From d618365c88963051740f60fee2e0971af91e5412 Mon Sep 17 00:00:00 2001 From: satan Date: Sat, 22 Jul 2023 00:25:58 +0200 Subject: [PATCH 001/114] [feat]: Made sdk and client io generic --- apps/src/bin/namada-client/main.rs | 4 +- apps/src/bin/namada-relayer/main.rs | 4 +- apps/src/bin/namada-wallet/main.rs | 4 +- apps/src/lib/cli.rs | 3 +- apps/src/lib/cli/api.rs | 12 +- apps/src/lib/cli/client.rs | 178 +++-- apps/src/lib/cli/context.rs | 5 +- apps/src/lib/cli/relayer.rs | 43 +- apps/src/lib/cli/utils.rs | 3 +- apps/src/lib/cli/wallet.rs | 252 +++--- apps/src/lib/client/rpc.rs | 751 ++++++++++++------ apps/src/lib/client/signing.rs | 18 +- apps/src/lib/client/tx.rs | 437 ++++++---- shared/src/ledger/eth_bridge.rs | 22 +- shared/src/ledger/eth_bridge/bridge_pool.rs | 144 ++-- shared/src/ledger/eth_bridge/validator_set.rs | 49 +- shared/src/ledger/masp.rs | 46 +- shared/src/ledger/rpc.rs | 83 +- shared/src/ledger/signing.rs | 130 ++- shared/src/ledger/tx.rs | 432 ++++++---- shared/src/types/io.rs | 117 +++ shared/src/types/mod.rs | 1 + tests/src/e2e/ledger_tests.rs | 7 +- 23 files changed, 1813 insertions(+), 932 deletions(-) create mode 100644 shared/src/types/io.rs diff --git a/apps/src/bin/namada-client/main.rs b/apps/src/bin/namada-client/main.rs index a9e1fb4948c..9b43ca8f91b 100644 --- a/apps/src/bin/namada-client/main.rs +++ b/apps/src/bin/namada-client/main.rs @@ -1,5 +1,5 @@ use color_eyre::eyre::Result; -use namada_apps::cli::api::CliApi; +use namada_apps::cli::api::{CliApi, CliIo}; use namada_apps::facade::tendermint_rpc::HttpClient; use namada_apps::{cli, logging}; use tracing_subscriber::filter::LevelFilter; @@ -13,7 +13,7 @@ async fn main() -> Result<()> { let _log_guard = logging::init_from_env_or(LevelFilter::INFO)?; // run the CLI - CliApi::<()>::handle_client_command::( + CliApi::::handle_client_command::( None, cli::namada_client_cli()?, ) diff --git a/apps/src/bin/namada-relayer/main.rs b/apps/src/bin/namada-relayer/main.rs index 0b314cb9fa1..1d7ae94feca 100644 --- a/apps/src/bin/namada-relayer/main.rs +++ b/apps/src/bin/namada-relayer/main.rs @@ -1,6 +1,6 @@ use color_eyre::eyre::Result; use namada::tendermint_rpc::HttpClient; -use namada_apps::cli::api::CliApi; +use namada_apps::cli::api::{CliApi, CliIo}; use namada_apps::{cli, logging}; use tracing_subscriber::filter::LevelFilter; @@ -14,5 +14,5 @@ async fn main() -> Result<()> { let (cmd, _) = cli::namada_relayer_cli()?; // run the CLI - CliApi::<()>::handle_relayer_command::(None, cmd).await + CliApi::::handle_relayer_command::(None, cmd).await } diff --git a/apps/src/bin/namada-wallet/main.rs b/apps/src/bin/namada-wallet/main.rs index 7459234c791..5e94831716c 100644 --- a/apps/src/bin/namada-wallet/main.rs +++ b/apps/src/bin/namada-wallet/main.rs @@ -1,10 +1,10 @@ use color_eyre::eyre::Result; use namada_apps::cli; -use namada_apps::cli::api::CliApi; +use namada_apps::cli::api::{CliApi, CliIo}; pub fn main() -> Result<()> { color_eyre::install()?; let (cmd, ctx) = cli::namada_wallet_cli()?; // run the CLI - CliApi::<()>::handle_wallet_command(cmd, ctx) + CliApi::::handle_wallet_command(cmd, ctx) } diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 699a2b7f17e..3874cbbe6fd 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -19,6 +19,7 @@ pub use utils::safe_exit; use utils::*; pub use self::context::Context; +use crate::cli::api::CliIo; include!("../../version.rs"); @@ -5044,7 +5045,7 @@ pub fn namada_client_cli() -> Result { let global_args = args::Global::parse(&matches); match cmd { cmds::NamadaClient::WithContext(sub_cmd) => { - let context = Context::new(global_args)?; + let context = Context::new::(global_args)?; Ok(NamadaClient::WithContext(Box::new((sub_cmd, context)))) } cmds::NamadaClient::WithoutContext(sub_cmd) => { diff --git a/apps/src/lib/cli/api.rs b/apps/src/lib/cli/api.rs index c22fe39fd3d..c53f277e29b 100644 --- a/apps/src/lib/cli/api.rs +++ b/apps/src/lib/cli/api.rs @@ -4,6 +4,7 @@ use namada::ledger::queries::Client; use namada::ledger::rpc::wait_until_node_is_synched; use namada::tendermint_rpc::HttpClient; use namada::types::control_flow::Halt; +use namada::types::io::Io; use tendermint_config::net::Address as TendermintAddress; use crate::client::utils; @@ -12,7 +13,7 @@ use crate::client::utils; #[async_trait::async_trait(?Send)] pub trait CliClient: Client + Sync { fn from_tendermint_address(address: &mut TendermintAddress) -> Self; - async fn wait_until_node_is_synced(&self) -> Halt<()>; + async fn wait_until_node_is_synced(&self) -> Halt<()>; } #[async_trait::async_trait(?Send)] @@ -21,9 +22,12 @@ impl CliClient for HttpClient { HttpClient::new(utils::take_config_address(address)).unwrap() } - async fn wait_until_node_is_synced(&self) -> Halt<()> { - wait_until_node_is_synched(self).await + async fn wait_until_node_is_synced(&self) -> Halt<()> { + wait_until_node_is_synched::<_, IO>(self).await } } -pub struct CliApi(PhantomData); +pub struct CliIo; +impl Io for CliIo {} + +pub struct CliApi(PhantomData); diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index fb7d01559b3..e01c07aa467 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -2,6 +2,7 @@ use color_eyre::eyre::{eyre, Report, Result}; use namada::ledger::eth_bridge::bridge_pool; use namada::ledger::{signing, tx as sdk_tx}; use namada::types::control_flow::ProceedOrElse; +use namada::types::io::Io; use crate::cli; use crate::cli::api::{CliApi, CliClient}; @@ -13,7 +14,7 @@ fn error() -> Report { eyre!("Fatal error") } -impl CliApi { +impl CliApi { pub async fn handle_client_command( client: Option, cmd: cli::NamadaClient, @@ -34,19 +35,20 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); let dry_run = args.tx.dry_run; - tx::submit_custom(&client, &mut ctx, args).await?; + tx::submit_custom::<_, IO>(&client, &mut ctx, args) + .await?; if !dry_run { crate::wallet::save(&ctx.wallet) .unwrap_or_else(|err| eprintln!("{}", err)); } else { - println!( + IO::println( "Transaction dry run. No addresses have been \ - saved." + saved.", ) } } @@ -57,11 +59,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_transfer(&client, ctx, args).await?; + tx::submit_transfer::<_, IO>(&client, ctx, args) + .await?; } Sub::TxIbcTransfer(TxIbcTransfer(mut args)) => { let client = client.unwrap_or_else(|| { @@ -70,11 +73,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_ibc_transfer(&client, ctx, args).await?; + tx::submit_ibc_transfer::<_, IO>(&client, ctx, args) + .await?; } Sub::TxUpdateVp(TxUpdateVp(mut args)) => { let client = client.unwrap_or_else(|| { @@ -83,11 +87,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_update_vp(&client, &mut ctx, args).await?; + tx::submit_update_vp::<_, IO>(&client, &mut ctx, args) + .await?; } Sub::TxInitAccount(TxInitAccount(mut args)) => { let client = client.unwrap_or_else(|| { @@ -96,20 +101,22 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); let dry_run = args.tx.dry_run; - tx::submit_init_account(&client, &mut ctx, args) - .await?; + tx::submit_init_account::<_, IO>( + &client, &mut ctx, args, + ) + .await?; if !dry_run { crate::wallet::save(&ctx.wallet) .unwrap_or_else(|err| eprintln!("{}", err)); } else { - println!( + IO::println( "Transaction dry run. No addresses have been \ - saved." + saved.", ) } } @@ -120,11 +127,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_init_validator(&client, ctx, args).await?; + tx::submit_init_validator::<_, IO>(&client, ctx, args) + .await?; } Sub::TxInitProposal(TxInitProposal(mut args)) => { let client = client.unwrap_or_else(|| { @@ -133,11 +141,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_init_proposal(&client, ctx, args).await?; + tx::submit_init_proposal::<_, IO>(&client, ctx, args) + .await?; } Sub::TxVoteProposal(TxVoteProposal(mut args)) => { let client = client.unwrap_or_else(|| { @@ -146,11 +155,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_vote_proposal(&client, ctx, args).await?; + tx::submit_vote_proposal::<_, IO>(&client, ctx, args) + .await?; } Sub::TxRevealPk(TxRevealPk(mut args)) => { let client = client.unwrap_or_else(|| { @@ -159,11 +169,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_reveal_pk(&client, &mut ctx, args).await?; + tx::submit_reveal_pk::<_, IO>(&client, &mut ctx, args) + .await?; } Sub::Bond(Bond(mut args)) => { let client = client.unwrap_or_else(|| { @@ -172,11 +183,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_bond(&client, &mut ctx, args).await?; + tx::submit_bond::<_, IO>(&client, &mut ctx, args) + .await?; } Sub::Unbond(Unbond(mut args)) => { let client = client.unwrap_or_else(|| { @@ -185,11 +197,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_unbond(&client, &mut ctx, args).await?; + tx::submit_unbond::<_, IO>(&client, &mut ctx, args) + .await?; } Sub::Withdraw(Withdraw(mut args)) => { let client = client.unwrap_or_else(|| { @@ -198,11 +211,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_withdraw(&client, ctx, args).await?; + tx::submit_withdraw::<_, IO>(&client, ctx, args) + .await?; } Sub::TxCommissionRateChange(TxCommissionRateChange( mut args, @@ -213,11 +227,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_validator_commission_change( + tx::submit_validator_commission_change::<_, IO>( &client, ctx, args, ) .await?; @@ -231,20 +245,20 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); let tx_args = args.tx.clone(); let (mut tx, addr, pk) = - bridge_pool::build_bridge_pool_tx( + bridge_pool::build_bridge_pool_tx::<_, _, IO>( &client, &mut ctx.wallet, args, ) .await .unwrap(); - tx::submit_reveal_aux( + tx::submit_reveal_aux::<_, IO>( &client, &mut ctx, &tx_args, @@ -260,7 +274,7 @@ impl CliApi { &pk, ) .await?; - sdk_tx::process_tx( + sdk_tx::process_tx::<_, _, IO>( &client, &mut ctx.wallet, &tx_args, @@ -274,10 +288,10 @@ impl CliApi { C::from_tendermint_address(&mut args.ledger_address) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; - rpc::query_and_print_epoch(&client).await; + rpc::query_and_print_epoch::<_, IO>(&client).await; } Sub::QueryTransfers(QueryTransfers(mut args)) => { let client = client.unwrap_or_else(|| { @@ -286,11 +300,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_transfers( + rpc::query_transfers::<_, _, IO>( &client, &mut ctx.wallet, &mut ctx.shielded, @@ -305,22 +319,26 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_conversions(&client, &mut ctx.wallet, args) - .await; + rpc::query_conversions::<_, IO>( + &client, + &mut ctx.wallet, + args, + ) + .await; } Sub::QueryBlock(QueryBlock(mut args)) => { let client = client.unwrap_or_else(|| { C::from_tendermint_address(&mut args.ledger_address) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; - rpc::query_block(&client).await; + rpc::query_block::<_, IO>(&client).await; } Sub::QueryBalance(QueryBalance(mut args)) => { let client = client.unwrap_or_else(|| { @@ -329,11 +347,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_balance( + rpc::query_balance::<_, _, IO>( &client, &mut ctx.wallet, &mut ctx.shielded, @@ -348,13 +366,17 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_bonds(&client, &mut ctx.wallet, args) - .await - .expect("expected successful query of bonds"); + rpc::query_bonds::<_, IO>( + &client, + &mut ctx.wallet, + args, + ) + .await + .expect("expected successful query of bonds"); } Sub::QueryBondedStake(QueryBondedStake(mut args)) => { let client = client.unwrap_or_else(|| { @@ -363,11 +385,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_bonded_stake(&client, args).await; + rpc::query_bonded_stake::<_, IO>(&client, args).await; } Sub::QueryCommissionRate(QueryCommissionRate(mut args)) => { let client = client.unwrap_or_else(|| { @@ -376,11 +398,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_and_print_commission_rate( + rpc::query_and_print_commission_rate::<_, IO>( &client, &mut ctx.wallet, args, @@ -394,12 +416,16 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_slashes(&client, &mut ctx.wallet, args) - .await; + rpc::query_slashes::<_, IO>( + &client, + &mut ctx.wallet, + args, + ) + .await; } Sub::QueryDelegations(QueryDelegations(mut args)) => { let client = client.unwrap_or_else(|| { @@ -408,12 +434,16 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_delegations(&client, &mut ctx.wallet, args) - .await; + rpc::query_delegations::<_, IO>( + &client, + &mut ctx.wallet, + args, + ) + .await; } Sub::QueryFindValidator(QueryFindValidator(mut args)) => { let client = client.unwrap_or_else(|| { @@ -422,11 +452,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_find_validator(&client, args).await; + rpc::query_find_validator::<_, IO>(&client, args).await; } Sub::QueryResult(QueryResult(mut args)) => { let client = client.unwrap_or_else(|| { @@ -435,11 +465,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_result(&client, args).await; + rpc::query_result::<_, IO>(&client, args).await; } Sub::QueryRawBytes(QueryRawBytes(mut args)) => { let client = client.unwrap_or_else(|| { @@ -448,11 +478,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_raw_bytes(&client, args).await; + rpc::query_raw_bytes::<_, IO>(&client, args).await; } Sub::QueryProposal(QueryProposal(mut args)) => { @@ -462,11 +492,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_proposal(&client, args).await; + rpc::query_proposal::<_, IO>(&client, args).await; } Sub::QueryProposalResult(QueryProposalResult(mut args)) => { let client = client.unwrap_or_else(|| { @@ -475,11 +505,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_proposal_result(&client, args).await; + rpc::query_proposal_result::<_, IO>(&client, args) + .await; } Sub::QueryProtocolParameters(QueryProtocolParameters( mut args, @@ -490,11 +521,12 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - rpc::query_protocol_parameters(&client, args).await; + rpc::query_protocol_parameters::<_, IO>(&client, args) + .await; } } } diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 06228271408..3027976754f 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -12,6 +12,7 @@ use namada::ledger::wallet::store::AddressVpType; use namada::ledger::wallet::Wallet; use namada::types::address::Address; use namada::types::chain::ChainId; +use namada::types::io::Io; use namada::types::key::*; use namada::types::masp::*; @@ -82,7 +83,7 @@ pub struct Context { } impl Context { - pub fn new(global_args: args::Global) -> Result { + pub fn new(global_args: args::Global) -> Result { let global_config = read_or_try_new_global_config(&global_args); tracing::debug!("Chain ID: {}", global_config.default_chain_id); @@ -124,7 +125,7 @@ impl Context { wallet, global_config, config, - shielded: CLIShieldedUtils::new(chain_dir), + shielded: CLIShieldedUtils::new::(chain_dir), native_token, }) } diff --git a/apps/src/lib/cli/relayer.rs b/apps/src/lib/cli/relayer.rs index 531051d27ad..65ec0cf56b7 100644 --- a/apps/src/lib/cli/relayer.rs +++ b/apps/src/lib/cli/relayer.rs @@ -4,6 +4,7 @@ use color_eyre::eyre::{eyre, Report, Result}; use namada::eth_bridge::ethers::providers::{Http, Provider}; use namada::ledger::eth_bridge::{bridge_pool, validator_set}; use namada::types::control_flow::ProceedOrElse; +use namada::types::io::Io; use crate::cli::api::{CliApi, CliClient}; use crate::cli::args::CliToSdkCtxless; @@ -13,7 +14,7 @@ fn error() -> Report { eyre!("Fatal error") } -impl CliApi { +impl CliApi { pub async fn handle_relayer_command( client: Option, cmd: cmds::NamadaRelayer, @@ -30,11 +31,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk_ctxless(); - bridge_pool::recommend_batch(&client, args) + bridge_pool::recommend_batch::<_, IO>(&client, args) .await .proceed_or_else(error)?; } @@ -45,11 +46,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk_ctxless(); - bridge_pool::construct_proof(&client, args) + bridge_pool::construct_proof::<_, IO>(&client, args) .await .proceed_or_else(error)?; } @@ -60,7 +61,7 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let eth_client = Arc::new( @@ -68,7 +69,7 @@ impl CliApi { .unwrap(), ); let args = args.to_sdk_ctxless(); - bridge_pool::relay_bridge_pool_proof( + bridge_pool::relay_bridge_pool_proof::<_, _, IO>( eth_client, &client, args, ) .await @@ -79,20 +80,20 @@ impl CliApi { C::from_tendermint_address(&mut query.ledger_address) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; - bridge_pool::query_bridge_pool(&client).await; + bridge_pool::query_bridge_pool::<_, IO>(&client).await; } cmds::EthBridgePool::QuerySigned(mut query) => { let client = client.unwrap_or_else(|| { C::from_tendermint_address(&mut query.ledger_address) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; - bridge_pool::query_signed_bridge_pool(&client) + bridge_pool::query_signed_bridge_pool::<_, IO>(&client) .await .proceed_or_else(error)?; } @@ -101,10 +102,10 @@ impl CliApi { C::from_tendermint_address(&mut query.ledger_address) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; - bridge_pool::query_relay_progress(&client).await; + bridge_pool::query_relay_progress::<_, IO>(&client).await; } }, cmds::NamadaRelayer::ValidatorSet(sub) => match sub { @@ -115,12 +116,14 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk_ctxless(); - validator_set::query_validator_set_args(&client, args) - .await; + validator_set::query_validator_set_args::<_, IO>( + &client, args, + ) + .await; } cmds::ValidatorSet::ValidatorSetProof(mut args) => { let client = client.unwrap_or_else(|| { @@ -129,11 +132,11 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let args = args.to_sdk_ctxless(); - validator_set::query_validator_set_update_proof( + validator_set::query_validator_set_update_proof::<_, IO>( &client, args, ) .await; @@ -145,7 +148,7 @@ impl CliApi { ) }); client - .wait_until_node_is_synced() + .wait_until_node_is_synced::() .await .proceed_or_else(error)?; let eth_client = Arc::new( @@ -153,7 +156,7 @@ impl CliApi { .unwrap(), ); let args = args.to_sdk_ctxless(); - validator_set::relay_validator_set_update( + validator_set::relay_validator_set_update::<_, _, IO>( eth_client, &client, args, ) .await diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index eac233ed28a..8a4d1429a5d 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -8,6 +8,7 @@ use color_eyre::eyre::Result; use super::args; use super::context::{Context, FromContext}; +use crate::cli::api::CliIo; // We only use static strings pub type App = clap::Command; @@ -22,7 +23,7 @@ pub trait Cmd: Sized { match Self::parse(&matches) { Some(cmd) => { let global_args = args::Global::parse(&matches); - let context = Context::new(global_args)?; + let context = Context::new::(global_args)?; Ok((cmd, context)) } None => { diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index 7505c59efe3..56a0960db66 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -9,6 +9,7 @@ use itertools::sorted; use masp_primitives::zip32::ExtendedFullViewingKey; use namada::ledger::masp::find_valid_diversifier; use namada::ledger::wallet::{DecryptionError, FindKeyError}; +use namada::types::io::Io; use namada::types::key::*; use namada::types::masp::{MaspValue, PaymentAddress}; use rand_core::OsRng; @@ -19,7 +20,7 @@ use crate::cli::args::CliToSdk; use crate::cli::{args, cmds, Context}; use crate::wallet::{read_and_confirm_encryption_password, CliWalletUtils}; -impl CliApi { +impl CliApi { pub fn handle_wallet_command( cmd: cmds::NamadaWallet, mut ctx: Context, @@ -27,57 +28,57 @@ impl CliApi { match cmd { cmds::NamadaWallet::Key(sub) => match sub { cmds::WalletKey::Restore(cmds::KeyRestore(args)) => { - key_and_address_restore(ctx, args) + key_and_address_restore::(ctx, args) } cmds::WalletKey::Gen(cmds::KeyGen(args)) => { - key_and_address_gen(ctx, args) + key_and_address_gen::(ctx, args) } cmds::WalletKey::Find(cmds::KeyFind(args)) => { - key_find(ctx, args) + key_find::(ctx, args) } cmds::WalletKey::List(cmds::KeyList(args)) => { - key_list(ctx, args) + key_list::(ctx, args) } cmds::WalletKey::Export(cmds::Export(args)) => { - key_export(ctx, args) + key_export::(ctx, args) } }, cmds::NamadaWallet::Address(sub) => match sub { cmds::WalletAddress::Gen(cmds::AddressGen(args)) => { - key_and_address_gen(ctx, args) + key_and_address_gen::(ctx, args) } cmds::WalletAddress::Restore(cmds::AddressRestore(args)) => { - key_and_address_restore(ctx, args) + key_and_address_restore::(ctx, args) } cmds::WalletAddress::Find(cmds::AddressOrAliasFind(args)) => { - address_or_alias_find(ctx, args) + address_or_alias_find::(ctx, args) } cmds::WalletAddress::List(cmds::AddressList) => { - address_list(ctx) + address_list::(ctx) } cmds::WalletAddress::Add(cmds::AddressAdd(args)) => { - address_add(ctx, args) + address_add::(ctx, args) } }, cmds::NamadaWallet::Masp(sub) => match sub { cmds::WalletMasp::GenSpendKey(cmds::MaspGenSpendKey(args)) => { - spending_key_gen(ctx, args) + spending_key_gen::(ctx, args) } cmds::WalletMasp::GenPayAddr(cmds::MaspGenPayAddr(args)) => { let args = args.to_sdk(&mut ctx); - payment_address_gen(ctx, args) + payment_address_gen::(ctx, args) } cmds::WalletMasp::AddAddrKey(cmds::MaspAddAddrKey(args)) => { - address_key_add(ctx, args) + address_key_add::(ctx, args) } cmds::WalletMasp::ListPayAddrs(cmds::MaspListPayAddrs) => { - payment_addresses_list(ctx) + payment_addresses_list::(ctx) } cmds::WalletMasp::ListKeys(cmds::MaspListKeys(args)) => { - spending_keys_list(ctx, args) + spending_keys_list::(ctx, args) } cmds::WalletMasp::FindAddrKey(cmds::MaspFindAddrKey(args)) => { - address_key_find(ctx, args) + address_key_find::(ctx, args) } }, } @@ -86,7 +87,7 @@ impl CliApi { } /// Find shielded address or key -fn address_key_find( +fn address_key_find( ctx: Context, args::AddrKeyFind { alias, @@ -97,31 +98,33 @@ fn address_key_find( let alias = alias.to_lowercase(); if let Ok(viewing_key) = wallet.find_viewing_key(&alias) { // Check if alias is a viewing key - println!("Viewing key: {}", viewing_key); + IO::println(format!("Viewing key: {}", viewing_key)); if unsafe_show_secret { // Check if alias is also a spending key match wallet.find_spending_key(&alias, None) { - Ok(spending_key) => println!("Spending key: {}", spending_key), + Ok(spending_key) => { + IO::println(format!("Spending key: {}", spending_key)) + } Err(FindKeyError::KeyNotFound) => {} - Err(err) => eprintln!("{}", err), + Err(err) => IO::eprintln(format!("{}", err)), } } } else if let Some(payment_addr) = wallet.find_payment_addr(&alias) { // Failing that, check if alias is a payment address - println!("Payment address: {}", payment_addr); + IO::println(format!("Payment address: {}", payment_addr)); } else { // Otherwise alias cannot be referring to any shielded value - println!( + IO::println(format!( "No shielded address or key with alias {} found. Use the commands \ `masp list-addrs` and `masp list-keys` to see all the known \ addresses and keys.", alias.to_lowercase() - ); + )); } } /// List spending keys. -fn spending_keys_list( +fn spending_keys_list( ctx: Context, args::MaspKeysList { decrypt, @@ -132,32 +135,32 @@ fn spending_keys_list( let known_view_keys = wallet.get_viewing_keys(); let known_spend_keys = wallet.get_spending_keys(); if known_view_keys.is_empty() { - println!( + IO::println( "No known keys. Try `masp add --alias my-addr --value ...` to add \ - a new key to the wallet." + a new key to the wallet.", ); } else { let stdout = io::stdout(); let mut w = stdout.lock(); - writeln!(w, "Known keys:").unwrap(); + IO::writeln(&mut w, "Known keys:").unwrap(); for (alias, key) in known_view_keys { - write!(w, " Alias \"{}\"", alias).unwrap(); + IO::write(&mut w, format!(" Alias \"{}\"", alias)).unwrap(); let spending_key_opt = known_spend_keys.get(&alias); // If this alias is associated with a spending key, indicate whether // or not the spending key is encrypted // TODO: consider turning if let into match if let Some(spending_key) = spending_key_opt { if spending_key.is_encrypted() { - writeln!(w, " (encrypted):") + IO::writeln(&mut w, " (encrypted):") } else { - writeln!(w, " (not encrypted):") + IO::writeln(&mut w, " (not encrypted):") } .unwrap(); } else { - writeln!(w, ":").unwrap(); + IO::writeln(&mut w, ":").unwrap(); } // Always print the corresponding viewing key - writeln!(w, " Viewing Key: {}", key).unwrap(); + IO::writeln(&mut w, format!(" Viewing Key: {}", key)).unwrap(); // A subset of viewing keys will have corresponding spending keys. // Print those too if they are available and requested. if unsafe_show_secret { @@ -166,8 +169,11 @@ fn spending_keys_list( // Here the spending key is unencrypted or successfully // decrypted Ok(spending_key) => { - writeln!(w, " Spending key: {}", spending_key) - .unwrap(); + IO::writeln( + &mut w, + format!(" Spending key: {}", spending_key), + ) + .unwrap(); } // Here the key is encrypted but decryption has not been // requested @@ -177,10 +183,12 @@ fn spending_keys_list( // Here the key is encrypted but incorrect password has // been provided Err(err) => { - writeln!( - w, - " Couldn't decrypt the spending key: {}", - err + IO::writeln( + &mut w, + format!( + " Couldn't decrypt the spending key: {}", + err + ), ) .unwrap(); } @@ -192,26 +200,27 @@ fn spending_keys_list( } /// List payment addresses. -fn payment_addresses_list(ctx: Context) { +fn payment_addresses_list(ctx: Context) { let wallet = ctx.wallet; let known_addresses = wallet.get_payment_addrs(); if known_addresses.is_empty() { - println!( + IO::println( "No known payment addresses. Try `masp gen-addr --alias my-addr` \ - to generate a new payment address." + to generate a new payment address.", ); } else { let stdout = io::stdout(); let mut w = stdout.lock(); - writeln!(w, "Known payment addresses:").unwrap(); + IO::writeln(&mut w, "Known payment addresses:").unwrap(); for (alias, address) in sorted(known_addresses) { - writeln!(w, " \"{}\": {}", alias, address).unwrap(); + IO::writeln(&mut w, format!(" \"{}\": {}", alias, address)) + .unwrap(); } } } /// Generate a spending key. -fn spending_key_gen( +fn spending_key_gen( ctx: Context, args::MaspSpendKeyGen { alias, @@ -224,14 +233,14 @@ fn spending_key_gen( let password = read_and_confirm_encryption_password(unsafe_dont_encrypt); let (alias, _key) = wallet.gen_spending_key(alias, password, alias_force); crate::wallet::save(&wallet).unwrap_or_else(|err| eprintln!("{}", err)); - println!( + IO::println(format!( "Successfully added a spending key with alias: \"{}\"", alias - ); + )); } /// Generate a shielded payment address from the given key. -fn payment_address_gen( +fn payment_address_gen( ctx: Context, args::MaspPayAddrGen { alias, @@ -254,18 +263,18 @@ fn payment_address_gen( alias_force, ) .unwrap_or_else(|| { - eprintln!("Payment address not added"); + IO::eprintln("Payment address not added"); cli::safe_exit(1); }); crate::wallet::save(&wallet).unwrap_or_else(|err| eprintln!("{}", err)); - println!( + IO::println(format!( "Successfully generated a payment address with the following alias: {}", alias, - ); + )); } /// Add a viewing key, spending key, or payment address to wallet. -fn address_key_add( +fn address_key_add( mut ctx: Context, args::MaspAddrKeyAdd { alias, @@ -281,7 +290,7 @@ fn address_key_add( .wallet .insert_viewing_key(alias, viewing_key, alias_force) .unwrap_or_else(|| { - eprintln!("Viewing key not added"); + IO::eprintln("Viewing key not added"); cli::safe_exit(1); }); (alias, "viewing key") @@ -298,7 +307,7 @@ fn address_key_add( alias_force, ) .unwrap_or_else(|| { - eprintln!("Spending key not added"); + IO::eprintln("Spending key not added"); cli::safe_exit(1); }); (alias, "spending key") @@ -308,22 +317,22 @@ fn address_key_add( .wallet .insert_payment_addr(alias, payment_addr, alias_force) .unwrap_or_else(|| { - eprintln!("Payment address not added"); + IO::eprintln("Payment address not added"); cli::safe_exit(1); }); (alias, "payment address") } }; crate::wallet::save(&ctx.wallet).unwrap_or_else(|err| eprintln!("{}", err)); - println!( + IO::println(format!( "Successfully added a {} with the following alias to wallet: {}", typ, alias, - ); + )); } /// Restore a keypair and an implicit address from the mnemonic code in the /// wallet. -fn key_and_address_restore( +fn key_and_address_restore( ctx: Context, args::KeyAndAddressRestore { scheme, @@ -345,23 +354,24 @@ fn key_and_address_restore( encryption_password, ) .unwrap_or_else(|err| { - eprintln!("{}", err); + IO::eprintln(format!("{}", err)); cli::safe_exit(1) }) .unwrap_or_else(|| { - println!("No changes are persisted. Exiting."); + IO::println("No changes are persisted. Exiting."); cli::safe_exit(0); }); - crate::wallet::save(&wallet).unwrap_or_else(|err| eprintln!("{}", err)); - println!( + crate::wallet::save(&wallet) + .unwrap_or_else(|err| IO::eprintln(format!("{}", err))); + IO::println(format!( "Successfully added a key and an address with alias: \"{}\"", alias - ); + )); } /// Generate a new keypair and derive implicit address from it and store them in /// the wallet. -fn key_and_address_gen( +fn key_and_address_gen( ctx: Context, args::KeyAndAddressGen { scheme, @@ -386,22 +396,23 @@ fn key_and_address_gen( derivation_path_and_mnemonic_rng, ) .unwrap_or_else(|err| { - eprintln!("{}", err); + IO::eprintln(format!("{}", err)); cli::safe_exit(1); }) .unwrap_or_else(|| { - println!("No changes are persisted. Exiting."); + IO::println("No changes are persisted. Exiting."); cli::safe_exit(0); }); - crate::wallet::save(&wallet).unwrap_or_else(|err| eprintln!("{}", err)); - println!( + crate::wallet::save(&wallet) + .unwrap_or_else(|err| IO::eprintln(format!("{}", err))); + IO::println(format!( "Successfully added a key and an address with alias: \"{}\"", alias - ); + )); } /// Find a keypair in the wallet store. -fn key_find( +fn key_find( ctx: Context, args::KeyFind { public_key, @@ -417,9 +428,9 @@ fn key_find( let alias = alias.or(value); match alias { None => { - eprintln!( + IO::eprintln( "An alias, public key or public key hash needs to be \ - supplied" + supplied", ); cli::safe_exit(1) } @@ -430,20 +441,20 @@ fn key_find( match found_keypair { Ok(keypair) => { let pkh: PublicKeyHash = (&keypair.ref_to()).into(); - println!("Public key hash: {}", pkh); - println!("Public key: {}", keypair.ref_to()); + IO::println(format!("Public key hash: {}", pkh)); + IO::println(format!("Public key: {}", keypair.ref_to())); if unsafe_show_secret { - println!("Secret key: {}", keypair); + IO::println(format!("Secret key: {}", keypair)); } } Err(err) => { - eprintln!("{}", err); + IO::eprintln(format!("{}", err)); } } } /// List all known keys. -fn key_list( +fn key_list( ctx: Context, args::KeyList { decrypt, @@ -453,38 +464,53 @@ fn key_list( let wallet = ctx.wallet; let known_keys = wallet.get_keys(); if known_keys.is_empty() { - println!( + IO::println( "No known keys. Try `key gen --alias my-key` to generate a new \ - key." + key.", ); } else { let stdout = io::stdout(); let mut w = stdout.lock(); - writeln!(w, "Known keys:").unwrap(); + IO::writeln(&mut w, "Known keys:").unwrap(); for (alias, (stored_keypair, pkh)) in known_keys { let encrypted = if stored_keypair.is_encrypted() { "encrypted" } else { "not encrypted" }; - writeln!(w, " Alias \"{}\" ({}):", alias, encrypted).unwrap(); + IO::writeln( + &mut w, + format!(" Alias \"{}\" ({}):", alias, encrypted), + ) + .unwrap(); if let Some(pkh) = pkh { - writeln!(w, " Public key hash: {}", pkh).unwrap(); + IO::writeln(&mut w, format!(" Public key hash: {}", pkh)) + .unwrap(); } match stored_keypair.get::(decrypt, None) { Ok(keypair) => { - writeln!(w, " Public key: {}", keypair.ref_to()) - .unwrap(); + IO::writeln( + &mut w, + format!(" Public key: {}", keypair.ref_to()), + ) + .unwrap(); if unsafe_show_secret { - writeln!(w, " Secret key: {}", keypair).unwrap(); + IO::writeln( + &mut w, + format!(" Secret key: {}", keypair), + ) + .unwrap(); } } Err(DecryptionError::NotDecrypting) if !decrypt => { continue; } Err(err) => { - writeln!(w, " Couldn't decrypt the keypair: {}", err) - .unwrap(); + IO::writeln( + &mut w, + format!(" Couldn't decrypt the keypair: {}", err), + ) + .unwrap(); } } } @@ -492,7 +518,10 @@ fn key_list( } /// Export a keypair to a file. -fn key_export(ctx: Context, args::KeyExport { alias }: args::KeyExport) { +fn key_export( + ctx: Context, + args::KeyExport { alias }: args::KeyExport, +) { let mut wallet = ctx.wallet; wallet .find_key(alias.to_lowercase(), None) @@ -504,36 +533,39 @@ fn key_export(ctx: Context, args::KeyExport { alias }: args::KeyExport) { let mut file = File::create(&file_name).unwrap(); file.write_all(file_data.as_ref()).unwrap(); - println!("Exported to file {}", file_name); + IO::println(format!("Exported to file {}", file_name)); }) .unwrap_or_else(|err| { - eprintln!("{}", err); + IO::eprintln(format!("{}", err)); cli::safe_exit(1) }) } /// List all known addresses. -fn address_list(ctx: Context) { +fn address_list(ctx: Context) { let wallet = ctx.wallet; let known_addresses = wallet.get_addresses(); if known_addresses.is_empty() { - println!( + IO::println( "No known addresses. Try `address gen --alias my-addr` to \ - generate a new implicit address." + generate a new implicit address.", ); } else { let stdout = io::stdout(); let mut w = stdout.lock(); - writeln!(w, "Known addresses:").unwrap(); + IO::writeln(&mut w, "Known addresses:").unwrap(); for (alias, address) in sorted(known_addresses) { - writeln!(w, " \"{}\": {}", alias, address.to_pretty_string()) - .unwrap(); + IO::writeln( + &mut w, + format!(" \"{}\": {}", alias, address.to_pretty_string()), + ) + .unwrap(); } } } /// Find address (alias) by its alias (address). -fn address_or_alias_find(ctx: Context, args: args::AddressOrAliasFind) { +fn address_or_alias_find(ctx: Context, args: args::AddressOrAliasFind) { let wallet = ctx.wallet; if args.address.is_some() && args.alias.is_some() { panic!( @@ -543,29 +575,32 @@ fn address_or_alias_find(ctx: Context, args: args::AddressOrAliasFind) { } else if args.alias.is_some() { if let Some(address) = wallet.find_address(args.alias.as_ref().unwrap()) { - println!("Found address {}", address.to_pretty_string()); + IO::println(format!( + "Found address {}", + address.to_pretty_string() + )); } else { - println!( + IO::println(format!( "No address with alias {} found. Use the command `address \ list` to see all the known addresses.", args.alias.unwrap().to_lowercase() - ); + )); } } else if args.address.is_some() { if let Some(alias) = wallet.find_alias(args.address.as_ref().unwrap()) { - println!("Found alias {}", alias); + IO::println(format!("Found alias {}", alias)); } else { - println!( + IO::println(format!( "No alias with address {} found. Use the command `address \ list` to see all the known addresses.", args.address.unwrap() - ); + )); } } } /// Add an address to the wallet. -fn address_add(ctx: Context, args: args::AddressAdd) { +fn address_add(ctx: Context, args: args::AddressAdd) { let mut wallet = ctx.wallet; if wallet .add_address( @@ -575,12 +610,13 @@ fn address_add(ctx: Context, args: args::AddressAdd) { ) .is_none() { - eprintln!("Address not added"); + IO::eprintln("Address not added"); cli::safe_exit(1); } - crate::wallet::save(&wallet).unwrap_or_else(|err| eprintln!("{}", err)); - println!( + crate::wallet::save(&wallet) + .unwrap_or_else(|err| IO::eprintln(format!("{}", err))); + IO::println(format!( "Successfully added a key and an address with alias: \"{}\"", args.alias.to_lowercase() - ); + )); } diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index a2d2ffbd50a..730b935b460 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -43,11 +43,13 @@ use namada::types::governance::{ OfflineProposal, OfflineVote, ProposalVote, VotePower, VoteType, }; use namada::types::hash::Hash; +use namada::types::io::Io; use namada::types::key::*; use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, Denomination, MaspDenom, TokenAddress}; use namada::types::{storage, token}; +use namada::{display, display_line, edisplay}; use tokio::time::Instant; use crate::cli::{self, args}; @@ -59,12 +61,15 @@ use crate::wallet::CliWalletUtils; /// /// If a response is not delivered until `deadline`, we exit the cli with an /// error. -pub async fn query_tx_status( +pub async fn query_tx_status< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, status: namada::ledger::rpc::TxEventQuery<'_>, deadline: Instant, ) -> Event { - namada::ledger::rpc::query_tx_status(client, status, deadline) + namada::ledger::rpc::query_tx_status::<_, IO>(client, status, deadline) .await .proceed() } @@ -72,28 +77,32 @@ pub async fn query_tx_status( /// Query and print the epoch of the last committed block pub async fn query_and_print_epoch< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, ) -> Epoch { let epoch = namada::ledger::rpc::query_epoch(client).await; - println!("Last committed epoch: {}", epoch); + display_line!(IO, "Last committed epoch: {}", epoch); epoch } /// Query the last committed block -pub async fn query_block( +pub async fn query_block( client: &C, ) { let block = namada::ledger::rpc::query_block(client).await; match block { Some(block) => { - println!( + display_line!( + IO, "Last committed block ID: {}, height: {}, time: {}", - block.hash, block.height, block.time + block.hash, + block.height, + block.time ); } None => { - println!("No block has been committed yet."); + display_line!(IO, "No block has been committed yet."); } } } @@ -112,6 +121,7 @@ pub async fn query_results( pub async fn query_transfers< C: namada::ledger::queries::Client + Sync, U: ShieldedUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -159,7 +169,7 @@ pub async fn query_transfers< // Realize the rewards that would have been attained upon the // transaction's reception let amt = shielded - .compute_exchanged_amount( + .compute_exchanged_amount::<_, IO>( client, amt, epoch, @@ -191,33 +201,43 @@ pub async fn query_transfers< if !relevant { continue; } - println!("Height: {}, Index: {}, Transparent Transfer:", height, idx); + display_line!( + IO, + "Height: {}, Index: {}, Transparent Transfer:", + height, + idx + ); // Display the transparent changes first for (account, MaspChange { ref asset, change }) in tfer_delta { if account != masp() { - print!(" {}:", account); + display!(IO, " {}:", account); let token_alias = lookup_alias(wallet, &asset.address); let sign = match change.cmp(&Change::zero()) { Ordering::Greater => "+", Ordering::Less => "-", Ordering::Equal => "", }; - print!( + display!( + IO, " {}{} {}", sign, - format_denominated_amount(client, asset, change.into(),) - .await, + format_denominated_amount::<_, IO>( + client, + asset, + change.into(), + ) + .await, asset.format_with_alias(&token_alias) ); } - println!(); + display_line!(IO, ""); } // Then display the shielded changes afterwards // TODO: turn this to a display impl // (account, amt) for (account, masp_change) in shielded_accounts { if fvk_map.contains_key(&account) { - print!(" {}:", fvk_map[&account]); + display!(IO, " {}:", fvk_map[&account]); for (token_addr, val) in masp_change { let token_alias = lookup_alias(wallet, &token_addr.address); let sign = match val.cmp(&Change::zero()) { @@ -225,10 +245,11 @@ pub async fn query_transfers< Ordering::Less => "-", Ordering::Equal => "", }; - print!( + display!( + IO, " {}{} {}", sign, - format_denominated_amount( + format_denominated_amount::<_, IO>( client, &token_addr, val.into(), @@ -237,14 +258,17 @@ pub async fn query_transfers< token_addr.format_with_alias(&token_alias), ); } - println!(); + display_line!(IO, ""); } } } } /// Query the raw bytes of given storage key -pub async fn query_raw_bytes( +pub async fn query_raw_bytes< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, args: args::QueryRawBytes, ) { @@ -254,9 +278,9 @@ pub async fn query_raw_bytes( .await, ); if !response.data.is_empty() { - println!("Found data: 0x{}", HEXLOWER.encode(&response.data)); + display_line!(IO, "Found data: 0x{}", HEXLOWER.encode(&response.data)); } else { - println!("No data found for key {}", args.storage_key); + display_line!(IO, "No data found for key {}", args.storage_key); } } @@ -264,6 +288,7 @@ pub async fn query_raw_bytes( pub async fn query_balance< C: namada::ledger::queries::Client + Sync, U: ShieldedUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -274,22 +299,35 @@ pub async fn query_balance< // the CLI arguments match &args.owner { Some(BalanceOwner::FullViewingKey(_viewing_key)) => { - query_shielded_balance(client, wallet, shielded, args).await + query_shielded_balance::<_, _, IO>(client, wallet, shielded, args) + .await } Some(BalanceOwner::Address(_owner)) => { - query_transparent_balance(client, wallet, args).await + query_transparent_balance::<_, IO>(client, wallet, args).await } Some(BalanceOwner::PaymentAddress(_owner)) => { - query_pinned_balance(client, wallet, shielded, args).await + query_pinned_balance::<_, _, IO>(client, wallet, shielded, args) + .await } None => { // Print pinned balance - query_pinned_balance(client, wallet, shielded, args.clone()).await; + query_pinned_balance::<_, _, IO>( + client, + wallet, + shielded, + args.clone(), + ) + .await; // Print shielded balance - query_shielded_balance(client, wallet, shielded, args.clone()) - .await; + query_shielded_balance::<_, _, IO>( + client, + wallet, + shielded, + args.clone(), + ) + .await; // Then print transparent balance - query_transparent_balance(client, wallet, args).await; + query_transparent_balance::<_, IO>(client, wallet, args).await; } }; } @@ -297,6 +335,7 @@ pub async fn query_balance< /// Query token balance(s) pub async fn query_transparent_balance< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -328,7 +367,7 @@ pub async fn query_transparent_balance< .await { Some(balance) => { - let balance = format_denominated_amount( + let balance = format_denominated_amount::<_, IO>( client, &TokenAddress { address: token, @@ -339,16 +378,26 @@ pub async fn query_transparent_balance< .await; match &args.sub_prefix { Some(sub_prefix) => { - println!( + display_line!( + IO, "{} with {}: {}", - token_alias, sub_prefix, balance + token_alias, + sub_prefix, + balance ); } - None => println!("{}: {}", token_alias, balance), + None => { + display_line!(IO, "{}: {}", token_alias, balance) + } } } None => { - println!("No {} balance found for {}", token_alias, owner) + display_line!( + IO, + "No {} balance found for {}", + token_alias, + owner + ); } } } @@ -356,11 +405,12 @@ pub async fn query_transparent_balance< for token in tokens { let prefix = token::balance_key(&token, &owner.address().unwrap()); - let balances = - query_storage_prefix::(client, &prefix) - .await; + let balances = query_storage_prefix::( + client, &prefix, + ) + .await; if let Some(balances) = balances { - print_balances( + print_balances::<_, IO>( client, wallet, balances, @@ -374,20 +424,24 @@ pub async fn query_transparent_balance< (Some(token), None) => { let prefix = token::balance_prefix(&token); let balances = - query_storage_prefix::(client, &prefix).await; + query_storage_prefix::(client, &prefix) + .await; if let Some(balances) = balances { - print_balances(client, wallet, balances, &token, None).await; + print_balances::<_, IO>(client, wallet, balances, &token, None) + .await; } } (None, None) => { for token in tokens { let key = token::balance_prefix(&token); let balances = - query_storage_prefix::(client, &key) + query_storage_prefix::(client, &key) .await; if let Some(balances) = balances { - print_balances(client, wallet, balances, &token, None) - .await; + print_balances::<_, IO>( + client, wallet, balances, &token, None, + ) + .await; } } } @@ -398,6 +452,7 @@ pub async fn query_transparent_balance< pub async fn query_pinned_balance< C: namada::ledger::queries::Client + Sync, U: ShieldedUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -431,7 +486,7 @@ pub async fn query_pinned_balance< // address for vk in &viewing_keys { balance = shielded - .compute_exchanged_pinned_balance(client, owner, vk) + .compute_exchanged_pinned_balance::<_, IO>(client, owner, vk) .await; if balance != pinned_error { break; @@ -439,32 +494,39 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - print!("Enter the viewing key for {}: ", owner); + display!(IO, "Enter the viewing key for {}: ", owner); io::stdout().flush().unwrap(); let mut vk_str = String::new(); io::stdin().read_line(&mut vk_str).unwrap(); let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { - eprintln!("Invalid viewing key entered"); + edisplay!(IO, "Invalid viewing key entered"); continue; } }; let vk = ExtendedFullViewingKey::from(fvk).fvk.vk; // Use the given viewing key to decrypt pinned transaction data balance = shielded - .compute_exchanged_pinned_balance(client, owner, &vk) + .compute_exchanged_pinned_balance::<_, IO>(client, owner, &vk) .await } // Now print out the received quantities according to CLI arguments match (balance, args.token.as_ref(), args.sub_prefix.as_ref()) { - (Err(PinnedBalanceError::InvalidViewingKey), _, _) => println!( - "Supplied viewing key cannot decode transactions to given \ - payment address." - ), + (Err(PinnedBalanceError::InvalidViewingKey), _, _) => { + display_line!( + IO, + "Supplied viewing key cannot decode transactions to given \ + payment address." + ) + } (Err(PinnedBalanceError::NoTransactionPinned), _, _) => { - println!("Payment address {} has not yet been consumed.", owner) + display_line!( + IO, + "Payment address {} has not yet been consumed.", + owner + ); } (Ok((balance, epoch)), Some(token), sub_prefix) => { let token_alias = lookup_alias(wallet, token); @@ -480,7 +542,8 @@ pub async fn query_pinned_balance< .unwrap_or_default(); if total_balance.is_zero() { - println!( + display_line!( + IO, "Payment address {} was consumed during epoch {}. \ Received no shielded {}", owner, @@ -488,13 +551,14 @@ pub async fn query_pinned_balance< token_address.format_with_alias(&token_alias) ); } else { - let formatted = format_denominated_amount( + let formatted = format_denominated_amount::<_, IO>( client, &token_address, total_balance.into(), ) .await; - println!( + display_line!( + IO, "Payment address {} was consumed during epoch {}. \ Received {} {}", owner, @@ -512,14 +576,16 @@ pub async fn query_pinned_balance< .filter(|((token_epoch, _), _)| *token_epoch == epoch) { if !found_any { - println!( + display_line!( + IO, "Payment address {} was consumed during epoch {}. \ Received:", - owner, epoch + owner, + epoch ); found_any = true; } - let formatted = format_denominated_amount( + let formatted = format_denominated_amount::<_, IO>( client, token_addr, (*value).into(), @@ -529,17 +595,20 @@ pub async fn query_pinned_balance< .get(&token_addr.address) .map(|a| a.to_string()) .unwrap_or_else(|| token_addr.address.to_string()); - println!( + display_line!( + IO, " {}: {}", token_addr.format_with_alias(&token_alias), formatted, ); } if !found_any { - println!( + display_line!( + IO, "Payment address {} was consumed during epoch {}. \ Received no shielded assets.", - owner, epoch + owner, + epoch ); } } @@ -547,7 +616,7 @@ pub async fn query_pinned_balance< } } -async fn print_balances( +async fn print_balances( client: &C, wallet: &Wallet, balances: impl Iterator, @@ -558,7 +627,7 @@ async fn print_balances( let mut w = stdout.lock(); let token_alias = lookup_alias(wallet, token); - writeln!(w, "Token {}", token_alias).unwrap(); + display_line!(IO, &mut w; "Token {}", token_alias).unwrap(); let mut print_num = 0; for (key, balance) in balances { let (o, s) = match token::is_any_multitoken_balance_key(&key) { @@ -567,7 +636,7 @@ async fn print_balances( format!( "with {}: {}, owned by {}", sub_prefix.clone(), - format_denominated_amount( + format_denominated_amount::<_, IO>( client, &TokenAddress { address: tok.clone(), @@ -587,7 +656,7 @@ async fn print_balances( owner.clone(), format!( ": {}, owned by {}", - format_denominated_amount( + format_denominated_amount::<_, IO>( client, &TokenAddress { address: tok.clone(), @@ -609,29 +678,35 @@ async fn print_balances( Some(_) => continue, None => s, }; - writeln!(w, "{}", s).unwrap(); + display_line!(IO, &mut w; "{}", s).unwrap(); print_num += 1; } if print_num == 0 { match target { Some(t) => { - writeln!(w, "No balances owned by {}", lookup_alias(wallet, t)) + display_line!(IO, &mut w; "No balances owned by {}", lookup_alias(wallet, t)) .unwrap() } None => { - writeln!(w, "No balances for token {}", token_alias).unwrap() + display_line!(IO, &mut w; "No balances for token {}", token_alias).unwrap() } } } } /// Query Proposals -pub async fn query_proposal( +pub async fn query_proposal< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, args: args::QueryProposal, ) { - async fn print_proposal( + async fn print_proposal< + C: namada::ledger::queries::Client + Sync, + IO: Io, + >( client: &C, id: u64, current_epoch: Epoch, @@ -664,79 +739,89 @@ pub async fn query_proposal( query_storage_value::(client, &grace_epoch_key) .await?; - println!("Proposal: {}", id); - println!("{:4}Type: {}", "", proposal_type); - println!("{:4}Author: {}", "", author); - println!("{:4}Content:", ""); + display_line!(IO, "Proposal: {}", id); + display_line!(IO, "{:4}Type: {}", "", proposal_type); + display_line!(IO, "{:4}Author: {}", "", author); + display_line!(IO, "{:4}Content:", ""); for (key, value) in &content { - println!("{:8}{}: {}", "", key, value); + display_line!(IO, "{:8}{}: {}", "", key, value); } - println!("{:4}Start Epoch: {}", "", start_epoch); - println!("{:4}End Epoch: {}", "", end_epoch); - println!("{:4}Grace Epoch: {}", "", grace_epoch); - let votes = get_proposal_votes(client, start_epoch, id).await; + display_line!(IO, "{:4}Start Epoch: {}", "", start_epoch); + display_line!(IO, "{:4}End Epoch: {}", "", end_epoch); + display_line!(IO, "{:4}Grace Epoch: {}", "", grace_epoch); + let votes = + get_proposal_votes::<_, IO>(client, start_epoch, id).await; let total_stake = get_total_staked_tokens(client, start_epoch) .await .try_into() .unwrap(); if start_epoch > current_epoch { - println!("{:4}Status: pending", ""); + display_line!(IO, "{:4}Status: pending", ""); } else if start_epoch <= current_epoch && current_epoch <= end_epoch { match utils::compute_tally(votes, total_stake, &proposal_type) { Ok(partial_proposal_result) => { - println!( + display_line!( + IO, "{:4}Yay votes: {}", - "", partial_proposal_result.total_yay_power + "", + partial_proposal_result.total_yay_power ); - println!( + display_line!( + IO, "{:4}Nay votes: {}", - "", partial_proposal_result.total_nay_power + "", + partial_proposal_result.total_nay_power ); - println!("{:4}Status: on-going", ""); + display_line!(IO, "{:4}Status: on-going", ""); } Err(msg) => { - eprintln!("Error in tally computation: {}", msg) + edisplay!(IO, "Error in tally computation: {}", msg); } } } else { match utils::compute_tally(votes, total_stake, &proposal_type) { Ok(proposal_result) => { - println!("{:4}Status: done", ""); - println!("{:4}Result: {}", "", proposal_result); + display_line!(IO, "{:4}Status: done", ""); + display_line!( + IO, + "{:4}Result: {}", + "", + proposal_result + ); } Err(msg) => { - eprintln!("Error in tally computation: {}", msg) + edisplay!(IO, "Error in tally computation: {}", msg); } } } } else { - println!("Proposal: {}", id); - println!("{:4}Type: {}", "", proposal_type); - println!("{:4}Author: {}", "", author); - println!("{:4}Start Epoch: {}", "", start_epoch); - println!("{:4}End Epoch: {}", "", end_epoch); + display_line!(IO, "Proposal: {}", id); + display_line!(IO, "{:4}Type: {}", "", proposal_type); + display_line!(IO, "{:4}Author: {}", "", author); + display_line!(IO, "{:4}Start Epoch: {}", "", start_epoch); + display_line!(IO, "{:4}End Epoch: {}", "", end_epoch); if start_epoch > current_epoch { - println!("{:4}Status: pending", ""); + display_line!(IO, "{:4}Status: pending", ""); } else if start_epoch <= current_epoch && current_epoch <= end_epoch { - println!("{:4}Status: on-going", ""); + display_line!(IO, "{:4}Status: on-going", ""); } else { - println!("{:4}Status: done", ""); + display_line!(IO, "{:4}Status: done", ""); } } Some(()) } - let current_epoch = query_and_print_epoch(client).await; + let current_epoch = query_and_print_epoch::<_, IO>(client).await; match args.proposal_id { Some(id) => { - if print_proposal::(client, id, current_epoch, true) + if print_proposal::(client, id, current_epoch, true) .await .is_none() { - eprintln!("No valid proposal was found with id {}", id) + edisplay!(IO, "No valid proposal was found with id {}", id); } } None => { @@ -747,11 +832,11 @@ pub async fn query_proposal( .unwrap(); for id in 0..last_proposal_id { - if print_proposal::(client, id, current_epoch, false) + if print_proposal::(client, id, current_epoch, false) .await .is_none() { - eprintln!("No valid proposal was found with id {}", id) + edisplay!(IO, "No valid proposal was found with id {}", id); }; } } @@ -762,6 +847,7 @@ pub async fn query_proposal( pub async fn query_shielded_balance< C: namada::ledger::queries::Client + Sync, U: ShieldedUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -788,7 +874,7 @@ pub async fn query_shielded_balance< // Save the update state so that future fetches can be short-circuited let _ = shielded.save().await; // The epoch is required to identify timestamped tokens - let epoch = query_and_print_epoch(client).await; + let epoch = query_and_print_epoch::<_, IO>(client).await; // Map addresses to token names let tokens = wallet.get_addresses_with_vp_type(AddressVpType::Token); match (args.token, owner.is_some()) { @@ -804,7 +890,11 @@ pub async fn query_shielded_balance< .expect("context should contain viewing key") } else { shielded - .compute_exchanged_balance(client, &viewing_key, epoch) + .compute_exchanged_balance::<_, IO>( + client, + &viewing_key, + epoch, + ) .await .expect("context should contain viewing key") }; @@ -821,15 +911,17 @@ pub async fn query_shielded_balance< .cloned() .unwrap_or_default(); if total_balance.is_zero() { - println!( + display_line!( + IO, "No shielded {} balance found for given key", token_address.format_with_alias(&token_alias) ); } else { - println!( + display_line!( + IO, "{}: {}", token_address.format_with_alias(&token_alias), - format_denominated_amount( + format_denominated_amount::<_, IO>( client, &token_address, token::Amount::from(total_balance) @@ -852,7 +944,11 @@ pub async fn query_shielded_balance< .expect("context should contain viewing key") } else { shielded - .compute_exchanged_balance(client, &viewing_key, epoch) + .compute_exchanged_balance::<_, IO>( + client, + &viewing_key, + epoch, + ) .await .expect("context should contain viewing key") }; @@ -876,7 +972,8 @@ pub async fn query_shielded_balance< // remove this from here, should not be making the // hashtable creation any uglier if balances.is_empty() { - println!( + display_line!( + IO, "No shielded {} balance found for any wallet key", &token_addr ); @@ -910,17 +1007,18 @@ pub async fn query_shielded_balance< .get(&token_address.address) .map(|a| a.to_string()) .unwrap_or_else(|| token_address.address.to_string()); - println!( + display_line!( + IO, "Shielded Token {}:", token_address.format_with_alias(&alias), ); - let formatted = format_denominated_amount( + let formatted = format_denominated_amount::<_, IO>( client, &token_address, token_balance.into(), ) .await; - println!(" {}, owned by {}", formatted, fvk); + display_line!(IO, " {}, owned by {}", formatted, fvk); } // Print zero balances for remaining assets for token in tokens { @@ -930,19 +1028,28 @@ pub async fn query_shielded_balance< match sub_addr { // abstract out these prints Some(sub_addr) => { - println!( + display_line!( + IO, "Shielded Token {}/{}:", - token_alias, sub_addr + token_alias, + sub_addr ); - println!( + display_line!( + IO, "No shielded {}/{} balance found for any \ wallet key", - token_alias, sub_addr + token_alias, + sub_addr ); } None => { - println!("Shielded Token {}:", token_alias,); - println!( + display_line!( + IO, + "Shielded Token {}:", + token_alias + ); + display_line!( + IO, "No shielded {} balance found for any \ wallet key", token_alias @@ -966,7 +1073,7 @@ pub async fn query_shielded_balance< ) .unwrap(); let token_alias = lookup_alias(wallet, &token); - println!("Shielded Token {}:", token_alias); + display_line!(IO, "Shielded Token {}:", token_alias); let mut found_any = false; let token_alias = lookup_alias(wallet, &token); let token_address = TokenAddress { @@ -976,7 +1083,8 @@ pub async fn query_shielded_balance< .as_ref() .map(|k| Key::parse(k).unwrap()), }; - println!( + display_line!( + IO, "Shielded Token {}:", token_address.format_with_alias(&token_alias), ); @@ -990,7 +1098,11 @@ pub async fn query_shielded_balance< .expect("context should contain viewing key") } else { shielded - .compute_exchanged_balance(client, &viewing_key, epoch) + .compute_exchanged_balance::<_, IO>( + client, + &viewing_key, + epoch, + ) .await .expect("context should contain viewing key") }; @@ -999,17 +1111,18 @@ pub async fn query_shielded_balance< if !val.is_zero() { found_any = true; } - let formatted = format_denominated_amount( + let formatted = format_denominated_amount::<_, IO>( client, address, (*val).into(), ) .await; - println!(" {}, owned by {}", formatted, fvk); + display_line!(IO, " {}, owned by {}", formatted, fvk); } } if !found_any { - println!( + display_line!( + IO, "No shielded {} balance found for any wallet key", token_address.format_with_alias(&token_alias), ); @@ -1026,14 +1139,22 @@ pub async fn query_shielded_balance< .await .expect("context should contain viewing key"); // Print balances by human-readable token names - print_decoded_balance_with_epoch(client, wallet, balance).await; + print_decoded_balance_with_epoch::<_, IO>( + client, wallet, balance, + ) + .await; } else { let balance = shielded - .compute_exchanged_balance(client, &viewing_key, epoch) + .compute_exchanged_balance::<_, IO>( + client, + &viewing_key, + epoch, + ) .await .expect("context should contain viewing key"); // Print balances by human-readable token names - print_decoded_balance(client, wallet, balance, epoch).await; + print_decoded_balance::<_, IO>(client, wallet, balance, epoch) + .await; } } } @@ -1041,6 +1162,7 @@ pub async fn query_shielded_balance< pub async fn print_decoded_balance< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -1048,20 +1170,25 @@ pub async fn print_decoded_balance< epoch: Epoch, ) { if decoded_balance.is_empty() { - println!("No shielded balance found for given key"); + display_line!(IO, "No shielded balance found for given key"); } else { for ((_, token_addr), amount) in decoded_balance .iter() .filter(|((token_epoch, _), _)| *token_epoch == epoch) { - println!( + display_line!( + IO, "{} : {}", token_addr.format_with_alias(&lookup_alias( wallet, &token_addr.address )), - format_denominated_amount(client, token_addr, (*amount).into()) - .await, + format_denominated_amount::<_, IO>( + client, + token_addr, + (*amount).into() + ) + .await, ); } } @@ -1069,6 +1196,7 @@ pub async fn print_decoded_balance< pub async fn print_decoded_balance_with_epoch< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -1076,7 +1204,7 @@ pub async fn print_decoded_balance_with_epoch< ) { let tokens = wallet.get_addresses_with_vp_type(AddressVpType::Token); if decoded_balance.is_empty() { - println!("No shielded balance found for given key"); + display_line!(IO, "No shielded balance found for given key"); } for ((epoch, token_addr), value) in decoded_balance.iter() { let asset_value = (*value).into(); @@ -1084,11 +1212,13 @@ pub async fn print_decoded_balance_with_epoch< .get(&token_addr.address) .map(|a| a.to_string()) .unwrap_or_else(|| token_addr.to_string()); - println!( + display_line!( + IO, "{} | {} : {}", token_addr.format_with_alias(&alias), epoch, - format_denominated_amount(client, token_addr, asset_value).await, + format_denominated_amount::<_, IO>(client, token_addr, asset_value) + .await, ); } } @@ -1104,6 +1234,7 @@ pub async fn get_token_balance( pub async fn query_proposal_result< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, args: args::QueryProposalResult, @@ -1120,7 +1251,8 @@ pub async fn query_proposal_result< Some(end_epoch) => { if current_epoch > end_epoch { let votes = - get_proposal_votes(client, end_epoch, id).await; + get_proposal_votes::<_, IO>(client, end_epoch, id) + .await; let proposal_type_key = gov_storage::get_proposal_type_key(id); let proposal_type = query_storage_value::< @@ -1136,26 +1268,35 @@ pub async fn query_proposal_result< .await .try_into() .unwrap(); - println!("Proposal: {}", id); + display_line!(IO, "Proposal: {}", id); match utils::compute_tally( votes, total_stake, &proposal_type, ) { Ok(proposal_result) => { - println!("{:4}Result: {}", "", proposal_result) + display_line!( + IO, + "{:4}Result: {}", + "", + proposal_result + ); } Err(msg) => { - eprintln!("Error in tally computation: {}", msg) + edisplay!( + IO, + "Error in tally computation: {}", + msg + ); } } } else { - eprintln!("Proposal is still in progress."); + edisplay!(IO, "Proposal is still in progress."); cli::safe_exit(1) } } None => { - eprintln!("Error while retriving proposal."); + edisplay!(IO, "Error while retriving proposal."); cli::safe_exit(1) } } @@ -1193,7 +1334,8 @@ pub async fn query_proposal_result< } } Err(e) => { - eprintln!( + edisplay!( + IO, "Can't read entry type: {}.", e ); @@ -1201,14 +1343,15 @@ pub async fn query_proposal_result< } }, Err(e) => { - eprintln!("Can't read entry: {}.", e); + edisplay!(IO, "Can't read entry: {}.", e); cli::safe_exit(1) } } } if !is_proposal_present { - eprintln!( + edisplay!( + IO, "The folder must contain the offline proposal \ in a file named \"proposal\"" ); @@ -1228,7 +1371,7 @@ pub async fn query_proposal_result< .expect("Public key should exist."); if !proposal.check_signature(&public_key) { - eprintln!("Bad proposal signature."); + edisplay!(IO, "Bad proposal signature."); cli::safe_exit(1) } @@ -1251,22 +1394,33 @@ pub async fn query_proposal_result< &ProposalType::Default(None), ) { Ok(proposal_result) => { - println!("{:4}Result: {}", "", proposal_result) + display_line!( + IO, + "{:4}Result: {}", + "", + proposal_result + ); } Err(msg) => { - eprintln!("Error in tally computation: {}", msg) + edisplay!( + IO, + "Error in tally computation: {}", + msg + ); } } } None => { - eprintln!( + edisplay!( + IO, "Offline flag must be followed by data-path." ); cli::safe_exit(1) } }; } else { - eprintln!( + edisplay!( + IO, "Either --proposal-id or --data-path should be provided \ as arguments." ); @@ -1278,73 +1432,93 @@ pub async fn query_proposal_result< pub async fn query_protocol_parameters< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, _args: args::QueryProtocolParameters, ) { let gov_parameters = get_governance_parameters(client).await; - println!("Governance Parameters\n {:4}", gov_parameters); + display_line!(IO, "Governance Parameters\n {:4}", gov_parameters); - println!("Protocol parameters"); + display_line!(IO, "Protocol parameters"); let key = param_storage::get_epoch_duration_storage_key(); let epoch_duration = query_storage_value::(client, &key) .await .expect("Parameter should be definied."); - println!( + display_line!( + IO, "{:4}Min. epoch duration: {}", - "", epoch_duration.min_duration + "", + epoch_duration.min_duration ); - println!( + display_line!( + IO, "{:4}Min. number of blocks: {}", - "", epoch_duration.min_num_of_blocks + "", + epoch_duration.min_num_of_blocks ); let key = param_storage::get_max_expected_time_per_block_key(); let max_block_duration = query_storage_value::(client, &key) .await .expect("Parameter should be defined."); - println!("{:4}Max. block duration: {}", "", max_block_duration); + display_line!(IO, "{:4}Max. block duration: {}", "", max_block_duration); let key = param_storage::get_tx_whitelist_storage_key(); let vp_whitelist = query_storage_value::>(client, &key) .await .expect("Parameter should be defined."); - println!("{:4}VP whitelist: {:?}", "", vp_whitelist); + display_line!(IO, "{:4}VP whitelist: {:?}", "", vp_whitelist); let key = param_storage::get_tx_whitelist_storage_key(); let tx_whitelist = query_storage_value::>(client, &key) .await .expect("Parameter should be defined."); - println!("{:4}Transactions whitelist: {:?}", "", tx_whitelist); + display_line!(IO, "{:4}Transactions whitelist: {:?}", "", tx_whitelist); - println!("PoS parameters"); + display_line!(IO, "PoS parameters"); let key = pos::params_key(); let pos_params = query_storage_value::(client, &key) .await .expect("Parameter should be defined."); - println!( + display_line!( + IO, "{:4}Block proposer reward: {}", - "", pos_params.block_proposer_reward + "", + pos_params.block_proposer_reward ); - println!( + display_line!( + IO, "{:4}Block vote reward: {}", - "", pos_params.block_vote_reward + "", + pos_params.block_vote_reward ); - println!( + display_line!( + IO, "{:4}Duplicate vote minimum slash rate: {}", - "", pos_params.duplicate_vote_min_slash_rate + "", + pos_params.duplicate_vote_min_slash_rate ); - println!( + display_line!( + IO, "{:4}Light client attack minimum slash rate: {}", - "", pos_params.light_client_attack_min_slash_rate + "", + pos_params.light_client_attack_min_slash_rate ); - println!( + display_line!( + IO, "{:4}Max. validator slots: {}", - "", pos_params.max_validator_slots + "", + pos_params.max_validator_slots + ); + display_line!(IO, "{:4}Pipeline length: {}", "", pos_params.pipeline_len); + display_line!(IO, "{:4}Unbonding length: {}", "", pos_params.unbonding_len); + display_line!( + IO, + "{:4}Votes per token: {}", + "", + pos_params.tm_votes_per_token ); - println!("{:4}Pipeline length: {}", "", pos_params.pipeline_len); - println!("{:4}Unbonding length: {}", "", pos_params.unbonding_len); - println!("{:4}Votes per token: {}", "", pos_params.tm_votes_per_token); } pub async fn query_bond( @@ -1375,6 +1549,7 @@ pub async fn query_unbond_with_slashing< pub async fn query_and_print_unbonds< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, source: &Address, @@ -1395,16 +1570,18 @@ pub async fn query_and_print_unbonds< } } if total_withdrawable != token::Amount::default() { - println!( + display_line!( + IO, "Total withdrawable now: {}.", total_withdrawable.to_string_native() ); } if !not_yet_withdrawable.is_empty() { - println!("Current epoch: {current_epoch}.") + display_line!(IO, "Current epoch: {current_epoch}."); } for (withdraw_epoch, amount) in not_yet_withdrawable { - println!( + display_line!( + IO, "Amount {} withdrawable starting from epoch {withdraw_epoch}.", amount.to_string_native(), ); @@ -1428,12 +1605,12 @@ pub async fn query_withdrawable_tokens< } /// Query PoS bond(s) and unbond(s) -pub async fn query_bonds( +pub async fn query_bonds( client: &C, _wallet: &mut Wallet, args: args::QueryBonds, ) -> std::io::Result<()> { - let epoch = query_and_print_epoch(client).await; + let epoch = query_and_print_epoch::<_, IO>(client).await; let source = args.owner; let validator = args.validator; @@ -1453,24 +1630,26 @@ pub async fn query_bonds( bond_id.source, bond_id.validator ) }; - writeln!(w, "{}:", bond_type)?; + display_line!(IO, &mut w; "{}:", bond_type)?; for bond in &details.data.bonds { - writeln!( - w, + display_line!( + IO, + &mut w; " Remaining active bond from epoch {}: Δ {}", bond.start, bond.amount.to_string_native() )?; } if details.bonds_total != token::Amount::zero() { - writeln!( - w, + display_line!( + IO, + &mut w; "Active (slashed) bonds total: {}", details.bonds_total_active().to_string_native() )?; } - writeln!(w, "Bonds total: {}", details.bonds_total.to_string_native())?; - writeln!(w)?; + display_line!(IO, &mut w; "Bonds total: {}", details.bonds_total.to_string_native())?; + display_line!(IO, &mut w; "")?; if !details.data.unbonds.is_empty() { let bond_type = if bond_id.source == bond_id.validator { @@ -1478,38 +1657,43 @@ pub async fn query_bonds( } else { format!("Unbonded delegations from {}", bond_id.source) }; - writeln!(w, "{}:", bond_type)?; + display_line!(IO, &mut w; "{}:", bond_type)?; for unbond in &details.data.unbonds { - writeln!( - w, + display_line!( + IO, + &mut w; " Withdrawable from epoch {} (active from {}): Δ {}", unbond.withdraw, unbond.start, unbond.amount.to_string_native() )?; } - writeln!( - w, + display_line!( + IO, + &mut w; "Unbonded total: {}", details.unbonds_total.to_string_native() )?; } - writeln!( - w, + display_line!( + IO, + &mut w; "Withdrawable total: {}", details.total_withdrawable.to_string_native() )?; - writeln!(w)?; + display_line!(IO, &mut w; "")?; } if bonds_and_unbonds.bonds_total != bonds_and_unbonds.bonds_total_slashed { - writeln!( - w, + display_line!( + IO, + &mut w; "All bonds total active: {}", bonds_and_unbonds.bonds_total_active().to_string_native() )?; } - writeln!( - w, + display_line!( + IO, + &mut w; "All bonds total: {}", bonds_and_unbonds.bonds_total.to_string_native() )?; @@ -1517,19 +1701,22 @@ pub async fn query_bonds( if bonds_and_unbonds.unbonds_total != bonds_and_unbonds.unbonds_total_slashed { - writeln!( - w, + display_line!( + IO, + &mut w; "All unbonds total active: {}", bonds_and_unbonds.unbonds_total_active().to_string_native() )?; } - writeln!( - w, + display_line!( + IO, + &mut w; "All unbonds total: {}", bonds_and_unbonds.unbonds_total.to_string_native() )?; - writeln!( - w, + display_line!( + IO, + &mut w; "All unbonds total withdrawable: {}", bonds_and_unbonds.total_withdrawable.to_string_native() )?; @@ -1537,13 +1724,16 @@ pub async fn query_bonds( } /// Query PoS bonded stake -pub async fn query_bonded_stake( +pub async fn query_bonded_stake< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, args: args::QueryBondedStake, ) { let epoch = match args.epoch { Some(epoch) => epoch, - None => query_and_print_epoch(client).await, + None => query_and_print_epoch::<_, IO>(client).await, }; match args.validator { @@ -1555,13 +1745,14 @@ pub async fn query_bonded_stake( Some(stake) => { // TODO: show if it's in consensus set, below capacity, or // below threshold set - println!( + display_line!( + IO, "Bonded stake of validator {validator}: {}", stake.to_string_native() ) } None => { - println!("No bonded stake found for {validator}") + display_line!(IO, "No bonded stake found for {validator}"); } } } @@ -1585,21 +1776,24 @@ pub async fn query_bonded_stake( let stdout = io::stdout(); let mut w = stdout.lock(); - writeln!(w, "Consensus validators:").unwrap(); + display_line!(IO, &mut w; "Consensus validators:").unwrap(); for val in consensus { - writeln!( - w, - " {}: {}", - val.address.encode(), - val.bonded_stake.to_string_native() + display_line!( + IO, + &mut w; + " {}: {}", + val.address.encode(), + val.bonded_stake.to_string_native() ) .unwrap(); } if !below_capacity.is_empty() { - writeln!(w, "Below capacity validators:").unwrap(); + display_line!(IO, &mut w; "Below capacity validators:") + .unwrap(); for val in &below_capacity { - writeln!( - w, + display_line!( + IO, + &mut w; " {}: {}", val.address.encode(), val.bonded_stake.to_string_native() @@ -1611,7 +1805,8 @@ pub async fn query_bonded_stake( } let total_staked_tokens = get_total_staked_tokens(client, epoch).await; - println!( + display_line!( + IO, "Total bonded stake: {}", total_staked_tokens.to_string_native() ); @@ -1637,6 +1832,7 @@ pub async fn query_commission_rate< /// Query PoS validator's commission rate information pub async fn query_and_print_commission_rate< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, _wallet: &mut Wallet, @@ -1651,7 +1847,8 @@ pub async fn query_and_print_commission_rate< commission_rate: rate, max_commission_change_per_epoch: change, }) => { - println!( + display_line!( + IO, "Validator {} commission rate: {}, max change per epoch: {}", validator.encode(), rate, @@ -1659,7 +1856,8 @@ pub async fn query_and_print_commission_rate< ); } None => { - println!( + display_line!( + IO, "Address {} is not a validator (did not find commission rate \ and max change)", validator.encode(), @@ -1669,7 +1867,10 @@ pub async fn query_and_print_commission_rate< } /// Query PoS slashes -pub async fn query_slashes( +pub async fn query_slashes< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, _wallet: &mut Wallet, args: args::QuerySlashes, @@ -1690,15 +1891,16 @@ pub async fn query_slashes( let stdout = io::stdout(); let mut w = stdout.lock(); for slash in slashes { - writeln!( - w, - "Slash epoch {}, type {}, rate {}", - slash.epoch, slash.r#type, slash.rate + display_line!( + IO, + &mut w; + "Slash epoch {}, type {}, rate {}", + slash.epoch, slash.r#type, slash.rate ) .unwrap(); } } else { - println!("No slashes found for {}", validator.encode()) + display_line!(IO, "No slashes found for {}", validator.encode()) } } None => { @@ -1712,8 +1914,9 @@ pub async fn query_slashes( let mut w = stdout.lock(); for (validator, slashes) in all_slashes.into_iter() { for slash in slashes { - writeln!( - w, + display_line!( + IO, + &mut w; "Slash epoch {}, block height {}, rate {}, type \ {}, validator {}", slash.epoch, @@ -1726,13 +1929,16 @@ pub async fn query_slashes( } } } else { - println!("No slashes found") + display_line!(IO, "No slashes found") } } } } -pub async fn query_delegations( +pub async fn query_delegations< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, _wallet: &mut Wallet, args: args::QueryDelegations, @@ -1742,22 +1948,26 @@ pub async fn query_delegations( RPC.vp().pos().delegation_validators(client, &owner).await, ); if delegations.is_empty() { - println!("No delegations found"); + display_line!(IO, "No delegations found"); } else { - println!("Found delegations to:"); + display_line!(IO, "Found delegations to:"); for delegation in delegations { - println!(" {delegation}"); + display_line!(IO, " {delegation}"); } } } -pub async fn query_find_validator( +pub async fn query_find_validator< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, args: args::QueryFindValidator, ) { let args::QueryFindValidator { query: _, tm_addr } = args; if tm_addr.len() != 40 { - eprintln!( + edisplay!( + IO, "Expected 40 characters in Tendermint address, got {}", tm_addr.len() ); @@ -1768,22 +1978,28 @@ pub async fn query_find_validator( RPC.vp().pos().validator_by_tm_addr(client, &tm_addr).await, ); match validator { - Some(address) => println!("Found validator address \"{address}\"."), + Some(address) => { + display_line!(IO, "Found validator address \"{address}\".") + } None => { - println!("No validator with Tendermint address {tm_addr} found.") + display_line!( + IO, + "No validator with Tendermint address {tm_addr} found." + ) } } } /// Dry run a transaction -pub async fn dry_run_tx(client: &C, tx_bytes: Vec) +pub async fn dry_run_tx(client: &C, tx_bytes: Vec) where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - println!( + display_line!( + IO, "Dry-run result: {}", - namada::ledger::rpc::dry_run_tx(client, tx_bytes).await + namada::ledger::rpc::dry_run_tx::<_, IO>(client, tx_bytes).await ); } @@ -1830,7 +2046,10 @@ pub async fn known_address( } /// Query for all conversions. -pub async fn query_conversions( +pub async fn query_conversions< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, wallet: &mut Wallet, args: args::QueryConversions, @@ -1863,7 +2082,8 @@ pub async fn query_conversions( } conversions_found = true; // Print the asset to which the conversion applies - print!( + display!( + IO, "{}{}[{}]: ", tokens.get(addr).cloned().unwrap_or_else(|| addr.clone()), sub.as_ref().map(|k| format!("/{}", k)).unwrap_or_default(), @@ -1876,7 +2096,8 @@ pub async fn query_conversions( // printing let ((addr, sub, _), epoch, _, _) = &conv_state.assets[asset_type]; // Now print out this component of the conversion - print!( + display!( + IO, "{}{} {}{}[{}]", prefix, val, @@ -1888,10 +2109,13 @@ pub async fn query_conversions( prefix = " + "; } // Allowed conversions are always implicit equations - println!(" = 0"); + display_line!(IO, " = 0"); } if !conversions_found { - println!("No conversions found satisfying specified criteria."); + display_line!( + IO, + "No conversions found satisfying specified criteria." + ); } } @@ -1911,11 +2135,14 @@ pub async fn query_conversion( } /// Query a wasm code hash -pub async fn query_wasm_code_hash( +pub async fn query_wasm_code_hash< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, code_path: impl AsRef, ) -> Option { - namada::ledger::rpc::query_wasm_code_hash(client, code_path).await + namada::ledger::rpc::query_wasm_code_hash::<_, IO>(client, code_path).await } /// Query a storage value and decode it with [`BorshDeserialize`]. @@ -1948,6 +2175,7 @@ pub async fn query_storage_value_bytes< pub async fn query_storage_prefix< C: namada::ledger::queries::Client + Sync, T, + IO: Io, >( client: &C, key: &storage::Key, @@ -1955,7 +2183,7 @@ pub async fn query_storage_prefix< where T: BorshDeserialize, { - namada::ledger::rpc::query_storage_prefix(client, key).await + namada::ledger::rpc::query_storage_prefix::<_, IO, _>(client, key).await } /// Query to check if the given storage key exists. @@ -1991,7 +2219,7 @@ pub async fn query_tx_response( /// Lookup the results of applying the specified transaction to the /// blockchain. -pub async fn query_result( +pub async fn query_result( client: &C, args: args::QueryResult, ) { @@ -2003,7 +2231,8 @@ pub async fn query_result( .await; match tx_response { Ok(result) => { - println!( + display_line!( + IO, "Transaction was applied with result: {}", serde_json::to_string_pretty(&result).unwrap() ) @@ -2016,13 +2245,14 @@ pub async fn query_result( ) .await; match tx_response { - Ok(result) => println!( + Ok(result) => display_line!( + IO, "Transaction was accepted with result: {}", serde_json::to_string_pretty(&result).unwrap() ), Err(err2) => { // Print the errors that caused the lookups to fail - eprintln!("{}\n{}", err1, err2); + edisplay!(IO, "{}\n{}", err1, err2); cli::safe_exit(1) } } @@ -2030,12 +2260,16 @@ pub async fn query_result( } } -pub async fn get_proposal_votes( +pub async fn get_proposal_votes< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, epoch: Epoch, proposal_id: u64, ) -> Votes { - namada::ledger::rpc::get_proposal_votes(client, epoch, proposal_id).await + namada::ledger::rpc::get_proposal_votes::<_, IO>(client, epoch, proposal_id) + .await } pub async fn get_proposal_offline_votes< @@ -2309,7 +2543,10 @@ fn unwrap_client_response( } /// Get the correct representation of the amount given the token type. -pub async fn validate_amount( +pub async fn validate_amount< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, amount: InputAmount, token: &Address, @@ -2328,13 +2565,15 @@ pub async fn validate_amount( ) .unwrap_or_else(|| { if force { - println!( + display_line!( + IO, "No denomination found for token: {token}, but --force was \ passed. Defaulting to the provided denomination." ); input_amount.denom } else { - println!( + display_line!( + IO, "No denomination found for token: {token}, the input \ arguments could not be parsed." ); @@ -2342,14 +2581,16 @@ pub async fn validate_amount( } }); if denom < input_amount.denom && !force { - println!( + display_line!( + IO, "The input amount contained a higher precision than allowed by \ {token}." ); cli::safe_exit(1); } else { input_amount.increase_precision(denom).unwrap_or_else(|_| { - println!( + display_line!( + IO, "The amount provided requires more the 256 bits to represent." ); cli::safe_exit(1); diff --git a/apps/src/lib/client/signing.rs b/apps/src/lib/client/signing.rs index 3c2a5d67fe1..34ee2bcc299 100644 --- a/apps/src/lib/client/signing.rs +++ b/apps/src/lib/client/signing.rs @@ -8,13 +8,14 @@ use namada::ledger::wallet::{Wallet, WalletUtils}; use namada::proof_of_stake::Epoch; use namada::proto::Tx; use namada::types::address::Address; +use namada::types::io::Io; use namada::types::key::*; use crate::cli::args; /// Find the public key for the given address and try to load the keypair /// for it from the wallet. Panics if the key cannot be found or loaded. -pub async fn find_pk( +pub async fn find_pk( client: &C, wallet: &mut Wallet, addr: &Address, @@ -24,14 +25,15 @@ where C::Error: std::fmt::Display, U: WalletUtils, { - namada::ledger::signing::find_pk(client, wallet, addr, None).await + namada::ledger::signing::find_pk::<_, _, IO>(client, wallet, addr, None) + .await } /// Given CLI arguments and some defaults, determine the rightful transaction /// signer. Return the given signing key or public key of the given signer if /// possible. If no explicit signer given, use the `default`. If no `default` /// is given, panics. -pub async fn tx_signer( +pub async fn tx_signer( client: &C, wallet: &mut Wallet, args: &args::Tx, @@ -42,8 +44,10 @@ where C::Error: std::fmt::Display, U: WalletUtils, { - namada::ledger::signing::tx_signer::(client, wallet, args, default) - .await + namada::ledger::signing::tx_signer::( + client, wallet, args, default, + ) + .await } /// Sign a transaction with a given signing key or public key of a given signer. @@ -71,7 +75,7 @@ where /// Create a wrapper tx from a normal tx. Get the hash of the /// wrapper and its payload which is needed for monitoring its /// progress on chain. -pub async fn sign_wrapper( +pub async fn sign_wrapper( client: &C, wallet: &mut Wallet, args: &args::Tx, @@ -85,7 +89,7 @@ where C::Error: std::fmt::Display, U: WalletUtils, { - namada::ledger::signing::sign_wrapper( + namada::ledger::signing::sign_wrapper::<_, _, IO>( client, wallet, args, diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index e2683babbaa..75067088a83 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -22,11 +22,13 @@ use namada::types::dec::Dec; use namada::types::governance::{ OfflineProposal, OfflineVote, Proposal, ProposalVote, VoteType, }; +use namada::types::io::Io; use namada::types::key::{self, *}; use namada::types::storage::{Epoch, Key}; use namada::types::token; use namada::types::transaction::governance::{ProposalType, VoteProposalData}; use namada::types::transaction::{InitValidator, TxType}; +use namada::{display_line, edisplay}; use super::rpc; use crate::cli::context::WalletAddress; @@ -40,7 +42,10 @@ use crate::node::ledger::tendermint_node; use crate::wallet::{gen_validator_keys, read_and_confirm_encryption_password}; // Build a transaction to reveal the signer of the given transaction. -pub async fn submit_reveal_aux( +pub async fn submit_reveal_aux< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, ctx: &mut Context, args: &args::Tx, @@ -49,7 +54,7 @@ pub async fn submit_reveal_aux( tx: &mut Tx, ) -> Result<(), tx::Error> { if let Some(Address::Implicit(_)) = addr { - let reveal_pk = tx::build_reveal_pk( + let reveal_pk = tx::build_reveal_pk::<_, _, IO>( client, &mut ctx.wallet, args::RevealPk { @@ -62,16 +67,20 @@ pub async fn submit_reveal_aux( // Sign the reveal public key transaction with the fee payer signing::sign_tx(&mut ctx.wallet, &mut rtx, args, &pk).await?; // Submit the reveal public key transaction first - tx::process_tx(client, &mut ctx.wallet, args, rtx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, args, rtx) + .await?; // Update the stateful PoW challenge of the outer transaction #[cfg(not(feature = "mainnet"))] - signing::update_pow_challenge(client, args, tx, &pk, false).await; + signing::update_pow_challenge::<_, IO>( + client, args, tx, &pk, false, + ) + .await; } } Ok(()) } -pub async fn submit_custom( +pub async fn submit_custom( client: &C, ctx: &mut Context, args: args::TxCustom, @@ -81,14 +90,23 @@ where C::Error: std::fmt::Display, { let (mut tx, addr, pk) = - tx::build_custom(client, &mut ctx.wallet, args.clone()).await?; - submit_reveal_aux(client, ctx, &args.tx, addr, pk.clone(), &mut tx).await?; + tx::build_custom::<_, _, IO>(client, &mut ctx.wallet, args.clone()) + .await?; + submit_reveal_aux::<_, IO>( + client, + ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; Ok(()) } -pub async fn submit_update_vp( +pub async fn submit_update_vp( client: &C, ctx: &mut Context, args: args::TxUpdateVp, @@ -98,14 +116,23 @@ where C::Error: std::fmt::Display, { let (mut tx, addr, pk) = - tx::build_update_vp(client, &mut ctx.wallet, args.clone()).await?; - submit_reveal_aux(client, ctx, &args.tx, addr, pk.clone(), &mut tx).await?; + tx::build_update_vp::<_, _, IO>(client, &mut ctx.wallet, args.clone()) + .await?; + submit_reveal_aux::<_, IO>( + client, + ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; Ok(()) } -pub async fn submit_init_account( +pub async fn submit_init_account( client: &C, ctx: &mut Context, args: args::TxInitAccount, @@ -114,15 +141,27 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = - tx::build_init_account(client, &mut ctx.wallet, args.clone()).await?; - submit_reveal_aux(client, ctx, &args.tx, addr, pk.clone(), &mut tx).await?; + let (mut tx, addr, pk) = tx::build_init_account::<_, _, IO>( + client, + &mut ctx.wallet, + args.clone(), + ) + .await?; + submit_reveal_aux::<_, IO>( + client, + ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; Ok(()) } -pub async fn submit_init_validator( +pub async fn submit_init_validator( client: &C, mut ctx: Context, args::TxInitValidator { @@ -163,7 +202,7 @@ where let eth_hot_key_alias = format!("{}-eth-hot-key", alias); let eth_cold_key_alias = format!("{}-eth-cold-key", alias); let account_key = account_key.unwrap_or_else(|| { - println!("Generating validator account key..."); + display_line!(IO, "Generating validator account key..."); let password = read_and_confirm_encryption_password(unsafe_dont_encrypt); ctx.wallet @@ -184,12 +223,12 @@ where .map(|key| match key { common::SecretKey::Ed25519(_) => key, common::SecretKey::Secp256k1(_) => { - eprintln!("Consensus key can only be ed25519"); + edisplay!(IO, "Consensus key can only be ed25519"); safe_exit(1) } }) .unwrap_or_else(|| { - println!("Generating consensus key..."); + display_line!(IO, "Generating consensus key..."); let password = read_and_confirm_encryption_password(unsafe_dont_encrypt); ctx.wallet @@ -210,12 +249,12 @@ where .map(|key| match key { common::SecretKey::Secp256k1(_) => key.ref_to(), common::SecretKey::Ed25519(_) => { - eprintln!("Eth cold key can only be secp256k1"); + edisplay!(IO, "Eth cold key can only be secp256k1"); safe_exit(1) } }) .unwrap_or_else(|| { - println!("Generating Eth cold key..."); + display_line!(IO, "Generating Eth cold key..."); let password = read_and_confirm_encryption_password(unsafe_dont_encrypt); ctx.wallet @@ -237,12 +276,12 @@ where .map(|key| match key { common::SecretKey::Secp256k1(_) => key.ref_to(), common::SecretKey::Ed25519(_) => { - eprintln!("Eth hot key can only be secp256k1"); + edisplay!(IO, "Eth hot key can only be secp256k1"); safe_exit(1) } }) .unwrap_or_else(|| { - println!("Generating Eth hot key..."); + display_line!(IO, "Generating Eth hot key..."); let password = read_and_confirm_encryption_password(unsafe_dont_encrypt); ctx.wallet @@ -261,7 +300,7 @@ where }); if protocol_key.is_none() { - println!("Generating protocol signing key..."); + display_line!(IO, "Generating protocol signing key..."); } // Generate the validator keys let validator_keys = gen_validator_keys( @@ -278,7 +317,7 @@ where .expect("DKG sessions keys should have been created") .public(); - let validator_vp_code_hash = query_wasm_code_hash::( + let validator_vp_code_hash = query_wasm_code_hash::( client, validator_vp_code_path.to_str().unwrap(), ) @@ -287,7 +326,8 @@ where // Validate the commission rate data if commission_rate > Dec::one() || commission_rate < Dec::zero() { - eprintln!( + edisplay!( + IO, "The validator commission rate must not exceed 1.0 or 100%, and \ it must be 0 or positive" ); @@ -298,7 +338,8 @@ where if max_commission_rate_change > Dec::one() || max_commission_rate_change < Dec::zero() { - eprintln!( + edisplay!( + IO, "The validator maximum change in commission rate per epoch must \ not exceed 1.0 or 100%" ); @@ -307,7 +348,7 @@ where } } let tx_code_hash = - query_wasm_code_hash(client, args::TX_INIT_VALIDATOR_WASM) + query_wasm_code_hash::<_, IO>(client, args::TX_INIT_VALIDATOR_WASM) .await .unwrap(); @@ -334,7 +375,7 @@ where tx.set_data(Data::new(data)); tx.set_code(Code::from_hash(tx_code_hash)); - let (mut tx, addr, pk) = tx::prepare_tx( + let (mut tx, addr, pk) = tx::prepare_tx::<_, _, IO>( client, &mut ctx.wallet, &tx_args, @@ -344,12 +385,20 @@ where false, ) .await?; - submit_reveal_aux(client, &mut ctx, &tx_args, addr, pk.clone(), &mut tx) - .await?; + submit_reveal_aux::<_, IO>( + client, + &mut ctx, + &tx_args, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &tx_args, &pk).await?; - let result = tx::process_tx(client, &mut ctx.wallet, &tx_args, tx) - .await? - .initialized_accounts(); + let result = + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &tx_args, tx) + .await? + .initialized_accounts(); if !tx_args.dry_run { let (validator_address_alias, validator_address) = match &result[..] { @@ -358,12 +407,12 @@ where if let Some(alias) = ctx.wallet.find_alias(validator_address) { (alias.clone(), validator_address.clone()) } else { - eprintln!("Expected one account to be created"); + edisplay!(IO, "Expected one account to be created"); safe_exit(1) } } _ => { - eprintln!("Expected one account to be created"); + edisplay!(IO, "Expected one account to be created"); safe_exit(1) } }; @@ -371,7 +420,7 @@ where ctx.wallet .add_validator_data(validator_address, validator_keys); crate::wallet::save(&ctx.wallet) - .unwrap_or_else(|err| eprintln!("{}", err)); + .unwrap_or_else(|err| edisplay!(IO, "{}", err)); let tendermint_home = ctx.config.ledger.cometbft_dir(); tendermint_node::write_validator_key(&tendermint_home, &consensus_key); @@ -393,24 +442,35 @@ where .await .expect("Pos parameter should be defined."); - println!(); - println!( + display_line!(IO, ""); + display_line!( + IO, "The validator's addresses and keys were stored in the wallet:" ); - println!(" Validator address \"{}\"", validator_address_alias); - println!(" Validator account key \"{}\"", validator_key_alias); - println!(" Consensus key \"{}\"", consensus_key_alias); - println!( + display_line!( + IO, + " Validator address \"{}\"", + validator_address_alias + ); + display_line!( + IO, + " Validator account key \"{}\"", + validator_key_alias + ); + display_line!(IO, " Consensus key \"{}\"", consensus_key_alias); + display_line!( + IO, "The ledger node has been setup to use this validator's address \ and consensus key." ); - println!( + display_line!( + IO, "Your validator will be active in {} epochs. Be sure to restart \ your node for the changes to take effect!", pos_params.pipeline_len ); } else { - println!("Transaction dry run. No addresses have been saved."); + display_line!(IO, "Transaction dry run. No addresses have been saved."); } Ok(()) } @@ -428,7 +488,7 @@ pub struct CLIShieldedUtils { impl CLIShieldedUtils { /// Initialize a shielded transaction context that identifies notes /// decryptable by any viewing key in the given set - pub fn new(context_dir: PathBuf) -> masp::ShieldedContext { + pub fn new(context_dir: PathBuf) -> masp::ShieldedContext { // Make sure that MASP parameters are downloaded to enable MASP // transaction building and verification later on let params_dir = masp::get_params_dir(); @@ -439,10 +499,13 @@ impl CLIShieldedUtils { && convert_path.exists() && output_path.exists()) { - println!("MASP parameters not present, downloading..."); + display_line!(IO, "MASP parameters not present, downloading..."); masp_proofs::download_masp_parameters(None) .expect("MASP parameters not present or downloadable"); - println!("MASP parameter download complete, resuming execution..."); + display_line!( + IO, + "MASP parameter download complete, resuming execution..." + ); } // Finally initialize a shielded context with the supplied directory let utils = Self { context_dir }; @@ -523,7 +586,7 @@ impl masp::ShieldedUtils for CLIShieldedUtils { } } -pub async fn submit_transfer( +pub async fn submit_transfer( client: &C, mut ctx: Context, args: args::TxTransfer, @@ -531,9 +594,14 @@ pub async fn submit_transfer( for _ in 0..2 { let arg = args.clone(); let (mut tx, addr, pk, tx_epoch, _isf) = - tx::build_transfer(client, &mut ctx.wallet, &mut ctx.shielded, arg) - .await?; - submit_reveal_aux( + tx::build_transfer::<_, _, _, IO>( + client, + &mut ctx.wallet, + &mut ctx.shielded, + arg, + ) + .await?; + submit_reveal_aux::<_, IO>( client, &mut ctx, &args.tx, @@ -544,9 +612,11 @@ pub async fn submit_transfer( .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; let result = - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; // Query the epoch in which the transaction was probably submitted - let submission_epoch = rpc::query_and_print_epoch(client).await; + let submission_epoch = + rpc::query_and_print_epoch::<_, IO>(client).await; match result { ProcessTxResponse::Applied(resp) if @@ -558,7 +628,7 @@ pub async fn submit_transfer( tx_epoch.unwrap() != submission_epoch => { // Then we probably straddled an epoch boundary. Let's retry... - eprintln!( + edisplay!(IO, "MASP transaction rejected and this may be due to the \ epoch changing. Attempting to resubmit transaction.", ); @@ -572,7 +642,7 @@ pub async fn submit_transfer( Ok(()) } -pub async fn submit_ibc_transfer( +pub async fn submit_ibc_transfer( client: &C, mut ctx: Context, args: args::TxIbcTransfer, @@ -581,16 +651,27 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = - tx::build_ibc_transfer(client, &mut ctx.wallet, args.clone()).await?; - submit_reveal_aux(client, &mut ctx, &args.tx, addr, pk.clone(), &mut tx) - .await?; + let (mut tx, addr, pk) = tx::build_ibc_transfer::<_, _, IO>( + client, + &mut ctx.wallet, + args.clone(), + ) + .await?; + submit_reveal_aux::<_, IO>( + client, + &mut ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; Ok(()) } -pub async fn submit_init_proposal( +pub async fn submit_init_proposal( client: &C, mut ctx: Context, args: args::InitProposal, @@ -604,7 +685,7 @@ where serde_json::from_reader(file).expect("JSON was not well-formatted"); let signer = WalletAddress::new(proposal.clone().author.to_string()); - let current_epoch = rpc::query_and_print_epoch(client).await; + let current_epoch = rpc::query_and_print_epoch::<_, IO>(client).await; let governance_parameters = rpc::get_governance_parameters(client).await; if proposal.voting_start_epoch <= current_epoch @@ -612,14 +693,16 @@ where % governance_parameters.min_proposal_period != 0 { - println!("{}", proposal.voting_start_epoch <= current_epoch); - println!( + display_line!(IO, "{}", proposal.voting_start_epoch <= current_epoch); + display_line!( + IO, "{}", proposal.voting_start_epoch.0 % governance_parameters.min_proposal_period == 0 ); - eprintln!( + edisplay!( + IO, "Invalid proposal start epoch: {} must be greater than current \ epoch {} and a multiple of {}", proposal.voting_start_epoch, @@ -636,7 +719,8 @@ where > governance_parameters.max_proposal_period || proposal.voting_end_epoch.0 % 3 != 0 { - eprintln!( + edisplay!( + IO, "Invalid proposal end epoch: difference between proposal start \ and end epoch must be at least {} and at max {} and end epoch \ must be a multiple of {}", @@ -651,7 +735,8 @@ where || proposal.grace_epoch.0 - proposal.voting_end_epoch.0 < governance_parameters.min_proposal_grace_epochs { - eprintln!( + edisplay!( + IO, "Invalid proposal grace epoch: difference between proposal grace \ and end epoch must be at least {}", governance_parameters.min_proposal_grace_epochs @@ -663,7 +748,7 @@ where if args.offline { let signer = ctx.get(&signer); - let key = find_pk(client, &mut ctx.wallet, &signer).await?; + let key = find_pk::<_, _, IO>(client, &mut ctx.wallet, &signer).await?; let signing_key = signing::find_key_by_pk(&mut ctx.wallet, &args.tx, &key)?; let offline_proposal = @@ -676,13 +761,14 @@ where let out = File::create(&proposal_filename).unwrap(); match serde_json::to_writer_pretty(out, &offline_proposal) { Ok(_) => { - println!( + display_line!( + IO, "Proposal created: {}.", proposal_filename.to_string_lossy() ); } Err(e) => { - eprintln!("Error while creating proposal file: {}.", e); + edisplay!(IO, "Error while creating proposal file: {}.", e); safe_exit(1) } } @@ -694,7 +780,7 @@ where if let Ok(data) = tx_data { data } else { - eprintln!("Invalid data for init proposal transaction."); + edisplay!(IO, "Invalid data for init proposal transaction."); safe_exit(1) }; @@ -709,7 +795,8 @@ where ) .unwrap() { - eprintln!( + edisplay!( + IO, "Address {} doesn't have enough funds.", &proposal.author ); @@ -719,14 +806,15 @@ where if init_proposal_content.len() > governance_parameters.max_proposal_content_size as usize { - eprintln!("Proposal content size too big.",); + edisplay!(IO, "Proposal content size too big."); safe_exit(1); } let mut tx = Tx::new(TxType::Raw); - let tx_code_hash = query_wasm_code_hash(client, args::TX_INIT_PROPOSAL) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, args::TX_INIT_PROPOSAL) + .await + .unwrap(); tx.header.chain_id = ctx.config.ledger.chain_id.clone(); tx.header.expiration = args.tx.expiration; // Put the content of this proposal into an extra section @@ -751,7 +839,7 @@ where tx.set_data(Data::new(data)); tx.set_code(Code::from_hash(tx_code_hash)); - let (mut tx, addr, pk) = tx::prepare_tx( + let (mut tx, addr, pk) = tx::prepare_tx::<_, _, IO>( client, &mut ctx.wallet, &args.tx, @@ -761,7 +849,7 @@ where false, ) .await?; - submit_reveal_aux( + submit_reveal_aux::<_, IO>( client, &mut ctx, &args.tx, @@ -771,12 +859,13 @@ where ) .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; Ok(()) } } -pub async fn submit_vote_proposal( +pub async fn submit_vote_proposal( client: &C, mut ctx: Context, args: args::VoteProposal, @@ -788,7 +877,7 @@ where let signer = if let Some(addr) = &args.tx.signer { addr } else { - eprintln!("Missing mandatory argument --signer."); + edisplay!(IO, "Missing mandatory argument --signer."); safe_exit(1) }; @@ -828,7 +917,7 @@ where let msg = splits.next().expect("Missing message to sign"); if splits.next().is_some() { - eprintln!("Unexpected argument after message"); + edisplay!(IO, "Unexpected argument after message"); safe_exit(1); } @@ -844,14 +933,15 @@ where } "nay" => ProposalVote::Nay, _ => { - eprintln!("Vote must be either yay or nay"); + edisplay!(IO, "Vote must be either yay or nay"); safe_exit(1); } }; if args.offline { if !proposal_vote.is_default_vote() { - eprintln!( + edisplay!( + IO, "Wrong vote type for offline proposal. Just vote yay or nay!" ); safe_exit(1); @@ -866,11 +956,11 @@ where .await .expect("Public key should exist."); if !proposal.check_signature(&public_key) { - eprintln!("Proposal signature mismatch!"); + edisplay!(IO, "Proposal signature mismatch!"); safe_exit(1) } - let key = find_pk(client, &mut ctx.wallet, signer).await?; + let key = find_pk::<_, _, IO>(client, &mut ctx.wallet, signer).await?; let signing_key = signing::find_key_by_pk(&mut ctx.wallet, &args.tx, &key)?; let offline_vote = OfflineVote::new( @@ -887,19 +977,24 @@ where let out = File::create(&proposal_vote_filename).unwrap(); match serde_json::to_writer_pretty(out, &offline_vote) { Ok(_) => { - println!( + display_line!( + IO, "Proposal vote created: {}.", proposal_vote_filename.to_string_lossy() ); Ok(()) } Err(e) => { - eprintln!("Error while creating proposal vote file: {}.", e); + edisplay!( + IO, + "Error while creating proposal vote file: {}.", + e + ); safe_exit(1) } } } else { - let current_epoch = rpc::query_and_print_epoch(client).await; + let current_epoch = rpc::query_and_print_epoch::<_, IO>(client).await; let voter_address = signer.clone(); let proposal_id = args.proposal_id.unwrap(); @@ -924,9 +1019,11 @@ where if let ProposalVote::Yay(ref vote_type) = proposal_vote { if &proposal_type != vote_type { - eprintln!( + edisplay!( + IO, "Expected vote of type {}, found {}", - proposal_type, args.vote + proposal_type, + args.vote ); safe_exit(1); } else if let VoteType::PGFCouncil(set) = vote_type { @@ -939,7 +1036,8 @@ where if !rpc::query_has_storage_key::(client, &vp_key) .await { - eprintln!( + edisplay!( + IO, "Proposed PGF council {} cannot be found \ in storage", address @@ -948,7 +1046,8 @@ where } } _ => { - eprintln!( + edisplay!( + IO, "PGF council vote contains a non-established \ address: {}", address @@ -963,10 +1062,12 @@ where match proposal_start_epoch { Some(epoch) => { if current_epoch < epoch { - eprintln!( + edisplay!( + IO, "Current epoch {} is not greater than proposal start \ epoch {}", - current_epoch, epoch + current_epoch, + epoch ); if !args.tx.force { @@ -1008,7 +1109,7 @@ where .try_to_vec() .expect("Encoding proposal data shouldn't fail"); - let tx_code_hash = query_wasm_code_hash( + let tx_code_hash = query_wasm_code_hash::<_, IO>( client, args.tx_code_path.to_str().unwrap(), ) @@ -1020,7 +1121,7 @@ where tx.set_data(Data::new(data)); tx.set_code(Code::from_hash(tx_code_hash)); - let (mut tx, addr, pk) = tx::prepare_tx( + let (mut tx, addr, pk) = tx::prepare_tx::<_, _, IO>( client, &mut ctx.wallet, &args.tx, @@ -1030,7 +1131,7 @@ where false, ) .await?; - submit_reveal_aux( + submit_reveal_aux::<_, IO>( client, &mut ctx, &args.tx, @@ -1041,11 +1142,18 @@ where .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk) .await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>( + client, + &mut ctx.wallet, + &args.tx, + tx, + ) + .await?; Ok(()) } None => { - eprintln!( + edisplay!( + IO, "Proposal start epoch for proposal id {} is not definied.", proposal_id ); @@ -1055,7 +1163,7 @@ where } } -pub async fn submit_reveal_pk( +pub async fn submit_reveal_pk( client: &C, ctx: &mut Context, args: args::RevealPk, @@ -1065,10 +1173,12 @@ where C::Error: std::fmt::Display, { let reveal_tx = - tx::build_reveal_pk(client, &mut ctx.wallet, args.clone()).await?; + tx::build_reveal_pk::<_, _, IO>(client, &mut ctx.wallet, args.clone()) + .await?; if let Some((mut tx, _, pk)) = reveal_tx { signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; } Ok(()) } @@ -1131,7 +1241,7 @@ where delegations.into_iter().flatten().collect() } -pub async fn submit_bond( +pub async fn submit_bond( client: &C, ctx: &mut Context, args: args::Bond, @@ -1141,14 +1251,23 @@ where C::Error: std::fmt::Display, { let (mut tx, addr, pk) = - tx::build_bond::(client, &mut ctx.wallet, args.clone()).await?; - submit_reveal_aux(client, ctx, &args.tx, addr, pk.clone(), &mut tx).await?; + tx::build_bond::(client, &mut ctx.wallet, args.clone()) + .await?; + submit_reveal_aux::<_, IO>( + client, + ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; Ok(()) } -pub async fn submit_unbond( +pub async fn submit_unbond( client: &C, ctx: &mut Context, args: args::Unbond, @@ -1158,15 +1277,25 @@ where C::Error: std::fmt::Display, { let (mut tx, addr, pk, latest_withdrawal_pre) = - tx::build_unbond(client, &mut ctx.wallet, args.clone()).await?; - submit_reveal_aux(client, ctx, &args.tx, addr, pk.clone(), &mut tx).await?; + tx::build_unbond::<_, _, IO>(client, &mut ctx.wallet, args.clone()) + .await?; + submit_reveal_aux::<_, IO>( + client, + ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; - tx::query_unbonds(client, args.clone(), latest_withdrawal_pre).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::query_unbonds::<_, IO>(client, args.clone(), latest_withdrawal_pre) + .await?; Ok(()) } -pub async fn submit_withdraw( +pub async fn submit_withdraw( client: &C, mut ctx: Context, args: args::Withdraw, @@ -1176,15 +1305,23 @@ where C::Error: std::fmt::Display, { let (mut tx, addr, pk) = - tx::build_withdraw(client, &mut ctx.wallet, args.clone()).await?; - submit_reveal_aux(client, &mut ctx, &args.tx, addr, pk.clone(), &mut tx) - .await?; + tx::build_withdraw::<_, _, IO>(client, &mut ctx.wallet, args.clone()) + .await?; + submit_reveal_aux::<_, IO>( + client, + &mut ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; Ok(()) } -pub async fn submit_validator_commission_change( +pub async fn submit_validator_commission_change( client: &C, mut ctx: Context, args: args::CommissionRateChange, @@ -1194,18 +1331,29 @@ where C::Error: std::fmt::Display, { let arg = args.clone(); - let (mut tx, addr, pk) = - tx::build_validator_commission_change(client, &mut ctx.wallet, arg) - .await?; - submit_reveal_aux(client, &mut ctx, &args.tx, addr, pk.clone(), &mut tx) - .await?; + let (mut tx, addr, pk) = tx::build_validator_commission_change::<_, _, IO>( + client, + &mut ctx.wallet, + arg, + ) + .await?; + submit_reveal_aux::<_, IO>( + client, + &mut ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; Ok(()) } pub async fn submit_unjail_validator< C: namada::ledger::queries::Client + Sync, + IO: Io, >( client: &C, mut ctx: Context, @@ -1215,30 +1363,41 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = - tx::build_unjail_validator(client, &mut ctx.wallet, args.clone()) - .await?; - submit_reveal_aux(client, &mut ctx, &args.tx, addr, pk.clone(), &mut tx) - .await?; + let (mut tx, addr, pk) = tx::build_unjail_validator::<_, _, IO>( + client, + &mut ctx.wallet, + args.clone(), + ) + .await?; + submit_reveal_aux::<_, IO>( + client, + &mut ctx, + &args.tx, + addr, + pk.clone(), + &mut tx, + ) + .await?; signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx(client, &mut ctx.wallet, &args.tx, tx).await?; + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; Ok(()) } /// Save accounts initialized from a tx into the wallet, if any. -pub async fn save_initialized_accounts( +pub async fn save_initialized_accounts( wallet: &mut Wallet, args: &args::Tx, initialized_accounts: Vec
, ) { - tx::save_initialized_accounts::(wallet, args, initialized_accounts).await + tx::save_initialized_accounts::(wallet, args, initialized_accounts) + .await } /// Broadcast a transaction to be included in the blockchain and checks that /// the tx has been successfully included into the mempool of a validator /// /// In the case of errors in any of those stages, an error message is returned -pub async fn broadcast_tx( +pub async fn broadcast_tx( rpc_cli: &C, to_broadcast: &TxBroadcastData, ) -> Result @@ -1246,7 +1405,7 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - tx::broadcast_tx(rpc_cli, to_broadcast).await + tx::broadcast_tx::<_, IO>(rpc_cli, to_broadcast).await } /// Broadcast a transaction to be included in the blockchain. @@ -1257,7 +1416,7 @@ where /// 3. The decrypted payload of the tx has been included on the blockchain. /// /// In the case of errors in any of those stages, an error message is returned -pub async fn submit_tx( +pub async fn submit_tx( client: &C, to_broadcast: TxBroadcastData, ) -> Result @@ -1265,7 +1424,7 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - tx::submit_tx(client, to_broadcast).await + tx::submit_tx::<_, IO>(client, to_broadcast).await } #[cfg(test)] diff --git a/shared/src/ledger/eth_bridge.rs b/shared/src/ledger/eth_bridge.rs index 50d560c2b01..e5b10f20dbd 100644 --- a/shared/src/ledger/eth_bridge.rs +++ b/shared/src/ledger/eth_bridge.rs @@ -17,6 +17,8 @@ use crate::types::control_flow::time::{ Constant, Duration, Error as TimeoutError, Instant, LinearBackoff, Sleep, }; use crate::types::control_flow::{self, Halt, TryHalt}; +use crate::types::io::Io; +use crate::{display_line, edisplay}; const DEFAULT_BACKOFF: Duration = std::time::Duration::from_millis(500); const DEFAULT_CEILING: Duration = std::time::Duration::from_secs(30); @@ -98,7 +100,10 @@ pub struct BlockOnEthSync { } /// Block until Ethereum finishes synchronizing. -pub async fn block_on_eth_sync(client: &C, args: BlockOnEthSync) -> Halt<()> +pub async fn block_on_eth_sync( + client: &C, + args: BlockOnEthSync, +) -> Halt<()> where C: Middleware, { @@ -106,7 +111,7 @@ where deadline, delta_sleep, } = args; - tracing::info!("Attempting to synchronize with the Ethereum network"); + display_line!(IO, "Attempting to synchronize with the Ethereum network"); Sleep { strategy: LinearBackoff { delta: delta_sleep }, } @@ -122,15 +127,15 @@ where }) .await .try_halt(|_| { - tracing::error!("Timed out while waiting for Ethereum to synchronize"); + edisplay!(IO, "Timed out while waiting for Ethereum to synchronize"); })?; - tracing::info!("The Ethereum node is up to date"); + display_line!(IO, "The Ethereum node is up to date"); control_flow::proceed(()) } /// Check if Ethereum has finished synchronizing. In case it has /// not, perform `action`. -pub async fn eth_sync_or( +pub async fn eth_sync_or( client: &C, mut action: F, ) -> Halt> @@ -142,7 +147,8 @@ where .await .map(|status| status.is_synchronized()) .try_halt(|err| { - tracing::error!( + edisplay!( + IO, "An error occurred while fetching the Ethereum \ synchronization status: {err}" ); @@ -156,11 +162,11 @@ where /// Check if Ethereum has finished synchronizing. In case it has /// not, end execution. -pub async fn eth_sync_or_exit(client: &C) -> Halt<()> +pub async fn eth_sync_or_exit(client: &C) -> Halt<()> where C: Middleware, { - eth_sync_or(client, || { + eth_sync_or::<_, _, _, IO>(client, || { tracing::error!("The Ethereum node has not finished synchronizing"); }) .await? diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index a95d56d475b..47ce2453d8e 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -2,7 +2,6 @@ use std::cmp::Ordering; use std::collections::HashMap; -use std::io::Write; use std::sync::Arc; use borsh::BorshSerialize; @@ -42,6 +41,7 @@ use crate::types::voting_power::FractionalVotingPower; pub async fn build_bridge_pool_tx< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -59,10 +59,15 @@ pub async fn build_bridge_pool_tx< } = args; let sub_prefix = Some(wrapped_erc20s::sub_prefix(&asset)); - let DenominatedAmount { amount, .. } = - validate_amount(client, amount, &BRIDGE_ADDRESS, &sub_prefix, tx.force) - .await - .expect("Failed to validate amount"); + let DenominatedAmount { amount, .. } = validate_amount::<_, IO>( + client, + amount, + &BRIDGE_ADDRESS, + &sub_prefix, + tx.force, + ) + .await + .expect("Failed to validate amount"); let transfer = PendingTransfer { transfer: TransferToEthereum { asset, @@ -87,7 +92,7 @@ pub async fn build_bridge_pool_tx< // TODO: change the wasm code to a hash transfer_tx.set_code(Code::new(wasm_code)); - prepare_tx::( + prepare_tx::( client, wallet, tx, @@ -108,7 +113,7 @@ struct BridgePoolResponse { /// Query the contents of the Ethereum bridge pool. /// Prints out a json payload. -pub async fn query_bridge_pool(client: &C) +pub async fn query_bridge_pool(client: &C) where C: Client + Sync, { @@ -123,19 +128,19 @@ where .map(|transfer| (transfer.keccak256().to_string(), transfer)) .collect(); if pool_contents.is_empty() { - println!("Bridge pool is empty."); + display_line!(IO, "Bridge pool is empty."); return; } let contents = BridgePoolResponse { bridge_pool_contents: pool_contents, }; - println!("{}", serde_json::to_string_pretty(&contents).unwrap()); + display_line!(IO, "{}", serde_json::to_string_pretty(&contents).unwrap()); } /// Query the contents of the Ethereum bridge pool that /// is covered by the latest signed root. /// Prints out a json payload. -pub async fn query_signed_bridge_pool( +pub async fn query_signed_bridge_pool( client: &C, ) -> Halt> where @@ -152,13 +157,13 @@ where .map(|transfer| (transfer.keccak256().to_string(), transfer)) .collect(); if pool_contents.is_empty() { - println!("Bridge pool is empty."); + display_line!(IO, "Bridge pool is empty."); return control_flow::halt(); } let contents = BridgePoolResponse { bridge_pool_contents: pool_contents.clone(), }; - println!("{}", serde_json::to_string_pretty(&contents).unwrap()); + display_line!(IO, "{}", serde_json::to_string_pretty(&contents).unwrap()); control_flow::proceed(pool_contents) } @@ -167,7 +172,7 @@ where /// backing each `TransferToEthereum` event. /// /// Prints a json payload. -pub async fn query_relay_progress(client: &C) +pub async fn query_relay_progress(client: &C) where C: Client + Sync, { @@ -177,12 +182,12 @@ where .transfer_to_ethereum_progress(client) .await .unwrap(); - println!("{}", serde_json::to_string_pretty(&resp).unwrap()); + display_line!(IO, "{}", serde_json::to_string_pretty(&resp).unwrap()); } /// Internal methdod to construct a proof that a set of transfers are in the /// bridge pool. -async fn construct_bridge_pool_proof( +async fn construct_bridge_pool_proof( client: &C, transfers: &[KeccakHash], relayer: Address, @@ -213,27 +218,29 @@ where let warning = "Warning".on_yellow(); let warning = warning.bold(); let warning = warning.blink(); - println!( + display_line!( + IO, "{warning}: The following hashes correspond to transfers that \ have surpassed the security threshold in Namada, therefore have \ likely been relayed to Ethereum, but do not yet have a quorum of \ validator signatures behind them in Namada; thus they are still \ in the Bridge pool:\n{warnings:?}", ); - print!("\nDo you wish to proceed? (y/n): "); - std::io::stdout().flush().unwrap(); + display!(IO, "\nDo you wish to proceed? (y/n): "); + IO::flush(); loop { - let mut buffer = String::new(); - let stdin = std::io::stdin(); - stdin.read_line(&mut buffer).try_halt(|e| { - println!("Encountered error reading from STDIN: {e:?}"); + let resp = IO::read().try_halt(|e| { + display_line!( + IO, + "Encountered error reading from STDIN: {e:?}" + ); })?; - match buffer.trim() { + match resp.trim() { "y" => break, "n" => return control_flow::halt(), _ => { - print!("Expected 'y' or 'n'. Please try again: "); - std::io::stdout().flush().unwrap(); + display!(IO, "Expected 'y' or 'n'. Please try again: "); + IO::flush(); } } } @@ -247,7 +254,7 @@ where .await; response.map(|response| response.data).try_halt(|e| { - println!("Encountered error constructing proof:\n{:?}", e); + display_line!(IO, "Encountered error constructing proof:\n{:?}", e); }) } @@ -263,14 +270,14 @@ struct BridgePoolProofResponse { /// Construct a merkle proof of a batch of transfers in /// the bridge pool and return it to the user (as opposed /// to relaying it to ethereum). -pub async fn construct_proof( +pub async fn construct_proof( client: &C, args: args::BridgePoolProof, ) -> Halt<()> where C: Client + Sync, { - let bp_proof_bytes = construct_bridge_pool_proof( + let bp_proof_bytes = construct_bridge_pool_proof::<_, IO>( client, &args.transfers, args.relayer.clone(), @@ -278,7 +285,11 @@ where .await?; let bp_proof: RelayProof = AbiDecode::decode(&bp_proof_bytes).try_halt(|error| { - println!("Unable to decode the generated proof: {:?}", error); + display_line!( + IO, + "Unable to decode the generated proof: {:?}", + error + ); })?; let resp = BridgePoolProofResponse { hashes: args.transfers, @@ -291,12 +302,12 @@ where .into(), abi_encoded_proof: bp_proof_bytes, }; - println!("{}", serde_json::to_string(&resp).unwrap()); + display_line!(IO, "{}", serde_json::to_string(&resp).unwrap()); control_flow::proceed(()) } /// Relay a validator set update, signed off for a given epoch. -pub async fn relay_bridge_pool_proof( +pub async fn relay_bridge_pool_proof( eth_client: Arc, nam_client: &C, args: args::RelayBridgePoolProof, @@ -309,7 +320,7 @@ where let _signal_receiver = args.safe_mode.then(install_shutdown_signal); if args.sync { - block_on_eth_sync( + block_on_eth_sync::<_, IO>( &*eth_client, BlockOnEthSync { deadline: Instant::now() + Duration::from_secs(60), @@ -318,12 +329,15 @@ where ) .await?; } else { - eth_sync_or_exit(&*eth_client).await?; + eth_sync_or_exit::<_, IO>(&*eth_client).await?; } - let bp_proof = - construct_bridge_pool_proof(nam_client, &args.transfers, args.relayer) - .await?; + let bp_proof = construct_bridge_pool_proof::<_, IO>( + nam_client, + &args.transfers, + args.relayer, + ) + .await?; let bridge = match RPC .shell() .eth_bridge() @@ -335,7 +349,8 @@ where let error = "Error".on_red(); let error = error.bold(); let error = error.blink(); - println!( + display_line!( + IO, "{error}: Failed to retrieve the Ethereum Bridge smart \ contract address from storage with \ reason:\n{err_msg}\n\nPerhaps the Ethereum bridge is not \ @@ -347,7 +362,11 @@ where let bp_proof: RelayProof = AbiDecode::decode(&bp_proof).try_halt(|error| { - println!("Unable to decode the generated proof: {:?}", error); + display_line!( + IO, + "Unable to decode the generated proof: {:?}", + error + ); })?; // NOTE: this operation costs no gas on Ethereum @@ -360,7 +379,8 @@ where let error = "Error".on_red(); let error = error.bold(); let error = error.blink(); - println!( + display_line!( + IO, "{error}: The Bridge pool nonce in the smart contract is \ {contract_nonce}, while the nonce in Namada is still {}. A \ relay of the former one has already happened, but a proof \ @@ -373,7 +393,8 @@ where let error = "Error".on_red(); let error = error.bold(); let error = error.blink(); - println!( + display_line!( + IO, "{error}: The Bridge pool nonce in the smart contract is \ {contract_nonce}, while the nonce in Namada is still {}. \ Somehow, Namada's nonce is ahead of the contract's nonce!", @@ -400,7 +421,7 @@ where .await .unwrap(); - println!("{transf_result:?}"); + display_line!(IO, "{transf_result:?}"); control_flow::proceed(()) } @@ -411,6 +432,7 @@ mod recommendations { use super::*; use crate::eth_bridge::storage::bridge_pool::get_signed_root_key; use crate::eth_bridge::storage::proof::BridgePoolRootProof; + use crate::types::io::Io; use crate::types::storage::BlockHeight; use crate::types::vote_extensions::validator_set_update::{ EthAddrBook, VotingPowersMap, VotingPowersMapExt, @@ -458,7 +480,7 @@ mod recommendations { /// Recommend the most economical batch of transfers to relay based /// on a conversion rate estimates from NAM to ETH and gas usage /// heuristics. - pub async fn recommend_batch( + pub async fn recommend_batch( client: &C, args: args::RecommendBatch, ) -> Halt<()> @@ -517,7 +539,7 @@ mod recommendations { // we don't recommend transfers that have already been relayed let mut contents: Vec<(String, I256, PendingTransfer)> = - query_signed_bridge_pool(client) + query_signed_bridge_pool::<_, IO>(client) .await? .into_iter() .filter_map(|(k, v)| { @@ -546,7 +568,7 @@ mod recommendations { let max_gas = args.max_gas.map(Uint::from_u64).unwrap_or(uint::MAX_VALUE); let max_cost = args.gas.map(I256::from).unwrap_or_default(); - generate(contents, validator_gas, max_gas, max_cost)?; + generate::(contents, validator_gas, max_gas, max_cost)?; control_flow::proceed(()) } @@ -587,7 +609,7 @@ mod recommendations { /// Generates the actual recommendation from restrictions given by the /// input parameters. - fn generate( + fn generate( contents: Vec<(String, I256, PendingTransfer)>, validator_gas: Uint, max_gas: Uint, @@ -644,16 +666,22 @@ mod recommendations { control_flow::proceed( if state.feasible_region && !recommendation.is_empty() { - println!("Recommended batch: {:#?}", recommendation); - println!( + display_line!(IO, "Recommended batch: {:#?}", recommendation); + display_line!( + IO, "Estimated Ethereum transaction gas (in gwei): {}", total_gas ); - println!("Estimated net profit (in gwei): {}", -total_cost); - println!("Total fees (in NAM): {}", total_fees); + display_line!( + IO, + "Estimated net profit (in gwei): {}", + -total_cost + ); + display_line!(IO, "Total fees (in NAM): {}", total_fees); Some(recommendation) } else { - println!( + display_line!( + IO, "Unable to find a recommendation satisfying the input \ parameters." ); @@ -669,6 +697,7 @@ mod recommendations { use super::*; use crate::types::control_flow::ProceedOrElse; + use crate::types::io::DefaultIo; /// An established user address for testing & development pub fn bertha_address() -> Address { @@ -757,7 +786,7 @@ mod recommendations { let profitable = vec![transfer(100_000); 17]; let hash = profitable[0].keccak256().to_string(); let expected = vec![hash; 17]; - let recommendation = generate( + let recommendation = generate::( process_transfers(profitable), Uint::from_u64(800_000), uint::MAX_VALUE, @@ -774,7 +803,7 @@ mod recommendations { let hash = transfers[0].keccak256().to_string(); transfers.push(transfer(0)); let expected: Vec<_> = vec![hash; 17]; - let recommendation = generate( + let recommendation = generate::( process_transfers(transfers), Uint::from_u64(800_000), uint::MAX_VALUE, @@ -790,7 +819,7 @@ mod recommendations { let transfers = vec![transfer(75_000); 4]; let hash = transfers[0].keccak256().to_string(); let expected = vec![hash; 2]; - let recommendation = generate( + let recommendation = generate::( process_transfers(transfers), Uint::from_u64(50_000), Uint::from_u64(150_000), @@ -810,7 +839,7 @@ mod recommendations { .map(|t| t.keccak256().to_string()) .take(5) .collect(); - let recommendation = generate( + let recommendation = generate::( process_transfers(transfers), Uint::from_u64(150_000), uint::MAX_VALUE, @@ -827,7 +856,7 @@ mod recommendations { let hash = transfers[0].keccak256().to_string(); let expected = vec![hash; 4]; transfers.extend([transfer(17_500), transfer(17_500)]); - let recommendation = generate( + let recommendation = generate::( process_transfers(transfers), Uint::from_u64(150_000), Uint::from_u64(330_000), @@ -841,7 +870,7 @@ mod recommendations { #[test] fn test_wholly_infeasible() { let transfers = vec![transfer(75_000); 4]; - let recommendation = generate( + let recommendation = generate::( process_transfers(transfers), Uint::from_u64(300_000), uint::MAX_VALUE, @@ -854,3 +883,6 @@ mod recommendations { } pub use recommendations::recommend_batch; + +use crate::types::io::Io; +use crate::{display, display_line}; diff --git a/shared/src/ledger/eth_bridge/validator_set.rs b/shared/src/ledger/eth_bridge/validator_set.rs index 6814fae8ec1..d4c01f1c1a9 100644 --- a/shared/src/ledger/eth_bridge/validator_set.rs +++ b/shared/src/ledger/eth_bridge/validator_set.rs @@ -24,6 +24,8 @@ use crate::types::control_flow::time::{self, Duration, Instant}; use crate::types::control_flow::{ self, install_shutdown_signal, Halt, TryHalt, }; +use crate::types::io::{DefaultIo, Io}; +use crate::{display_line, edisplay}; /// Relayer related errors. #[derive(Debug, Default)] @@ -253,7 +255,7 @@ impl From> for RelayResult { /// Query an ABI encoding of the validator set to be installed /// at the given epoch, and its associated proof. -pub async fn query_validator_set_update_proof( +pub async fn query_validator_set_update_proof( client: &C, args: args::ValidatorSetProof, ) where @@ -272,11 +274,11 @@ pub async fn query_validator_set_update_proof( .await .unwrap(); - println!("0x{}", HEXLOWER.encode(encoded_proof.as_ref())); + display_line!(IO, "0x{}", HEXLOWER.encode(encoded_proof.as_ref())); } /// Query an ABI encoding of the validator set at a given epoch. -pub async fn query_validator_set_args( +pub async fn query_validator_set_args( client: &C, args: args::ConsensusValidatorSet, ) where @@ -295,11 +297,15 @@ pub async fn query_validator_set_args( .await .unwrap(); - println!("0x{}", HEXLOWER.encode(encoded_validator_set_args.as_ref())); + display_line!( + IO, + "0x{}", + HEXLOWER.encode(encoded_validator_set_args.as_ref()) + ); } /// Relay a validator set update, signed off for a given epoch. -pub async fn relay_validator_set_update( +pub async fn relay_validator_set_update( eth_client: Arc, nam_client: &C, args: args::ValidatorSetUpdateRelay, @@ -312,7 +318,7 @@ where let mut signal_receiver = args.safe_mode.then(install_shutdown_signal); if args.sync { - block_on_eth_sync( + block_on_eth_sync::<_, IO>( &*eth_client, BlockOnEthSync { deadline: Instant::now() + Duration::from_secs(60), @@ -321,7 +327,7 @@ where ) .await?; } else { - eth_sync_or_exit(&*eth_client).await?; + eth_sync_or_exit::<_, IO>(&*eth_client).await?; } if args.daemon { @@ -339,7 +345,7 @@ where nam_client, |relay_result| match relay_result { RelayResult::GovernanceCallError(reason) => { - tracing::error!(reason, "Calling Governance failed"); + edisplay!(IO, "Calling Governance failed due to: {reason}"); } RelayResult::NonceError { argument, contract } => { let whence = match argument.cmp(&contract) { @@ -347,22 +353,31 @@ where Ordering::Equal => "identical to", Ordering::Greater => "too far ahead of", }; - tracing::error!( - ?argument, - ?contract, - "Argument nonce is {whence} contract nonce" + edisplay!( + IO, + "Argument nonce <{argument}> is {whence} contract \ + nonce <{contract}>" ); } RelayResult::NoReceipt => { - tracing::warn!( + edisplay!( + IO, "No transfer receipt received from the Ethereum node" ); } RelayResult::Receipt { receipt } => { if receipt.is_successful() { - tracing::info!(?receipt, "Ethereum transfer succeded"); + display_line!( + IO, + "Ethereum transfer succeded: {:?}", + receipt + ); } else { - tracing::error!(?receipt, "Ethereum transfer failed"); + display_line!( + IO, + "Ethereum transfer failed: {:?}", + receipt + ); } } }, @@ -420,7 +435,9 @@ where time::sleep(sleep_for).await; let is_synchronizing = - eth_sync_or(&*eth_client, || ()).await.is_break(); + eth_sync_or::<_, _, _, DefaultIo>(&*eth_client, || ()) + .await + .is_break(); if is_synchronizing { tracing::debug!("The Ethereum node is synchronizing"); last_call_succeeded = false; diff --git a/shared/src/ledger/masp.rs b/shared/src/ledger/masp.rs index 28e1fd8e139..f92847b213e 100644 --- a/shared/src/ledger/masp.rs +++ b/shared/src/ledger/masp.rs @@ -67,6 +67,7 @@ use crate::proto::Tx; use crate::tendermint_rpc::query::Query; use crate::tendermint_rpc::Order; use crate::types::address::{masp, Address}; +use crate::types::io::Io; use crate::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use crate::types::storage::{BlockHeight, Epoch, Key, KeySeg, TxIndex}; use crate::types::token; @@ -74,6 +75,7 @@ use crate::types::token::{ Transfer, HEAD_TX_KEY, PIN_KEY_PREFIX, TX_KEY_PREFIX, }; use crate::types::transaction::{EllipticCurve, PairingEngine, WrapperTx}; +use crate::{display_line, edisplay}; /// Env var to point to a dir with MASP parameters. When not specified, /// the default OS specific path is used. @@ -960,7 +962,7 @@ impl ShieldedContext { /// context and express that value in terms of the currently timestamped /// asset types. If the key is not in the context, then we do not know the /// balance and hence we return None. - pub async fn compute_exchanged_balance( + pub async fn compute_exchanged_balance( &mut self, client: &C, vk: &ViewingKey, @@ -969,7 +971,7 @@ impl ShieldedContext { // First get the unexchanged balance if let Some(balance) = self.compute_shielded_balance(client, vk).await { let exchanged_amount = self - .compute_exchanged_amount( + .compute_exchanged_amount::<_, IO>( client, balance, target_epoch, @@ -990,7 +992,7 @@ impl ShieldedContext { /// the trace amount that could not be converted is moved from input to /// output. #[allow(clippy::too_many_arguments)] - async fn apply_conversion( + async fn apply_conversion( &mut self, client: &C, conv: AllowedConversion, @@ -1015,7 +1017,8 @@ impl ShieldedContext { ); let threshold = -conv[&masp_asset]; if threshold == 0 { - eprintln!( + edisplay!( + IO, "Asset threshold of selected conversion for asset type {} is \ 0, this is a bug, please report it.", masp_asset @@ -1044,7 +1047,7 @@ impl ShieldedContext { /// note of the conversions that were used. Note that this function does /// not assume that allowed conversions from the ledger are expressed in /// terms of the latest asset types. - pub async fn compute_exchanged_amount( + pub async fn compute_exchanged_amount( &mut self, client: &C, mut input: MaspAmount, @@ -1090,14 +1093,15 @@ impl ShieldedContext { if let (Some((conv, _wit, usage)), false) = (conversions.get_mut(&asset_type), at_target_asset_type) { - println!( + display_line!( + IO, "converting current asset type to latest asset type..." ); // Not at the target asset type, not at the latest asset // type. Apply conversion to get from // current asset type to the latest // asset type. - self.apply_conversion( + self.apply_conversion::<_, IO>( client, conv.clone(), (asset_epoch, token_addr.clone(), denom), @@ -1111,14 +1115,15 @@ impl ShieldedContext { conversions.get_mut(&target_asset_type), at_target_asset_type, ) { - println!( + display_line!( + IO, "converting latest asset type to target asset type..." ); // Not at the target asset type, yet at the latest asset // type. Apply inverse conversion to get // from latest asset type to the target // asset type. - self.apply_conversion( + self.apply_conversion::<_, IO>( client, conv.clone(), (asset_epoch, token_addr.clone(), denom), @@ -1153,7 +1158,7 @@ impl ShieldedContext { /// of the specified asset type. Return the total value accumulated plus /// notes and the corresponding diversifiers/merkle paths that were used to /// achieve the total value. - pub async fn collect_unspent_notes( + pub async fn collect_unspent_notes( &mut self, client: &C, vk: &ViewingKey, @@ -1188,7 +1193,7 @@ impl ShieldedContext { .expect("received note has invalid value or asset type"); let input = self.decode_all_amounts(client, pre_contr).await; let (contr, proposed_convs) = self - .compute_exchanged_amount( + .compute_exchanged_amount::<_, IO>( client, input, target_epoch, @@ -1294,7 +1299,7 @@ impl ShieldedContext { /// the epoch of the transaction or even before, so exchange all these /// amounts to the epoch of the transaction in order to get the value that /// would have been displayed in the epoch of the transaction. - pub async fn compute_exchanged_pinned_balance( + pub async fn compute_exchanged_pinned_balance( &mut self, client: &C, owner: PaymentAddress, @@ -1303,16 +1308,21 @@ impl ShieldedContext { // Obtain the balance that will be exchanged let (amt, ep) = Self::compute_pinned_balance(client, owner, viewing_key).await?; - println!("Pinned balance: {:?}", amt); + display_line!(IO, "Pinned balance: {:?}", amt); // Establish connection with which to do exchange rate queries let amount = self.decode_all_amounts(client, amt).await; - println!("Decoded pinned balance: {:?}", amount); + display_line!(IO, "Decoded pinned balance: {:?}", amount); // Finally, exchange the balance to the transaction's epoch let computed_amount = self - .compute_exchanged_amount(client, amount, ep, HashMap::new()) + .compute_exchanged_amount::<_, IO>( + client, + amount, + ep, + HashMap::new(), + ) .await .0; - println!("Exchanged amount: {:?}", computed_amount); + display_line!(IO, "Exchanged amount: {:?}", computed_amount); Ok((self.decode_all_amounts(client, computed_amount).await, ep)) } @@ -1391,7 +1401,7 @@ impl ShieldedContext { /// understood that transparent account changes are effected only by the /// amounts and signatures specified by the containing Transfer object. #[cfg(feature = "masp-tx-gen")] - pub async fn gen_shielded_transfer( + pub async fn gen_shielded_transfer( &mut self, client: &C, args: &args::TxTransfer, @@ -1462,7 +1472,7 @@ impl ShieldedContext { // Locate unspent notes that can help us meet the transaction amount let (_, unspent_notes, used_convs) = self - .collect_unspent_notes( + .collect_unspent_notes::<_, IO>( client, &to_viewing_key(&sk).vk, required_amt, diff --git a/shared/src/ledger/rpc.rs b/shared/src/ledger/rpc.rs index 90d05ebd135..357ab8d2981 100644 --- a/shared/src/ledger/rpc.rs +++ b/shared/src/ledger/rpc.rs @@ -34,16 +34,18 @@ use crate::tendermint_rpc::Order; use crate::types::control_flow::{time, Halt, TryHalt}; use crate::types::governance::{ProposalVote, VotePower}; use crate::types::hash::Hash; +use crate::types::io::Io; use crate::types::key::*; use crate::types::storage::{BlockHeight, BlockResults, Epoch, PrefixValue}; use crate::types::token::balance_key; use crate::types::{storage, token}; +use crate::{display_line, edisplay}; /// Query the status of a given transaction. /// /// If a response is not delivered until `deadline`, we exit the cli with an /// error. -pub async fn query_tx_status( +pub async fn query_tx_status( client: &C, status: TxEventQuery<'_>, deadline: time::Instant, @@ -84,7 +86,10 @@ where }) .await .try_halt(|_| { - eprintln!("Transaction status query deadline of {deadline:?} exceeded"); + edisplay!( + IO, + "Transaction status query deadline of {deadline:?} exceeded" + ); }) } @@ -253,7 +258,10 @@ pub async fn query_conversion( } /// Query a wasm code hash -pub async fn query_wasm_code_hash( +pub async fn query_wasm_code_hash< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, code_path: impl AsRef, ) -> Option { @@ -266,7 +274,8 @@ pub async fn query_wasm_code_hash( Some(Hash::try_from(&hash[..]).expect("Invalid code hash")) } None => { - eprintln!( + edisplay!( + IO, "The corresponding wasm code of the code path {} doesn't \ exist on chain.", code_path.as_ref(), @@ -339,7 +348,11 @@ pub async fn query_storage_value_bytes< /// Query a range of storage values with a matching prefix and decode them with /// [`BorshDeserialize`]. Returns an iterator of the storage keys paired with /// their associated values. -pub async fn query_storage_prefix( +pub async fn query_storage_prefix< + C: crate::ledger::queries::Client + Sync, + IO: Io, + T, +>( client: &C, key: &storage::Key, ) -> Option> @@ -356,9 +369,11 @@ where &value[..], ) { Err(err) => { - eprintln!( + edisplay!( + IO, "Skipping a value for key {}. Error in decoding: {}", - key, err + key, + err ); None } @@ -446,7 +461,7 @@ pub async fn query_tx_events( } /// Dry run a transaction -pub async fn dry_run_tx( +pub async fn dry_run_tx( client: &C, tx_bytes: Vec, ) -> namada_core::types::transaction::TxResult { @@ -455,7 +470,7 @@ pub async fn dry_run_tx( RPC.shell().dry_run_tx(client, data, height, prove).await, ) .data; - println! {"Dry-run result: {}", result}; + display_line!(IO, "Dry-run result: {}", result); result } @@ -634,7 +649,10 @@ pub async fn query_tx_response( } /// Get the votes for a given proposal id -pub async fn get_proposal_votes( +pub async fn get_proposal_votes< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, epoch: Epoch, proposal_id: u64, @@ -644,7 +662,8 @@ pub async fn get_proposal_votes( let vote_prefix_key = gov_storage::get_proposal_vote_prefix_key(proposal_id); let vote_iter = - query_storage_prefix::(client, &vote_prefix_key).await; + query_storage_prefix::(client, &vote_prefix_key) + .await; let mut yay_validators: HashMap = HashMap::new(); @@ -778,6 +797,7 @@ pub async fn query_bond( /// Query a validator's unbonds for a given epoch pub async fn query_and_print_unbonds< C: crate::ledger::queries::Client + Sync, + IO: Io, >( client: &C, source: &Address, @@ -798,16 +818,18 @@ pub async fn query_and_print_unbonds< } } if total_withdrawable != token::Amount::default() { - println!( + display_line!( + IO, "Total withdrawable now: {}.", total_withdrawable.to_string_native() ); } if !not_yet_withdrawable.is_empty() { - println!("Current epoch: {current_epoch}.") + display_line!(IO, "Current epoch: {current_epoch}.") } for (withdraw_epoch, amount) in not_yet_withdrawable { - println!( + display_line!( + IO, "Amount {} withdrawable starting from epoch {withdraw_epoch}.", amount.to_string_native() ); @@ -950,7 +972,10 @@ pub async fn enriched_bonds_and_unbonds< } /// Get the correct representation of the amount given the token type. -pub async fn validate_amount( +pub async fn validate_amount< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, amount: InputAmount, token: &Address, @@ -969,13 +994,15 @@ pub async fn validate_amount( ) .or_else(|| { if force { - println!( + display_line!( + IO, "No denomination found for token: {token}, but --force was \ passed. Defaulting to the provided denomination." ); Some(input_amount.denom) } else { - println!( + display_line!( + IO, "No denomination found for token: {token}, the input \ arguments could not be parsed." ); @@ -983,7 +1010,8 @@ pub async fn validate_amount( } })?; if denom < input_amount.denom && !force { - println!( + display_line!( + IO, "The input amount contained a higher precision than allowed by \ {token}." ); @@ -992,7 +1020,8 @@ pub async fn validate_amount( match input_amount.increase_precision(denom) { Ok(res) => Some(res), Err(_) => { - println!( + display_line!( + IO, "The amount provided requires more the 256 bits to \ represent." ); @@ -1003,7 +1032,7 @@ pub async fn validate_amount( } /// Wait for a first block and node to be synced. -pub async fn wait_until_node_is_synched(client: &C) -> Halt<()> +pub async fn wait_until_node_is_synched(client: &C) -> Halt<()> where C: crate::ledger::queries::Client + Sync, { @@ -1027,7 +1056,8 @@ where if is_at_least_height_one && !is_catching_up { return ControlFlow::Break(Ok(())); } - println!( + display_line!( + IO, " Waiting for {} ({}/{} tries)...", if is_at_least_height_one { "a first block" @@ -1041,7 +1071,7 @@ where ControlFlow::Continue(()) } Err(e) => { - eprintln!("Failed to query node status with error: {}", e); + edisplay!(IO, "Failed to query node status with error: {}", e); ControlFlow::Break(Err(())) } } @@ -1049,7 +1079,10 @@ where .await // maybe time out .try_halt(|_| { - println!("Node is still catching up, wait for it to finish synching."); + display_line!( + IO, + "Node is still catching up, wait for it to finish synching." + ); })? // error querying rpc .try_halt(|_| ()) @@ -1059,6 +1092,7 @@ where /// correctly as a string. pub async fn format_denominated_amount< C: crate::ledger::queries::Client + Sync, + IO: Io, >( client: &C, token: &TokenAddress, @@ -1071,7 +1105,8 @@ pub async fn format_denominated_amount< .await, ) .unwrap_or_else(|| { - println!( + display_line!( + IO, "No denomination found for token: {token}, defaulting to zero \ decimal places" ); diff --git a/shared/src/ledger/signing.rs b/shared/src/ledger/signing.rs index b6b06f0daea..a7204bcce41 100644 --- a/shared/src/ledger/signing.rs +++ b/shared/src/ledger/signing.rs @@ -46,6 +46,7 @@ pub use crate::ledger::wallet::store::AddressVpType; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::ledger::{args, rpc}; use crate::proto::{MaspBuilder, Section, Signature, Tx}; +use crate::types::io::Io; use crate::types::key::*; use crate::types::masp::{ExtendedViewingKey, PaymentAddress}; use crate::types::storage::Epoch; @@ -56,6 +57,7 @@ use crate::types::transaction::governance::{ use crate::types::transaction::{ Fee, InitAccount, InitValidator, TxType, UpdateVp, WrapperTx, }; +use crate::{display_line, edisplay}; #[cfg(feature = "std")] /// Env. var specifying where to store signing test vectors @@ -71,6 +73,7 @@ const ENV_VAR_TX_LOG_PATH: &str = "NAMADA_TX_LOG_PATH"; pub async fn find_pk< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -79,7 +82,8 @@ pub async fn find_pk< ) -> Result { match addr { Address::Established(_) => { - println!( + display_line!( + IO, "Looking-up public key of {} from the ledger...", addr.encode() ); @@ -158,6 +162,7 @@ pub enum TxSigningKey { pub async fn tx_signer< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -186,7 +191,7 @@ pub async fn tx_signer< } TxSigningKey::WalletAddress(signer) => Ok(( Some(signer.clone()), - find_pk::(client, wallet, &signer, args.password.clone()) + find_pk::(client, wallet, &signer, args.password.clone()) .await?, )), TxSigningKey::None => other_err( @@ -230,7 +235,10 @@ pub async fn sign_tx( #[cfg(not(feature = "mainnet"))] /// Solve the PoW challenge if balance is insufficient to pay transaction fees /// or if solution is explicitly requested. -pub async fn solve_pow_challenge( +pub async fn solve_pow_challenge< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, args: &args::Tx, keypair: &common::PublicKey, @@ -259,8 +267,10 @@ pub async fn solve_pow_challenge( let err_msg = format!( "The wrapper transaction source doesn't have enough balance to \ pay fee {}, got {}.", - format_denominated_amount(client, &token_addr, fee_amount).await, - format_denominated_amount(client, &token_addr, balance).await, + format_denominated_amount::<_, IO>(client, &token_addr, fee_amount) + .await, + format_denominated_amount::<_, IO>(client, &token_addr, balance) + .await, ); if !args.force && cfg!(feature = "mainnet") { panic!("{}", err_msg); @@ -274,7 +284,10 @@ pub async fn solve_pow_challenge( // If the address derived from the keypair doesn't have enough balance // to pay for the fee, allow to find a PoW solution instead. if requires_pow || !is_bal_sufficient { - println!("The transaction requires the completion of a PoW challenge."); + display_line!( + IO, + "The transaction requires the completion of a PoW challenge." + ); // Obtain a PoW challenge for faucet withdrawal let challenge = rpc::get_testnet_pow_challenge(client, source).await; @@ -288,7 +301,10 @@ pub async fn solve_pow_challenge( #[cfg(not(feature = "mainnet"))] /// Update the PoW challenge inside the given transaction -pub async fn update_pow_challenge( +pub async fn update_pow_challenge< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, args: &args::Tx, tx: &mut Tx, @@ -297,7 +313,8 @@ pub async fn update_pow_challenge( ) { if let TxType::Wrapper(wrapper) = &mut tx.header.tx_type { let (pow_solution, fee) = - solve_pow_challenge(client, args, keypair, requires_pow).await; + solve_pow_challenge::<_, IO>(client, args, keypair, requires_pow) + .await; wrapper.fee = fee; wrapper.pow_solution = pow_solution; } @@ -309,6 +326,7 @@ pub async fn update_pow_challenge( pub async fn wrap_tx< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, #[allow(unused_variables)] wallet: &mut Wallet, @@ -320,7 +338,7 @@ pub async fn wrap_tx< ) -> Tx { #[cfg(not(feature = "mainnet"))] let (pow_solution, fee) = - solve_pow_challenge(client, args, keypair, requires_pow).await; + solve_pow_challenge::<_, IO>(client, args, keypair, requires_pow).await; // This object governs how the payload will be processed tx.update_header(TxType::Wrapper(Box::new(WrapperTx::new( fee, @@ -340,7 +358,7 @@ pub async fn wrap_tx< // Contract the large data blobs in the transaction tx.wallet_filter(); // Convert the transaction to Ledger format - let decoding = to_ledger_vector(client, wallet, &tx) + let decoding = to_ledger_vector::<_, _, IO>(client, wallet, &tx) .await .expect("unable to decode transaction"); let output = serde_json::to_string(&decoding) @@ -378,6 +396,7 @@ pub async fn wrap_tx< pub async fn sign_wrapper< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, #[allow(unused_variables)] wallet: &mut Wallet, @@ -414,10 +433,12 @@ pub async fn sign_wrapper< let err_msg = format!( "The wrapper transaction source doesn't have enough balance to \ pay fee {}, got {}.", - format_denominated_amount(client, &token_addr, fee_amount).await, - format_denominated_amount(client, &token_addr, balance).await, + format_denominated_amount::<_, IO>(client, &token_addr, fee_amount) + .await, + format_denominated_amount::<_, IO>(client, &token_addr, balance) + .await, ); - eprintln!("{}", err_msg); + edisplay!(IO, "{}", err_msg); if !args.force && cfg!(feature = "mainnet") { panic!("{}", err_msg); } @@ -429,7 +450,8 @@ pub async fn sign_wrapper< // If the address derived from the keypair doesn't have enough balance // to pay for the fee, allow to find a PoW solution instead. if requires_pow || !is_bal_sufficient { - println!( + display_line!( + IO, "The transaction requires the completion of a PoW challenge." ); // Obtain a PoW challenge for faucet withdrawal @@ -466,7 +488,7 @@ pub async fn sign_wrapper< // Contract the large data blobs in the transaction tx.wallet_filter(); // Convert the transaction to Ledger format - let decoding = to_ledger_vector(client, wallet, &tx) + let decoding = to_ledger_vector::<_, _, IO>(client, wallet, &tx) .await .expect("unable to decode transaction"); let output = serde_json::to_string(&decoding) @@ -561,7 +583,10 @@ fn make_ledger_amount_addr( /// Adds a Ledger output line describing a given transaction amount and asset /// type -async fn make_ledger_amount_asset( +async fn make_ledger_amount_asset< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, tokens: &HashMap, output: &mut Vec, @@ -576,8 +601,12 @@ async fn make_ledger_amount_asset( address: token.clone(), sub_prefix: sub_prefix.clone(), }; - let formatted_amt = - format_denominated_amount(client, &token_addr, amount.into()).await; + let formatted_amt = format_denominated_amount::<_, IO>( + client, + &token_addr, + amount.into(), + ) + .await; if let Some(token) = tokens.get(token) { output.push(format!( "{}Amount: {} {}", @@ -665,6 +694,7 @@ fn format_outputs(output: &mut Vec) { /// transactions pub async fn make_ledger_masp_endpoints< C: crate::ledger::queries::Client + Sync, + IO: Io, >( client: &C, tokens: &HashMap, @@ -689,7 +719,7 @@ pub async fn make_ledger_masp_endpoints< for sapling_input in builder.builder.sapling_inputs() { let vk = ExtendedViewingKey::from(*sapling_input.key()); output.push(format!("Sender : {}", vk)); - make_ledger_amount_asset( + make_ledger_amount_asset::<_, IO>( client, tokens, output, @@ -717,7 +747,7 @@ pub async fn make_ledger_masp_endpoints< for sapling_output in builder.builder.sapling_outputs() { let pa = PaymentAddress::from(sapling_output.address()); output.push(format!("Destination : {}", pa)); - make_ledger_amount_asset( + make_ledger_amount_asset::<_, IO>( client, tokens, output, @@ -746,44 +776,57 @@ pub async fn make_ledger_masp_endpoints< pub async fn to_ledger_vector< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, tx: &Tx, ) -> Result { - let init_account_hash = query_wasm_code_hash(client, TX_INIT_ACCOUNT_WASM) + let init_account_hash = + query_wasm_code_hash::<_, IO>(client, TX_INIT_ACCOUNT_WASM) + .await + .unwrap(); + let init_validator_hash = + query_wasm_code_hash::<_, IO>(client, TX_INIT_VALIDATOR_WASM) + .await + .unwrap(); + let init_proposal_hash = + query_wasm_code_hash::<_, IO>(client, TX_INIT_PROPOSAL) + .await + .unwrap(); + let vote_proposal_hash = + query_wasm_code_hash::<_, IO>(client, TX_VOTE_PROPOSAL) + .await + .unwrap(); + let reveal_pk_hash = query_wasm_code_hash::<_, IO>(client, TX_REVEAL_PK) .await .unwrap(); - let init_validator_hash = - query_wasm_code_hash(client, TX_INIT_VALIDATOR_WASM) + let update_vp_hash = + query_wasm_code_hash::<_, IO>(client, TX_UPDATE_VP_WASM) .await .unwrap(); - let init_proposal_hash = query_wasm_code_hash(client, TX_INIT_PROPOSAL) + let transfer_hash = query_wasm_code_hash::<_, IO>(client, TX_TRANSFER_WASM) .await .unwrap(); - let vote_proposal_hash = query_wasm_code_hash(client, TX_VOTE_PROPOSAL) + let ibc_hash = query_wasm_code_hash::<_, IO>(client, TX_IBC_WASM) .await .unwrap(); - let reveal_pk_hash = - query_wasm_code_hash(client, TX_REVEAL_PK).await.unwrap(); - let update_vp_hash = query_wasm_code_hash(client, TX_UPDATE_VP_WASM) + let bond_hash = query_wasm_code_hash::<_, IO>(client, TX_BOND_WASM) .await .unwrap(); - let transfer_hash = query_wasm_code_hash(client, TX_TRANSFER_WASM) + let unbond_hash = query_wasm_code_hash::<_, IO>(client, TX_UNBOND_WASM) .await .unwrap(); - let ibc_hash = query_wasm_code_hash(client, TX_IBC_WASM).await.unwrap(); - let bond_hash = query_wasm_code_hash(client, TX_BOND_WASM).await.unwrap(); - let unbond_hash = - query_wasm_code_hash(client, TX_UNBOND_WASM).await.unwrap(); - let withdraw_hash = query_wasm_code_hash(client, TX_WITHDRAW_WASM) + let withdraw_hash = query_wasm_code_hash::<_, IO>(client, TX_WITHDRAW_WASM) .await .unwrap(); let change_commission_hash = - query_wasm_code_hash(client, TX_CHANGE_COMMISSION_WASM) + query_wasm_code_hash::<_, IO>(client, TX_CHANGE_COMMISSION_WASM) .await .unwrap(); - let user_hash = query_wasm_code_hash(client, VP_USER_WASM).await.unwrap(); + let user_hash = query_wasm_code_hash::<_, IO>(client, VP_USER_WASM) + .await + .unwrap(); // To facilitate lookups of human-readable token names let tokens: HashMap = wallet @@ -1045,7 +1088,7 @@ pub async fn to_ledger_vector< tv.name = "Transfer 0".to_string(); tv.output.push("Type : Transfer".to_string()); - make_ledger_masp_endpoints( + make_ledger_masp_endpoints::<_, IO>( client, &tokens, &mut tv.output, @@ -1054,7 +1097,7 @@ pub async fn to_ledger_vector< &asset_types, ) .await; - make_ledger_masp_endpoints( + make_ledger_masp_endpoints::<_, IO>( client, &tokens, &mut tv.output_expert, @@ -1220,15 +1263,18 @@ pub async fn to_ledger_vector< address: wrapper.fee.token.clone(), sub_prefix: None, }; - let gas_limit = format_denominated_amount( + let gas_limit = format_denominated_amount::<_, IO>( client, &gas_token, Amount::from(wrapper.gas_limit), ) .await; - let gas_amount = - format_denominated_amount(client, &gas_token, wrapper.fee.amount) - .await; + let gas_amount = format_denominated_amount::<_, IO>( + client, + &gas_token, + wrapper.fee.amount, + ) + .await; tv.output_expert.extend(vec![ format!("Timestamp : {}", tx.header.timestamp.0), format!("PK : {}", wrapper.pk), diff --git a/shared/src/ledger/tx.rs b/shared/src/ledger/tx.rs index 7bceb09a092..85abe4ef30f 100644 --- a/shared/src/ledger/tx.rs +++ b/shared/src/ledger/tx.rs @@ -42,14 +42,15 @@ use crate::proto::{Code, Data, MaspBuilder, Section, Tx}; use crate::tendermint_rpc::endpoint::broadcast::tx_sync::Response; use crate::tendermint_rpc::error::Error as RpcError; use crate::types::control_flow::{time, ProceedOrElse}; +use crate::types::io::Io; use crate::types::key::*; use crate::types::masp::TransferTarget; use crate::types::storage::{Epoch, RESERVED_ADDRESS_PREFIX}; use crate::types::time::DateTimeUtc; use crate::types::transaction::{pos, InitAccount, TxType, UpdateVp}; use crate::types::{storage, token}; -use crate::vm; use crate::vm::WasmValidationError; +use crate::{display_line, edisplay, vm}; /// Initialize account transaction WASM pub const TX_INIT_ACCOUNT_WASM: &str = "tx_init_account.wasm"; @@ -236,6 +237,7 @@ impl ProcessTxResponse { pub async fn prepare_tx< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -245,13 +247,14 @@ pub async fn prepare_tx< #[cfg(not(feature = "mainnet"))] requires_pow: bool, ) -> Result<(Tx, Option
, common::PublicKey), Error> { let (signer_addr, signer_pk) = - tx_signer::(client, wallet, args, default_signer.clone()).await?; + tx_signer::(client, wallet, args, default_signer.clone()) + .await?; if args.dry_run { Ok((tx, signer_addr, signer_pk)) } else { let epoch = rpc::query_epoch(client).await; Ok(( - wrap_tx( + wrap_tx::<_, _, IO>( client, wallet, args, @@ -273,6 +276,7 @@ pub async fn prepare_tx< pub async fn process_tx< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -292,7 +296,7 @@ pub async fn process_tx< // println!("HTTP request body: {}", request_body); if args.dry_run { - expect_dry_broadcast(TxBroadcastData::DryRun(tx), client).await + expect_dry_broadcast::<_, IO>(TxBroadcastData::DryRun(tx), client).await } else { // We use this to determine when the wrapper tx makes it on-chain let wrapper_hash = tx.header_hash().to_string(); @@ -311,13 +315,13 @@ pub async fn process_tx< // Either broadcast or submit transaction and collect result into // sum type if args.broadcast_only { - broadcast_tx(client, &to_broadcast) + broadcast_tx::<_, IO>(client, &to_broadcast) .await .map(ProcessTxResponse::Broadcast) } else { - match submit_tx(client, to_broadcast).await { + match submit_tx::<_, IO>(client, to_broadcast).await { Ok(x) => { - save_initialized_accounts::( + save_initialized_accounts::( wallet, args, x.initialized_accounts.clone(), @@ -335,6 +339,7 @@ pub async fn process_tx< pub async fn build_reveal_pk< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -347,12 +352,12 @@ pub async fn build_reveal_pk< let public_key = public_key; if !is_reveal_pk_needed::(client, &public_key, &args).await? { let addr: Address = (&public_key).into(); - println!("PK for {addr} is already revealed, nothing to do."); + display_line!(IO, "PK for {addr} is already revealed, nothing to do."); Ok(None) } else { // If not, submit it Ok(Some( - build_reveal_pk_aux::(client, wallet, &public_key, &args) + build_reveal_pk_aux::(client, wallet, &public_key, &args) .await?, )) } @@ -388,6 +393,7 @@ pub async fn has_revealed_pk( pub async fn build_reveal_pk_aux< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -395,10 +401,13 @@ pub async fn build_reveal_pk_aux< args: &args::Tx, ) -> Result<(Tx, Option
, common::PublicKey), Error> { let addr: Address = public_key.into(); - println!("Submitting a tx to reveal the public key for address {addr}..."); + display_line!( + IO, + "Submitting a tx to reveal the public key for address {addr}..." + ); let tx_data = public_key.try_to_vec().map_err(Error::EncodeKeyFailure)?; - let tx_code_hash = query_wasm_code_hash( + let tx_code_hash = query_wasm_code_hash::<_, IO>( client, args.tx_reveal_code_path.to_str().unwrap(), ) @@ -411,7 +420,7 @@ pub async fn build_reveal_pk_aux< tx.set_data(Data::new(tx_data)); tx.set_code(Code::from_hash(tx_code_hash)); - prepare_tx::( + prepare_tx::( client, wallet, args, @@ -427,7 +436,7 @@ pub async fn build_reveal_pk_aux< /// the tx has been successfully included into the mempool of a validator /// /// In the case of errors in any of those stages, an error message is returned -pub async fn broadcast_tx( +pub async fn broadcast_tx( rpc_cli: &C, to_broadcast: &TxBroadcastData, ) -> Result { @@ -452,12 +461,20 @@ pub async fn broadcast_tx( lift_rpc_error(rpc_cli.broadcast_tx_sync(tx.to_bytes().into()).await)?; if response.code == 0.into() { - println!("Transaction added to mempool: {:?}", response); + display_line!(IO, "Transaction added to mempool: {:?}", response); // Print the transaction identifiers to enable the extraction of // acceptance/application results later { - println!("Wrapper transaction hash: {:?}", wrapper_tx_hash); - println!("Inner transaction hash: {:?}", decrypted_tx_hash); + display_line!( + IO, + "Wrapper transaction hash: {:?}", + wrapper_tx_hash + ); + display_line!( + IO, + "Inner transaction hash: {:?}", + decrypted_tx_hash + ); } Ok(response) } else { @@ -475,7 +492,7 @@ pub async fn broadcast_tx( /// 3. The decrypted payload of the tx has been included on the blockchain. /// /// In the case of errors in any of those stages, an error message is returned -pub async fn submit_tx( +pub async fn submit_tx( client: &C, to_broadcast: TxBroadcastData, ) -> Result @@ -492,7 +509,7 @@ where }?; // Broadcast the supplied transaction - broadcast_tx(client, &to_broadcast).await?; + broadcast_tx::<_, IO>(client, &to_broadcast).await?; let deadline = time::Instant::now() + time::Duration::from_secs( @@ -508,12 +525,14 @@ where let parsed = { let wrapper_query = crate::ledger::rpc::TxEventQuery::Accepted(wrapper_hash.as_str()); - let event = rpc::query_tx_status(client, wrapper_query, deadline) - .await - .proceed_or(Error::AcceptTimeout)?; + let event = + rpc::query_tx_status::<_, IO>(client, wrapper_query, deadline) + .await + .proceed_or(Error::AcceptTimeout)?; let parsed = TxResponse::from_event(event); - println!( + display_line!( + IO, "Transaction accepted with result: {}", serde_json::to_string_pretty(&parsed).unwrap() ); @@ -524,11 +543,16 @@ where // payload makes its way onto the blockchain let decrypted_query = rpc::TxEventQuery::Applied(decrypted_hash.as_str()); - let event = rpc::query_tx_status(client, decrypted_query, deadline) - .await - .proceed_or(Error::AppliedTimeout)?; + let event = rpc::query_tx_status::<_, IO>( + client, + decrypted_query, + deadline, + ) + .await + .proceed_or(Error::AppliedTimeout)?; let parsed = TxResponse::from_event(event); - println!( + display_line!( + IO, "Transaction applied with result: {}", serde_json::to_string_pretty(&parsed).unwrap() ); @@ -565,7 +589,7 @@ pub fn decode_component( } /// Save accounts initialized from a tx into the wallet, if any. -pub async fn save_initialized_accounts( +pub async fn save_initialized_accounts( wallet: &mut Wallet, args: &args::Tx, initialized_accounts: Vec
, @@ -573,7 +597,8 @@ pub async fn save_initialized_accounts( let len = initialized_accounts.len(); if len != 0 { // Store newly initialized account addresses in the wallet - println!( + display_line!( + IO, "The transaction initialized {} new account{}", len, if len == 1 { "" } else { "s" } @@ -604,12 +629,16 @@ pub async fn save_initialized_accounts( ); match added { Some(new_alias) if new_alias != encoded => { - println!( + display_line!( + IO, "Added alias {} for address {}.", - new_alias, encoded + new_alias, + encoded ); } - _ => println!("No alias added for address {}.", encoded), + _ => { + display_line!(IO, "No alias added for address {}.", encoded) + } }; } } @@ -619,6 +648,7 @@ pub async fn save_initialized_accounts( pub async fn build_validator_commission_change< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -626,10 +656,12 @@ pub async fn build_validator_commission_change< ) -> Result<(Tx, Option
, common::PublicKey), Error> { let epoch = rpc::query_epoch(client).await; - let tx_code_hash = - query_wasm_code_hash(client, args.tx_code_path.to_str().unwrap()) - .await - .unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.tx_code_path.to_str().unwrap(), + ) + .await + .unwrap(); // TODO: put following two let statements in its own function let params_key = crate::ledger::pos::params_key(); @@ -640,7 +672,11 @@ pub async fn build_validator_commission_change< let validator = args.validator.clone(); if rpc::is_validator(client, &validator).await { if args.rate < Dec::zero() || args.rate > Dec::one() { - eprintln!("Invalid new commission rate, received {}", args.rate); + edisplay!( + IO, + "Invalid new commission rate, received {}", + args.rate + ); return Err(Error::InvalidCommissionRate(args.rate)); } @@ -660,7 +696,8 @@ pub async fn build_validator_commission_change< if args.rate.abs_diff(&commission_rate) > max_commission_change_per_epoch { - eprintln!( + edisplay!( + IO, "New rate is too large of a change with respect to \ the predecessor epoch in which the rate will take \ effect." @@ -671,14 +708,14 @@ pub async fn build_validator_commission_change< } } None => { - eprintln!("Error retrieving from storage"); + edisplay!(IO, "Error retrieving from storage"); if !args.tx.force { return Err(Error::Retrieval); } } } } else { - eprintln!("The given address {validator} is not a validator."); + edisplay!(IO, "The given address {validator} is not a validator."); if !args.tx.force { return Err(Error::InvalidValidatorAddress(validator)); } @@ -697,7 +734,7 @@ pub async fn build_validator_commission_change< tx.set_code(Code::from_hash(tx_code_hash)); let default_signer = args.validator.clone(); - prepare_tx::( + prepare_tx::( client, wallet, &args.tx, @@ -713,21 +750,27 @@ pub async fn build_validator_commission_change< pub async fn build_unjail_validator< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, args: args::TxUnjailValidator, ) -> Result<(Tx, Option
, common::PublicKey), Error> { if !rpc::is_validator(client, &args.validator).await { - eprintln!("The given address {} is not a validator.", &args.validator); + edisplay!( + IO, + "The given address {} is not a validator.", + &args.validator + ); if !args.tx.force { return Err(Error::InvalidValidatorAddress(args.validator.clone())); } } let tx_code_path = String::from_utf8(args.tx_code_path).unwrap(); - let tx_code_hash = - query_wasm_code_hash(client, tx_code_path).await.unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>(client, tx_code_path) + .await + .unwrap(); let data = args .validator @@ -742,7 +785,7 @@ pub async fn build_unjail_validator< tx.set_code(Code::from_hash(tx_code_hash)); let default_signer = args.validator; - prepare_tx( + prepare_tx::<_, _, IO>( client, wallet, &args.tx, @@ -758,21 +801,27 @@ pub async fn build_unjail_validator< pub async fn submit_unjail_validator< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, args: args::TxUnjailValidator, ) -> Result<(), Error> { if !rpc::is_validator(client, &args.validator).await { - eprintln!("The given address {} is not a validator.", &args.validator); + edisplay!( + IO, + "The given address {} is not a validator.", + &args.validator + ); if !args.tx.force { return Err(Error::InvalidValidatorAddress(args.validator.clone())); } } let tx_code_path = String::from_utf8(args.tx_code_path).unwrap(); - let tx_code_hash = - query_wasm_code_hash(client, tx_code_path).await.unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>(client, tx_code_path) + .await + .unwrap(); let data = args .validator @@ -787,7 +836,7 @@ pub async fn submit_unjail_validator< tx.set_code(Code::from_hash(tx_code_hash)); let default_signer = args.validator; - prepare_tx( + prepare_tx::<_, _, IO>( client, wallet, &args.tx, @@ -804,6 +853,7 @@ pub async fn submit_unjail_validator< pub async fn build_withdraw< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -811,16 +861,21 @@ pub async fn build_withdraw< ) -> Result<(Tx, Option
, common::PublicKey), Error> { let epoch = rpc::query_epoch(client).await; - let validator = - known_validator_or_err(args.validator.clone(), args.tx.force, client) - .await?; + let validator = known_validator_or_err::<_, IO>( + args.validator.clone(), + args.tx.force, + client, + ) + .await?; let source = args.source.clone(); - let tx_code_hash = - query_wasm_code_hash(client, args.tx_code_path.to_str().unwrap()) - .await - .unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.tx_code_path.to_str().unwrap(), + ) + .await + .unwrap(); // Check the source's current unbond amount let bond_source = source.clone().unwrap_or_else(|| validator.clone()); @@ -832,21 +887,24 @@ pub async fn build_withdraw< ) .await; if tokens.is_zero() { - eprintln!( + edisplay!( + IO, "There are no unbonded bonds ready to withdraw in the current \ epoch {}.", epoch ); - rpc::query_and_print_unbonds(client, &bond_source, &validator).await; + rpc::query_and_print_unbonds::<_, IO>(client, &bond_source, &validator) + .await; if !args.tx.force { return Err(Error::NoUnbondReady(epoch)); } } else { - println!( + display_line!( + IO, "Found {} tokens that can be withdrawn.", tokens.to_string_native() ); - println!("Submitting transaction to withdraw them..."); + display_line!(IO, "Submitting transaction to withdraw them..."); } let data = pos::Withdraw { validator, source }; @@ -859,7 +917,7 @@ pub async fn build_withdraw< tx.set_code(Code::from_hash(tx_code_hash)); let default_signer = args.source.unwrap_or(args.validator); - prepare_tx::( + prepare_tx::( client, wallet, &args.tx, @@ -875,6 +933,7 @@ pub async fn build_withdraw< pub async fn build_unbond< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -892,24 +951,32 @@ pub async fn build_unbond< // Check the source's current bond amount let bond_source = source.clone().unwrap_or_else(|| args.validator.clone()); - let tx_code_hash = - query_wasm_code_hash(client, args.tx_code_path.to_str().unwrap()) - .await - .unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.tx_code_path.to_str().unwrap(), + ) + .await + .unwrap(); if !args.tx.force { - known_validator_or_err(args.validator.clone(), args.tx.force, client) - .await?; + known_validator_or_err::<_, IO>( + args.validator.clone(), + args.tx.force, + client, + ) + .await?; let bond_amount = rpc::query_bond(client, &bond_source, &args.validator, None).await; - println!( + display_line!( + IO, "Bond amount available for unbonding: {} NAM", bond_amount.to_string_native() ); if args.amount > bond_amount { - eprintln!( + edisplay!( + IO, "The total bonds of the source {} is lower than the amount to \ be unbonded. Amount to unbond is {} and the total bonds is \ {}.", @@ -952,7 +1019,7 @@ pub async fn build_unbond< tx.set_code(Code::from_hash(tx_code_hash)); let default_signer = args.source.unwrap_or_else(|| args.validator.clone()); - let (tx, signer_addr, default_signer) = prepare_tx::( + let (tx, signer_addr, default_signer) = prepare_tx::( client, wallet, &args.tx, @@ -967,7 +1034,7 @@ pub async fn build_unbond< } /// Query the unbonds post-tx -pub async fn query_unbonds( +pub async fn query_unbonds( client: &C, args: args::Unbond, latest_withdrawal_pre: Option<(Epoch, token::Amount)>, @@ -994,7 +1061,8 @@ pub async fn query_unbonds( match latest_withdraw_epoch_post.cmp(&latest_withdraw_epoch_pre) { std::cmp::Ordering::Less => { if args.tx.force { - eprintln!( + edisplay!( + IO, "Unexpected behavior reading the unbonds data has \ occurred" ); @@ -1003,7 +1071,8 @@ pub async fn query_unbonds( } } std::cmp::Ordering::Equal => { - println!( + display_line!( + IO, "Amount {} withdrawable starting from epoch {}", (latest_withdraw_amount_post - latest_withdraw_amount_pre) .to_string_native(), @@ -1011,7 +1080,8 @@ pub async fn query_unbonds( ); } std::cmp::Ordering::Greater => { - println!( + display_line!( + IO, "Amount {} withdrawable starting from epoch {}", latest_withdraw_amount_post.to_string_native(), latest_withdraw_epoch_post, @@ -1019,7 +1089,8 @@ pub async fn query_unbonds( } } } else { - println!( + display_line!( + IO, "Amount {} withdrawable starting from epoch {}", latest_withdraw_amount_post.to_string_native(), latest_withdraw_epoch_post, @@ -1032,21 +1103,27 @@ pub async fn query_unbonds( pub async fn build_bond< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, args: args::Bond, ) -> Result<(Tx, Option
, common::PublicKey), Error> { - let validator = - known_validator_or_err(args.validator.clone(), args.tx.force, client) - .await?; + let validator = known_validator_or_err::<_, IO>( + args.validator.clone(), + args.tx.force, + client, + ) + .await?; // Check that the source address exists on chain let source = args.source.clone(); let source = match args.source.clone() { - Some(source) => source_exists_or_err(source, args.tx.force, client) - .await - .map(Some), + Some(source) => { + source_exists_or_err::<_, IO>(source, args.tx.force, client) + .await + .map(Some) + } None => Ok(source), }?; // Check bond's source (source for delegation or validator for self-bonds) @@ -1055,7 +1132,7 @@ pub async fn build_bond< let balance_key = token::balance_key(&args.native_token, bond_source); // TODO Should we state the same error message for the native token? - check_balance_too_low_err( + check_balance_too_low_err::<_, IO>( &args.native_token, bond_source, args.amount, @@ -1065,10 +1142,12 @@ pub async fn build_bond< ) .await?; - let tx_code_hash = - query_wasm_code_hash(client, args.tx_code_path.to_str().unwrap()) - .await - .unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.tx_code_path.to_str().unwrap(), + ) + .await + .unwrap(); let bond = pos::Bond { validator, @@ -1084,7 +1163,7 @@ pub async fn build_bond< tx.set_code(Code::from_hash(tx_code_hash)); let default_signer = args.source.unwrap_or(args.validator); - prepare_tx::( + prepare_tx::( client, wallet, &args.tx, @@ -1130,18 +1209,23 @@ pub async fn is_safe_voting_window( pub async fn build_ibc_transfer< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, args: args::TxIbcTransfer, ) -> Result<(Tx, Option
, common::PublicKey), Error> { // Check that the source address exists on chain - let source = - source_exists_or_err(args.source.clone(), args.tx.force, client) - .await?; + let source = source_exists_or_err::<_, IO>( + args.source.clone(), + args.tx.force, + client, + ) + .await?; // We cannot check the receiver - let token = token_exists_or_err(args.token, args.tx.force, client).await?; + let token = + token_exists_or_err::<_, IO>(args.token, args.tx.force, client).await?; // Check source balance let (sub_prefix, balance_key) = match args.sub_prefix { @@ -1156,7 +1240,7 @@ pub async fn build_ibc_transfer< None => (None, token::balance_key(&token, &source)), }; - check_balance_too_low_err( + check_balance_too_low_err::<_, IO>( &token, &source, args.amount, @@ -1166,10 +1250,12 @@ pub async fn build_ibc_transfer< ) .await?; - let tx_code_hash = - query_wasm_code_hash(client, args.tx_code_path.to_str().unwrap()) - .await - .unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.tx_code_path.to_str().unwrap(), + ) + .await + .unwrap(); let denom = match sub_prefix { // To parse IbcToken address, remove the address prefix @@ -1225,7 +1311,7 @@ pub async fn build_ibc_transfer< tx.set_data(Data::new(data)); tx.set_code(Code::from_hash(tx_code_hash)); - prepare_tx::( + prepare_tx::( client, wallet, &args.tx, @@ -1315,6 +1401,7 @@ pub async fn build_transfer< C: crate::ledger::queries::Client + Sync, V: WalletUtils, U: ShieldedUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -1327,11 +1414,13 @@ pub async fn build_transfer< let token = args.token.clone(); // Check that the source address exists on chain - source_exists_or_err(source.clone(), args.tx.force, client).await?; + source_exists_or_err::<_, IO>(source.clone(), args.tx.force, client) + .await?; // Check that the target address exists on chain - target_exists_or_err(target.clone(), args.tx.force, client).await?; + target_exists_or_err::<_, IO>(target.clone(), args.tx.force, client) + .await?; // Check that the token address exists on chain - token_exists_or_err(token.clone(), args.tx.force, client).await?; + token_exists_or_err::<_, IO>(token.clone(), args.tx.force, client).await?; // Check source balance let (sub_prefix, balance_key) = match &args.sub_prefix { Some(ref sub_prefix) => { @@ -1346,7 +1435,7 @@ pub async fn build_transfer< }; // validate the amount given - let validated_amount = validate_amount( + let validated_amount = validate_amount::<_, IO>( client, args.amount, &token, @@ -1355,7 +1444,7 @@ pub async fn build_transfer< ) .await .expect("expected to validate amount"); - let validate_fee = validate_amount( + let validate_fee = validate_amount::<_, IO>( client, args.tx.fee_amount, &args.tx.fee_token, @@ -1369,7 +1458,7 @@ pub async fn build_transfer< args.amount = InputAmount::Validated(validated_amount); args.tx.fee_amount = InputAmount::Validated(validate_fee); - check_balance_too_low_err::( + check_balance_too_low_err::( &token, &source, validated_amount.amount, @@ -1395,7 +1484,7 @@ pub async fn build_transfer< // If our chosen signer is the MASP sentinel key, then our shielded inputs // will need to cover the gas fees. let chosen_signer = - tx_signer::(client, wallet, &args.tx, default_signer.clone()) + tx_signer::(client, wallet, &args.tx, default_signer.clone()) .await? .1; let shielded_gas = masp_tx_key().ref_to() == chosen_signer; @@ -1408,14 +1497,16 @@ pub async fn build_transfer< #[cfg(not(feature = "mainnet"))] let is_source_faucet = rpc::is_faucet_account(client, &source).await; - let tx_code_hash = - query_wasm_code_hash(client, args.tx_code_path.to_str().unwrap()) - .await - .unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.tx_code_path.to_str().unwrap(), + ) + .await + .unwrap(); // Construct the shielded part of the transaction, if any let stx_result = shielded - .gen_shielded_transfer(client, &args, shielded_gas) + .gen_shielded_transfer::<_, IO>(client, &args, shielded_gas) .await; let shielded_parts = match stx_result { @@ -1484,7 +1575,7 @@ pub async fn build_transfer< tx.set_code(Code::from_hash(tx_code_hash)); // Dry-run/broadcast/submit the transaction - let (tx, signer_addr, def_key) = prepare_tx::( + let (tx, signer_addr, def_key) = prepare_tx::( client, wallet, &args.tx, @@ -1507,6 +1598,7 @@ pub async fn build_transfer< pub async fn build_init_account< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -1514,15 +1606,19 @@ pub async fn build_init_account< ) -> Result<(Tx, Option
, common::PublicKey), Error> { let public_key = args.public_key; - let vp_code_hash = - query_wasm_code_hash(client, args.vp_code_path.to_str().unwrap()) - .await - .unwrap(); + let vp_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.vp_code_path.to_str().unwrap(), + ) + .await + .unwrap(); - let tx_code_hash = - query_wasm_code_hash(client, args.tx_code_path.to_str().unwrap()) - .await - .unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.tx_code_path.to_str().unwrap(), + ) + .await + .unwrap(); let mut tx = Tx::new(TxType::Raw); tx.header.chain_id = args.tx.chain_id.clone().unwrap(); @@ -1537,7 +1633,7 @@ pub async fn build_init_account< tx.set_data(Data::new(data)); tx.set_code(Code::from_hash(tx_code_hash)); - prepare_tx::( + prepare_tx::( client, wallet, &args.tx, @@ -1553,6 +1649,7 @@ pub async fn build_init_account< pub async fn build_update_vp< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -1566,7 +1663,11 @@ pub async fn build_update_vp< let exists = rpc::known_address::(client, &addr).await; if !exists { if args.tx.force { - eprintln!("The address {} doesn't exist on chain.", addr); + edisplay!( + IO, + "The address {} doesn't exist on chain.", + addr + ); Ok(()) } else { Err(Error::LocationDoesNotExist(addr.clone())) @@ -1577,7 +1678,8 @@ pub async fn build_update_vp< } Address::Implicit(_) => { if args.tx.force { - eprintln!( + edisplay!( + IO, "A validity predicate of an implicit address cannot be \ directly updated. You can use an established address for \ this purpose." @@ -1589,7 +1691,8 @@ pub async fn build_update_vp< } Address::Internal(_) => { if args.tx.force { - eprintln!( + edisplay!( + IO, "A validity predicate of an internal address cannot be \ directly updated." ); @@ -1600,15 +1703,19 @@ pub async fn build_update_vp< } }?; - let vp_code_hash = - query_wasm_code_hash(client, args.vp_code_path.to_str().unwrap()) - .await - .unwrap(); + let vp_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.vp_code_path.to_str().unwrap(), + ) + .await + .unwrap(); - let tx_code_hash = - query_wasm_code_hash(client, args.tx_code_path.to_str().unwrap()) - .await - .unwrap(); + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + args.tx_code_path.to_str().unwrap(), + ) + .await + .unwrap(); let mut tx = Tx::new(TxType::Raw); tx.header.chain_id = args.tx.chain_id.clone().unwrap(); @@ -1623,7 +1730,7 @@ pub async fn build_update_vp< tx.set_data(Data::new(data)); tx.set_code(Code::from_hash(tx_code_hash)); - prepare_tx::( + prepare_tx::( client, wallet, &args.tx, @@ -1639,6 +1746,7 @@ pub async fn build_update_vp< pub async fn build_custom< C: crate::ledger::queries::Client + Sync, U: WalletUtils, + IO: Io, >( client: &C, wallet: &mut Wallet, @@ -1650,7 +1758,7 @@ pub async fn build_custom< args.data_path.map(|data| tx.set_data(Data::new(data))); tx.set_code(Code::new(args.code_path)); - prepare_tx::( + prepare_tx::( client, wallet, &args.tx, @@ -1662,13 +1770,16 @@ pub async fn build_custom< .await } -async fn expect_dry_broadcast( +async fn expect_dry_broadcast< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( to_broadcast: TxBroadcastData, client: &C, ) -> Result { match to_broadcast { TxBroadcastData::DryRun(tx) => { - rpc::dry_run_tx(client, tx.to_bytes()).await; + rpc::dry_run_tx::<_, IO>(client, tx.to_bytes()).await; Ok(ProcessTxResponse::DryRun) } TxBroadcastData::Wrapper { @@ -1686,7 +1797,10 @@ fn lift_rpc_error(res: Result) -> Result { /// Returns the given validator if the given address is a validator, /// otherwise returns an error, force forces the address through even /// if it isn't a validator -async fn known_validator_or_err( +async fn known_validator_or_err< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( validator: Address, force: bool, client: &C, @@ -1695,7 +1809,8 @@ async fn known_validator_or_err( let is_validator = rpc::is_validator(client, &validator).await; if !is_validator { if force { - eprintln!( + edisplay!( + IO, "The address {} doesn't belong to any known validator account.", validator ); @@ -1711,7 +1826,7 @@ async fn known_validator_or_err( /// general pattern for checking if an address exists on the chain, or /// throwing an error if it's not forced. Takes a generic error /// message and the error type. -async fn address_exists_or_err( +async fn address_exists_or_err( addr: Address, force: bool, client: &C, @@ -1725,7 +1840,7 @@ where let addr_exists = rpc::known_address::(client, &addr).await; if !addr_exists { if force { - eprintln!("{}", message); + edisplay!(IO, "{}", message); Ok(addr) } else { Err(err(addr)) @@ -1738,14 +1853,17 @@ where /// Returns the given token if the given address exists on chain /// otherwise returns an error, force forces the address through even /// if it isn't on chain -pub async fn token_exists_or_err( +pub async fn token_exists_or_err< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( token: Address, force: bool, client: &C, ) -> Result { let message = format!("The token address {} doesn't exist on chain.", token); - address_exists_or_err( + address_exists_or_err::<_, _, IO>( token, force, client, @@ -1758,14 +1876,17 @@ pub async fn token_exists_or_err( /// Returns the given source address if the given address exists on chain /// otherwise returns an error, force forces the address through even /// if it isn't on chain -async fn source_exists_or_err( +async fn source_exists_or_err< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( token: Address, force: bool, client: &C, ) -> Result { let message = format!("The source address {} doesn't exist on chain.", token); - address_exists_or_err( + address_exists_or_err::<_, _, IO>( token, force, client, @@ -1778,14 +1899,17 @@ async fn source_exists_or_err( /// Returns the given target address if the given address exists on chain /// otherwise returns an error, force forces the address through even /// if it isn't on chain -async fn target_exists_or_err( +async fn target_exists_or_err< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( token: Address, force: bool, client: &C, ) -> Result { let message = format!("The target address {} doesn't exist on chain.", token); - address_exists_or_err( + address_exists_or_err::<_, _, IO>( token, force, client, @@ -1798,7 +1922,10 @@ async fn target_exists_or_err( /// checks the balance at the given address is enough to transfer the /// given amount, along with the balance even existing. force /// overrides this -async fn check_balance_too_low_err( +async fn check_balance_too_low_err< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( token: &Address, source: &Address, amount: token::Amount, @@ -1812,7 +1939,8 @@ async fn check_balance_too_low_err( Some(balance) => { if balance < amount { if force { - eprintln!( + edisplay!( + IO, "The balance of the source {} of token {} is lower \ than the amount to be transferred. Amount to \ transfer is {} and the balance is {}.", @@ -1836,9 +1964,11 @@ async fn check_balance_too_low_err( } None => { if force { - eprintln!( + edisplay!( + IO, "No balance found for the source {} of token {}", - source, token + source, + token ); Ok(()) } else { @@ -1849,13 +1979,17 @@ async fn check_balance_too_low_err( } #[allow(dead_code)] -fn validate_untrusted_code_err( +fn validate_untrusted_code_err( vp_code: &Vec, force: bool, ) -> Result<(), Error> { if let Err(err) = vm::validate_untrusted_wasm(vp_code) { if force { - eprintln!("Validity predicate code validation failed with {}", err); + edisplay!( + IO, + "Validity predicate code validation failed with {}", + err + ); Ok(()) } else { Err(Error::WasmValidationFailure(err)) diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs new file mode 100644 index 00000000000..cf666f544ca --- /dev/null +++ b/shared/src/types/io.rs @@ -0,0 +1,117 @@ +//! Traits for implementing IO handlers. This is to enable +//! generic IO. The defaults are the obvious Rust native +//! functions. + +/// Rust native I/O handling. +pub struct DefaultIo; + +impl Io for DefaultIo {} + +#[allow(missing_docs)] +pub trait Io { + fn print(output: impl AsRef) { + print!("{}", output.as_ref()); + } + + fn flush() { + use std::io::Write; + std::io::stdout().flush().unwrap(); + } + + fn println(output: impl AsRef) { + println!("{}", output.as_ref()); + } + + fn write( + mut writer: W, + output: impl AsRef, + ) -> std::io::Result<()> { + write!(writer, "{}", output.as_ref()) + } + + fn writeln( + mut writer: W, + output: impl AsRef, + ) -> std::io::Result<()> { + writeln!(writer, "{}", output.as_ref()) + } + + fn eprintln(output: impl AsRef) { + eprintln!("{}", output.as_ref()); + } + + fn read() -> std::io::Result { + read_aux(std::io::stdin().lock()) + } + + fn prompt(question: impl AsRef) -> String { + prompt_aux( + std::io::stdin().lock(), + std::io::stdout(), + question.as_ref(), + ) + } +} + +/// A generic function for displaying a prompt to users and reading +/// in their response. +pub fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String +where + R: std::io::Read, + W: std::io::Write, +{ + write!(&mut writer, "{}", question).expect("Unable to write"); + writer.flush().unwrap(); + let mut s = String::new(); + reader.read_to_string(&mut s).expect("Unable to read"); + s +} + +/// A generic function for reading input from users +pub fn read_aux(mut reader: R) -> std::io::Result +where + R: std::io::Read, +{ + let mut s = String::new(); + reader.read_to_string(&mut s)?; + Ok(s) +} + +/// Convenience macro for formatting arguments to +/// [`IO::print`] +#[macro_export] +macro_rules! display { + ($io:ty) => { + <$io>::print("") + }; + ($io:ty, $w:expr; $($args:tt)*) => { + <$io>::write($w, format_args!($($args)*).to_string()) + }; + ($io:ty,$($args:tt)*) => { + <$io>::print(format_args!($($args)*).to_string()) + }; +} + +/// Convenience macro for formatting arguments to +/// [`IO::println`] and [`IO::writeln`] +#[macro_export] +macro_rules! display_line { + ($io:ty) => { + <$io>::println("") + }; + ($io:ty, $w:expr; $($args:tt)*) => { + <$io>::writeln($w, format_args!($($args)*).to_string()) + }; + ($io:ty,$($args:tt)*) => { + <$io>::println(format_args!($($args)*).to_string()) + }; +} + +/// Convenience macro for formatting arguments to +/// [`IO::eprintln`] +#[macro_export] +macro_rules! edisplay { + ($io:ty,$($args:tt)*) => { + <$io>::eprintln(format_args!($($args)*).to_string()) + }; +} diff --git a/shared/src/types/mod.rs b/shared/src/types/mod.rs index 4f1a795d409..e0b51e5ef12 100644 --- a/shared/src/types/mod.rs +++ b/shared/src/types/mod.rs @@ -2,6 +2,7 @@ pub mod control_flow; pub mod ibc; +pub mod io; pub mod key; pub use namada_core::types::{ diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index ca7bd974c72..75ee8bfd446 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -21,6 +21,7 @@ use color_eyre::eyre::Result; use data_encoding::HEXLOWER; use namada::types::address::{btc, eth, masp_rewards, Address}; use namada::types::governance::ProposalType; +use namada::types::io::DefaultIo; use namada::types::storage::Epoch; use namada::types::token; use namada_apps::client::tx::CLIShieldedUtils; @@ -664,7 +665,7 @@ fn ledger_txs_and_queries() -> Result<()> { #[test] fn masp_txs_and_queries() -> Result<()> { // Download the shielded pool parameters before starting node - let _ = CLIShieldedUtils::new(PathBuf::new()); + let _ = CLIShieldedUtils::new::(PathBuf::new()); // Lengthen epoch to ensure that a transaction can be constructed and // submitted within the same block. Necessary to ensure that conversion is // not invalidated. @@ -927,7 +928,7 @@ fn masp_txs_and_queries() -> Result<()> { #[test] fn masp_pinned_txs() -> Result<()> { // Download the shielded pool parameters before starting node - let _ = CLIShieldedUtils::new(PathBuf::new()); + let _ = CLIShieldedUtils::new::(PathBuf::new()); // Lengthen epoch to ensure that a transaction can be constructed and // submitted within the same block. Necessary to ensure that conversion is // not invalidated. @@ -1107,7 +1108,7 @@ fn masp_incentives() -> Result<()> { // The number of decimal places used by ETH amounts. const ETH_DENOMINATION: u8 = 18; // Download the shielded pool parameters before starting node - let _ = CLIShieldedUtils::new(PathBuf::new()); + let _ = CLIShieldedUtils::new::(PathBuf::new()); // Lengthen epoch to ensure that a transaction can be constructed and // submitted within the same block. Necessary to ensure that conversion is // not invalidated. From 3c968bfd297c721b94eb6b9083d0b5d5e1b5e5d8 Mon Sep 17 00:00:00 2001 From: satan Date: Sat, 22 Jul 2023 00:42:46 +0200 Subject: [PATCH 002/114] [fix]: Fixed intra-doc link typo --- shared/src/types/io.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index cf666f544ca..3f130887da5 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -78,7 +78,7 @@ where } /// Convenience macro for formatting arguments to -/// [`IO::print`] +/// [`Io::print`] #[macro_export] macro_rules! display { ($io:ty) => { @@ -93,7 +93,7 @@ macro_rules! display { } /// Convenience macro for formatting arguments to -/// [`IO::println`] and [`IO::writeln`] +/// [`Io::println`] and [`Io::writeln`] #[macro_export] macro_rules! display_line { ($io:ty) => { @@ -108,7 +108,7 @@ macro_rules! display_line { } /// Convenience macro for formatting arguments to -/// [`IO::eprintln`] +/// [`Io::eprintln`] #[macro_export] macro_rules! edisplay { ($io:ty,$($args:tt)*) => { From 3e651c940d730c610fc57c659a58e8daac0c1761 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:00:05 +0200 Subject: [PATCH 003/114] [feat]: Refactored the masp integration tests to no longer need the nightly feature --- Cargo.lock | 10 +- apps/src/lib/cli.rs | 2 +- apps/src/lib/cli/utils.rs | 51 ----- apps/src/lib/client/rpc.rs | 5 +- .../lib/node/ledger/shell/testing/client.rs | 12 +- .../lib/node/ledger/shell/testing/utils.rs | 197 ++++++++++++++++++ shared/src/types/io.rs | 9 + tests/src/integration.rs | 1 - tests/src/integration/masp.rs | 3 +- tests/src/integration/utils.rs | 83 -------- tests/src/lib.rs | 2 - wasm/checksums.json | 38 ++-- 12 files changed, 240 insertions(+), 173 deletions(-) delete mode 100644 tests/src/integration/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 9517b5cf7b2..55126207333 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3608,7 +3608,7 @@ checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.48.0", ] @@ -6022,16 +6022,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.13" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +checksum = "d4790277f605573dd24b6751701e0823582a63c7cafc095e427e6c66e45dd75e" dependencies = [ "bitflags 1.2.1", "errno", "io-lifetimes", "libc", "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", + "windows-sys 0.45.0", ] [[package]] @@ -6887,7 +6887,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.45.0", ] diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 12927cca13e..3fa2cdd8ed4 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -16,7 +16,7 @@ pub mod wallet; use clap::{ArgGroup, ArgMatches, ColorChoice}; use color_eyre::eyre::Result; use utils::*; -pub use utils::{dispatch_prompt, safe_exit, Cmd, TESTIN}; +pub use utils::{safe_exit, Cmd}; pub use self::context::Context; use crate::cli::api::CliIo; diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index c35298976c5..73d144596c2 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -6,7 +6,6 @@ use std::str::FromStr; use clap::{ArgAction, ArgMatches}; use color_eyre::eyre::Result; -use lazy_static::lazy_static; use super::args; use super::context::{Context, FromContext}; @@ -342,53 +341,3 @@ pub fn safe_exit(_: i32) -> ! { panic!("Test failed because the client exited unexpectedly.") } - -lazy_static! { - /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); -} - -/// A generic function for displaying a prompt to users and reading -/// in their response. -fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String -where - R: std::io::Read, - W: Write, -{ - write!(&mut writer, "{}", question).expect("Unable to write"); - writer.flush().unwrap(); - let mut s = String::new(); - reader.read_to_string(&mut s).expect("Unable to read"); - s -} - -/// A function that chooses how to dispatch prompts -/// to users. There is a hierarchy of feature flags -/// that determines this. If no flags are set, -/// the question is printed to stdout and response -/// read from stdin. -pub fn dispatch_prompt(question: impl AsRef) -> String { - if cfg!(feature = "testing") { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) - } else { - prompt_aux( - std::io::stdin().lock(), - std::io::stdout(), - question.as_ref(), - ) - } -} - -#[macro_export] -/// A convenience macro for formatting the user prompt before -/// forwarding it to the `[dispatch_prompt]` method. -macro_rules! prompt { - ($($arg:tt)*) => {{ - $crate::cli::dispatch_prompt(format!("{}", format_args!($($arg)*))) - }} -} diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 7ab2c3a03aa..87f8666a889 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,13 +48,12 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay}; +use namada::{display, display_line, edisplay, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; use crate::facade::tendermint::merkle::proof::Proof; use crate::facade::tendermint_rpc::error::Error as TError; -use crate::prompt; use crate::wallet::CliWalletUtils; /// Query the status of a given transaction. @@ -456,7 +455,7 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!("Enter the viewing key for {}: ", owner); + let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 0f27a2f6f12..1aa35ca3213 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -3,14 +3,14 @@ use std::ops::ControlFlow; use clap::Command as App; use eyre::Report; use namada::types::control_flow::Halt; -use namada::types::io::{DefaultIo, Io}; +use namada::types::io::Io; use tendermint_config::net::Address as TendermintAddress; use super::node::MockNode; use crate::cli::api::{CliApi, CliClient}; use crate::cli::args::Global; use crate::cli::{args, cmds, Cmd, Context, NamadaClient}; -use crate::node::ledger::shell::testing::utils::Bin; +use crate::node::ledger::shell::testing::utils::{Bin, TestingIo}; pub fn run( node: &MockNode, @@ -25,7 +25,7 @@ pub fn run( wasm_dir: Some(locked.wasm_dir.clone()), } }; - let ctx = Context::new::(global.clone())?; + let ctx = Context::new::(global.clone())?; let rt = tokio::runtime::Runtime::new().unwrap(); match who { @@ -47,7 +47,7 @@ pub fn run( NamadaClient::WithoutContext(sub_cmd, global) } }; - rt.block_on(CliApi::::handle_client_command( + rt.block_on(CliApi::::handle_client_command( Some(node), cmd, )) @@ -60,7 +60,7 @@ pub fn run( let cmd = cmds::NamadaWallet::parse(&matches) .expect("Could not parse wallet command"); - CliApi::::handle_wallet_command(cmd, ctx) + CliApi::::handle_wallet_command(cmd, ctx) } Bin::Relayer => { args.insert(0, "relayer"); @@ -69,7 +69,7 @@ pub fn run( let matches = app.get_matches_from(args.clone()); let cmd = cmds::NamadaRelayer::parse(&matches) .expect("Could not parse wallet command"); - rt.block_on(CliApi::::handle_relayer_command( + rt.block_on(CliApi::::handle_relayer_command( Some(node), cmd, )) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index e66ead21e7d..95da7efb856 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,5 +1,7 @@ use std::path::{Path, PathBuf}; +use lazy_static::lazy_static; +use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; /// Namada binaries @@ -46,3 +48,198 @@ impl Default for TestDir { Self::new() } } + +/// The max number of bytes that the is currently remembered from stdout while +/// testing. +const TESTOUT_BUF_SIZE: usize = 100_000; + +lazy_static! { + /// A replacement for stdout in testing. The maximum number of bytes + /// it holds is limited to prevent memory issues. + pub static ref TESTOUT: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(FixedBuffer::new(TESTOUT_BUF_SIZE))); +} + +lazy_static! { + /// A replacement for stdin in testing. + pub static ref TESTIN: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(vec![])); +} + +pub struct TestingIo; + +impl Io for TestingIo { + fn print(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + testout.append(output.as_ref().as_bytes().to_vec()); + print!("{}", output.as_ref()); + } + + fn println(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + println!("{}", output.as_ref()); + } + + fn write( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::print(output); + Ok(()) + } + + fn writeln( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::println(output); + Ok(()) + } + + fn eprintln(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + eprintln!("{}", output.as_ref()); + } + + fn read() -> std::io::Result { + read_aux(TESTIN.lock().unwrap().as_slice()) + } + + fn prompt(question: impl AsRef) -> String { + prompt_aux( + TESTIN.lock().unwrap().as_slice(), + std::io::stdout(), + question.as_ref(), + ) + } +} + +/// Test helper that captures stdout of +/// a process. +pub struct CapturedOutput { + pub output: String, + pub result: T, + input: String, +} + +impl CapturedOutput { + pub fn with_input(input: String) -> Self { + Self { + output: "".to_string(), + result: (), + input, + } + } +} + +impl CapturedOutput { + /// Run a client command and capture + /// the output to the mocked stdout. + pub fn of(func: F) -> Self + where + F: FnOnce() -> T, + { + let mut capture = Self { + output: Default::default(), + result: func(), + input: Default::default(), + }; + capture.output = TESTOUT.lock().unwrap().read_string(); + capture + } + + /// Run a client command with input to the mocked stdin and capture + /// the output to the mocked stdout + pub fn run(&self, func: F) -> CapturedOutput + where + F: FnOnce() -> U, + { + { + // write the input to the mocked stdin + let mut buf = TESTIN.lock().unwrap(); + buf.clear(); + buf.extend_from_slice(self.input.as_bytes()); + } + CapturedOutput::of(func) + } + + /// Check if the captured output contains the regex. + pub fn matches(&self, needle: regex::Regex) -> bool { + needle.captures(&self.output).is_some() + } + + /// Check if the captured output contains the string. + pub fn contains(&self, needle: &str) -> bool { + let needle = regex::Regex::new(needle).unwrap(); + self.matches(needle) + } +} + +/// A buffer with a max size. Drops elements from the front on +/// size overflow. +pub struct FixedBuffer { + inner: Vec, + max_size: usize, +} + +impl FixedBuffer { + fn new(max_size: usize) -> Self { + Self { + inner: vec![], + max_size, + } + } + + /// Remove the first `size` elements from the buffer. + fn roll(&mut self, size: usize) { + self.inner = self.inner[size..].to_vec(); + } + + /// Add data to the end of the buffer, deleting from the + /// front as necessary. + fn append(&mut self, mut other: Vec) { + // if new data exceeds max size, take the tail. + if other.len() > self.max_size { + self.inner = other[(other.len() - self.max_size)..].to_vec(); + return; + } + // check if appending the data overflows buffer + let free_space = self.max_size - self.inner.len(); + if other.len() > free_space { + // delete the minimum amount of data from the front of the buffer + // to fit new data. + self.roll(other.len() - free_space); + } + self.inner.append(&mut other); + } +} + +impl FixedBuffer { + /// Read the inner buffer out to string + pub fn read_string(&mut self) -> String { + let mut fresh = vec![]; + std::mem::swap(&mut fresh, &mut self.inner); + String::from_utf8(fresh).unwrap() + } +} + +#[cfg(test)] +mod testing { + use super::*; + + #[test] + fn test_buffer() { + let mut buffer = FixedBuffer::::new(10); + buffer.inner = (1u64..=9_u64).collect(); + buffer.append(vec![10, 11, 12, 13, 14, 15]); + assert_eq!(buffer.inner, (6u64..=15_u64).collect::>()); + buffer.append((20u64..=40_u64).collect()); + assert_eq!(buffer.inner, (31u64..=40_u64).collect::>()); + } +} diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 3f130887da5..6e1b0e8c3cd 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -115,3 +115,12 @@ macro_rules! edisplay { <$io>::eprintln(format_args!($($args)*).to_string()) }; } + +#[macro_export] +/// A convenience macro for formatting the user prompt before +/// forwarding it to the [`Io::prompt`] method. +macro_rules! prompt { + ($io:ty,$($arg:tt)*) => {{ + <$io>::prompt(format!("{}", format_args!($($arg)*))) + }} +} diff --git a/tests/src/integration.rs b/tests/src/integration.rs index 8642e0e03c2..1a7c84dbfbd 100644 --- a/tests/src/integration.rs +++ b/tests/src/integration.rs @@ -1,3 +1,2 @@ mod masp; mod setup; -mod utils; diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index b8f9c47ed5c..841bdb01c8e 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -5,7 +5,7 @@ use color_eyre::owo_colors::OwoColorize; use namada::types::io::DefaultIo; use namada_apps::client::tx::CLIShieldedUtils; use namada_apps::node::ledger::shell::testing::client::run; -use namada_apps::node::ledger::shell::testing::utils::Bin; +use namada_apps::node::ledger::shell::testing::utils::{Bin, CapturedOutput}; use namada_core::types::address::{btc, eth, masp_rewards}; use namada_core::types::token; use namada_core::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; @@ -17,7 +17,6 @@ use crate::e2e::setup::constants::{ AC_PAYMENT_ADDRESS, AC_VIEWING_KEY, ALBERT, A_SPENDING_KEY, BB_PAYMENT_ADDRESS, BERTHA, BTC, B_SPENDING_KEY, CHRISTEL, ETH, MASP, NAM, }; -use crate::integration::utils::CapturedOutput; /// In this test we verify that users of the MASP receive the correct rewards /// for leaving their assets in the pool for varying periods of time. diff --git a/tests/src/integration/utils.rs b/tests/src/integration/utils.rs deleted file mode 100644 index f626a001ee8..00000000000 --- a/tests/src/integration/utils.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::fs::File; -use std::path::PathBuf; -use std::sync::Arc; - -struct TempFile(PathBuf); -impl TempFile { - fn new(path: PathBuf) -> (Self, File) { - let f = File::create(&path).unwrap(); - (Self(path), f) - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = std::fs::remove_file(&self.0); - } -} - -/// Test helper that captures stdout of -/// a process. -pub struct CapturedOutput { - pub output: String, - pub result: T, - input: String, -} - -impl CapturedOutput { - pub fn with_input(input: String) -> Self { - Self { - output: "".to_string(), - result: (), - input, - } - } -} - -impl CapturedOutput { - /// Run a client command and capture - /// the output to the mocked stdout. - pub(crate) fn of(func: F) -> Self - where - F: FnOnce() -> T, - { - std::io::set_output_capture(Some(Default::default())); - let mut capture = Self { - output: Default::default(), - result: func(), - input: Default::default(), - }; - let captured = std::io::set_output_capture(None); - let captured = captured.unwrap(); - let captured = Arc::try_unwrap(captured).unwrap(); - let captured = captured.into_inner().unwrap(); - capture.output = String::from_utf8(captured).unwrap(); - capture - } - - /// Run a client command with input to the mocked stdin and capture - /// the output to the mocked stdout - pub fn run(&self, func: F) -> CapturedOutput - where - F: FnOnce() -> U, - { - { - // write the input to the mocked stdin - let mut buf = namada_apps::cli::TESTIN.lock().unwrap(); - buf.clear(); - buf.extend_from_slice(self.input.as_bytes()); - } - CapturedOutput::of(func) - } - - /// Check if the captured output contains the regex. - pub fn matches(&self, needle: regex::Regex) -> bool { - needle.captures(&self.output).is_some() - } - - /// Check if the captured output contains the string. - pub fn contains(&self, needle: &str) -> bool { - let needle = regex::Regex::new(needle).unwrap(); - self.matches(needle) - } -} diff --git a/tests/src/lib.rs b/tests/src/lib.rs index 7e359474772..1d9958a30a3 100644 --- a/tests/src/lib.rs +++ b/tests/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(test, feature(internal_output_capture))] //! Namada integrations and WASM tests and testing helpers. #![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] @@ -13,7 +12,6 @@ pub use vm_host_env::{ibc, tx, vp}; #[cfg(test)] mod e2e; #[cfg(test)] -#[allow(dead_code)] mod integration; pub mod native_vp; pub mod storage; diff --git a/wasm/checksums.json b/wasm/checksums.json index 71bcf7c9ef8..adf06b5afee 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.e9201ea2342459a86343e5e6db1400b23d0843fe4407f6f759c65dc63395b5cd.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.c1b7457cc85bfb4ca141a3f1157700be2d0f672aec21a2a7883a6264e8775cc1.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.c91a746933ecb67daf41d77d6cb7810277dfb661a72e6f4726cee7300f750cde.wasm", - "tx_ibc.wasm": "tx_ibc.917a7c8ad4138679eb467e8a18b0234d6c3ba56802a728186d7fcd047e0c0c4b.wasm", - "tx_init_account.wasm": "tx_init_account.6fc0c6ebbf933befd27f8515f0d439814ad8ea2732ec62271fe5ec4da177340e.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.0dd098e0962ba8b3fac93eefae0524959125ce334edf05e05edbdf4d38ec9069.wasm", - "tx_init_validator.wasm": "tx_init_validator.88f4d2b5cc358e8e9a53512314450161b8ab123a54ccbbbc44c6272fc3496ee2.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.4d4243a995611cb5c53bb7ad9657dd6112f8f3e309b1497c4af2763dcff5f0e7.wasm", - "tx_transfer.wasm": "tx_transfer.c6d4ac6e8311a75f199a0ca009f2b80c1ef107eeadfe7bbab94ff6453f075954.wasm", - "tx_unbond.wasm": "tx_unbond.00df2be4c4eaa94bec27f4bb89ccb96f7725cfdc4af2c965473ec1e9679f0989.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.96081388ae0cb289df7fb48b37a5f640c867205f19c9c44a2af4f2f9598c4a27.wasm", - "tx_update_vp.wasm": "tx_update_vp.a1b0a203c05769a90c63711ef3ff922c5ba4b82f74511ade2a446ead47a2913b.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.9b4103f524a21e45d39361afb349e60a5010d94db5bf5ed5a8f678ec9c0df1b8.wasm", - "tx_withdraw.wasm": "tx_withdraw.37ffd46d73cc8cb67c14df42389b18fff03cd0c77861e2d9fc64ac486a13f65c.wasm", - "vp_implicit.wasm": "vp_implicit.e16621fd592ef6ad906b820762959dec1224e5a2e6917e8d8f0258601ed8dadd.wasm", - "vp_masp.wasm": "vp_masp.6aee2c99eba0b680198c985aabb1c6be877538ae338e36e9164c60685eec9334.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.1a78846b5aca8ce6a34c258dec573fec7d247ae07c09dd7b92196b2bd0a8d1dd.wasm", - "vp_user.wasm": "vp_user.e0200e6274839583464001363bfce2137c8a0a9191b242a9c34c32e31b525a04.wasm", - "vp_validator.wasm": "vp_validator.3a23a0a5629de85f2029543d3fc3d9d3fd58473280859b4984a9a25723c1ca88.wasm" + "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", + "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", + "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", + "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", + "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", + "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", + "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", + "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", + "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", + "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", + "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", + "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" } \ No newline at end of file From c33d0e0dc6ff67eb9869d8e5a90f84b2e7049ec6 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:36:34 +0200 Subject: [PATCH 004/114] [chore]: Added IO macros to wallet cli. Renamed to --- apps/src/lib/cli/wallet.rs | 182 +++++++++--------- apps/src/lib/client/rpc.rs | 56 ++++-- apps/src/lib/client/tx.rs | 63 +++--- shared/src/ledger/eth_bridge.rs | 9 +- shared/src/ledger/eth_bridge/validator_set.rs | 11 +- shared/src/ledger/masp.rs | 4 +- shared/src/ledger/rpc.rs | 14 +- shared/src/ledger/signing.rs | 4 +- shared/src/ledger/tx.rs | 40 ++-- shared/src/types/io.rs | 2 +- 10 files changed, 216 insertions(+), 169 deletions(-) diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index 56a0960db66..d72ee3ecd0e 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -12,6 +12,7 @@ use namada::ledger::wallet::{DecryptionError, FindKeyError}; use namada::types::io::Io; use namada::types::key::*; use namada::types::masp::{MaspValue, PaymentAddress}; +use namada::{display, display_line, edisplay_line}; use rand_core::OsRng; use crate::cli; @@ -98,28 +99,29 @@ fn address_key_find( let alias = alias.to_lowercase(); if let Ok(viewing_key) = wallet.find_viewing_key(&alias) { // Check if alias is a viewing key - IO::println(format!("Viewing key: {}", viewing_key)); + display_line!(IO, "Viewing key: {}", viewing_key); if unsafe_show_secret { // Check if alias is also a spending key match wallet.find_spending_key(&alias, None) { Ok(spending_key) => { - IO::println(format!("Spending key: {}", spending_key)) + display_line!(IO, "Spending key: {}", spending_key) } Err(FindKeyError::KeyNotFound) => {} - Err(err) => IO::eprintln(format!("{}", err)), + Err(err) => edisplay_line!(IO, "{}", err), } } } else if let Some(payment_addr) = wallet.find_payment_addr(&alias) { // Failing that, check if alias is a payment address - IO::println(format!("Payment address: {}", payment_addr)); + display_line!(IO, "Payment address: {}", payment_addr); } else { // Otherwise alias cannot be referring to any shielded value - IO::println(format!( + display_line!( + IO, "No shielded address or key with alias {} found. Use the commands \ `masp list-addrs` and `masp list-keys` to see all the known \ addresses and keys.", alias.to_lowercase() - )); + ); } } @@ -135,32 +137,33 @@ fn spending_keys_list( let known_view_keys = wallet.get_viewing_keys(); let known_spend_keys = wallet.get_spending_keys(); if known_view_keys.is_empty() { - IO::println( + display_line!( + IO, "No known keys. Try `masp add --alias my-addr --value ...` to add \ a new key to the wallet.", ); } else { let stdout = io::stdout(); let mut w = stdout.lock(); - IO::writeln(&mut w, "Known keys:").unwrap(); + display_line!(IO, &mut w; "Known keys:").unwrap(); for (alias, key) in known_view_keys { - IO::write(&mut w, format!(" Alias \"{}\"", alias)).unwrap(); + display!(IO, &mut w; " Alias \"{}\"", alias).unwrap(); let spending_key_opt = known_spend_keys.get(&alias); // If this alias is associated with a spending key, indicate whether // or not the spending key is encrypted // TODO: consider turning if let into match if let Some(spending_key) = spending_key_opt { if spending_key.is_encrypted() { - IO::writeln(&mut w, " (encrypted):") + display_line!(IO, &mut w; " (encrypted):") } else { - IO::writeln(&mut w, " (not encrypted):") + display_line!(IO, &mut w; " (not encrypted):") } .unwrap(); } else { - IO::writeln(&mut w, ":").unwrap(); + display_line!(IO, &mut w; ":").unwrap(); } // Always print the corresponding viewing key - IO::writeln(&mut w, format!(" Viewing Key: {}", key)).unwrap(); + display_line!(IO, &mut w; " Viewing Key: {}", key).unwrap(); // A subset of viewing keys will have corresponding spending keys. // Print those too if they are available and requested. if unsafe_show_secret { @@ -169,9 +172,9 @@ fn spending_keys_list( // Here the spending key is unencrypted or successfully // decrypted Ok(spending_key) => { - IO::writeln( - &mut w, - format!(" Spending key: {}", spending_key), + display_line!(IO, + &mut w; + " Spending key: {}", spending_key, ) .unwrap(); } @@ -183,12 +186,10 @@ fn spending_keys_list( // Here the key is encrypted but incorrect password has // been provided Err(err) => { - IO::writeln( - &mut w, - format!( + display_line!(IO, + &mut w; " Couldn't decrypt the spending key: {}", - err - ), + err, ) .unwrap(); } @@ -204,17 +205,17 @@ fn payment_addresses_list(ctx: Context) { let wallet = ctx.wallet; let known_addresses = wallet.get_payment_addrs(); if known_addresses.is_empty() { - IO::println( + display_line!( + IO, "No known payment addresses. Try `masp gen-addr --alias my-addr` \ to generate a new payment address.", ); } else { let stdout = io::stdout(); let mut w = stdout.lock(); - IO::writeln(&mut w, "Known payment addresses:").unwrap(); + display_line!(IO, &mut w; "Known payment addresses:").unwrap(); for (alias, address) in sorted(known_addresses) { - IO::writeln(&mut w, format!(" \"{}\": {}", alias, address)) - .unwrap(); + display_line!(IO, &mut w; " \"{}\": {}", alias, address).unwrap(); } } } @@ -233,10 +234,11 @@ fn spending_key_gen( let password = read_and_confirm_encryption_password(unsafe_dont_encrypt); let (alias, _key) = wallet.gen_spending_key(alias, password, alias_force); crate::wallet::save(&wallet).unwrap_or_else(|err| eprintln!("{}", err)); - IO::println(format!( + display_line!( + IO, "Successfully added a spending key with alias: \"{}\"", alias - )); + ); } /// Generate a shielded payment address from the given key. @@ -263,14 +265,15 @@ fn payment_address_gen( alias_force, ) .unwrap_or_else(|| { - IO::eprintln("Payment address not added"); + edisplay_line!(IO, "Payment address not added"); cli::safe_exit(1); }); crate::wallet::save(&wallet).unwrap_or_else(|err| eprintln!("{}", err)); - IO::println(format!( + display_line!( + IO, "Successfully generated a payment address with the following alias: {}", alias, - )); + ); } /// Add a viewing key, spending key, or payment address to wallet. @@ -290,7 +293,7 @@ fn address_key_add( .wallet .insert_viewing_key(alias, viewing_key, alias_force) .unwrap_or_else(|| { - IO::eprintln("Viewing key not added"); + edisplay_line!(IO, "Viewing key not added"); cli::safe_exit(1); }); (alias, "viewing key") @@ -307,7 +310,7 @@ fn address_key_add( alias_force, ) .unwrap_or_else(|| { - IO::eprintln("Spending key not added"); + edisplay_line!(IO, "Spending key not added"); cli::safe_exit(1); }); (alias, "spending key") @@ -317,17 +320,19 @@ fn address_key_add( .wallet .insert_payment_addr(alias, payment_addr, alias_force) .unwrap_or_else(|| { - IO::eprintln("Payment address not added"); + edisplay_line!(IO, "Payment address not added"); cli::safe_exit(1); }); (alias, "payment address") } }; crate::wallet::save(&ctx.wallet).unwrap_or_else(|err| eprintln!("{}", err)); - IO::println(format!( + display_line!( + IO, "Successfully added a {} with the following alias to wallet: {}", - typ, alias, - )); + typ, + alias, + ); } /// Restore a keypair and an implicit address from the mnemonic code in the @@ -354,19 +359,20 @@ fn key_and_address_restore( encryption_password, ) .unwrap_or_else(|err| { - IO::eprintln(format!("{}", err)); + edisplay_line!(IO, "{}", err); cli::safe_exit(1) }) .unwrap_or_else(|| { - IO::println("No changes are persisted. Exiting."); + display_line!(IO, "No changes are persisted. Exiting."); cli::safe_exit(0); }); crate::wallet::save(&wallet) - .unwrap_or_else(|err| IO::eprintln(format!("{}", err))); - IO::println(format!( + .unwrap_or_else(|err| edisplay_line!(IO, "{}", err)); + display_line!( + IO, "Successfully added a key and an address with alias: \"{}\"", alias - )); + ); } /// Generate a new keypair and derive implicit address from it and store them in @@ -396,19 +402,20 @@ fn key_and_address_gen( derivation_path_and_mnemonic_rng, ) .unwrap_or_else(|err| { - IO::eprintln(format!("{}", err)); + edisplay_line!(IO, "{}", err); cli::safe_exit(1); }) .unwrap_or_else(|| { - IO::println("No changes are persisted. Exiting."); + display_line!(IO, "No changes are persisted. Exiting."); cli::safe_exit(0); }); crate::wallet::save(&wallet) - .unwrap_or_else(|err| IO::eprintln(format!("{}", err))); - IO::println(format!( + .unwrap_or_else(|err| edisplay_line!(IO, "{}", err)); + display_line!( + IO, "Successfully added a key and an address with alias: \"{}\"", alias - )); + ); } /// Find a keypair in the wallet store. @@ -428,7 +435,8 @@ fn key_find( let alias = alias.or(value); match alias { None => { - IO::eprintln( + edisplay_line!( + IO, "An alias, public key or public key hash needs to be \ supplied", ); @@ -441,14 +449,14 @@ fn key_find( match found_keypair { Ok(keypair) => { let pkh: PublicKeyHash = (&keypair.ref_to()).into(); - IO::println(format!("Public key hash: {}", pkh)); - IO::println(format!("Public key: {}", keypair.ref_to())); + display_line!(IO, "Public key hash: {}", pkh); + display_line!(IO, "Public key: {}", keypair.ref_to()); if unsafe_show_secret { - IO::println(format!("Secret key: {}", keypair)); + display_line!(IO, "Secret key: {}", keypair); } } Err(err) => { - IO::eprintln(format!("{}", err)); + edisplay_line!(IO, "{}", err); } } } @@ -464,40 +472,41 @@ fn key_list( let wallet = ctx.wallet; let known_keys = wallet.get_keys(); if known_keys.is_empty() { - IO::println( + display_line!( + IO, "No known keys. Try `key gen --alias my-key` to generate a new \ key.", ); } else { let stdout = io::stdout(); let mut w = stdout.lock(); - IO::writeln(&mut w, "Known keys:").unwrap(); + display_line!(IO, &mut w; "Known keys:").unwrap(); for (alias, (stored_keypair, pkh)) in known_keys { let encrypted = if stored_keypair.is_encrypted() { "encrypted" } else { "not encrypted" }; - IO::writeln( - &mut w, - format!(" Alias \"{}\" ({}):", alias, encrypted), + display_line!(IO, + &mut w; + " Alias \"{}\" ({}):", alias, encrypted, ) .unwrap(); if let Some(pkh) = pkh { - IO::writeln(&mut w, format!(" Public key hash: {}", pkh)) + display_line!(IO, &mut w; " Public key hash: {}", pkh) .unwrap(); } match stored_keypair.get::(decrypt, None) { Ok(keypair) => { - IO::writeln( - &mut w, - format!(" Public key: {}", keypair.ref_to()), + display_line!(IO, + &mut w; + " Public key: {}", keypair.ref_to(), ) .unwrap(); if unsafe_show_secret { - IO::writeln( - &mut w, - format!(" Secret key: {}", keypair), + display_line!(IO, + &mut w; + " Secret key: {}", keypair, ) .unwrap(); } @@ -506,9 +515,9 @@ fn key_list( continue; } Err(err) => { - IO::writeln( - &mut w, - format!(" Couldn't decrypt the keypair: {}", err), + display_line!(IO, + &mut w; + " Couldn't decrypt the keypair: {}", err, ) .unwrap(); } @@ -533,10 +542,10 @@ fn key_export( let mut file = File::create(&file_name).unwrap(); file.write_all(file_data.as_ref()).unwrap(); - IO::println(format!("Exported to file {}", file_name)); + display_line!(IO, "Exported to file {}", file_name); }) .unwrap_or_else(|err| { - IO::eprintln(format!("{}", err)); + edisplay_line!(IO, "{}", err); cli::safe_exit(1) }) } @@ -546,18 +555,19 @@ fn address_list(ctx: Context) { let wallet = ctx.wallet; let known_addresses = wallet.get_addresses(); if known_addresses.is_empty() { - IO::println( + display_line!( + IO, "No known addresses. Try `address gen --alias my-addr` to \ generate a new implicit address.", ); } else { let stdout = io::stdout(); let mut w = stdout.lock(); - IO::writeln(&mut w, "Known addresses:").unwrap(); + display_line!(IO, &mut w; "Known addresses:").unwrap(); for (alias, address) in sorted(known_addresses) { - IO::writeln( - &mut w, - format!(" \"{}\": {}", alias, address.to_pretty_string()), + display_line!(IO, + &mut w; + " \"{}\": {}", alias, address.to_pretty_string(), ) .unwrap(); } @@ -575,26 +585,25 @@ fn address_or_alias_find(ctx: Context, args: args::AddressOrAliasFind) { } else if args.alias.is_some() { if let Some(address) = wallet.find_address(args.alias.as_ref().unwrap()) { - IO::println(format!( - "Found address {}", - address.to_pretty_string() - )); + display_line!(IO, "Found address {}", address.to_pretty_string()); } else { - IO::println(format!( + display_line!( + IO, "No address with alias {} found. Use the command `address \ list` to see all the known addresses.", args.alias.unwrap().to_lowercase() - )); + ); } } else if args.address.is_some() { if let Some(alias) = wallet.find_alias(args.address.as_ref().unwrap()) { - IO::println(format!("Found alias {}", alias)); + display_line!(IO, "Found alias {}", alias); } else { - IO::println(format!( + display_line!( + IO, "No alias with address {} found. Use the command `address \ list` to see all the known addresses.", args.address.unwrap() - )); + ); } } } @@ -610,13 +619,14 @@ fn address_add(ctx: Context, args: args::AddressAdd) { ) .is_none() { - IO::eprintln("Address not added"); + edisplay_line!(IO, "Address not added"); cli::safe_exit(1); } crate::wallet::save(&wallet) - .unwrap_or_else(|err| IO::eprintln(format!("{}", err))); - IO::println(format!( + .unwrap_or_else(|err| edisplay_line!(IO, "{}", err)); + display_line!( + IO, "Successfully added a key and an address with alias: \"{}\"", args.alias.to_lowercase() - )); + ); } diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 7ab2c3a03aa..56696fb0227 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,7 +48,7 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay}; +use namada::{display, display_line, edisplay_line}; use tokio::time::Instant; use crate::cli::{self, args}; @@ -460,7 +460,7 @@ pub async fn query_pinned_balance< let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { - edisplay!(IO, "Invalid viewing key entered"); + edisplay_line!(IO, "Invalid viewing key entered"); continue; } }; @@ -724,7 +724,11 @@ pub async fn query_proposal< display_line!(IO, "{:4}Status: on-going", ""); } Err(msg) => { - edisplay!(IO, "Error in tally computation: {}", msg); + edisplay_line!( + IO, + "Error in tally computation: {}", + msg + ); } } } else { @@ -739,7 +743,11 @@ pub async fn query_proposal< ); } Err(msg) => { - edisplay!(IO, "Error in tally computation: {}", msg); + edisplay_line!( + IO, + "Error in tally computation: {}", + msg + ); } } } @@ -769,7 +777,11 @@ pub async fn query_proposal< .await .is_none() { - edisplay!(IO, "No valid proposal was found with id {}", id); + edisplay_line!( + IO, + "No valid proposal was found with id {}", + id + ); } } None => { @@ -784,7 +796,11 @@ pub async fn query_proposal< .await .is_none() { - edisplay!(IO, "No valid proposal was found with id {}", id); + edisplay_line!( + IO, + "No valid proposal was found with id {}", + id + ); }; } } @@ -1148,7 +1164,7 @@ pub async fn query_proposal_result< ); } Err(msg) => { - edisplay!( + edisplay_line!( IO, "Error in tally computation: {}", msg @@ -1156,12 +1172,12 @@ pub async fn query_proposal_result< } } } else { - edisplay!(IO, "Proposal is still in progress."); + edisplay_line!(IO, "Proposal is still in progress."); cli::safe_exit(1) } } None => { - edisplay!(IO, "Error while retriving proposal."); + edisplay_line!(IO, "Error while retriving proposal."); cli::safe_exit(1) } } @@ -1199,7 +1215,7 @@ pub async fn query_proposal_result< } } Err(e) => { - edisplay!( + edisplay_line!( IO, "Can't read entry type: {}.", e @@ -1208,14 +1224,18 @@ pub async fn query_proposal_result< } }, Err(e) => { - edisplay!(IO, "Can't read entry: {}.", e); + edisplay_line!( + IO, + "Can't read entry: {}.", + e + ); cli::safe_exit(1) } } } if !is_proposal_present { - edisplay!( + edisplay_line!( IO, "The folder must contain the offline proposal \ in a file named \"proposal\"" @@ -1236,7 +1256,7 @@ pub async fn query_proposal_result< .expect("Public key should exist."); if !proposal.check_signature(&public_key) { - edisplay!(IO, "Bad proposal signature."); + edisplay_line!(IO, "Bad proposal signature."); cli::safe_exit(1) } @@ -1267,7 +1287,7 @@ pub async fn query_proposal_result< ); } Err(msg) => { - edisplay!( + edisplay_line!( IO, "Error in tally computation: {}", msg @@ -1276,7 +1296,7 @@ pub async fn query_proposal_result< } } None => { - edisplay!( + edisplay_line!( IO, "Offline flag must be followed by data-path." ); @@ -1284,7 +1304,7 @@ pub async fn query_proposal_result< } }; } else { - edisplay!( + edisplay_line!( IO, "Either --proposal-id or --data-path should be provided \ as arguments." @@ -1976,7 +1996,7 @@ pub async fn query_find_validator< ) { let args::QueryFindValidator { query: _, tm_addr } = args; if tm_addr.len() != 40 { - edisplay!( + edisplay_line!( IO, "Expected 40 characters in Tendermint address, got {}", tm_addr.len() @@ -2259,7 +2279,7 @@ pub async fn query_result( ), Err(err2) => { // Print the errors that caused the lookups to fail - edisplay!(IO, "{}\n{}", err1, err2); + edisplay_line!(IO, "{}\n{}", err1, err2); cli::safe_exit(1) } } diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index c3c802ced11..1d6144454c9 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -28,7 +28,7 @@ use namada::types::storage::{Epoch, Key}; use namada::types::token; use namada::types::transaction::governance::{ProposalType, VoteProposalData}; use namada::types::transaction::{InitValidator, TxType}; -use namada::{display_line, edisplay}; +use namada::{display_line, edisplay_line}; use super::rpc; use crate::cli::context::WalletAddress; @@ -223,7 +223,7 @@ where .map(|key| match key { common::SecretKey::Ed25519(_) => key, common::SecretKey::Secp256k1(_) => { - edisplay!(IO, "Consensus key can only be ed25519"); + edisplay_line!(IO, "Consensus key can only be ed25519"); safe_exit(1) } }) @@ -249,7 +249,7 @@ where .map(|key| match key { common::SecretKey::Secp256k1(_) => key.ref_to(), common::SecretKey::Ed25519(_) => { - edisplay!(IO, "Eth cold key can only be secp256k1"); + edisplay_line!(IO, "Eth cold key can only be secp256k1"); safe_exit(1) } }) @@ -276,7 +276,7 @@ where .map(|key| match key { common::SecretKey::Secp256k1(_) => key.ref_to(), common::SecretKey::Ed25519(_) => { - edisplay!(IO, "Eth hot key can only be secp256k1"); + edisplay_line!(IO, "Eth hot key can only be secp256k1"); safe_exit(1) } }) @@ -326,7 +326,7 @@ where // Validate the commission rate data if commission_rate > Dec::one() || commission_rate < Dec::zero() { - edisplay!( + edisplay_line!( IO, "The validator commission rate must not exceed 1.0 or 100%, and \ it must be 0 or positive" @@ -338,7 +338,7 @@ where if max_commission_rate_change > Dec::one() || max_commission_rate_change < Dec::zero() { - edisplay!( + edisplay_line!( IO, "The validator maximum change in commission rate per epoch must \ not exceed 1.0 or 100%" @@ -407,12 +407,12 @@ where if let Some(alias) = ctx.wallet.find_alias(validator_address) { (alias.clone(), validator_address.clone()) } else { - edisplay!(IO, "Expected one account to be created"); + edisplay_line!(IO, "Expected one account to be created"); safe_exit(1) } } _ => { - edisplay!(IO, "Expected one account to be created"); + edisplay_line!(IO, "Expected one account to be created"); safe_exit(1) } }; @@ -420,7 +420,7 @@ where ctx.wallet .add_validator_data(validator_address, validator_keys); crate::wallet::save(&ctx.wallet) - .unwrap_or_else(|err| edisplay!(IO, "{}", err)); + .unwrap_or_else(|err| edisplay_line!(IO, "{}", err)); let tendermint_home = ctx.config.ledger.cometbft_dir(); tendermint_node::write_validator_key(&tendermint_home, &consensus_key); @@ -628,7 +628,7 @@ pub async fn submit_transfer( tx_epoch.unwrap() != submission_epoch => { // Then we probably straddled an epoch boundary. Let's retry... - edisplay!(IO, + edisplay_line!(IO, "MASP transaction rejected and this may be due to the \ epoch changing. Attempting to resubmit transaction.", ); @@ -701,7 +701,7 @@ where % governance_parameters.min_proposal_period == 0 ); - edisplay!( + edisplay_line!( IO, "Invalid proposal start epoch: {} must be greater than current \ epoch {} and a multiple of {}", @@ -719,7 +719,7 @@ where > governance_parameters.max_proposal_period || proposal.voting_end_epoch.0 % 3 != 0 { - edisplay!( + edisplay_line!( IO, "Invalid proposal end epoch: difference between proposal start \ and end epoch must be at least {} and at max {} and end epoch \ @@ -735,7 +735,7 @@ where || proposal.grace_epoch.0 - proposal.voting_end_epoch.0 < governance_parameters.min_proposal_grace_epochs { - edisplay!( + edisplay_line!( IO, "Invalid proposal grace epoch: difference between proposal grace \ and end epoch must be at least {}", @@ -768,7 +768,11 @@ where ); } Err(e) => { - edisplay!(IO, "Error while creating proposal file: {}.", e); + edisplay_line!( + IO, + "Error while creating proposal file: {}.", + e + ); safe_exit(1) } } @@ -780,7 +784,10 @@ where if let Ok(data) = tx_data { data } else { - edisplay!(IO, "Invalid data for init proposal transaction."); + edisplay_line!( + IO, + "Invalid data for init proposal transaction." + ); safe_exit(1) }; @@ -794,7 +801,7 @@ where ) .unwrap() { - edisplay!( + edisplay_line!( IO, "Address {} doesn't have enough funds.", &proposal.author @@ -805,7 +812,7 @@ where if init_proposal_content.len() > governance_parameters.max_proposal_content_size as usize { - edisplay!(IO, "Proposal content size too big."); + edisplay_line!(IO, "Proposal content size too big."); safe_exit(1); } @@ -876,7 +883,7 @@ where let signer = if let Some(addr) = &args.tx.signer { addr } else { - edisplay!(IO, "Missing mandatory argument --signer."); + edisplay_line!(IO, "Missing mandatory argument --signer."); safe_exit(1) }; @@ -916,7 +923,7 @@ where let msg = splits.next().expect("Missing message to sign"); if splits.next().is_some() { - edisplay!(IO, "Unexpected argument after message"); + edisplay_line!(IO, "Unexpected argument after message"); safe_exit(1); } @@ -932,14 +939,14 @@ where } "nay" => ProposalVote::Nay, _ => { - edisplay!(IO, "Vote must be either yay or nay"); + edisplay_line!(IO, "Vote must be either yay or nay"); safe_exit(1); } }; if args.offline { if !proposal_vote.is_default_vote() { - edisplay!( + edisplay_line!( IO, "Wrong vote type for offline proposal. Just vote yay or nay!" ); @@ -955,7 +962,7 @@ where .await .expect("Public key should exist."); if !proposal.check_signature(&public_key) { - edisplay!(IO, "Proposal signature mismatch!"); + edisplay_line!(IO, "Proposal signature mismatch!"); safe_exit(1) } @@ -984,7 +991,7 @@ where Ok(()) } Err(e) => { - edisplay!( + edisplay_line!( IO, "Error while creating proposal vote file: {}.", e @@ -1018,7 +1025,7 @@ where if let ProposalVote::Yay(ref vote_type) = proposal_vote { if &proposal_type != vote_type { - edisplay!( + edisplay_line!( IO, "Expected vote of type {}, found {}", proposal_type, @@ -1035,7 +1042,7 @@ where if !rpc::query_has_storage_key::(client, &vp_key) .await { - edisplay!( + edisplay_line!( IO, "Proposed PGF council {} cannot be found \ in storage", @@ -1045,7 +1052,7 @@ where } } _ => { - edisplay!( + edisplay_line!( IO, "PGF council vote contains a non-established \ address: {}", @@ -1061,7 +1068,7 @@ where match proposal_start_epoch { Some(epoch) => { if current_epoch < epoch { - edisplay!( + edisplay_line!( IO, "Current epoch {} is not greater than proposal start \ epoch {}", @@ -1151,7 +1158,7 @@ where Ok(()) } None => { - edisplay!( + edisplay_line!( IO, "Proposal start epoch for proposal id {} is not definied.", proposal_id diff --git a/shared/src/ledger/eth_bridge.rs b/shared/src/ledger/eth_bridge.rs index e5b10f20dbd..a73f5efd770 100644 --- a/shared/src/ledger/eth_bridge.rs +++ b/shared/src/ledger/eth_bridge.rs @@ -18,7 +18,7 @@ use crate::types::control_flow::time::{ }; use crate::types::control_flow::{self, Halt, TryHalt}; use crate::types::io::Io; -use crate::{display_line, edisplay}; +use crate::{display_line, edisplay_line}; const DEFAULT_BACKOFF: Duration = std::time::Duration::from_millis(500); const DEFAULT_CEILING: Duration = std::time::Duration::from_secs(30); @@ -127,7 +127,10 @@ where }) .await .try_halt(|_| { - edisplay!(IO, "Timed out while waiting for Ethereum to synchronize"); + edisplay_line!( + IO, + "Timed out while waiting for Ethereum to synchronize" + ); })?; display_line!(IO, "The Ethereum node is up to date"); control_flow::proceed(()) @@ -147,7 +150,7 @@ where .await .map(|status| status.is_synchronized()) .try_halt(|err| { - edisplay!( + edisplay_line!( IO, "An error occurred while fetching the Ethereum \ synchronization status: {err}" diff --git a/shared/src/ledger/eth_bridge/validator_set.rs b/shared/src/ledger/eth_bridge/validator_set.rs index d4c01f1c1a9..fab665e711e 100644 --- a/shared/src/ledger/eth_bridge/validator_set.rs +++ b/shared/src/ledger/eth_bridge/validator_set.rs @@ -25,7 +25,7 @@ use crate::types::control_flow::{ self, install_shutdown_signal, Halt, TryHalt, }; use crate::types::io::{DefaultIo, Io}; -use crate::{display_line, edisplay}; +use crate::{display_line, edisplay_line}; /// Relayer related errors. #[derive(Debug, Default)] @@ -345,7 +345,10 @@ where nam_client, |relay_result| match relay_result { RelayResult::GovernanceCallError(reason) => { - edisplay!(IO, "Calling Governance failed due to: {reason}"); + edisplay_line!( + IO, + "Calling Governance failed due to: {reason}" + ); } RelayResult::NonceError { argument, contract } => { let whence = match argument.cmp(&contract) { @@ -353,14 +356,14 @@ where Ordering::Equal => "identical to", Ordering::Greater => "too far ahead of", }; - edisplay!( + edisplay_line!( IO, "Argument nonce <{argument}> is {whence} contract \ nonce <{contract}>" ); } RelayResult::NoReceipt => { - edisplay!( + edisplay_line!( IO, "No transfer receipt received from the Ethereum node" ); diff --git a/shared/src/ledger/masp.rs b/shared/src/ledger/masp.rs index 9cc1a014f22..8596ceca844 100644 --- a/shared/src/ledger/masp.rs +++ b/shared/src/ledger/masp.rs @@ -75,7 +75,7 @@ use crate::types::token::{ Transfer, HEAD_TX_KEY, PIN_KEY_PREFIX, TX_KEY_PREFIX, }; use crate::types::transaction::{EllipticCurve, PairingEngine, WrapperTx}; -use crate::{display_line, edisplay}; +use crate::{display_line, edisplay_line}; /// Env var to point to a dir with MASP parameters. When not specified, /// the default OS specific path is used. @@ -1002,7 +1002,7 @@ impl ShieldedContext { make_asset_type(Some(asset_type.0), &asset_type.1, asset_type.2); let threshold = -conv[&masp_asset]; if threshold == 0 { - edisplay!( + edisplay_line!( IO, "Asset threshold of selected conversion for asset type {} is \ 0, this is a bug, please report it.", diff --git a/shared/src/ledger/rpc.rs b/shared/src/ledger/rpc.rs index 2937ba81f8d..1bd42018c51 100644 --- a/shared/src/ledger/rpc.rs +++ b/shared/src/ledger/rpc.rs @@ -41,7 +41,7 @@ use crate::types::io::Io; use crate::types::key::*; use crate::types::storage::{BlockHeight, BlockResults, Epoch, PrefixValue}; use crate::types::{storage, token}; -use crate::{display_line, edisplay}; +use crate::{display_line, edisplay_line}; /// Query the status of a given transaction. /// @@ -88,7 +88,7 @@ where }) .await .try_halt(|_| { - edisplay!( + edisplay_line!( IO, "Transaction status query deadline of {deadline:?} exceeded" ); @@ -276,7 +276,7 @@ pub async fn query_wasm_code_hash< Some(Hash::try_from(&hash[..]).expect("Invalid code hash")) } None => { - edisplay!( + edisplay_line!( IO, "The corresponding wasm code of the code path {} doesn't \ exist on chain.", @@ -371,7 +371,7 @@ where &value[..], ) { Err(err) => { - edisplay!( + edisplay_line!( IO, "Skipping a value for key {}. Error in decoding: {}", key, @@ -1090,7 +1090,11 @@ where ControlFlow::Continue(()) } Err(e) => { - edisplay!(IO, "Failed to query node status with error: {}", e); + edisplay_line!( + IO, + "Failed to query node status with error: {}", + e + ); ControlFlow::Break(Err(())) } } diff --git a/shared/src/ledger/signing.rs b/shared/src/ledger/signing.rs index 56ae841d28d..31e2256c3a2 100644 --- a/shared/src/ledger/signing.rs +++ b/shared/src/ledger/signing.rs @@ -54,7 +54,7 @@ use crate::types::transaction::governance::{ use crate::types::transaction::{ Fee, InitAccount, InitValidator, TxType, UpdateVp, WrapperTx, }; -use crate::{display_line, edisplay}; +use crate::{display_line, edisplay_line}; #[cfg(feature = "std")] /// Env. var specifying where to store signing test vectors @@ -429,7 +429,7 @@ pub async fn sign_wrapper< format_denominated_amount::<_, IO>(client, &token_addr, balance) .await, ); - edisplay!(IO, "{}", err_msg); + edisplay_line!(IO, "{}", err_msg); if !args.force && cfg!(feature = "mainnet") { panic!("{}", err_msg); } diff --git a/shared/src/ledger/tx.rs b/shared/src/ledger/tx.rs index 79dda0363f9..fabc4e6f403 100644 --- a/shared/src/ledger/tx.rs +++ b/shared/src/ledger/tx.rs @@ -52,7 +52,7 @@ use crate::types::time::DateTimeUtc; use crate::types::transaction::{pos, InitAccount, TxType, UpdateVp}; use crate::types::{storage, token}; use crate::vm::WasmValidationError; -use crate::{display_line, edisplay, vm}; +use crate::{display_line, edisplay_line, vm}; /// Initialize account transaction WASM pub const TX_INIT_ACCOUNT_WASM: &str = "tx_init_account.wasm"; @@ -682,7 +682,7 @@ pub async fn build_validator_commission_change< let validator = args.validator.clone(); if rpc::is_validator(client, &validator).await { if args.rate < Dec::zero() || args.rate > Dec::one() { - edisplay!( + edisplay_line!( IO, "Invalid new commission rate, received {}", args.rate @@ -706,7 +706,7 @@ pub async fn build_validator_commission_change< if args.rate.abs_diff(&commission_rate) > max_commission_change_per_epoch { - edisplay!( + edisplay_line!( IO, "New rate is too large of a change with respect to \ the predecessor epoch in which the rate will take \ @@ -718,14 +718,14 @@ pub async fn build_validator_commission_change< } } None => { - edisplay!(IO, "Error retrieving from storage"); + edisplay_line!(IO, "Error retrieving from storage"); if !args.tx.force { return Err(Error::Retrieval); } } } } else { - edisplay!(IO, "The given address {validator} is not a validator."); + edisplay_line!(IO, "The given address {validator} is not a validator."); if !args.tx.force { return Err(Error::InvalidValidatorAddress(validator)); } @@ -767,7 +767,7 @@ pub async fn build_unjail_validator< args: args::TxUnjailValidator, ) -> Result<(Tx, Option
, common::PublicKey), Error> { if !rpc::is_validator(client, &args.validator).await { - edisplay!( + edisplay_line!( IO, "The given address {} is not a validator.", &args.validator @@ -820,7 +820,7 @@ pub async fn submit_unjail_validator< args: args::TxUnjailValidator, ) -> Result<(), Error> { if !rpc::is_validator(client, &args.validator).await { - edisplay!( + edisplay_line!( IO, "The given address {} is not a validator.", &args.validator @@ -839,7 +839,7 @@ pub async fn submit_unjail_validator< .await .expect("Validator state should be defined."); if validator_state_at_pipeline != ValidatorState::Jailed { - edisplay!( + edisplay_line!( IO, "The given validator address {} is not jailed at the pipeline \ epoch when it would be restored to one of the validator sets.", @@ -861,7 +861,7 @@ pub async fn submit_unjail_validator< let eligible_epoch = last_slash_epoch + params.slash_processing_epoch_offset(); if current_epoch < eligible_epoch { - edisplay!( + edisplay_line!( IO, "The given validator address {} is currently frozen and not \ yet eligible to be unjailed.", @@ -946,7 +946,7 @@ pub async fn build_withdraw< ) .await; if tokens.is_zero() { - edisplay!( + edisplay_line!( IO, "There are no unbonded bonds ready to withdraw in the current \ epoch {}.", @@ -1034,7 +1034,7 @@ pub async fn build_unbond< ); if args.amount > bond_amount { - edisplay!( + edisplay_line!( IO, "The total bonds of the source {} is lower than the amount to \ be unbonded. Amount to unbond is {} and the total bonds is \ @@ -1120,7 +1120,7 @@ pub async fn query_unbonds( match latest_withdraw_epoch_post.cmp(&latest_withdraw_epoch_pre) { std::cmp::Ordering::Less => { if args.tx.force { - edisplay!( + edisplay_line!( IO, "Unexpected behavior reading the unbonds data has \ occurred" @@ -1689,7 +1689,7 @@ pub async fn build_update_vp< let exists = rpc::known_address::(client, &addr).await; if !exists { if args.tx.force { - edisplay!( + edisplay_line!( IO, "The address {} doesn't exist on chain.", addr @@ -1704,7 +1704,7 @@ pub async fn build_update_vp< } Address::Implicit(_) => { if args.tx.force { - edisplay!( + edisplay_line!( IO, "A validity predicate of an implicit address cannot be \ directly updated. You can use an established address for \ @@ -1717,7 +1717,7 @@ pub async fn build_update_vp< } Address::Internal(_) => { if args.tx.force { - edisplay!( + edisplay_line!( IO, "A validity predicate of an internal address cannot be \ directly updated." @@ -1835,7 +1835,7 @@ async fn known_validator_or_err< let is_validator = rpc::is_validator(client, &validator).await; if !is_validator { if force { - edisplay!( + edisplay_line!( IO, "The address {} doesn't belong to any known validator account.", validator @@ -1866,7 +1866,7 @@ where let addr_exists = rpc::known_address::(client, &addr).await; if !addr_exists { if force { - edisplay!(IO, "{}", message); + edisplay_line!(IO, "{}", message); Ok(addr) } else { Err(err(addr)) @@ -1942,7 +1942,7 @@ async fn check_balance_too_low_err< Some(balance) => { if balance < amount { if force { - edisplay!( + edisplay_line!( IO, "The balance of the source {} of token {} is lower \ than the amount to be transferred. Amount to \ @@ -1973,7 +1973,7 @@ async fn check_balance_too_low_err< } None => { if force { - edisplay!( + edisplay_line!( IO, "No balance found for the source {} of token {}", source, @@ -1994,7 +1994,7 @@ fn validate_untrusted_code_err( ) -> Result<(), Error> { if let Err(err) = vm::validate_untrusted_wasm(vp_code) { if force { - edisplay!( + edisplay_line!( IO, "Validity predicate code validation failed with {}", err diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 3f130887da5..72904ac1144 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -110,7 +110,7 @@ macro_rules! display_line { /// Convenience macro for formatting arguments to /// [`Io::eprintln`] #[macro_export] -macro_rules! edisplay { +macro_rules! edisplay_line { ($io:ty,$($args:tt)*) => { <$io>::eprintln(format_args!($($args)*).to_string()) }; From b80a9bd34e961dc9f13144b3e5bfdbd93fc92021 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:00:05 +0200 Subject: [PATCH 005/114] [feat]: Refactored the masp integration tests to no longer need the nightly feature --- Cargo.lock | 10 +- apps/src/lib/cli.rs | 2 +- apps/src/lib/cli/utils.rs | 51 ----- apps/src/lib/client/rpc.rs | 5 +- .../lib/node/ledger/shell/testing/client.rs | 12 +- .../lib/node/ledger/shell/testing/utils.rs | 197 ++++++++++++++++++ shared/src/types/io.rs | 9 + tests/src/integration.rs | 1 - tests/src/integration/masp.rs | 3 +- tests/src/integration/utils.rs | 83 -------- tests/src/lib.rs | 2 - wasm/checksums.json | 38 ++-- 12 files changed, 240 insertions(+), 173 deletions(-) delete mode 100644 tests/src/integration/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 9517b5cf7b2..55126207333 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3608,7 +3608,7 @@ checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.48.0", ] @@ -6022,16 +6022,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.13" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +checksum = "d4790277f605573dd24b6751701e0823582a63c7cafc095e427e6c66e45dd75e" dependencies = [ "bitflags 1.2.1", "errno", "io-lifetimes", "libc", "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", + "windows-sys 0.45.0", ] [[package]] @@ -6887,7 +6887,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.45.0", ] diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 12927cca13e..3fa2cdd8ed4 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -16,7 +16,7 @@ pub mod wallet; use clap::{ArgGroup, ArgMatches, ColorChoice}; use color_eyre::eyre::Result; use utils::*; -pub use utils::{dispatch_prompt, safe_exit, Cmd, TESTIN}; +pub use utils::{safe_exit, Cmd}; pub use self::context::Context; use crate::cli::api::CliIo; diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index c35298976c5..73d144596c2 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -6,7 +6,6 @@ use std::str::FromStr; use clap::{ArgAction, ArgMatches}; use color_eyre::eyre::Result; -use lazy_static::lazy_static; use super::args; use super::context::{Context, FromContext}; @@ -342,53 +341,3 @@ pub fn safe_exit(_: i32) -> ! { panic!("Test failed because the client exited unexpectedly.") } - -lazy_static! { - /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); -} - -/// A generic function for displaying a prompt to users and reading -/// in their response. -fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String -where - R: std::io::Read, - W: Write, -{ - write!(&mut writer, "{}", question).expect("Unable to write"); - writer.flush().unwrap(); - let mut s = String::new(); - reader.read_to_string(&mut s).expect("Unable to read"); - s -} - -/// A function that chooses how to dispatch prompts -/// to users. There is a hierarchy of feature flags -/// that determines this. If no flags are set, -/// the question is printed to stdout and response -/// read from stdin. -pub fn dispatch_prompt(question: impl AsRef) -> String { - if cfg!(feature = "testing") { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) - } else { - prompt_aux( - std::io::stdin().lock(), - std::io::stdout(), - question.as_ref(), - ) - } -} - -#[macro_export] -/// A convenience macro for formatting the user prompt before -/// forwarding it to the `[dispatch_prompt]` method. -macro_rules! prompt { - ($($arg:tt)*) => {{ - $crate::cli::dispatch_prompt(format!("{}", format_args!($($arg)*))) - }} -} diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 56696fb0227..00435eee31a 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,13 +48,12 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_line}; +use namada::{display, display_line, edisplay_lin, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; use crate::facade::tendermint::merkle::proof::Proof; use crate::facade::tendermint_rpc::error::Error as TError; -use crate::prompt; use crate::wallet::CliWalletUtils; /// Query the status of a given transaction. @@ -456,7 +455,7 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!("Enter the viewing key for {}: ", owner); + let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 0f27a2f6f12..1aa35ca3213 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -3,14 +3,14 @@ use std::ops::ControlFlow; use clap::Command as App; use eyre::Report; use namada::types::control_flow::Halt; -use namada::types::io::{DefaultIo, Io}; +use namada::types::io::Io; use tendermint_config::net::Address as TendermintAddress; use super::node::MockNode; use crate::cli::api::{CliApi, CliClient}; use crate::cli::args::Global; use crate::cli::{args, cmds, Cmd, Context, NamadaClient}; -use crate::node::ledger::shell::testing::utils::Bin; +use crate::node::ledger::shell::testing::utils::{Bin, TestingIo}; pub fn run( node: &MockNode, @@ -25,7 +25,7 @@ pub fn run( wasm_dir: Some(locked.wasm_dir.clone()), } }; - let ctx = Context::new::(global.clone())?; + let ctx = Context::new::(global.clone())?; let rt = tokio::runtime::Runtime::new().unwrap(); match who { @@ -47,7 +47,7 @@ pub fn run( NamadaClient::WithoutContext(sub_cmd, global) } }; - rt.block_on(CliApi::::handle_client_command( + rt.block_on(CliApi::::handle_client_command( Some(node), cmd, )) @@ -60,7 +60,7 @@ pub fn run( let cmd = cmds::NamadaWallet::parse(&matches) .expect("Could not parse wallet command"); - CliApi::::handle_wallet_command(cmd, ctx) + CliApi::::handle_wallet_command(cmd, ctx) } Bin::Relayer => { args.insert(0, "relayer"); @@ -69,7 +69,7 @@ pub fn run( let matches = app.get_matches_from(args.clone()); let cmd = cmds::NamadaRelayer::parse(&matches) .expect("Could not parse wallet command"); - rt.block_on(CliApi::::handle_relayer_command( + rt.block_on(CliApi::::handle_relayer_command( Some(node), cmd, )) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index e66ead21e7d..95da7efb856 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,5 +1,7 @@ use std::path::{Path, PathBuf}; +use lazy_static::lazy_static; +use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; /// Namada binaries @@ -46,3 +48,198 @@ impl Default for TestDir { Self::new() } } + +/// The max number of bytes that the is currently remembered from stdout while +/// testing. +const TESTOUT_BUF_SIZE: usize = 100_000; + +lazy_static! { + /// A replacement for stdout in testing. The maximum number of bytes + /// it holds is limited to prevent memory issues. + pub static ref TESTOUT: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(FixedBuffer::new(TESTOUT_BUF_SIZE))); +} + +lazy_static! { + /// A replacement for stdin in testing. + pub static ref TESTIN: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(vec![])); +} + +pub struct TestingIo; + +impl Io for TestingIo { + fn print(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + testout.append(output.as_ref().as_bytes().to_vec()); + print!("{}", output.as_ref()); + } + + fn println(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + println!("{}", output.as_ref()); + } + + fn write( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::print(output); + Ok(()) + } + + fn writeln( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::println(output); + Ok(()) + } + + fn eprintln(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + eprintln!("{}", output.as_ref()); + } + + fn read() -> std::io::Result { + read_aux(TESTIN.lock().unwrap().as_slice()) + } + + fn prompt(question: impl AsRef) -> String { + prompt_aux( + TESTIN.lock().unwrap().as_slice(), + std::io::stdout(), + question.as_ref(), + ) + } +} + +/// Test helper that captures stdout of +/// a process. +pub struct CapturedOutput { + pub output: String, + pub result: T, + input: String, +} + +impl CapturedOutput { + pub fn with_input(input: String) -> Self { + Self { + output: "".to_string(), + result: (), + input, + } + } +} + +impl CapturedOutput { + /// Run a client command and capture + /// the output to the mocked stdout. + pub fn of(func: F) -> Self + where + F: FnOnce() -> T, + { + let mut capture = Self { + output: Default::default(), + result: func(), + input: Default::default(), + }; + capture.output = TESTOUT.lock().unwrap().read_string(); + capture + } + + /// Run a client command with input to the mocked stdin and capture + /// the output to the mocked stdout + pub fn run(&self, func: F) -> CapturedOutput + where + F: FnOnce() -> U, + { + { + // write the input to the mocked stdin + let mut buf = TESTIN.lock().unwrap(); + buf.clear(); + buf.extend_from_slice(self.input.as_bytes()); + } + CapturedOutput::of(func) + } + + /// Check if the captured output contains the regex. + pub fn matches(&self, needle: regex::Regex) -> bool { + needle.captures(&self.output).is_some() + } + + /// Check if the captured output contains the string. + pub fn contains(&self, needle: &str) -> bool { + let needle = regex::Regex::new(needle).unwrap(); + self.matches(needle) + } +} + +/// A buffer with a max size. Drops elements from the front on +/// size overflow. +pub struct FixedBuffer { + inner: Vec, + max_size: usize, +} + +impl FixedBuffer { + fn new(max_size: usize) -> Self { + Self { + inner: vec![], + max_size, + } + } + + /// Remove the first `size` elements from the buffer. + fn roll(&mut self, size: usize) { + self.inner = self.inner[size..].to_vec(); + } + + /// Add data to the end of the buffer, deleting from the + /// front as necessary. + fn append(&mut self, mut other: Vec) { + // if new data exceeds max size, take the tail. + if other.len() > self.max_size { + self.inner = other[(other.len() - self.max_size)..].to_vec(); + return; + } + // check if appending the data overflows buffer + let free_space = self.max_size - self.inner.len(); + if other.len() > free_space { + // delete the minimum amount of data from the front of the buffer + // to fit new data. + self.roll(other.len() - free_space); + } + self.inner.append(&mut other); + } +} + +impl FixedBuffer { + /// Read the inner buffer out to string + pub fn read_string(&mut self) -> String { + let mut fresh = vec![]; + std::mem::swap(&mut fresh, &mut self.inner); + String::from_utf8(fresh).unwrap() + } +} + +#[cfg(test)] +mod testing { + use super::*; + + #[test] + fn test_buffer() { + let mut buffer = FixedBuffer::::new(10); + buffer.inner = (1u64..=9_u64).collect(); + buffer.append(vec![10, 11, 12, 13, 14, 15]); + assert_eq!(buffer.inner, (6u64..=15_u64).collect::>()); + buffer.append((20u64..=40_u64).collect()); + assert_eq!(buffer.inner, (31u64..=40_u64).collect::>()); + } +} diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 72904ac1144..7cf9bd94e92 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -115,3 +115,12 @@ macro_rules! edisplay_line { <$io>::eprintln(format_args!($($args)*).to_string()) }; } + +#[macro_export] +/// A convenience macro for formatting the user prompt before +/// forwarding it to the [`Io::prompt`] method. +macro_rules! prompt { + ($io:ty,$($arg:tt)*) => {{ + <$io>::prompt(format!("{}", format_args!($($arg)*))) + }} +} diff --git a/tests/src/integration.rs b/tests/src/integration.rs index 8642e0e03c2..1a7c84dbfbd 100644 --- a/tests/src/integration.rs +++ b/tests/src/integration.rs @@ -1,3 +1,2 @@ mod masp; mod setup; -mod utils; diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index b8f9c47ed5c..841bdb01c8e 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -5,7 +5,7 @@ use color_eyre::owo_colors::OwoColorize; use namada::types::io::DefaultIo; use namada_apps::client::tx::CLIShieldedUtils; use namada_apps::node::ledger::shell::testing::client::run; -use namada_apps::node::ledger::shell::testing::utils::Bin; +use namada_apps::node::ledger::shell::testing::utils::{Bin, CapturedOutput}; use namada_core::types::address::{btc, eth, masp_rewards}; use namada_core::types::token; use namada_core::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; @@ -17,7 +17,6 @@ use crate::e2e::setup::constants::{ AC_PAYMENT_ADDRESS, AC_VIEWING_KEY, ALBERT, A_SPENDING_KEY, BB_PAYMENT_ADDRESS, BERTHA, BTC, B_SPENDING_KEY, CHRISTEL, ETH, MASP, NAM, }; -use crate::integration::utils::CapturedOutput; /// In this test we verify that users of the MASP receive the correct rewards /// for leaving their assets in the pool for varying periods of time. diff --git a/tests/src/integration/utils.rs b/tests/src/integration/utils.rs deleted file mode 100644 index f626a001ee8..00000000000 --- a/tests/src/integration/utils.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::fs::File; -use std::path::PathBuf; -use std::sync::Arc; - -struct TempFile(PathBuf); -impl TempFile { - fn new(path: PathBuf) -> (Self, File) { - let f = File::create(&path).unwrap(); - (Self(path), f) - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = std::fs::remove_file(&self.0); - } -} - -/// Test helper that captures stdout of -/// a process. -pub struct CapturedOutput { - pub output: String, - pub result: T, - input: String, -} - -impl CapturedOutput { - pub fn with_input(input: String) -> Self { - Self { - output: "".to_string(), - result: (), - input, - } - } -} - -impl CapturedOutput { - /// Run a client command and capture - /// the output to the mocked stdout. - pub(crate) fn of(func: F) -> Self - where - F: FnOnce() -> T, - { - std::io::set_output_capture(Some(Default::default())); - let mut capture = Self { - output: Default::default(), - result: func(), - input: Default::default(), - }; - let captured = std::io::set_output_capture(None); - let captured = captured.unwrap(); - let captured = Arc::try_unwrap(captured).unwrap(); - let captured = captured.into_inner().unwrap(); - capture.output = String::from_utf8(captured).unwrap(); - capture - } - - /// Run a client command with input to the mocked stdin and capture - /// the output to the mocked stdout - pub fn run(&self, func: F) -> CapturedOutput - where - F: FnOnce() -> U, - { - { - // write the input to the mocked stdin - let mut buf = namada_apps::cli::TESTIN.lock().unwrap(); - buf.clear(); - buf.extend_from_slice(self.input.as_bytes()); - } - CapturedOutput::of(func) - } - - /// Check if the captured output contains the regex. - pub fn matches(&self, needle: regex::Regex) -> bool { - needle.captures(&self.output).is_some() - } - - /// Check if the captured output contains the string. - pub fn contains(&self, needle: &str) -> bool { - let needle = regex::Regex::new(needle).unwrap(); - self.matches(needle) - } -} diff --git a/tests/src/lib.rs b/tests/src/lib.rs index 7e359474772..1d9958a30a3 100644 --- a/tests/src/lib.rs +++ b/tests/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(test, feature(internal_output_capture))] //! Namada integrations and WASM tests and testing helpers. #![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] @@ -13,7 +12,6 @@ pub use vm_host_env::{ibc, tx, vp}; #[cfg(test)] mod e2e; #[cfg(test)] -#[allow(dead_code)] mod integration; pub mod native_vp; pub mod storage; diff --git a/wasm/checksums.json b/wasm/checksums.json index 71bcf7c9ef8..adf06b5afee 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.e9201ea2342459a86343e5e6db1400b23d0843fe4407f6f759c65dc63395b5cd.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.c1b7457cc85bfb4ca141a3f1157700be2d0f672aec21a2a7883a6264e8775cc1.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.c91a746933ecb67daf41d77d6cb7810277dfb661a72e6f4726cee7300f750cde.wasm", - "tx_ibc.wasm": "tx_ibc.917a7c8ad4138679eb467e8a18b0234d6c3ba56802a728186d7fcd047e0c0c4b.wasm", - "tx_init_account.wasm": "tx_init_account.6fc0c6ebbf933befd27f8515f0d439814ad8ea2732ec62271fe5ec4da177340e.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.0dd098e0962ba8b3fac93eefae0524959125ce334edf05e05edbdf4d38ec9069.wasm", - "tx_init_validator.wasm": "tx_init_validator.88f4d2b5cc358e8e9a53512314450161b8ab123a54ccbbbc44c6272fc3496ee2.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.4d4243a995611cb5c53bb7ad9657dd6112f8f3e309b1497c4af2763dcff5f0e7.wasm", - "tx_transfer.wasm": "tx_transfer.c6d4ac6e8311a75f199a0ca009f2b80c1ef107eeadfe7bbab94ff6453f075954.wasm", - "tx_unbond.wasm": "tx_unbond.00df2be4c4eaa94bec27f4bb89ccb96f7725cfdc4af2c965473ec1e9679f0989.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.96081388ae0cb289df7fb48b37a5f640c867205f19c9c44a2af4f2f9598c4a27.wasm", - "tx_update_vp.wasm": "tx_update_vp.a1b0a203c05769a90c63711ef3ff922c5ba4b82f74511ade2a446ead47a2913b.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.9b4103f524a21e45d39361afb349e60a5010d94db5bf5ed5a8f678ec9c0df1b8.wasm", - "tx_withdraw.wasm": "tx_withdraw.37ffd46d73cc8cb67c14df42389b18fff03cd0c77861e2d9fc64ac486a13f65c.wasm", - "vp_implicit.wasm": "vp_implicit.e16621fd592ef6ad906b820762959dec1224e5a2e6917e8d8f0258601ed8dadd.wasm", - "vp_masp.wasm": "vp_masp.6aee2c99eba0b680198c985aabb1c6be877538ae338e36e9164c60685eec9334.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.1a78846b5aca8ce6a34c258dec573fec7d247ae07c09dd7b92196b2bd0a8d1dd.wasm", - "vp_user.wasm": "vp_user.e0200e6274839583464001363bfce2137c8a0a9191b242a9c34c32e31b525a04.wasm", - "vp_validator.wasm": "vp_validator.3a23a0a5629de85f2029543d3fc3d9d3fd58473280859b4984a9a25723c1ca88.wasm" + "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", + "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", + "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", + "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", + "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", + "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", + "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", + "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", + "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", + "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", + "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", + "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" } \ No newline at end of file From e35ed2e10d530fa164fde3ef1906d37b448971f8 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 23:50:54 +0200 Subject: [PATCH 006/114] [chore]: rebasing on bat/generic-io --- apps/src/lib/client/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 00435eee31a..6862ee2a393 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,7 +48,7 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_lin, prompt}; +use namada::{display, display_line, edisplay_line, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; From c5a2ce2215f464ede671889b580a00d1ffdaa5a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 25 Jul 2023 08:23:29 +0100 Subject: [PATCH 007/114] changelog: add #1746 --- .changelog/unreleased/features/1746-generic-io.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/features/1746-generic-io.md diff --git a/.changelog/unreleased/features/1746-generic-io.md b/.changelog/unreleased/features/1746-generic-io.md new file mode 100644 index 00000000000..ff469ec8635 --- /dev/null +++ b/.changelog/unreleased/features/1746-generic-io.md @@ -0,0 +1,2 @@ +- Replaced standard IO in SDK and client code with a trait that allows custom + handling. ([\#1746](https://github.com/anoma/namada/pull/1746)) \ No newline at end of file From cfb57ab19234c53dcca18d8164fccaa81c5e3551 Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 26 Jul 2023 13:26:36 +0200 Subject: [PATCH 008/114] [feat]: Made io reading methods async --- apps/src/lib/cli/api.rs | 2 ++ shared/src/ledger/eth_bridge/bridge_pool.rs | 2 +- shared/src/types/io.rs | 6 ++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/cli/api.rs b/apps/src/lib/cli/api.rs index c53f277e29b..2cf609f18e3 100644 --- a/apps/src/lib/cli/api.rs +++ b/apps/src/lib/cli/api.rs @@ -28,6 +28,8 @@ impl CliClient for HttpClient { } pub struct CliIo; + +#[async_trait::async_trait(?Send)] impl Io for CliIo {} pub struct CliApi(PhantomData); diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index 4891468e58b..235941eb6a9 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -221,7 +221,7 @@ where display!(IO, "\nDo you wish to proceed? (y/n): "); IO::flush(); loop { - let resp = IO::read().try_halt(|e| { + let resp = IO::read().await.try_halt(|e| { display_line!( IO, "Encountered error reading from STDIN: {e:?}" diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 72904ac1144..80eeb2eb695 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -5,8 +5,10 @@ /// Rust native I/O handling. pub struct DefaultIo; +#[async_trait::async_trait(?Send)] impl Io for DefaultIo {} +#[async_trait::async_trait(?Send)] #[allow(missing_docs)] pub trait Io { fn print(output: impl AsRef) { @@ -40,11 +42,11 @@ pub trait Io { eprintln!("{}", output.as_ref()); } - fn read() -> std::io::Result { + async fn read() -> std::io::Result { read_aux(std::io::stdin().lock()) } - fn prompt(question: impl AsRef) -> String { + async fn prompt(question: impl AsRef) -> String { prompt_aux( std::io::stdin().lock(), std::io::stdout(), From 79a953f3225ab992bfbdabd560c53c3a6185c2d7 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:00:05 +0200 Subject: [PATCH 009/114] [feat]: Refactored the masp integration tests to no longer need the nightly feature --- Cargo.lock | 10 +- apps/src/lib/cli.rs | 2 +- apps/src/lib/cli/utils.rs | 51 ----- apps/src/lib/client/rpc.rs | 5 +- .../lib/node/ledger/shell/testing/client.rs | 12 +- .../lib/node/ledger/shell/testing/utils.rs | 197 ++++++++++++++++++ shared/src/types/io.rs | 9 + tests/src/integration.rs | 1 - tests/src/integration/masp.rs | 3 +- tests/src/integration/utils.rs | 83 -------- tests/src/lib.rs | 2 - wasm/checksums.json | 38 ++-- 12 files changed, 240 insertions(+), 173 deletions(-) delete mode 100644 tests/src/integration/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 9517b5cf7b2..55126207333 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3608,7 +3608,7 @@ checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.48.0", ] @@ -6022,16 +6022,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.13" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +checksum = "d4790277f605573dd24b6751701e0823582a63c7cafc095e427e6c66e45dd75e" dependencies = [ "bitflags 1.2.1", "errno", "io-lifetimes", "libc", "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", + "windows-sys 0.45.0", ] [[package]] @@ -6887,7 +6887,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.45.0", ] diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 12927cca13e..3fa2cdd8ed4 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -16,7 +16,7 @@ pub mod wallet; use clap::{ArgGroup, ArgMatches, ColorChoice}; use color_eyre::eyre::Result; use utils::*; -pub use utils::{dispatch_prompt, safe_exit, Cmd, TESTIN}; +pub use utils::{safe_exit, Cmd}; pub use self::context::Context; use crate::cli::api::CliIo; diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index c35298976c5..73d144596c2 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -6,7 +6,6 @@ use std::str::FromStr; use clap::{ArgAction, ArgMatches}; use color_eyre::eyre::Result; -use lazy_static::lazy_static; use super::args; use super::context::{Context, FromContext}; @@ -342,53 +341,3 @@ pub fn safe_exit(_: i32) -> ! { panic!("Test failed because the client exited unexpectedly.") } - -lazy_static! { - /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); -} - -/// A generic function for displaying a prompt to users and reading -/// in their response. -fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String -where - R: std::io::Read, - W: Write, -{ - write!(&mut writer, "{}", question).expect("Unable to write"); - writer.flush().unwrap(); - let mut s = String::new(); - reader.read_to_string(&mut s).expect("Unable to read"); - s -} - -/// A function that chooses how to dispatch prompts -/// to users. There is a hierarchy of feature flags -/// that determines this. If no flags are set, -/// the question is printed to stdout and response -/// read from stdin. -pub fn dispatch_prompt(question: impl AsRef) -> String { - if cfg!(feature = "testing") { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) - } else { - prompt_aux( - std::io::stdin().lock(), - std::io::stdout(), - question.as_ref(), - ) - } -} - -#[macro_export] -/// A convenience macro for formatting the user prompt before -/// forwarding it to the `[dispatch_prompt]` method. -macro_rules! prompt { - ($($arg:tt)*) => {{ - $crate::cli::dispatch_prompt(format!("{}", format_args!($($arg)*))) - }} -} diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 56696fb0227..00435eee31a 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,13 +48,12 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_line}; +use namada::{display, display_line, edisplay_lin, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; use crate::facade::tendermint::merkle::proof::Proof; use crate::facade::tendermint_rpc::error::Error as TError; -use crate::prompt; use crate::wallet::CliWalletUtils; /// Query the status of a given transaction. @@ -456,7 +455,7 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!("Enter the viewing key for {}: ", owner); + let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 0f27a2f6f12..1aa35ca3213 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -3,14 +3,14 @@ use std::ops::ControlFlow; use clap::Command as App; use eyre::Report; use namada::types::control_flow::Halt; -use namada::types::io::{DefaultIo, Io}; +use namada::types::io::Io; use tendermint_config::net::Address as TendermintAddress; use super::node::MockNode; use crate::cli::api::{CliApi, CliClient}; use crate::cli::args::Global; use crate::cli::{args, cmds, Cmd, Context, NamadaClient}; -use crate::node::ledger::shell::testing::utils::Bin; +use crate::node::ledger::shell::testing::utils::{Bin, TestingIo}; pub fn run( node: &MockNode, @@ -25,7 +25,7 @@ pub fn run( wasm_dir: Some(locked.wasm_dir.clone()), } }; - let ctx = Context::new::(global.clone())?; + let ctx = Context::new::(global.clone())?; let rt = tokio::runtime::Runtime::new().unwrap(); match who { @@ -47,7 +47,7 @@ pub fn run( NamadaClient::WithoutContext(sub_cmd, global) } }; - rt.block_on(CliApi::::handle_client_command( + rt.block_on(CliApi::::handle_client_command( Some(node), cmd, )) @@ -60,7 +60,7 @@ pub fn run( let cmd = cmds::NamadaWallet::parse(&matches) .expect("Could not parse wallet command"); - CliApi::::handle_wallet_command(cmd, ctx) + CliApi::::handle_wallet_command(cmd, ctx) } Bin::Relayer => { args.insert(0, "relayer"); @@ -69,7 +69,7 @@ pub fn run( let matches = app.get_matches_from(args.clone()); let cmd = cmds::NamadaRelayer::parse(&matches) .expect("Could not parse wallet command"); - rt.block_on(CliApi::::handle_relayer_command( + rt.block_on(CliApi::::handle_relayer_command( Some(node), cmd, )) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index e66ead21e7d..95da7efb856 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,5 +1,7 @@ use std::path::{Path, PathBuf}; +use lazy_static::lazy_static; +use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; /// Namada binaries @@ -46,3 +48,198 @@ impl Default for TestDir { Self::new() } } + +/// The max number of bytes that the is currently remembered from stdout while +/// testing. +const TESTOUT_BUF_SIZE: usize = 100_000; + +lazy_static! { + /// A replacement for stdout in testing. The maximum number of bytes + /// it holds is limited to prevent memory issues. + pub static ref TESTOUT: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(FixedBuffer::new(TESTOUT_BUF_SIZE))); +} + +lazy_static! { + /// A replacement for stdin in testing. + pub static ref TESTIN: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(vec![])); +} + +pub struct TestingIo; + +impl Io for TestingIo { + fn print(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + testout.append(output.as_ref().as_bytes().to_vec()); + print!("{}", output.as_ref()); + } + + fn println(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + println!("{}", output.as_ref()); + } + + fn write( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::print(output); + Ok(()) + } + + fn writeln( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::println(output); + Ok(()) + } + + fn eprintln(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + eprintln!("{}", output.as_ref()); + } + + fn read() -> std::io::Result { + read_aux(TESTIN.lock().unwrap().as_slice()) + } + + fn prompt(question: impl AsRef) -> String { + prompt_aux( + TESTIN.lock().unwrap().as_slice(), + std::io::stdout(), + question.as_ref(), + ) + } +} + +/// Test helper that captures stdout of +/// a process. +pub struct CapturedOutput { + pub output: String, + pub result: T, + input: String, +} + +impl CapturedOutput { + pub fn with_input(input: String) -> Self { + Self { + output: "".to_string(), + result: (), + input, + } + } +} + +impl CapturedOutput { + /// Run a client command and capture + /// the output to the mocked stdout. + pub fn of(func: F) -> Self + where + F: FnOnce() -> T, + { + let mut capture = Self { + output: Default::default(), + result: func(), + input: Default::default(), + }; + capture.output = TESTOUT.lock().unwrap().read_string(); + capture + } + + /// Run a client command with input to the mocked stdin and capture + /// the output to the mocked stdout + pub fn run(&self, func: F) -> CapturedOutput + where + F: FnOnce() -> U, + { + { + // write the input to the mocked stdin + let mut buf = TESTIN.lock().unwrap(); + buf.clear(); + buf.extend_from_slice(self.input.as_bytes()); + } + CapturedOutput::of(func) + } + + /// Check if the captured output contains the regex. + pub fn matches(&self, needle: regex::Regex) -> bool { + needle.captures(&self.output).is_some() + } + + /// Check if the captured output contains the string. + pub fn contains(&self, needle: &str) -> bool { + let needle = regex::Regex::new(needle).unwrap(); + self.matches(needle) + } +} + +/// A buffer with a max size. Drops elements from the front on +/// size overflow. +pub struct FixedBuffer { + inner: Vec, + max_size: usize, +} + +impl FixedBuffer { + fn new(max_size: usize) -> Self { + Self { + inner: vec![], + max_size, + } + } + + /// Remove the first `size` elements from the buffer. + fn roll(&mut self, size: usize) { + self.inner = self.inner[size..].to_vec(); + } + + /// Add data to the end of the buffer, deleting from the + /// front as necessary. + fn append(&mut self, mut other: Vec) { + // if new data exceeds max size, take the tail. + if other.len() > self.max_size { + self.inner = other[(other.len() - self.max_size)..].to_vec(); + return; + } + // check if appending the data overflows buffer + let free_space = self.max_size - self.inner.len(); + if other.len() > free_space { + // delete the minimum amount of data from the front of the buffer + // to fit new data. + self.roll(other.len() - free_space); + } + self.inner.append(&mut other); + } +} + +impl FixedBuffer { + /// Read the inner buffer out to string + pub fn read_string(&mut self) -> String { + let mut fresh = vec![]; + std::mem::swap(&mut fresh, &mut self.inner); + String::from_utf8(fresh).unwrap() + } +} + +#[cfg(test)] +mod testing { + use super::*; + + #[test] + fn test_buffer() { + let mut buffer = FixedBuffer::::new(10); + buffer.inner = (1u64..=9_u64).collect(); + buffer.append(vec![10, 11, 12, 13, 14, 15]); + assert_eq!(buffer.inner, (6u64..=15_u64).collect::>()); + buffer.append((20u64..=40_u64).collect()); + assert_eq!(buffer.inner, (31u64..=40_u64).collect::>()); + } +} diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 80eeb2eb695..7e1bf40d38e 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -117,3 +117,12 @@ macro_rules! edisplay_line { <$io>::eprintln(format_args!($($args)*).to_string()) }; } + +#[macro_export] +/// A convenience macro for formatting the user prompt before +/// forwarding it to the [`Io::prompt`] method. +macro_rules! prompt { + ($io:ty,$($arg:tt)*) => {{ + <$io>::prompt(format!("{}", format_args!($($arg)*))) + }} +} diff --git a/tests/src/integration.rs b/tests/src/integration.rs index 8642e0e03c2..1a7c84dbfbd 100644 --- a/tests/src/integration.rs +++ b/tests/src/integration.rs @@ -1,3 +1,2 @@ mod masp; mod setup; -mod utils; diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index b8f9c47ed5c..841bdb01c8e 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -5,7 +5,7 @@ use color_eyre::owo_colors::OwoColorize; use namada::types::io::DefaultIo; use namada_apps::client::tx::CLIShieldedUtils; use namada_apps::node::ledger::shell::testing::client::run; -use namada_apps::node::ledger::shell::testing::utils::Bin; +use namada_apps::node::ledger::shell::testing::utils::{Bin, CapturedOutput}; use namada_core::types::address::{btc, eth, masp_rewards}; use namada_core::types::token; use namada_core::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; @@ -17,7 +17,6 @@ use crate::e2e::setup::constants::{ AC_PAYMENT_ADDRESS, AC_VIEWING_KEY, ALBERT, A_SPENDING_KEY, BB_PAYMENT_ADDRESS, BERTHA, BTC, B_SPENDING_KEY, CHRISTEL, ETH, MASP, NAM, }; -use crate::integration::utils::CapturedOutput; /// In this test we verify that users of the MASP receive the correct rewards /// for leaving their assets in the pool for varying periods of time. diff --git a/tests/src/integration/utils.rs b/tests/src/integration/utils.rs deleted file mode 100644 index f626a001ee8..00000000000 --- a/tests/src/integration/utils.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::fs::File; -use std::path::PathBuf; -use std::sync::Arc; - -struct TempFile(PathBuf); -impl TempFile { - fn new(path: PathBuf) -> (Self, File) { - let f = File::create(&path).unwrap(); - (Self(path), f) - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = std::fs::remove_file(&self.0); - } -} - -/// Test helper that captures stdout of -/// a process. -pub struct CapturedOutput { - pub output: String, - pub result: T, - input: String, -} - -impl CapturedOutput { - pub fn with_input(input: String) -> Self { - Self { - output: "".to_string(), - result: (), - input, - } - } -} - -impl CapturedOutput { - /// Run a client command and capture - /// the output to the mocked stdout. - pub(crate) fn of(func: F) -> Self - where - F: FnOnce() -> T, - { - std::io::set_output_capture(Some(Default::default())); - let mut capture = Self { - output: Default::default(), - result: func(), - input: Default::default(), - }; - let captured = std::io::set_output_capture(None); - let captured = captured.unwrap(); - let captured = Arc::try_unwrap(captured).unwrap(); - let captured = captured.into_inner().unwrap(); - capture.output = String::from_utf8(captured).unwrap(); - capture - } - - /// Run a client command with input to the mocked stdin and capture - /// the output to the mocked stdout - pub fn run(&self, func: F) -> CapturedOutput - where - F: FnOnce() -> U, - { - { - // write the input to the mocked stdin - let mut buf = namada_apps::cli::TESTIN.lock().unwrap(); - buf.clear(); - buf.extend_from_slice(self.input.as_bytes()); - } - CapturedOutput::of(func) - } - - /// Check if the captured output contains the regex. - pub fn matches(&self, needle: regex::Regex) -> bool { - needle.captures(&self.output).is_some() - } - - /// Check if the captured output contains the string. - pub fn contains(&self, needle: &str) -> bool { - let needle = regex::Regex::new(needle).unwrap(); - self.matches(needle) - } -} diff --git a/tests/src/lib.rs b/tests/src/lib.rs index 7e359474772..1d9958a30a3 100644 --- a/tests/src/lib.rs +++ b/tests/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(test, feature(internal_output_capture))] //! Namada integrations and WASM tests and testing helpers. #![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] @@ -13,7 +12,6 @@ pub use vm_host_env::{ibc, tx, vp}; #[cfg(test)] mod e2e; #[cfg(test)] -#[allow(dead_code)] mod integration; pub mod native_vp; pub mod storage; diff --git a/wasm/checksums.json b/wasm/checksums.json index 71bcf7c9ef8..adf06b5afee 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.e9201ea2342459a86343e5e6db1400b23d0843fe4407f6f759c65dc63395b5cd.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.c1b7457cc85bfb4ca141a3f1157700be2d0f672aec21a2a7883a6264e8775cc1.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.c91a746933ecb67daf41d77d6cb7810277dfb661a72e6f4726cee7300f750cde.wasm", - "tx_ibc.wasm": "tx_ibc.917a7c8ad4138679eb467e8a18b0234d6c3ba56802a728186d7fcd047e0c0c4b.wasm", - "tx_init_account.wasm": "tx_init_account.6fc0c6ebbf933befd27f8515f0d439814ad8ea2732ec62271fe5ec4da177340e.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.0dd098e0962ba8b3fac93eefae0524959125ce334edf05e05edbdf4d38ec9069.wasm", - "tx_init_validator.wasm": "tx_init_validator.88f4d2b5cc358e8e9a53512314450161b8ab123a54ccbbbc44c6272fc3496ee2.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.4d4243a995611cb5c53bb7ad9657dd6112f8f3e309b1497c4af2763dcff5f0e7.wasm", - "tx_transfer.wasm": "tx_transfer.c6d4ac6e8311a75f199a0ca009f2b80c1ef107eeadfe7bbab94ff6453f075954.wasm", - "tx_unbond.wasm": "tx_unbond.00df2be4c4eaa94bec27f4bb89ccb96f7725cfdc4af2c965473ec1e9679f0989.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.96081388ae0cb289df7fb48b37a5f640c867205f19c9c44a2af4f2f9598c4a27.wasm", - "tx_update_vp.wasm": "tx_update_vp.a1b0a203c05769a90c63711ef3ff922c5ba4b82f74511ade2a446ead47a2913b.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.9b4103f524a21e45d39361afb349e60a5010d94db5bf5ed5a8f678ec9c0df1b8.wasm", - "tx_withdraw.wasm": "tx_withdraw.37ffd46d73cc8cb67c14df42389b18fff03cd0c77861e2d9fc64ac486a13f65c.wasm", - "vp_implicit.wasm": "vp_implicit.e16621fd592ef6ad906b820762959dec1224e5a2e6917e8d8f0258601ed8dadd.wasm", - "vp_masp.wasm": "vp_masp.6aee2c99eba0b680198c985aabb1c6be877538ae338e36e9164c60685eec9334.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.1a78846b5aca8ce6a34c258dec573fec7d247ae07c09dd7b92196b2bd0a8d1dd.wasm", - "vp_user.wasm": "vp_user.e0200e6274839583464001363bfce2137c8a0a9191b242a9c34c32e31b525a04.wasm", - "vp_validator.wasm": "vp_validator.3a23a0a5629de85f2029543d3fc3d9d3fd58473280859b4984a9a25723c1ca88.wasm" + "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", + "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", + "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", + "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", + "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", + "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", + "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", + "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", + "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", + "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", + "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", + "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" } \ No newline at end of file From 6aa9ee50d0577494fecc90451ce98b567b65d918 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 23:50:54 +0200 Subject: [PATCH 010/114] [chore]: rebasing on bat/generic-io --- apps/src/lib/client/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 00435eee31a..6862ee2a393 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,7 +48,7 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_lin, prompt}; +use namada::{display, display_line, edisplay_line, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; From c833aa3bf18719ac8f04d1c70fd8bbd5989308b7 Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 26 Jul 2023 13:41:01 +0200 Subject: [PATCH 011/114] [fix]: Fixing downstream async io changes from bat/generic-io --- apps/src/lib/client/rpc.rs | 3 ++- apps/src/lib/node/ledger/shell/testing/utils.rs | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 6862ee2a393..1b332964f37 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -455,7 +455,8 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); + let vk_str = + prompt!(IO, "Enter the viewing key for {}: ", owner).await; let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 95da7efb856..3ff3bdb7d31 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -68,6 +68,7 @@ lazy_static! { pub struct TestingIo; +#[async_trait::async_trait(?Send)] impl Io for TestingIo { fn print(output: impl AsRef) { let mut testout = TESTOUT.lock().unwrap(); @@ -107,11 +108,11 @@ impl Io for TestingIo { eprintln!("{}", output.as_ref()); } - fn read() -> std::io::Result { + async fn read() -> std::io::Result { read_aux(TESTIN.lock().unwrap().as_slice()) } - fn prompt(question: impl AsRef) -> String { + async fn prompt(question: impl AsRef) -> String { prompt_aux( TESTIN.lock().unwrap().as_slice(), std::io::stdout(), From 12f219f14f9e45b3cff6f43b2589bd9a33ad2895 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:00:05 +0200 Subject: [PATCH 012/114] [feat]: Refactored the masp integration tests to no longer need the nightly feature --- Cargo.lock | 10 +- apps/src/lib/cli.rs | 2 +- apps/src/lib/cli/utils.rs | 51 ----- apps/src/lib/client/rpc.rs | 5 +- .../lib/node/ledger/shell/testing/client.rs | 12 +- .../lib/node/ledger/shell/testing/utils.rs | 197 ++++++++++++++++++ shared/src/types/io.rs | 9 + tests/src/integration.rs | 1 - tests/src/integration/masp.rs | 3 +- tests/src/integration/utils.rs | 83 -------- tests/src/lib.rs | 2 - wasm/checksums.json | 38 ++-- 12 files changed, 240 insertions(+), 173 deletions(-) delete mode 100644 tests/src/integration/utils.rs diff --git a/Cargo.lock b/Cargo.lock index decc4289282..5821c9162e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3608,7 +3608,7 @@ checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.48.0", ] @@ -6022,16 +6022,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.13" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +checksum = "d4790277f605573dd24b6751701e0823582a63c7cafc095e427e6c66e45dd75e" dependencies = [ "bitflags 1.2.1", "errno", "io-lifetimes", "libc", "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", + "windows-sys 0.45.0", ] [[package]] @@ -6887,7 +6887,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.45.0", ] diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 12927cca13e..3fa2cdd8ed4 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -16,7 +16,7 @@ pub mod wallet; use clap::{ArgGroup, ArgMatches, ColorChoice}; use color_eyre::eyre::Result; use utils::*; -pub use utils::{dispatch_prompt, safe_exit, Cmd, TESTIN}; +pub use utils::{safe_exit, Cmd}; pub use self::context::Context; use crate::cli::api::CliIo; diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index c35298976c5..73d144596c2 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -6,7 +6,6 @@ use std::str::FromStr; use clap::{ArgAction, ArgMatches}; use color_eyre::eyre::Result; -use lazy_static::lazy_static; use super::args; use super::context::{Context, FromContext}; @@ -342,53 +341,3 @@ pub fn safe_exit(_: i32) -> ! { panic!("Test failed because the client exited unexpectedly.") } - -lazy_static! { - /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); -} - -/// A generic function for displaying a prompt to users and reading -/// in their response. -fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String -where - R: std::io::Read, - W: Write, -{ - write!(&mut writer, "{}", question).expect("Unable to write"); - writer.flush().unwrap(); - let mut s = String::new(); - reader.read_to_string(&mut s).expect("Unable to read"); - s -} - -/// A function that chooses how to dispatch prompts -/// to users. There is a hierarchy of feature flags -/// that determines this. If no flags are set, -/// the question is printed to stdout and response -/// read from stdin. -pub fn dispatch_prompt(question: impl AsRef) -> String { - if cfg!(feature = "testing") { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) - } else { - prompt_aux( - std::io::stdin().lock(), - std::io::stdout(), - question.as_ref(), - ) - } -} - -#[macro_export] -/// A convenience macro for formatting the user prompt before -/// forwarding it to the `[dispatch_prompt]` method. -macro_rules! prompt { - ($($arg:tt)*) => {{ - $crate::cli::dispatch_prompt(format!("{}", format_args!($($arg)*))) - }} -} diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index efdc8ee8c3f..ccac9cc398d 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,13 +48,12 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_line}; +use namada::{display, display_line, edisplay_lin, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; use crate::facade::tendermint::merkle::proof::Proof; use crate::facade::tendermint_rpc::error::Error as TError; -use crate::prompt; use crate::wallet::CliWalletUtils; /// Query the status of a given transaction. @@ -455,7 +454,7 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!("Enter the viewing key for {}: ", owner); + let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 0f27a2f6f12..1aa35ca3213 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -3,14 +3,14 @@ use std::ops::ControlFlow; use clap::Command as App; use eyre::Report; use namada::types::control_flow::Halt; -use namada::types::io::{DefaultIo, Io}; +use namada::types::io::Io; use tendermint_config::net::Address as TendermintAddress; use super::node::MockNode; use crate::cli::api::{CliApi, CliClient}; use crate::cli::args::Global; use crate::cli::{args, cmds, Cmd, Context, NamadaClient}; -use crate::node::ledger::shell::testing::utils::Bin; +use crate::node::ledger::shell::testing::utils::{Bin, TestingIo}; pub fn run( node: &MockNode, @@ -25,7 +25,7 @@ pub fn run( wasm_dir: Some(locked.wasm_dir.clone()), } }; - let ctx = Context::new::(global.clone())?; + let ctx = Context::new::(global.clone())?; let rt = tokio::runtime::Runtime::new().unwrap(); match who { @@ -47,7 +47,7 @@ pub fn run( NamadaClient::WithoutContext(sub_cmd, global) } }; - rt.block_on(CliApi::::handle_client_command( + rt.block_on(CliApi::::handle_client_command( Some(node), cmd, )) @@ -60,7 +60,7 @@ pub fn run( let cmd = cmds::NamadaWallet::parse(&matches) .expect("Could not parse wallet command"); - CliApi::::handle_wallet_command(cmd, ctx) + CliApi::::handle_wallet_command(cmd, ctx) } Bin::Relayer => { args.insert(0, "relayer"); @@ -69,7 +69,7 @@ pub fn run( let matches = app.get_matches_from(args.clone()); let cmd = cmds::NamadaRelayer::parse(&matches) .expect("Could not parse wallet command"); - rt.block_on(CliApi::::handle_relayer_command( + rt.block_on(CliApi::::handle_relayer_command( Some(node), cmd, )) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index e66ead21e7d..95da7efb856 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,5 +1,7 @@ use std::path::{Path, PathBuf}; +use lazy_static::lazy_static; +use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; /// Namada binaries @@ -46,3 +48,198 @@ impl Default for TestDir { Self::new() } } + +/// The max number of bytes that the is currently remembered from stdout while +/// testing. +const TESTOUT_BUF_SIZE: usize = 100_000; + +lazy_static! { + /// A replacement for stdout in testing. The maximum number of bytes + /// it holds is limited to prevent memory issues. + pub static ref TESTOUT: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(FixedBuffer::new(TESTOUT_BUF_SIZE))); +} + +lazy_static! { + /// A replacement for stdin in testing. + pub static ref TESTIN: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(vec![])); +} + +pub struct TestingIo; + +impl Io for TestingIo { + fn print(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + testout.append(output.as_ref().as_bytes().to_vec()); + print!("{}", output.as_ref()); + } + + fn println(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + println!("{}", output.as_ref()); + } + + fn write( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::print(output); + Ok(()) + } + + fn writeln( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::println(output); + Ok(()) + } + + fn eprintln(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + eprintln!("{}", output.as_ref()); + } + + fn read() -> std::io::Result { + read_aux(TESTIN.lock().unwrap().as_slice()) + } + + fn prompt(question: impl AsRef) -> String { + prompt_aux( + TESTIN.lock().unwrap().as_slice(), + std::io::stdout(), + question.as_ref(), + ) + } +} + +/// Test helper that captures stdout of +/// a process. +pub struct CapturedOutput { + pub output: String, + pub result: T, + input: String, +} + +impl CapturedOutput { + pub fn with_input(input: String) -> Self { + Self { + output: "".to_string(), + result: (), + input, + } + } +} + +impl CapturedOutput { + /// Run a client command and capture + /// the output to the mocked stdout. + pub fn of(func: F) -> Self + where + F: FnOnce() -> T, + { + let mut capture = Self { + output: Default::default(), + result: func(), + input: Default::default(), + }; + capture.output = TESTOUT.lock().unwrap().read_string(); + capture + } + + /// Run a client command with input to the mocked stdin and capture + /// the output to the mocked stdout + pub fn run(&self, func: F) -> CapturedOutput + where + F: FnOnce() -> U, + { + { + // write the input to the mocked stdin + let mut buf = TESTIN.lock().unwrap(); + buf.clear(); + buf.extend_from_slice(self.input.as_bytes()); + } + CapturedOutput::of(func) + } + + /// Check if the captured output contains the regex. + pub fn matches(&self, needle: regex::Regex) -> bool { + needle.captures(&self.output).is_some() + } + + /// Check if the captured output contains the string. + pub fn contains(&self, needle: &str) -> bool { + let needle = regex::Regex::new(needle).unwrap(); + self.matches(needle) + } +} + +/// A buffer with a max size. Drops elements from the front on +/// size overflow. +pub struct FixedBuffer { + inner: Vec, + max_size: usize, +} + +impl FixedBuffer { + fn new(max_size: usize) -> Self { + Self { + inner: vec![], + max_size, + } + } + + /// Remove the first `size` elements from the buffer. + fn roll(&mut self, size: usize) { + self.inner = self.inner[size..].to_vec(); + } + + /// Add data to the end of the buffer, deleting from the + /// front as necessary. + fn append(&mut self, mut other: Vec) { + // if new data exceeds max size, take the tail. + if other.len() > self.max_size { + self.inner = other[(other.len() - self.max_size)..].to_vec(); + return; + } + // check if appending the data overflows buffer + let free_space = self.max_size - self.inner.len(); + if other.len() > free_space { + // delete the minimum amount of data from the front of the buffer + // to fit new data. + self.roll(other.len() - free_space); + } + self.inner.append(&mut other); + } +} + +impl FixedBuffer { + /// Read the inner buffer out to string + pub fn read_string(&mut self) -> String { + let mut fresh = vec![]; + std::mem::swap(&mut fresh, &mut self.inner); + String::from_utf8(fresh).unwrap() + } +} + +#[cfg(test)] +mod testing { + use super::*; + + #[test] + fn test_buffer() { + let mut buffer = FixedBuffer::::new(10); + buffer.inner = (1u64..=9_u64).collect(); + buffer.append(vec![10, 11, 12, 13, 14, 15]); + assert_eq!(buffer.inner, (6u64..=15_u64).collect::>()); + buffer.append((20u64..=40_u64).collect()); + assert_eq!(buffer.inner, (31u64..=40_u64).collect::>()); + } +} diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 80eeb2eb695..7e1bf40d38e 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -117,3 +117,12 @@ macro_rules! edisplay_line { <$io>::eprintln(format_args!($($args)*).to_string()) }; } + +#[macro_export] +/// A convenience macro for formatting the user prompt before +/// forwarding it to the [`Io::prompt`] method. +macro_rules! prompt { + ($io:ty,$($arg:tt)*) => {{ + <$io>::prompt(format!("{}", format_args!($($arg)*))) + }} +} diff --git a/tests/src/integration.rs b/tests/src/integration.rs index 8642e0e03c2..1a7c84dbfbd 100644 --- a/tests/src/integration.rs +++ b/tests/src/integration.rs @@ -1,3 +1,2 @@ mod masp; mod setup; -mod utils; diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index b8f9c47ed5c..841bdb01c8e 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -5,7 +5,7 @@ use color_eyre::owo_colors::OwoColorize; use namada::types::io::DefaultIo; use namada_apps::client::tx::CLIShieldedUtils; use namada_apps::node::ledger::shell::testing::client::run; -use namada_apps::node::ledger::shell::testing::utils::Bin; +use namada_apps::node::ledger::shell::testing::utils::{Bin, CapturedOutput}; use namada_core::types::address::{btc, eth, masp_rewards}; use namada_core::types::token; use namada_core::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; @@ -17,7 +17,6 @@ use crate::e2e::setup::constants::{ AC_PAYMENT_ADDRESS, AC_VIEWING_KEY, ALBERT, A_SPENDING_KEY, BB_PAYMENT_ADDRESS, BERTHA, BTC, B_SPENDING_KEY, CHRISTEL, ETH, MASP, NAM, }; -use crate::integration::utils::CapturedOutput; /// In this test we verify that users of the MASP receive the correct rewards /// for leaving their assets in the pool for varying periods of time. diff --git a/tests/src/integration/utils.rs b/tests/src/integration/utils.rs deleted file mode 100644 index f626a001ee8..00000000000 --- a/tests/src/integration/utils.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::fs::File; -use std::path::PathBuf; -use std::sync::Arc; - -struct TempFile(PathBuf); -impl TempFile { - fn new(path: PathBuf) -> (Self, File) { - let f = File::create(&path).unwrap(); - (Self(path), f) - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = std::fs::remove_file(&self.0); - } -} - -/// Test helper that captures stdout of -/// a process. -pub struct CapturedOutput { - pub output: String, - pub result: T, - input: String, -} - -impl CapturedOutput { - pub fn with_input(input: String) -> Self { - Self { - output: "".to_string(), - result: (), - input, - } - } -} - -impl CapturedOutput { - /// Run a client command and capture - /// the output to the mocked stdout. - pub(crate) fn of(func: F) -> Self - where - F: FnOnce() -> T, - { - std::io::set_output_capture(Some(Default::default())); - let mut capture = Self { - output: Default::default(), - result: func(), - input: Default::default(), - }; - let captured = std::io::set_output_capture(None); - let captured = captured.unwrap(); - let captured = Arc::try_unwrap(captured).unwrap(); - let captured = captured.into_inner().unwrap(); - capture.output = String::from_utf8(captured).unwrap(); - capture - } - - /// Run a client command with input to the mocked stdin and capture - /// the output to the mocked stdout - pub fn run(&self, func: F) -> CapturedOutput - where - F: FnOnce() -> U, - { - { - // write the input to the mocked stdin - let mut buf = namada_apps::cli::TESTIN.lock().unwrap(); - buf.clear(); - buf.extend_from_slice(self.input.as_bytes()); - } - CapturedOutput::of(func) - } - - /// Check if the captured output contains the regex. - pub fn matches(&self, needle: regex::Regex) -> bool { - needle.captures(&self.output).is_some() - } - - /// Check if the captured output contains the string. - pub fn contains(&self, needle: &str) -> bool { - let needle = regex::Regex::new(needle).unwrap(); - self.matches(needle) - } -} diff --git a/tests/src/lib.rs b/tests/src/lib.rs index 7e359474772..1d9958a30a3 100644 --- a/tests/src/lib.rs +++ b/tests/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(test, feature(internal_output_capture))] //! Namada integrations and WASM tests and testing helpers. #![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] @@ -13,7 +12,6 @@ pub use vm_host_env::{ibc, tx, vp}; #[cfg(test)] mod e2e; #[cfg(test)] -#[allow(dead_code)] mod integration; pub mod native_vp; pub mod storage; diff --git a/wasm/checksums.json b/wasm/checksums.json index cb9ca8ed52d..adf06b5afee 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.08cedac1d825cd8ee9b04ef059bc68fee04f82fec57e0f6bc38123de8fb35b85.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.c9ef2bdb19910e12eadabc7f0552b45c937bcf1f47ca09759e52112b68d94114.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.2be60082c6b891cb437b4392e1b2570f5d92fed35dd624cd079ea48c4bc7902c.wasm", - "tx_ibc.wasm": "tx_ibc.f8056f465d17043d2864309d1c50a897a028b6ebf9702e5c403e1bf8c670f6e6.wasm", - "tx_init_account.wasm": "tx_init_account.e91ab25cebd15af9a958eca4a34ba287804b1ff6ba4c82fc941f7f50816e9c4d.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.1683eb9a2b2616af21f4f55457f7e06e0ae0591f460ede412a548ea9b1ab694c.wasm", - "tx_init_validator.wasm": "tx_init_validator.67574f70c1f76c2c68498d17323793366c13d119480b6787c8c5ede312e51da0.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.e6375abba3f750700c06fbdeb2d5edec22b6a382116a67a7f9d7f7ba49f134e1.wasm", - "tx_transfer.wasm": "tx_transfer.e65b47bc94c5a09e3edc68298ad0e5e35041b91bc4d679bf5b7f433dffdce58e.wasm", - "tx_unbond.wasm": "tx_unbond.4fd70d297ccedb369bf88d8a8459a47ea733d329410387a6f80a0e026c6e480d.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.b8e7204b14e15a3c395432f35788eca45ef4332916d96dfba87627a5717916de.wasm", - "tx_update_vp.wasm": "tx_update_vp.65c5ca3e48fdef70e696460eca7540cf6196511d76fb2465133b145409329b3e.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.e0a003d922230d32b741b57ca18913cbc4d5d2290f02cb37dfdaa7f27cebb486.wasm", - "tx_withdraw.wasm": "tx_withdraw.40499cb0e268d3cc3d9bca5dacca05d8df35f5b90adf4087a5171505472d921a.wasm", - "vp_implicit.wasm": "vp_implicit.57af3b7d2ee9e2c9d7ef1e33a85646abeea7ea02dad19b7e0b20b289de5a7ae9.wasm", - "vp_masp.wasm": "vp_masp.4d656f775b7462095e7d9ff533e346829fad02568b1cf92fa2f99cc0677720ce.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.b0c855f0356a468db1d26baebc988508d4824836b86adb94ac432368feb03ac4.wasm", - "vp_user.wasm": "vp_user.31967a7411caf61729e46840eec90d2db386cf4745f49d59086a43cc3c3e2d39.wasm", - "vp_validator.wasm": "vp_validator.0bca8e34f5d51c74b2861d588e3dd6a8e61de7c63d356af63e2182e030ac42ee.wasm" + "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", + "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", + "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", + "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", + "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", + "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", + "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", + "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", + "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", + "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", + "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", + "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" } \ No newline at end of file From 014e4f76b788bc8cfd8298d8ba4c98cd4144fdbc Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 23:50:54 +0200 Subject: [PATCH 013/114] [chore]: rebasing on bat/generic-io --- apps/src/lib/client/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index ccac9cc398d..26b1956a117 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,7 +48,7 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_lin, prompt}; +use namada::{display, display_line, edisplay_line, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; From c64fdee5197a0001d2db6c63b02731d386a5b5cf Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 26 Jul 2023 13:41:01 +0200 Subject: [PATCH 014/114] [fix]: Fixing downstream async io changes from bat/generic-io --- apps/src/lib/client/rpc.rs | 3 ++- apps/src/lib/node/ledger/shell/testing/utils.rs | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 26b1956a117..20ba1509bcc 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -454,7 +454,8 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); + let vk_str = + prompt!(IO, "Enter the viewing key for {}: ", owner).await; let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 95da7efb856..3ff3bdb7d31 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -68,6 +68,7 @@ lazy_static! { pub struct TestingIo; +#[async_trait::async_trait(?Send)] impl Io for TestingIo { fn print(output: impl AsRef) { let mut testout = TESTOUT.lock().unwrap(); @@ -107,11 +108,11 @@ impl Io for TestingIo { eprintln!("{}", output.as_ref()); } - fn read() -> std::io::Result { + async fn read() -> std::io::Result { read_aux(TESTIN.lock().unwrap().as_slice()) } - fn prompt(question: impl AsRef) -> String { + async fn prompt(question: impl AsRef) -> String { prompt_aux( TESTIN.lock().unwrap().as_slice(), std::io::stdout(), From 36fe43e3d1c35455034446873fbc47cbdab37d37 Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 27 Jul 2023 14:36:31 +0200 Subject: [PATCH 015/114] [feat]: Changed default io read methods to use tokio's async io tools --- shared/src/types/io.rs | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 80eeb2eb695..c4d2231dee3 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -47,25 +47,29 @@ pub trait Io { } async fn prompt(question: impl AsRef) -> String { - prompt_aux( - std::io::stdin().lock(), - std::io::stdout(), - question.as_ref(), - ) + prompt_aux(tokio::io::stdin(), tokio::io::stdout(), question.as_ref()) + .await } } /// A generic function for displaying a prompt to users and reading /// in their response. -pub fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String +pub async fn prompt_aux( + mut reader: R, + mut writer: W, + question: &str, +) -> String where - R: std::io::Read, - W: std::io::Write, + R: tokio::io::AsyncReadExt + Unpin, + W: tokio::io::AsyncWriteExt + Unpin, { - write!(&mut writer, "{}", question).expect("Unable to write"); - writer.flush().unwrap(); + writer + .write_all(question.as_bytes()) + .await + .expect("Unable to write"); + writer.flush().await.unwrap(); let mut s = String::new(); - reader.read_to_string(&mut s).expect("Unable to read"); + reader.read_to_string(&mut s).await.expect("Unable to read"); s } From f0467289f85b0970db5cd228a01e790bbfdbd84a Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 27 Jul 2023 14:41:23 +0200 Subject: [PATCH 016/114] [feat]: Changed default io read methods to use tokio's async io tools --- shared/src/types/io.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index c4d2231dee3..93d45a75ffc 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -42,8 +42,8 @@ pub trait Io { eprintln!("{}", output.as_ref()); } - async fn read() -> std::io::Result { - read_aux(std::io::stdin().lock()) + async fn read() -> tokio::io::Result { + read_aux(tokio::io::stdin()).await } async fn prompt(question: impl AsRef) -> String { @@ -74,12 +74,12 @@ where } /// A generic function for reading input from users -pub fn read_aux(mut reader: R) -> std::io::Result +pub async fn read_aux(mut reader: R) -> tokio::io::Result where - R: std::io::Read, + R: tokio::io::AsyncReadExt + Unpin, { let mut s = String::new(); - reader.read_to_string(&mut s)?; + reader.read_to_string(&mut s).await?; Ok(s) } From c249df8d53bce10db1250d2b2b243b2cc532e4e4 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:00:05 +0200 Subject: [PATCH 017/114] [feat]: Refactored the masp integration tests to no longer need the nightly feature --- Cargo.lock | 10 +- apps/src/lib/cli.rs | 2 +- apps/src/lib/cli/utils.rs | 51 ----- apps/src/lib/client/rpc.rs | 5 +- .../lib/node/ledger/shell/testing/client.rs | 12 +- .../lib/node/ledger/shell/testing/utils.rs | 197 ++++++++++++++++++ shared/src/types/io.rs | 9 + tests/src/integration.rs | 1 - tests/src/integration/masp.rs | 3 +- tests/src/integration/utils.rs | 83 -------- tests/src/lib.rs | 2 - wasm/checksums.json | 38 ++-- 12 files changed, 240 insertions(+), 173 deletions(-) delete mode 100644 tests/src/integration/utils.rs diff --git a/Cargo.lock b/Cargo.lock index decc4289282..5821c9162e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3608,7 +3608,7 @@ checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.48.0", ] @@ -6022,16 +6022,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.13" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +checksum = "d4790277f605573dd24b6751701e0823582a63c7cafc095e427e6c66e45dd75e" dependencies = [ "bitflags 1.2.1", "errno", "io-lifetimes", "libc", "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", + "windows-sys 0.45.0", ] [[package]] @@ -6887,7 +6887,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.45.0", ] diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 12927cca13e..3fa2cdd8ed4 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -16,7 +16,7 @@ pub mod wallet; use clap::{ArgGroup, ArgMatches, ColorChoice}; use color_eyre::eyre::Result; use utils::*; -pub use utils::{dispatch_prompt, safe_exit, Cmd, TESTIN}; +pub use utils::{safe_exit, Cmd}; pub use self::context::Context; use crate::cli::api::CliIo; diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index c35298976c5..73d144596c2 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -6,7 +6,6 @@ use std::str::FromStr; use clap::{ArgAction, ArgMatches}; use color_eyre::eyre::Result; -use lazy_static::lazy_static; use super::args; use super::context::{Context, FromContext}; @@ -342,53 +341,3 @@ pub fn safe_exit(_: i32) -> ! { panic!("Test failed because the client exited unexpectedly.") } - -lazy_static! { - /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); -} - -/// A generic function for displaying a prompt to users and reading -/// in their response. -fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String -where - R: std::io::Read, - W: Write, -{ - write!(&mut writer, "{}", question).expect("Unable to write"); - writer.flush().unwrap(); - let mut s = String::new(); - reader.read_to_string(&mut s).expect("Unable to read"); - s -} - -/// A function that chooses how to dispatch prompts -/// to users. There is a hierarchy of feature flags -/// that determines this. If no flags are set, -/// the question is printed to stdout and response -/// read from stdin. -pub fn dispatch_prompt(question: impl AsRef) -> String { - if cfg!(feature = "testing") { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) - } else { - prompt_aux( - std::io::stdin().lock(), - std::io::stdout(), - question.as_ref(), - ) - } -} - -#[macro_export] -/// A convenience macro for formatting the user prompt before -/// forwarding it to the `[dispatch_prompt]` method. -macro_rules! prompt { - ($($arg:tt)*) => {{ - $crate::cli::dispatch_prompt(format!("{}", format_args!($($arg)*))) - }} -} diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index efdc8ee8c3f..ccac9cc398d 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,13 +48,12 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_line}; +use namada::{display, display_line, edisplay_lin, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; use crate::facade::tendermint::merkle::proof::Proof; use crate::facade::tendermint_rpc::error::Error as TError; -use crate::prompt; use crate::wallet::CliWalletUtils; /// Query the status of a given transaction. @@ -455,7 +454,7 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!("Enter the viewing key for {}: ", owner); + let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 0f27a2f6f12..1aa35ca3213 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -3,14 +3,14 @@ use std::ops::ControlFlow; use clap::Command as App; use eyre::Report; use namada::types::control_flow::Halt; -use namada::types::io::{DefaultIo, Io}; +use namada::types::io::Io; use tendermint_config::net::Address as TendermintAddress; use super::node::MockNode; use crate::cli::api::{CliApi, CliClient}; use crate::cli::args::Global; use crate::cli::{args, cmds, Cmd, Context, NamadaClient}; -use crate::node::ledger::shell::testing::utils::Bin; +use crate::node::ledger::shell::testing::utils::{Bin, TestingIo}; pub fn run( node: &MockNode, @@ -25,7 +25,7 @@ pub fn run( wasm_dir: Some(locked.wasm_dir.clone()), } }; - let ctx = Context::new::(global.clone())?; + let ctx = Context::new::(global.clone())?; let rt = tokio::runtime::Runtime::new().unwrap(); match who { @@ -47,7 +47,7 @@ pub fn run( NamadaClient::WithoutContext(sub_cmd, global) } }; - rt.block_on(CliApi::::handle_client_command( + rt.block_on(CliApi::::handle_client_command( Some(node), cmd, )) @@ -60,7 +60,7 @@ pub fn run( let cmd = cmds::NamadaWallet::parse(&matches) .expect("Could not parse wallet command"); - CliApi::::handle_wallet_command(cmd, ctx) + CliApi::::handle_wallet_command(cmd, ctx) } Bin::Relayer => { args.insert(0, "relayer"); @@ -69,7 +69,7 @@ pub fn run( let matches = app.get_matches_from(args.clone()); let cmd = cmds::NamadaRelayer::parse(&matches) .expect("Could not parse wallet command"); - rt.block_on(CliApi::::handle_relayer_command( + rt.block_on(CliApi::::handle_relayer_command( Some(node), cmd, )) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index e66ead21e7d..95da7efb856 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,5 +1,7 @@ use std::path::{Path, PathBuf}; +use lazy_static::lazy_static; +use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; /// Namada binaries @@ -46,3 +48,198 @@ impl Default for TestDir { Self::new() } } + +/// The max number of bytes that the is currently remembered from stdout while +/// testing. +const TESTOUT_BUF_SIZE: usize = 100_000; + +lazy_static! { + /// A replacement for stdout in testing. The maximum number of bytes + /// it holds is limited to prevent memory issues. + pub static ref TESTOUT: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(FixedBuffer::new(TESTOUT_BUF_SIZE))); +} + +lazy_static! { + /// A replacement for stdin in testing. + pub static ref TESTIN: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(vec![])); +} + +pub struct TestingIo; + +impl Io for TestingIo { + fn print(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + testout.append(output.as_ref().as_bytes().to_vec()); + print!("{}", output.as_ref()); + } + + fn println(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + println!("{}", output.as_ref()); + } + + fn write( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::print(output); + Ok(()) + } + + fn writeln( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::println(output); + Ok(()) + } + + fn eprintln(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + eprintln!("{}", output.as_ref()); + } + + fn read() -> std::io::Result { + read_aux(TESTIN.lock().unwrap().as_slice()) + } + + fn prompt(question: impl AsRef) -> String { + prompt_aux( + TESTIN.lock().unwrap().as_slice(), + std::io::stdout(), + question.as_ref(), + ) + } +} + +/// Test helper that captures stdout of +/// a process. +pub struct CapturedOutput { + pub output: String, + pub result: T, + input: String, +} + +impl CapturedOutput { + pub fn with_input(input: String) -> Self { + Self { + output: "".to_string(), + result: (), + input, + } + } +} + +impl CapturedOutput { + /// Run a client command and capture + /// the output to the mocked stdout. + pub fn of(func: F) -> Self + where + F: FnOnce() -> T, + { + let mut capture = Self { + output: Default::default(), + result: func(), + input: Default::default(), + }; + capture.output = TESTOUT.lock().unwrap().read_string(); + capture + } + + /// Run a client command with input to the mocked stdin and capture + /// the output to the mocked stdout + pub fn run(&self, func: F) -> CapturedOutput + where + F: FnOnce() -> U, + { + { + // write the input to the mocked stdin + let mut buf = TESTIN.lock().unwrap(); + buf.clear(); + buf.extend_from_slice(self.input.as_bytes()); + } + CapturedOutput::of(func) + } + + /// Check if the captured output contains the regex. + pub fn matches(&self, needle: regex::Regex) -> bool { + needle.captures(&self.output).is_some() + } + + /// Check if the captured output contains the string. + pub fn contains(&self, needle: &str) -> bool { + let needle = regex::Regex::new(needle).unwrap(); + self.matches(needle) + } +} + +/// A buffer with a max size. Drops elements from the front on +/// size overflow. +pub struct FixedBuffer { + inner: Vec, + max_size: usize, +} + +impl FixedBuffer { + fn new(max_size: usize) -> Self { + Self { + inner: vec![], + max_size, + } + } + + /// Remove the first `size` elements from the buffer. + fn roll(&mut self, size: usize) { + self.inner = self.inner[size..].to_vec(); + } + + /// Add data to the end of the buffer, deleting from the + /// front as necessary. + fn append(&mut self, mut other: Vec) { + // if new data exceeds max size, take the tail. + if other.len() > self.max_size { + self.inner = other[(other.len() - self.max_size)..].to_vec(); + return; + } + // check if appending the data overflows buffer + let free_space = self.max_size - self.inner.len(); + if other.len() > free_space { + // delete the minimum amount of data from the front of the buffer + // to fit new data. + self.roll(other.len() - free_space); + } + self.inner.append(&mut other); + } +} + +impl FixedBuffer { + /// Read the inner buffer out to string + pub fn read_string(&mut self) -> String { + let mut fresh = vec![]; + std::mem::swap(&mut fresh, &mut self.inner); + String::from_utf8(fresh).unwrap() + } +} + +#[cfg(test)] +mod testing { + use super::*; + + #[test] + fn test_buffer() { + let mut buffer = FixedBuffer::::new(10); + buffer.inner = (1u64..=9_u64).collect(); + buffer.append(vec![10, 11, 12, 13, 14, 15]); + assert_eq!(buffer.inner, (6u64..=15_u64).collect::>()); + buffer.append((20u64..=40_u64).collect()); + assert_eq!(buffer.inner, (31u64..=40_u64).collect::>()); + } +} diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 93d45a75ffc..13798cc5b26 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -121,3 +121,12 @@ macro_rules! edisplay_line { <$io>::eprintln(format_args!($($args)*).to_string()) }; } + +#[macro_export] +/// A convenience macro for formatting the user prompt before +/// forwarding it to the [`Io::prompt`] method. +macro_rules! prompt { + ($io:ty,$($arg:tt)*) => {{ + <$io>::prompt(format!("{}", format_args!($($arg)*))) + }} +} diff --git a/tests/src/integration.rs b/tests/src/integration.rs index 8642e0e03c2..1a7c84dbfbd 100644 --- a/tests/src/integration.rs +++ b/tests/src/integration.rs @@ -1,3 +1,2 @@ mod masp; mod setup; -mod utils; diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index b8f9c47ed5c..841bdb01c8e 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -5,7 +5,7 @@ use color_eyre::owo_colors::OwoColorize; use namada::types::io::DefaultIo; use namada_apps::client::tx::CLIShieldedUtils; use namada_apps::node::ledger::shell::testing::client::run; -use namada_apps::node::ledger::shell::testing::utils::Bin; +use namada_apps::node::ledger::shell::testing::utils::{Bin, CapturedOutput}; use namada_core::types::address::{btc, eth, masp_rewards}; use namada_core::types::token; use namada_core::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; @@ -17,7 +17,6 @@ use crate::e2e::setup::constants::{ AC_PAYMENT_ADDRESS, AC_VIEWING_KEY, ALBERT, A_SPENDING_KEY, BB_PAYMENT_ADDRESS, BERTHA, BTC, B_SPENDING_KEY, CHRISTEL, ETH, MASP, NAM, }; -use crate::integration::utils::CapturedOutput; /// In this test we verify that users of the MASP receive the correct rewards /// for leaving their assets in the pool for varying periods of time. diff --git a/tests/src/integration/utils.rs b/tests/src/integration/utils.rs deleted file mode 100644 index f626a001ee8..00000000000 --- a/tests/src/integration/utils.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::fs::File; -use std::path::PathBuf; -use std::sync::Arc; - -struct TempFile(PathBuf); -impl TempFile { - fn new(path: PathBuf) -> (Self, File) { - let f = File::create(&path).unwrap(); - (Self(path), f) - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = std::fs::remove_file(&self.0); - } -} - -/// Test helper that captures stdout of -/// a process. -pub struct CapturedOutput { - pub output: String, - pub result: T, - input: String, -} - -impl CapturedOutput { - pub fn with_input(input: String) -> Self { - Self { - output: "".to_string(), - result: (), - input, - } - } -} - -impl CapturedOutput { - /// Run a client command and capture - /// the output to the mocked stdout. - pub(crate) fn of(func: F) -> Self - where - F: FnOnce() -> T, - { - std::io::set_output_capture(Some(Default::default())); - let mut capture = Self { - output: Default::default(), - result: func(), - input: Default::default(), - }; - let captured = std::io::set_output_capture(None); - let captured = captured.unwrap(); - let captured = Arc::try_unwrap(captured).unwrap(); - let captured = captured.into_inner().unwrap(); - capture.output = String::from_utf8(captured).unwrap(); - capture - } - - /// Run a client command with input to the mocked stdin and capture - /// the output to the mocked stdout - pub fn run(&self, func: F) -> CapturedOutput - where - F: FnOnce() -> U, - { - { - // write the input to the mocked stdin - let mut buf = namada_apps::cli::TESTIN.lock().unwrap(); - buf.clear(); - buf.extend_from_slice(self.input.as_bytes()); - } - CapturedOutput::of(func) - } - - /// Check if the captured output contains the regex. - pub fn matches(&self, needle: regex::Regex) -> bool { - needle.captures(&self.output).is_some() - } - - /// Check if the captured output contains the string. - pub fn contains(&self, needle: &str) -> bool { - let needle = regex::Regex::new(needle).unwrap(); - self.matches(needle) - } -} diff --git a/tests/src/lib.rs b/tests/src/lib.rs index 7e359474772..1d9958a30a3 100644 --- a/tests/src/lib.rs +++ b/tests/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(test, feature(internal_output_capture))] //! Namada integrations and WASM tests and testing helpers. #![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] @@ -13,7 +12,6 @@ pub use vm_host_env::{ibc, tx, vp}; #[cfg(test)] mod e2e; #[cfg(test)] -#[allow(dead_code)] mod integration; pub mod native_vp; pub mod storage; diff --git a/wasm/checksums.json b/wasm/checksums.json index cb9ca8ed52d..adf06b5afee 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.08cedac1d825cd8ee9b04ef059bc68fee04f82fec57e0f6bc38123de8fb35b85.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.c9ef2bdb19910e12eadabc7f0552b45c937bcf1f47ca09759e52112b68d94114.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.2be60082c6b891cb437b4392e1b2570f5d92fed35dd624cd079ea48c4bc7902c.wasm", - "tx_ibc.wasm": "tx_ibc.f8056f465d17043d2864309d1c50a897a028b6ebf9702e5c403e1bf8c670f6e6.wasm", - "tx_init_account.wasm": "tx_init_account.e91ab25cebd15af9a958eca4a34ba287804b1ff6ba4c82fc941f7f50816e9c4d.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.1683eb9a2b2616af21f4f55457f7e06e0ae0591f460ede412a548ea9b1ab694c.wasm", - "tx_init_validator.wasm": "tx_init_validator.67574f70c1f76c2c68498d17323793366c13d119480b6787c8c5ede312e51da0.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.e6375abba3f750700c06fbdeb2d5edec22b6a382116a67a7f9d7f7ba49f134e1.wasm", - "tx_transfer.wasm": "tx_transfer.e65b47bc94c5a09e3edc68298ad0e5e35041b91bc4d679bf5b7f433dffdce58e.wasm", - "tx_unbond.wasm": "tx_unbond.4fd70d297ccedb369bf88d8a8459a47ea733d329410387a6f80a0e026c6e480d.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.b8e7204b14e15a3c395432f35788eca45ef4332916d96dfba87627a5717916de.wasm", - "tx_update_vp.wasm": "tx_update_vp.65c5ca3e48fdef70e696460eca7540cf6196511d76fb2465133b145409329b3e.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.e0a003d922230d32b741b57ca18913cbc4d5d2290f02cb37dfdaa7f27cebb486.wasm", - "tx_withdraw.wasm": "tx_withdraw.40499cb0e268d3cc3d9bca5dacca05d8df35f5b90adf4087a5171505472d921a.wasm", - "vp_implicit.wasm": "vp_implicit.57af3b7d2ee9e2c9d7ef1e33a85646abeea7ea02dad19b7e0b20b289de5a7ae9.wasm", - "vp_masp.wasm": "vp_masp.4d656f775b7462095e7d9ff533e346829fad02568b1cf92fa2f99cc0677720ce.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.b0c855f0356a468db1d26baebc988508d4824836b86adb94ac432368feb03ac4.wasm", - "vp_user.wasm": "vp_user.31967a7411caf61729e46840eec90d2db386cf4745f49d59086a43cc3c3e2d39.wasm", - "vp_validator.wasm": "vp_validator.0bca8e34f5d51c74b2861d588e3dd6a8e61de7c63d356af63e2182e030ac42ee.wasm" + "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", + "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", + "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", + "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", + "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", + "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", + "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", + "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", + "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", + "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", + "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", + "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" } \ No newline at end of file From a2c5cedab902b8855e837f19f094ab3cb0a31182 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 23:50:54 +0200 Subject: [PATCH 018/114] [chore]: rebasing on bat/generic-io --- apps/src/lib/client/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index ccac9cc398d..26b1956a117 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -48,7 +48,7 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_lin, prompt}; +use namada::{display, display_line, edisplay_line, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; From 88820fd20c0a4c3dd3a52c8ee794e1e2253bc9b5 Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 26 Jul 2023 13:41:01 +0200 Subject: [PATCH 019/114] [fix]: Fixing downstream async io changes from bat/generic-io --- apps/src/lib/client/rpc.rs | 3 ++- apps/src/lib/node/ledger/shell/testing/utils.rs | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 26b1956a117..20ba1509bcc 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -454,7 +454,8 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); + let vk_str = + prompt!(IO, "Enter the viewing key for {}: ", owner).await; let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 95da7efb856..3ff3bdb7d31 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -68,6 +68,7 @@ lazy_static! { pub struct TestingIo; +#[async_trait::async_trait(?Send)] impl Io for TestingIo { fn print(output: impl AsRef) { let mut testout = TESTOUT.lock().unwrap(); @@ -107,11 +108,11 @@ impl Io for TestingIo { eprintln!("{}", output.as_ref()); } - fn read() -> std::io::Result { + async fn read() -> std::io::Result { read_aux(TESTIN.lock().unwrap().as_slice()) } - fn prompt(question: impl AsRef) -> String { + async fn prompt(question: impl AsRef) -> String { prompt_aux( TESTIN.lock().unwrap().as_slice(), std::io::stdout(), From 844e4a2e21002fca0f3d00af5d1089d89715aaad Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 28 Jul 2023 13:16:44 +0200 Subject: [PATCH 020/114] [feat]: After rebasing on bat/generic-io, need to make io read methods async for integration testing --- .../lib/node/ledger/shell/testing/utils.rs | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 3ff3bdb7d31..0161f864160 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,8 +1,12 @@ +use std::ops::{Deref, DerefMut}; use std::path::{Path, PathBuf}; +use std::pin::Pin; +use std::task::{Context, Poll}; use lazy_static::lazy_static; use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; +use tokio::io::{AsyncRead, ReadBuf}; /// Namada binaries #[derive(Debug)] @@ -62,8 +66,8 @@ lazy_static! { lazy_static! { /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); + pub static ref TESTIN: AtomicBuffer = + AtomicBuffer(std::sync::Arc::new(std::sync::Mutex::new(vec![]))); } pub struct TestingIo; @@ -108,16 +112,12 @@ impl Io for TestingIo { eprintln!("{}", output.as_ref()); } - async fn read() -> std::io::Result { - read_aux(TESTIN.lock().unwrap().as_slice()) + async fn read() -> tokio::io::Result { + read_aux(&*TESTIN).await } async fn prompt(question: impl AsRef) -> String { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) + prompt_aux(&*TESTIN, tokio::io::stdout(), question.as_ref()).await } } @@ -230,6 +230,31 @@ impl FixedBuffer { } } +pub struct AtomicBuffer(std::sync::Arc>>); + +impl Deref for AtomicBuffer { + type Target = std::sync::Arc>>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'a> AsyncRead for &'a AtomicBuffer { + fn poll_read( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut ReadBuf<'_>, + ) -> Poll> { + let mut inner = self.lock().unwrap(); + let buf_before = buf.filled().len(); + let res = AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); + let amount_read = buf.filled().len() - buf_before; + *inner.deref_mut() = inner[amount_read..].to_vec(); + res + } +} + #[cfg(test)] mod testing { use super::*; From b734c6535cf00c5602a522df09c34d18f8e36511 Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 28 Jul 2023 13:18:13 +0200 Subject: [PATCH 021/114] [chore]: Formatting --- apps/src/lib/node/ledger/shell/testing/utils.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 0161f864160..bfcb7f50ab9 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -248,7 +248,8 @@ impl<'a> AsyncRead for &'a AtomicBuffer { ) -> Poll> { let mut inner = self.lock().unwrap(); let buf_before = buf.filled().len(); - let res = AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); + let res = + AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); let amount_read = buf.filled().len() - buf_before; *inner.deref_mut() = inner[amount_read..].to_vec(); res From c8556323097c0171d250f4f6c1956a6ebcd92231 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 15 Aug 2023 10:32:15 +0200 Subject: [PATCH 022/114] [fix]: Removed unused file --- apps/src/bin/namada-client/cli.rs | 500 ------------------------------ 1 file changed, 500 deletions(-) delete mode 100644 apps/src/bin/namada-client/cli.rs diff --git a/apps/src/bin/namada-client/cli.rs b/apps/src/bin/namada-client/cli.rs deleted file mode 100644 index d6a3cbdaf91..00000000000 --- a/apps/src/bin/namada-client/cli.rs +++ /dev/null @@ -1,500 +0,0 @@ -//! Namada client CLI. - -use color_eyre::eyre::{eyre, Report, Result}; -use namada::ledger::eth_bridge::bridge_pool; -use namada::ledger::rpc::wait_until_node_is_synched; -use namada::ledger::{signing, tx as sdk_tx}; -use namada::types::control_flow::ProceedOrElse; -use namada_apps::cli; -use namada_apps::cli::args::CliToSdk; -use namada_apps::cli::cmds::*; -use namada_apps::client::{rpc, tx, utils}; -use namada_apps::facade::tendermint_rpc::HttpClient; - -fn error() -> Report { - eyre!("Fatal error") -} - -pub async fn main() -> Result<()> { - match cli::namada_client_cli()? { - cli::NamadaClient::WithContext(cmd_box) => { - let (cmd, mut ctx) = *cmd_box; - use NamadaClientWithContext as Sub; - match cmd { - // Ledger cmds - Sub::TxCustom(TxCustom(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - let dry_run = args.tx.dry_run; - tx::submit_custom::(&client, &mut ctx, args) - .await?; - if !dry_run { - namada_apps::wallet::save(&ctx.wallet) - .unwrap_or_else(|err| eprintln!("{}", err)); - } else { - println!( - "Transaction dry run. No addresses have been \ - saved." - ) - } - } - Sub::TxTransfer(TxTransfer(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_transfer(&client, ctx, args).await?; - } - Sub::TxIbcTransfer(TxIbcTransfer(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_ibc_transfer::(&client, ctx, args) - .await?; - } - Sub::TxUpdateVp(TxUpdateVp(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_update_vp::(&client, &mut ctx, args) - .await?; - } - Sub::TxInitAccount(TxInitAccount(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - let dry_run = args.tx.dry_run; - tx::submit_init_account::( - &client, &mut ctx, args, - ) - .await?; - if !dry_run { - namada_apps::wallet::save(&ctx.wallet) - .unwrap_or_else(|err| eprintln!("{}", err)); - } else { - println!( - "Transaction dry run. No addresses have been \ - saved." - ) - } - } - Sub::TxInitValidator(TxInitValidator(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_init_validator::(&client, ctx, args) - .await?; - } - Sub::TxInitProposal(TxInitProposal(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_init_proposal::(&client, ctx, args) - .await?; - } - Sub::TxVoteProposal(TxVoteProposal(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_vote_proposal::(&client, ctx, args) - .await?; - } - Sub::TxRevealPk(TxRevealPk(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_reveal_pk::(&client, &mut ctx, args) - .await?; - } - Sub::Bond(Bond(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_bond::(&client, &mut ctx, args) - .await?; - } - Sub::Unbond(Unbond(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_unbond::(&client, &mut ctx, args) - .await?; - } - Sub::Withdraw(Withdraw(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_withdraw::(&client, ctx, args) - .await?; - } - Sub::TxCommissionRateChange(TxCommissionRateChange( - mut args, - )) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client).await; - let args = args.to_sdk(&mut ctx); - tx::submit_validator_commission_change::( - &client, ctx, args, - ) - .await?; - } - // Eth bridge - Sub::AddToEthBridgePool(args) => { - let mut args = args.0; - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - let tx_args = args.tx.clone(); - let (mut tx, addr, pk) = bridge_pool::build_bridge_pool_tx( - &client, - &mut ctx.wallet, - args, - ) - .await - .unwrap(); - tx::submit_reveal_aux( - &client, - &mut ctx, - &tx_args, - addr, - pk.clone(), - &mut tx, - ) - .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &tx_args, &pk) - .await?; - sdk_tx::process_tx(&client, &mut ctx.wallet, &tx_args, tx) - .await?; - } - Sub::TxUnjailValidator(TxUnjailValidator(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.tx.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - tx::submit_unjail_validator::( - &client, ctx, args, - ) - .await?; - } - // Ledger queries - Sub::QueryEpoch(QueryEpoch(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - rpc::query_and_print_epoch(&client).await; - } - Sub::QueryTransfers(QueryTransfers(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_transfers( - &client, - &mut ctx.wallet, - &mut ctx.shielded, - args, - ) - .await; - } - Sub::QueryConversions(QueryConversions(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_conversions(&client, &mut ctx.wallet, args) - .await; - } - Sub::QueryBlock(QueryBlock(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - rpc::query_block(&client).await; - } - Sub::QueryBalance(QueryBalance(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_balance( - &client, - &mut ctx.wallet, - &mut ctx.shielded, - args, - ) - .await; - } - Sub::QueryBonds(QueryBonds(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_bonds(&client, &mut ctx.wallet, args) - .await - .expect("expected successful query of bonds"); - } - Sub::QueryBondedStake(QueryBondedStake(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_bonded_stake(&client, args).await; - } - Sub::QueryValidatorState(QueryValidatorState(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_and_print_validator_state( - &client, - &mut ctx.wallet, - args, - ) - .await; - } - Sub::QueryCommissionRate(QueryCommissionRate(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_and_print_commission_rate( - &client, - &mut ctx.wallet, - args, - ) - .await; - } - Sub::QuerySlashes(QuerySlashes(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_slashes(&client, &mut ctx.wallet, args).await; - } - Sub::QueryDelegations(QueryDelegations(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_delegations(&client, &mut ctx.wallet, args) - .await; - } - Sub::QueryFindValidator(QueryFindValidator(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_find_validator(&client, args).await; - } - Sub::QueryResult(QueryResult(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_result(&client, args).await; - } - Sub::QueryRawBytes(QueryRawBytes(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_raw_bytes(&client, args).await; - } - - Sub::QueryProposal(QueryProposal(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_proposal(&client, args).await; - } - Sub::QueryProposalResult(QueryProposalResult(mut args)) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_proposal_result(&client, args).await; - } - Sub::QueryProtocolParameters(QueryProtocolParameters( - mut args, - )) => { - let client = HttpClient::new(utils::take_config_address( - &mut args.query.ledger_address, - )) - .unwrap(); - wait_until_node_is_synched(&client) - .await - .proceed_or_else(error)?; - let args = args.to_sdk(&mut ctx); - rpc::query_protocol_parameters(&client, args).await; - } - } - } - cli::NamadaClient::WithoutContext(cmd, global_args) => match cmd { - // Utils cmds - Utils::JoinNetwork(JoinNetwork(args)) => { - utils::join_network(global_args, args).await - } - Utils::FetchWasms(FetchWasms(args)) => { - utils::fetch_wasms(global_args, args).await - } - Utils::InitNetwork(InitNetwork(args)) => { - utils::init_network(global_args, args) - } - Utils::InitGenesisValidator(InitGenesisValidator(args)) => { - utils::init_genesis_validator(global_args, args) - } - Utils::PkToTmAddress(PkToTmAddress(args)) => { - utils::pk_to_tm_address(global_args, args) - } - Utils::DefaultBaseDir(DefaultBaseDir(args)) => { - utils::default_base_dir(global_args, args) - } - Utils::EpochSleep(EpochSleep(args)) => { - let mut ctx = cli::Context::new(global_args) - .expect("expected to construct a context"); - let ledger_address = args.ledger_address.clone(); - wait_until_node_is_synched(&ledger_address).await; - let client = HttpClient::new(ledger_address).unwrap(); - let args = args.to_sdk(&mut ctx); - rpc::epoch_sleep(&client, args).await; - } - }, - } - Ok(()) -} From 078cea076f0d43525bffba7021879875fb813fff Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 1 Sep 2023 09:17:04 +0200 Subject: [PATCH 023/114] [chore]: Merge in 0.21.1 --- .../v0.21.0/bug-fixes/1774-fix-dec-display.md | 2 + .../bug-fixes/1775-downgrade-sysinfo.md | 2 + .../v0.21.0/bug-fixes/1793-fix-unjail-bug.md | 4 + .../bug-fixes/1801-fix-available-memory.md | 2 + ...1765-multisignature-draft-rebase-0.20.0.md | 4 + .../features/1803-refactor-governance.md | 2 + .changelog/v0.21.0/summary.md | 2 + .../testing/1768-pregen-masp-proofs.md | 2 + .changelog/v0.21.1/bug-fixes/1816-pgf-v2.md | 2 + .../v0.21.1/features/1635-ibc-rs-0.41.0.md | 2 + .changelog/v0.21.1/summary.md | 1 + .github/workflows/build-and-test.yml | 7 + .github/workflows/scripts/e2e.json | 2 +- CHANGELOG.md | 46 + Cargo.lock | 729 ++------ Cargo.toml | 8 +- Makefile | 23 +- README.md | 8 +- apps/src/bin/namada-client/cli.rs | 0 apps/src/bin/namada/cli.rs | 2 +- apps/src/lib/cli.rs | 623 +++++-- apps/src/lib/cli/client.rs | 120 +- apps/src/lib/cli/utils.rs | 21 + apps/src/lib/client/mod.rs | 1 - apps/src/lib/client/rpc.rs | 908 ++++------ apps/src/lib/client/signing.rs | 4 +- apps/src/lib/client/tx.rs | 1552 ++++++++--------- apps/src/lib/config/genesis.rs | 59 +- apps/src/lib/config/mod.rs | 2 +- apps/src/lib/node/ledger/mod.rs | 10 +- .../lib/node/ledger/shell/finalize_block.rs | 149 +- apps/src/lib/node/ledger/shell/governance.rs | 503 ++++-- apps/src/lib/node/ledger/shell/init_chain.rs | 41 +- apps/src/lib/node/ledger/shell/mod.rs | 140 +- .../lib/node/ledger/shell/prepare_proposal.rs | 146 +- .../lib/node/ledger/shell/process_proposal.rs | 337 ++-- apps/src/lib/node/ledger/shell/utils.rs | 14 + apps/src/lib/wallet/defaults.rs | 6 +- core/Cargo.toml | 5 +- core/src/ledger/governance/cli/mod.rs | 6 + core/src/ledger/governance/cli/offline.rs | 389 +++++ core/src/ledger/governance/cli/onchain.rs | 333 ++++ core/src/ledger/governance/cli/utils.rs | 0 core/src/ledger/governance/cli/validation.rs | 259 +++ core/src/ledger/governance/mod.rs | 4 + core/src/ledger/governance/parameters.rs | 51 +- .../{storage.rs => storage/keys.rs} | 145 +- core/src/ledger/governance/storage/mod.rs | 6 + .../src/ledger/governance/storage/proposal.rs | 270 +++ core/src/ledger/governance/storage/vote.rs | 127 ++ core/src/ledger/governance/utils.rs | 291 ++++ core/src/ledger/ibc/context/common.rs | 16 +- core/src/ledger/ibc/context/execution.rs | 42 +- core/src/ledger/ibc/context/router.rs | 3 +- core/src/ledger/ibc/context/transfer_mod.rs | 17 +- core/src/ledger/ibc/context/validation.rs | 24 +- core/src/ledger/ibc/mod.rs | 82 +- core/src/ledger/ibc/storage.rs | 48 +- core/src/ledger/mod.rs | 2 +- core/src/ledger/parameters/mod.rs | 45 + core/src/ledger/parameters/storage.rs | 6 + core/src/ledger/{slash_fund => pgf}/mod.rs | 11 +- core/src/ledger/pgf/parameters.rs | 63 + core/src/ledger/pgf/storage/keys.rs | 67 + core/src/ledger/pgf/storage/mod.rs | 2 + core/src/ledger/slash_fund/storage.rs | 8 - core/src/ledger/storage/mod.rs | 1 + core/src/ledger/storage_api/account.rs | 106 ++ core/src/ledger/storage_api/governance.rs | 145 +- core/src/ledger/storage_api/key.rs | 24 +- core/src/ledger/storage_api/mod.rs | 2 + core/src/ledger/storage_api/pgf.rs | 30 + core/src/ledger/storage_api/token.rs | 32 + core/src/proto/mod.rs | 5 +- core/src/proto/types.rs | 497 +++++- core/src/types/account.rs | 92 + core/src/types/address.rs | 24 +- core/src/types/dec.rs | 10 +- core/src/types/governance.rs | 384 ---- core/src/types/ibc.rs | 6 +- core/src/types/key/mod.rs | 75 +- core/src/types/mod.rs | 2 +- core/src/types/token.rs | 19 + core/src/types/transaction/account.rs | 52 + core/src/types/transaction/governance.rs | 185 +- core/src/types/transaction/mod.rs | 103 +- core/src/types/transaction/pos.rs | 40 + core/src/types/transaction/protocol.rs | 4 +- core/src/types/transaction/wrapper.rs | 32 +- .../src/explore/design/ledger/governance.md | 10 +- .../src/specs/ledger/default-transactions.md | 2 +- encoding_spec/src/main.rs | 21 +- genesis/dev.toml | 250 ++- genesis/e2e-tests-single-node.toml | 14 +- proof_of_stake/src/lib.rs | 9 +- proof_of_stake/src/tests.rs | 147 +- scripts/generator.sh | 66 +- scripts/get_hermes.sh | 41 + shared/src/ledger/args.rs | 117 +- shared/src/ledger/eth_bridge/bridge_pool.rs | 80 +- shared/src/ledger/events.rs | 6 +- shared/src/ledger/events/log/dumb_queries.rs | 5 +- .../ledger/{native_vp => }/governance/mod.rs | 633 ++++--- shared/src/ledger/governance/utils.rs | 122 ++ shared/src/ledger/ibc/vp/mod.rs | 563 +++--- shared/src/ledger/masp.rs | 169 +- shared/src/ledger/mod.rs | 4 +- .../ethereum_bridge/bridge_pool_vp.rs | 37 +- .../ledger/native_vp/ethereum_bridge/vp.rs | 6 +- .../src/ledger/native_vp/governance/utils.rs | 484 ----- shared/src/ledger/native_vp/mod.rs | 2 - shared/src/ledger/native_vp/multitoken.rs | 2 +- shared/src/ledger/native_vp/parameters.rs | 11 +- shared/src/ledger/pgf/mod.rs | 126 ++ shared/src/ledger/pgf/utils.rs | 66 + shared/src/ledger/pos/vp.rs | 11 +- shared/src/ledger/protocol/mod.rs | 26 +- shared/src/ledger/queries/shell.rs | 50 +- shared/src/ledger/queries/vp/governance.rs | 38 + shared/src/ledger/queries/vp/mod.rs | 8 + shared/src/ledger/queries/vp/pgf.rs | 36 + shared/src/ledger/queries/vp/pos.rs | 4 +- shared/src/ledger/rpc.rs | 184 +- shared/src/ledger/signing.rs | 571 +++--- shared/src/ledger/tx.rs | 1330 +++++++------- shared/src/types/mod.rs | 4 +- shared/src/vm/wasm/run.rs | 67 +- ...C83E76506147445D4DC22D57CBC9869BCDDA80.bin | Bin 0 -> 9649 bytes ...5D4C1BF345378A4FB6BB0B179BA8BDB0D2A3C0.bin | Bin 0 -> 9208 bytes ...9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin | Bin 0 -> 7448 bytes ...8B269A5436CD72AA758686960F409B04841707.bin | Bin 0 -> 9208 bytes ...79BAC90BA1F01653EBCFDCF7CC8AAA1BBEE462.bin | Bin 0 -> 25031 bytes ...7C98D1E5AAAA9988F26B1A47090ACCE693572F.bin | Bin 0 -> 7448 bytes ...4FDED28D5E7D3C6B52DCF38A5978CEA70D6FD3.bin | Bin 0 -> 9649 bytes ...46763B3CE0BACFB7799C6744E50B9E7F43E961.bin | Bin 0 -> 17018 bytes ...2989556FD771D368849D034E22923FD350EEEC.bin | Bin 0 -> 19947 bytes ...1C0CA6AA6520A2AC8BC34A84358EA137F138D0.bin | Bin 0 -> 18792 bytes ...8DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin | Bin 0 -> 7448 bytes ...344FFFAA6CA273027CD480AEA68DDED57D88CA.bin | Bin 0 -> 7448 bytes test_fixtures/masp_proofs/README.md | 11 + test_utils/src/lib.rs | 2 - tests/Cargo.toml | 4 +- tests/src/e2e/eth_bridge_tests.rs | 16 +- tests/src/e2e/eth_bridge_tests/helpers.rs | 2 +- tests/src/e2e/helpers.rs | 6 + tests/src/e2e/ibc_tests.rs | 942 +++++----- tests/src/e2e/ledger_tests.rs | 690 +++----- tests/src/e2e/multitoken_tests.rs | 372 ++++ tests/src/e2e/multitoken_tests/helpers.rs | 190 ++ tests/src/e2e/setup.rs | 1 + tests/src/integration/masp.rs | 8 +- tests/src/native_vp/eth_bridge_pool.rs | 16 +- tests/src/native_vp/pos.rs | 5 + tests/src/vm_host_env/ibc.rs | 148 +- tests/src/vm_host_env/mod.rs | 421 +++-- tests/src/vm_host_env/tx.rs | 52 +- tests/src/vm_host_env/vp.rs | 2 +- tx_prelude/src/account.rs | 18 + tx_prelude/src/lib.rs | 2 +- tx_prelude/src/proof_of_stake.rs | 13 +- vp_prelude/src/lib.rs | 25 +- wasm/Cargo.lock | 1004 ++--------- wasm/checksums.json | 38 +- wasm/tx_template/Cargo.toml | 2 +- wasm/tx_template/src/lib.rs | 2 +- wasm/vp_template/Cargo.toml | 2 +- wasm/wasm_source/Cargo.toml | 4 +- wasm/wasm_source/Makefile | 2 +- wasm/wasm_source/src/lib.rs | 4 +- wasm/wasm_source/src/tx_bond.rs | 17 +- .../src/tx_change_validator_commission.rs | 17 +- wasm/wasm_source/src/tx_init_account.rs | 15 +- wasm/wasm_source/src/tx_init_proposal.rs | 10 +- wasm/wasm_source/src/tx_init_validator.rs | 2 +- wasm/wasm_source/src/tx_unbond.rs | 16 +- wasm/wasm_source/src/tx_update_account.rs | 45 + wasm/wasm_source/src/tx_withdraw.rs | 16 +- wasm/wasm_source/src/vp_implicit.rs | 146 +- wasm/wasm_source/src/vp_testnet_faucet.rs | 48 +- wasm/wasm_source/src/vp_user.rs | 142 +- wasm/wasm_source/src/vp_validator.rs | 141 +- wasm_for_tests/tx_memory_limit.wasm | Bin 433802 -> 444310 bytes wasm_for_tests/tx_mint_tokens.wasm | Bin 595912 -> 595637 bytes wasm_for_tests/tx_no_op.wasm | Bin 355254 -> 364702 bytes wasm_for_tests/tx_proposal_code.wasm | Bin 518649 -> 528038 bytes wasm_for_tests/tx_read_storage_key.wasm | Bin 438326 -> 450586 bytes wasm_for_tests/tx_write.wasm | Bin 441531 -> 451937 bytes wasm_for_tests/vp_always_false.wasm | Bin 409996 -> 419074 bytes wasm_for_tests/vp_always_true.wasm | Bin 409996 -> 419074 bytes wasm_for_tests/vp_eval.wasm | Bin 480020 -> 492706 bytes wasm_for_tests/vp_memory_limit.wasm | Bin 458484 -> 468787 bytes wasm_for_tests/vp_read_storage_key.wasm | Bin 463802 -> 475686 bytes wasm_for_tests/wasm_source/Cargo.lock | 996 ++--------- wasm_for_tests/wasm_source/Cargo.toml | 3 +- wasm_for_tests/wasm_source/Makefile | 1 - wasm_for_tests/wasm_source/src/lib.rs | 26 +- 196 files changed, 11236 insertions(+), 9409 deletions(-) create mode 100644 .changelog/v0.21.0/bug-fixes/1774-fix-dec-display.md create mode 100644 .changelog/v0.21.0/bug-fixes/1775-downgrade-sysinfo.md create mode 100644 .changelog/v0.21.0/bug-fixes/1793-fix-unjail-bug.md create mode 100644 .changelog/v0.21.0/bug-fixes/1801-fix-available-memory.md create mode 100644 .changelog/v0.21.0/features/1765-multisignature-draft-rebase-0.20.0.md create mode 100644 .changelog/v0.21.0/features/1803-refactor-governance.md create mode 100644 .changelog/v0.21.0/summary.md create mode 100644 .changelog/v0.21.0/testing/1768-pregen-masp-proofs.md create mode 100644 .changelog/v0.21.1/bug-fixes/1816-pgf-v2.md create mode 100644 .changelog/v0.21.1/features/1635-ibc-rs-0.41.0.md create mode 100644 .changelog/v0.21.1/summary.md create mode 100644 apps/src/bin/namada-client/cli.rs create mode 100644 apps/src/lib/node/ledger/shell/utils.rs create mode 100644 core/src/ledger/governance/cli/mod.rs create mode 100644 core/src/ledger/governance/cli/offline.rs create mode 100644 core/src/ledger/governance/cli/onchain.rs create mode 100644 core/src/ledger/governance/cli/utils.rs create mode 100644 core/src/ledger/governance/cli/validation.rs rename core/src/ledger/governance/{storage.rs => storage/keys.rs} (78%) create mode 100644 core/src/ledger/governance/storage/mod.rs create mode 100644 core/src/ledger/governance/storage/proposal.rs create mode 100644 core/src/ledger/governance/storage/vote.rs create mode 100644 core/src/ledger/governance/utils.rs rename core/src/ledger/{slash_fund => pgf}/mod.rs (55%) create mode 100644 core/src/ledger/pgf/parameters.rs create mode 100644 core/src/ledger/pgf/storage/keys.rs create mode 100644 core/src/ledger/pgf/storage/mod.rs delete mode 100644 core/src/ledger/slash_fund/storage.rs create mode 100644 core/src/ledger/storage_api/account.rs create mode 100644 core/src/ledger/storage_api/pgf.rs create mode 100644 core/src/types/account.rs delete mode 100644 core/src/types/governance.rs create mode 100644 core/src/types/transaction/account.rs create mode 100755 scripts/get_hermes.sh rename shared/src/ledger/{native_vp => }/governance/mod.rs (50%) create mode 100644 shared/src/ledger/governance/utils.rs delete mode 100644 shared/src/ledger/native_vp/governance/utils.rs create mode 100644 shared/src/ledger/pgf/mod.rs create mode 100644 shared/src/ledger/pgf/utils.rs create mode 100644 shared/src/ledger/queries/vp/governance.rs create mode 100644 shared/src/ledger/queries/vp/pgf.rs create mode 100644 test_fixtures/masp_proofs/0DAF8BDF2318129AC828A7149AC83E76506147445D4DC22D57CBC9869BCDDA80.bin create mode 100644 test_fixtures/masp_proofs/12C933751C24BDC39C9108F5AF5D4C1BF345378A4FB6BB0B179BA8BDB0D2A3C0.bin create mode 100644 test_fixtures/masp_proofs/1362F1CF9B836CF8B05D8189EA9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin create mode 100644 test_fixtures/masp_proofs/5B99F3D7E0CE75AB1F4B737EC88B269A5436CD72AA758686960F409B04841707.bin create mode 100644 test_fixtures/masp_proofs/889C046FA76727BC97433503BB79BAC90BA1F01653EBCFDCF7CC8AAA1BBEE462.bin create mode 100644 test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin create mode 100644 test_fixtures/masp_proofs/A9FA2730222946FA51E9D587544FDED28D5E7D3C6B52DCF38A5978CEA70D6FD3.bin create mode 100644 test_fixtures/masp_proofs/AC308C08512AF5DAA364B845D146763B3CE0BACFB7799C6744E50B9E7F43E961.bin create mode 100644 test_fixtures/masp_proofs/BE57BA4D8FB068F5A933E78DEF2989556FD771D368849D034E22923FD350EEEC.bin create mode 100644 test_fixtures/masp_proofs/E76E54B7526CD2B5423322FB711C0CA6AA6520A2AC8BC34A84358EA137F138D0.bin create mode 100644 test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin create mode 100644 test_fixtures/masp_proofs/F068FDF05B8F25DD923E667215344FFFAA6CA273027CD480AEA68DDED57D88CA.bin create mode 100644 test_fixtures/masp_proofs/README.md create mode 100644 tests/src/e2e/multitoken_tests.rs create mode 100644 tests/src/e2e/multitoken_tests/helpers.rs create mode 100644 tx_prelude/src/account.rs create mode 100644 wasm/wasm_source/src/tx_update_account.rs diff --git a/.changelog/v0.21.0/bug-fixes/1774-fix-dec-display.md b/.changelog/v0.21.0/bug-fixes/1774-fix-dec-display.md new file mode 100644 index 00000000000..c53de24beee --- /dev/null +++ b/.changelog/v0.21.0/bug-fixes/1774-fix-dec-display.md @@ -0,0 +1,2 @@ +- Fixes buggy Display for the Dec type when the number is some multiple of 10 + ([\#1774](https://github.com/anoma/namada/pull/1774)) \ No newline at end of file diff --git a/.changelog/v0.21.0/bug-fixes/1775-downgrade-sysinfo.md b/.changelog/v0.21.0/bug-fixes/1775-downgrade-sysinfo.md new file mode 100644 index 00000000000..4d45e30a0a9 --- /dev/null +++ b/.changelog/v0.21.0/bug-fixes/1775-downgrade-sysinfo.md @@ -0,0 +1,2 @@ +- Downgraded sysinfo back to v0.27.8 with a working available memory report on + Mac M1. ([\#1775](https://github.com/anoma/namada/pull/1775)) \ No newline at end of file diff --git a/.changelog/v0.21.0/bug-fixes/1793-fix-unjail-bug.md b/.changelog/v0.21.0/bug-fixes/1793-fix-unjail-bug.md new file mode 100644 index 00000000000..11a2b1e5459 --- /dev/null +++ b/.changelog/v0.21.0/bug-fixes/1793-fix-unjail-bug.md @@ -0,0 +1,4 @@ +- Fixes buggy error handling in pos unjail_validator. Now properly enforces that + if an unjail tx is submitted when the validator state is something other than + Jailed in any of the current or future epochs, the tx will error out and fail. + ([\#1793](https://github.com/anoma/namada/pull/1793)) \ No newline at end of file diff --git a/.changelog/v0.21.0/bug-fixes/1801-fix-available-memory.md b/.changelog/v0.21.0/bug-fixes/1801-fix-available-memory.md new file mode 100644 index 00000000000..4f4e1b39cad --- /dev/null +++ b/.changelog/v0.21.0/bug-fixes/1801-fix-available-memory.md @@ -0,0 +1,2 @@ +- Fix available_memory size + ([\#1801](https://github.com/anoma/namada/issues/1801)) \ No newline at end of file diff --git a/.changelog/v0.21.0/features/1765-multisignature-draft-rebase-0.20.0.md b/.changelog/v0.21.0/features/1765-multisignature-draft-rebase-0.20.0.md new file mode 100644 index 00000000000..25697effb8c --- /dev/null +++ b/.changelog/v0.21.0/features/1765-multisignature-draft-rebase-0.20.0.md @@ -0,0 +1,4 @@ +- Introduce multisignature accounts and transaction format. It is now possible + to supply multiple public keys when creating a new account/validator and + specify the minimum number of signatures required to authorize a transaction. + ([\#1765](https://github.com/anoma/namada/pull/1765)) \ No newline at end of file diff --git a/.changelog/v0.21.0/features/1803-refactor-governance.md b/.changelog/v0.21.0/features/1803-refactor-governance.md new file mode 100644 index 00000000000..5ef71605056 --- /dev/null +++ b/.changelog/v0.21.0/features/1803-refactor-governance.md @@ -0,0 +1,2 @@ +- Introduce a simplified version of Public Good Fundings. + ([\#1803](https://github.com/anoma/namada/pull/1803)) \ No newline at end of file diff --git a/.changelog/v0.21.0/summary.md b/.changelog/v0.21.0/summary.md new file mode 100644 index 00000000000..bd8061518cf --- /dev/null +++ b/.changelog/v0.21.0/summary.md @@ -0,0 +1,2 @@ +Namada 0.21.0 is a minor release introducing a first version of the PGF mechanism, addressing several +improvements to the PoS and Governance system and some changes to the ledger stability. diff --git a/.changelog/v0.21.0/testing/1768-pregen-masp-proofs.md b/.changelog/v0.21.0/testing/1768-pregen-masp-proofs.md new file mode 100644 index 00000000000..7f86b1621f1 --- /dev/null +++ b/.changelog/v0.21.0/testing/1768-pregen-masp-proofs.md @@ -0,0 +1,2 @@ +- Added pre-built MASP proofs for integration tests. + ([\#1768](https://github.com/anoma/namada/pull/1768)) \ No newline at end of file diff --git a/.changelog/v0.21.1/bug-fixes/1816-pgf-v2.md b/.changelog/v0.21.1/bug-fixes/1816-pgf-v2.md new file mode 100644 index 00000000000..bede5e354ef --- /dev/null +++ b/.changelog/v0.21.1/bug-fixes/1816-pgf-v2.md @@ -0,0 +1,2 @@ +- Introduce a new genesis section to control PGF storage at chain start. + ([\#1816](https://github.com/anoma/namada/pull/1816)) \ No newline at end of file diff --git a/.changelog/v0.21.1/features/1635-ibc-rs-0.41.0.md b/.changelog/v0.21.1/features/1635-ibc-rs-0.41.0.md new file mode 100644 index 00000000000..f1d1fddc928 --- /dev/null +++ b/.changelog/v0.21.1/features/1635-ibc-rs-0.41.0.md @@ -0,0 +1,2 @@ +- Support the memo field of IBC transfer + ([\#1635](https://github.com/anoma/namada/issues/1635)) \ No newline at end of file diff --git a/.changelog/v0.21.1/summary.md b/.changelog/v0.21.1/summary.md new file mode 100644 index 00000000000..27efa154570 --- /dev/null +++ b/.changelog/v0.21.1/summary.md @@ -0,0 +1 @@ +Namada 0.21.0 is a patch release addressing some minor changes to the PGF and IBC components. diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index b8a796dfc64..44190695317 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -394,6 +394,7 @@ jobs: nightly_version: [nightly-2023-06-01] mold_version: [1.7.0] comet_bft: [0.37.2] + hermes: [1.6.0-namada-beta1] make: - name: e2e suffix: '' @@ -525,6 +526,11 @@ jobs: curl -o cometbft.tar.gz -LO https://github.com/cometbft/cometbft/releases/download/v${{ matrix.comet_bft }}/cometbft_${{ matrix.comet_bft }}_linux_amd64.tar.gz tar -xvzf cometbft.tar.gz mv cometbft /usr/local/bin + - name: Download Hermes + run: | + curl -o hermes.tar.gz -LO https://github.com/heliaxdev/hermes/releases/download/v${{ matrix.hermes }}/hermes-v${{ matrix.hermes }}-x86_64-unknown-linux-gnu.tar.gz + tar -xvzf hermes.tar.gz + mv hermes /usr/local/bin - name: Change permissions run: | chmod +x target/release/namada @@ -532,6 +538,7 @@ jobs: chmod +x target/release/namadan chmod +x target/release/namadac chmod +x /usr/local/bin/cometbft + chmod +x /usr/local/bin/hermes - name: Run e2e test run: | python3 .github/workflows/scripts/schedule-e2e.py diff --git a/.github/workflows/scripts/e2e.json b/.github/workflows/scripts/e2e.json index 485e4b43adc..15b871e61b4 100644 --- a/.github/workflows/scripts/e2e.json +++ b/.github/workflows/scripts/e2e.json @@ -8,10 +8,10 @@ "e2e::ledger_tests::ledger_txs_and_queries": 30, "e2e::ledger_tests::masp_txs_and_queries": 82, "e2e::ledger_tests::pos_bonds": 77, + "e2e::ledger_tests::implicit_account_reveal_pk": 30, "e2e::ledger_tests::pos_init_validator": 40, "e2e::ledger_tests::proposal_offline": 21, "e2e::ledger_tests::pgf_governance_proposal": 100, - "e2e::ledger_tests::eth_governance_proposal": 100, "e2e::ledger_tests::proposal_submission": 200, "e2e::ledger_tests::run_ledger": 5, "e2e::ledger_tests::run_ledger_load_state_and_reset": 23, diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ad3c0eff05..8c059ef2eb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,51 @@ # CHANGELOG +## v0.21.1 + +Namada 0.21.0 is a patch release addressing some minor changes to the PGF and IBC components. + +### BUG FIXES + +- Introduce a new genesis section to control PGF storage at chain start. + ([\#1816](https://github.com/anoma/namada/pull/1816)) + +### FEATURES + +- Support the memo field of IBC transfer + ([\#1635](https://github.com/anoma/namada/issues/1635)) + +## v0.21.0 + +Namada 0.21.0 is a minor release introducing a first version of the PGF mechanism, addressing several +improvements to the PoS and Governance system and some changes to the ledger stability. + +### BUG FIXES + +- Fixes buggy Display for the Dec type when the number is some multiple of 10 + ([\#1774](https://github.com/anoma/namada/pull/1774)) +- Downgraded sysinfo back to v0.27.8 with a working available memory report on + Mac M1. ([\#1775](https://github.com/anoma/namada/pull/1775)) +- Fixes buggy error handling in pos unjail_validator. Now properly enforces that + if an unjail tx is submitted when the validator state is something other than + Jailed in any of the current or future epochs, the tx will error out and fail. + ([\#1793](https://github.com/anoma/namada/pull/1793)) +- Fix available_memory size + ([\#1801](https://github.com/anoma/namada/issues/1801)) + +### FEATURES + +- Introduce multisignature accounts and transaction format. It is now possible + to supply multiple public keys when creating a new account/validator and + specify the minimum number of signatures required to authorize a transaction. + ([\#1765](https://github.com/anoma/namada/pull/1765)) +- Introduce a simplified version of Public Good Fundings. + ([\#1803](https://github.com/anoma/namada/pull/1803)) + +### TESTING + +- Added pre-built MASP proofs for integration tests. + ([\#1768](https://github.com/anoma/namada/pull/1768)) + ## v0.20.1 Namada 0.20.1 is a patch release addressing a bug in the inflation mechanism and minor ledger improvements. diff --git a/Cargo.lock b/Cargo.lock index decc4289282..3a069b0956e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -352,22 +352,6 @@ dependencies = [ "syn 2.0.15", ] -[[package]] -name = "async-tungstenite" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00550829ef8e2c4115250d0ee43305649b0fa95f78a32ce5b07da0b73d95c5c" -dependencies = [ - "futures-io", - "futures-util", - "log", - "pin-project-lite", - "tokio", - "tokio-rustls 0.22.0", - "tungstenite 0.12.0", - "webpki-roots 0.21.1", -] - [[package]] name = "async_io_stream" version = "0.3.3" @@ -457,12 +441,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base16ct" version = "0.2.0" @@ -511,12 +489,6 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - [[package]] name = "bellman" version = "0.13.1" @@ -606,27 +578,6 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -[[package]] -name = "bitcoin" -version = "0.29.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0694ea59225b0c5f3cb405ff3f670e4828358ed26aec49dc352f730f0cb1a8a3" -dependencies = [ - "bech32 0.9.1", - "bitcoin_hashes", - "secp256k1", - "serde 1.0.163", -] - -[[package]] -name = "bitcoin_hashes" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" -dependencies = [ - "serde 1.0.163", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -789,7 +740,17 @@ name = "borsh" version = "0.9.4" source = "git+https://github.com/heliaxdev/borsh-rs.git?rev=cd5223e5103c4f139e0c54cf8259b7ec5ec4073a#cd5223e5103c4f139e0c54cf8259b7ec5ec4073a" dependencies = [ - "borsh-derive", + "borsh-derive 0.9.4", + "hashbrown 0.11.2", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", "hashbrown 0.11.2", ] @@ -798,8 +759,21 @@ name = "borsh-derive" version = "0.9.4" source = "git+https://github.com/heliaxdev/borsh-rs.git?rev=cd5223e5103c4f139e0c54cf8259b7ec5ec4073a#cd5223e5103c4f139e0c54cf8259b7ec5ec4073a" dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", + "borsh-derive-internal 0.9.4", + "borsh-schema-derive-internal 0.9.4", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", "proc-macro-crate 0.1.5", "proc-macro2", "syn 1.0.109", @@ -815,6 +789,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "borsh-schema-derive-internal" version = "0.9.4" @@ -825,6 +810,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bs58" version = "0.4.0" @@ -895,12 +891,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytecount" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" - [[package]] name = "byteorder" version = "1.4.3" @@ -945,19 +935,6 @@ dependencies = [ "serde 1.0.163", ] -[[package]] -name = "cargo_metadata" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.17", - "serde 1.0.163", - "serde_json", -] - [[package]] name = "cargo_metadata" version = "0.15.4" @@ -1140,7 +1117,7 @@ dependencies = [ "digest 0.10.6", "getrandom 0.2.9", "hmac 0.12.1", - "k256 0.13.1", + "k256", "lazy_static", "serde 1.0.163", "sha2 0.10.6", @@ -1451,18 +1428,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.2" @@ -1621,15 +1586,6 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", -] - [[package]] name = "der" version = "0.7.7" @@ -1719,16 +1675,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.3.7" @@ -1740,17 +1686,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "displaydoc" version = "0.2.4" @@ -1812,28 +1747,16 @@ dependencies = [ "memmap2", ] -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" dependencies = [ - "der 0.7.7", + "der", "digest 0.10.6", - "elliptic-curve 0.13.5", - "rfc6979 0.4.0", + "elliptic-curve", + "rfc6979", "signature 2.1.0", "spki", ] @@ -1879,58 +1802,27 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ed25519-dalek-bip32" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" -dependencies = [ - "derivation-path", - "ed25519-dalek", - "hmac 0.12.1", - "sha2 0.10.6", -] - [[package]] name = "either" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.6", - "ff 0.12.1", - "generic-array 0.14.7", - "group 0.12.1", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "elliptic-curve" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.2", + "base16ct", + "crypto-bigint", "digest 0.10.6", "ff 0.13.0", "generic-array 0.14.7", "group 0.13.0", "pkcs8", "rand_core 0.6.4", - "sec1 0.7.2", + "sec1", "subtle 2.4.1", "zeroize", ] @@ -1953,7 +1845,7 @@ dependencies = [ "base64 0.13.1", "bytes", "hex", - "k256 0.13.1", + "k256", "log", "rand 0.8.5", "rlp", @@ -2039,15 +1931,6 @@ dependencies = [ "libc", ] -[[package]] -name = "error-chain" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" -dependencies = [ - "version_check", -] - [[package]] name = "escargot" version = "0.5.7" @@ -2287,13 +2170,13 @@ checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" dependencies = [ "arrayvec 0.7.2", "bytes", - "cargo_metadata 0.15.4", + "cargo_metadata", "chrono", - "elliptic-curve 0.13.5", + "elliptic-curve", "ethabi", "generic-array 0.14.7", "hex", - "k256 0.13.1", + "k256", "num_enum", "once_cell", "open-fastrlp", @@ -2395,7 +2278,7 @@ dependencies = [ "async-trait", "coins-bip32", "coins-bip39", - "elliptic-curve 0.13.5", + "elliptic-curve", "eth-keystore", "ethers-core", "hex", @@ -2475,7 +2358,7 @@ dependencies = [ "bincode", "blake2", "blake2b_simd", - "borsh", + "borsh 0.9.4", "digest 0.10.6", "ed25519-dalek", "either", @@ -2986,15 +2869,6 @@ dependencies = [ "fxhash", ] -[[package]] -name = "hdpath" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa5bc9db2c17d2660f53ce217b778d06d68de13d1cd01c0f4e5de4b7918935f" -dependencies = [ - "byteorder", -] - [[package]] name = "hdrhistogram" version = "7.5.2" @@ -3158,22 +3032,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "humantime-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" -dependencies = [ - "humantime", - "serde 1.0.163", -] - [[package]] name = "hyper" version = "0.14.26" @@ -3210,9 +3068,9 @@ dependencies = [ "http", "hyper", "hyper-rustls", - "rustls-native-certs 0.5.0", + "rustls-native-certs", "tokio", - "tokio-rustls 0.22.0", + "tokio-rustls", "tower-service", "webpki 0.21.4", ] @@ -3228,9 +3086,9 @@ dependencies = [ "hyper", "log", "rustls 0.19.1", - "rustls-native-certs 0.5.0", + "rustls-native-certs", "tokio", - "tokio-rustls 0.22.0", + "tokio-rustls", "webpki 0.21.4", "webpki-roots 0.21.1", ] @@ -3285,8 +3143,8 @@ dependencies = [ [[package]] name = "ibc" -version = "0.36.0" -source = "git+https://github.com/heliaxdev/cosmos-ibc-rs.git?rev=634f4ede136d045dd6f1ff8f4984dd0006aa15f0#634f4ede136d045dd6f1ff8f4984dd0006aa15f0" +version = "0.41.0" +source = "git+https://github.com/heliaxdev/cosmos-ibc-rs.git?rev=38a827d3901e590b2935ee5b6b81b4d67c399560#38a827d3901e590b2935ee5b6b81b4d67c399560" dependencies = [ "bytes", "cfg-if 1.0.0", @@ -3317,106 +3175,19 @@ dependencies = [ [[package]] name = "ibc-proto" -version = "0.26.0" -source = "git+https://github.com/heliaxdev/ibc-proto-rs.git?rev=bb16e17a4d9260d5f20516a8eda43fa52377fad2#bb16e17a4d9260d5f20516a8eda43fa52377fad2" -dependencies = [ - "base64 0.13.1", - "bytes", - "flex-error", - "prost", - "serde 1.0.163", - "subtle-encoding", - "tendermint-proto", - "tonic", -] - -[[package]] -name = "ibc-relayer" -version = "0.22.0" -source = "git+https://github.com/heliaxdev/hermes.git?rev=fea6928dace1af3e38c5b223f933c1d07720811d#fea6928dace1af3e38c5b223f933c1d07720811d" -dependencies = [ - "anyhow", - "async-stream", - "bech32 0.9.1", - "bitcoin", - "bs58", - "bytes", - "crossbeam-channel 0.5.8", - "digest 0.10.6", - "dirs-next", - "ed25519", - "ed25519-dalek", - "ed25519-dalek-bip32", - "flex-error", - "futures", - "generic-array 0.14.7", - "hdpath", - "hex", - "http", - "humantime", - "humantime-serde", - "ibc-proto", - "ibc-relayer-types", - "itertools", - "moka", - "num-bigint 0.4.3", - "num-rational 0.4.1", - "prost", - "regex", - "retry", - "ripemd", - "secp256k1", - "semver 1.0.17", - "serde 1.0.163", - "serde_derive", - "serde_json", - "sha2 0.10.6", - "signature 1.6.4", - "strum", - "subtle-encoding", - "tendermint", - "tendermint-light-client", - "tendermint-light-client-verifier", - "tendermint-proto", - "tendermint-rpc", - "thiserror", - "tiny-bip39 1.0.0", - "tiny-keccak", - "tokio", - "toml 0.5.9", - "tonic", - "tracing 0.1.37", - "uuid 1.3.2", -] - -[[package]] -name = "ibc-relayer-types" -version = "0.22.0" -source = "git+https://github.com/heliaxdev/hermes.git?rev=fea6928dace1af3e38c5b223f933c1d07720811d#fea6928dace1af3e38c5b223f933c1d07720811d" +version = "0.30.0" +source = "git+https://github.com/heliaxdev/ibc-proto-rs.git?rev=31892ee743b2af017d5629b2af419ee20b6100c7#31892ee743b2af017d5629b2af419ee20b6100c7" dependencies = [ + "base64 0.21.0", + "borsh 0.10.3", "bytes", - "derive_more", - "dyn-clone", - "erased-serde", "flex-error", - "ibc-proto", - "ics23", - "itertools", - "num-rational 0.4.1", - "primitive-types", + "parity-scale-codec", "prost", - "safe-regex", + "scale-info", "serde 1.0.163", - "serde_derive", - "serde_json", "subtle-encoding", - "tendermint", - "tendermint-light-client-verifier", "tendermint-proto", - "tendermint-rpc", - "tendermint-testgen", - "time", - "uint", ] [[package]] @@ -3519,7 +3290,7 @@ name = "index-set" version = "0.7.1" source = "git+https://github.com/heliaxdev/index-set?tag=v0.7.1#dc24cdbbe3664514d59f1a4c4031863fc565f1c2" dependencies = [ - "borsh", + "borsh 0.9.4", "serde 1.0.163", ] @@ -3553,15 +3324,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "input_buffer" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" -dependencies = [ - "bytes", -] - [[package]] name = "instant" version = "0.1.12" @@ -3659,18 +3421,6 @@ dependencies = [ "subtle 2.4.1", ] -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if 1.0.0", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.6", -] - [[package]] name = "k256" version = "0.13.1" @@ -3678,8 +3428,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if 1.0.0", - "ecdsa 0.16.7", - "elliptic-curve 0.13.5", + "ecdsa", + "elliptic-curve", "once_cell", "sha2 0.10.6", "signature 2.1.0", @@ -3930,15 +3680,6 @@ dependencies = [ "libc", ] -[[package]] -name = "mach2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" -dependencies = [ - "libc", -] - [[package]] name = "madato" version = "0.5.3" @@ -3958,7 +3699,7 @@ name = "masp_note_encryption" version = "0.2.0" source = "git+https://github.com/anoma/masp?rev=252a6059565b125c1444e9e7d0b7c8da0fba8f8f#252a6059565b125c1444e9e7d0b7c8da0fba8f8f" dependencies = [ - "borsh", + "borsh 0.9.4", "chacha20 0.9.1", "chacha20poly1305", "cipher 0.4.4", @@ -3977,7 +3718,7 @@ dependencies = [ "blake2b_simd", "blake2s_simd", "bls12_381", - "borsh", + "borsh 0.9.4", "byteorder", "ff 0.12.1", "fpe", @@ -4186,29 +3927,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94c7128ba23c81f6471141b90f17654f89ef44a56e14b8a4dd0fddfccd655277" -[[package]] -name = "moka" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ca9b167ed904bc89a2f64c4be5014615c26fd9c4ddd2042c6094744c7df11a" -dependencies = [ - "crossbeam-channel 0.5.8", - "crossbeam-epoch", - "crossbeam-utils 0.8.15", - "num_cpus", - "once_cell", - "parking_lot", - "quanta", - "rustc_version 0.4.0", - "scheduled-thread-pool", - "skeptic", - "smallvec", - "tagptr", - "thiserror", - "triomphe", - "uuid 1.3.2", -] - [[package]] name = "more-asserts" version = "0.2.2" @@ -4241,13 +3959,13 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "namada" -version = "0.20.1" +version = "0.21.1" dependencies = [ "assert_matches", "async-trait", "base58 0.2.0", "bimap", - "borsh", + "borsh 0.9.4", "byte-unit", "circular-queue", "clru", @@ -4289,7 +4007,7 @@ dependencies = [ "tendermint-rpc", "test-log", "thiserror", - "tiny-bip39 0.8.2", + "tiny-bip39", "tiny-hderive", "tokio", "toml 0.5.9", @@ -4309,7 +4027,7 @@ dependencies = [ [[package]] name = "namada_apps" -version = "0.20.1" +version = "0.21.1" dependencies = [ "ark-serialize", "ark-std", @@ -4320,7 +4038,7 @@ dependencies = [ "bimap", "bit-set", "blake2b-rs", - "borsh", + "borsh 0.9.4", "byte-unit", "byteorder", "bytes", @@ -4398,14 +4116,14 @@ dependencies = [ [[package]] name = "namada_core" -version = "0.20.1" +version = "0.21.1" dependencies = [ "ark-bls12-381", "ark-ec", "ark-serialize", "assert_matches", "bech32 0.8.1", - "borsh", + "borsh 0.9.4", "chrono", "data-encoding", "derivative", @@ -4455,9 +4173,9 @@ dependencies = [ [[package]] name = "namada_encoding_spec" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "itertools", "lazy_static", "madato", @@ -4466,10 +4184,10 @@ dependencies = [ [[package]] name = "namada_ethereum_bridge" -version = "0.20.1" +version = "0.21.1" dependencies = [ "assert_matches", - "borsh", + "borsh 0.9.4", "data-encoding", "ethabi", "ethers", @@ -4490,7 +4208,7 @@ dependencies = [ [[package]] name = "namada_macros" -version = "0.20.1" +version = "0.21.1" dependencies = [ "proc-macro2", "quote", @@ -4499,9 +4217,9 @@ dependencies = [ [[package]] name = "namada_proof_of_stake" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "data-encoding", "derivative", "itertools", @@ -4517,20 +4235,20 @@ dependencies = [ [[package]] name = "namada_test_utils" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "namada_core", "strum", ] [[package]] name = "namada_tests" -version = "0.20.1" +version = "0.21.1" dependencies = [ "assert_cmd", "async-trait", - "borsh", + "borsh 0.9.4", "chrono", "clap", "color-eyre", @@ -4543,8 +4261,6 @@ dependencies = [ "file-serve", "fs_extra", "hyper", - "ibc-relayer", - "ibc-relayer-types", "itertools", "lazy_static", "namada", @@ -4561,9 +4277,11 @@ dependencies = [ "prost", "rand 0.8.5", "regex", + "serde 1.0.163", "serde_json", "sha2 0.9.9", "tempfile", + "tendermint-light-client", "test-log", "tokio", "toml 0.5.9", @@ -4573,9 +4291,9 @@ dependencies = [ [[package]] name = "namada_tx_prelude" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "masp_primitives", "namada_core", "namada_macros", @@ -4587,18 +4305,18 @@ dependencies = [ [[package]] name = "namada_vm_env" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "masp_primitives", "namada_core", ] [[package]] name = "namada_vp_prelude" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "namada_core", "namada_macros", "namada_proof_of_stake", @@ -4733,7 +4451,6 @@ dependencies = [ "autocfg", "num-integer", "num-traits 0.2.15", - "serde 1.0.163", ] [[package]] @@ -4809,7 +4526,6 @@ dependencies = [ "num-bigint 0.4.3", "num-integer", "num-traits 0.2.15", - "serde 1.0.163", ] [[package]] @@ -5260,7 +4976,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.7", + "der", "spki", ] @@ -5524,33 +5240,6 @@ dependencies = [ "nix", ] -[[package]] -name = "pulldown-cmark" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f197a544b0c9ab3ae46c359a7ec9cbbb5c7bf97054266fecb7ead794a181d6" -dependencies = [ - "bitflags 1.2.1", - "memchr", - "unicase", -] - -[[package]] -name = "quanta" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" -dependencies = [ - "crossbeam-utils 0.8.15", - "libc", - "mach2", - "once_cell", - "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", - "web-sys", - "winapi", -] - [[package]] name = "quick-error" version = "1.2.3" @@ -5658,15 +5347,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "raw-cpuid" -version = "10.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" -dependencies = [ - "bitflags 1.2.1", -] - [[package]] name = "rayon" version = "1.5.3" @@ -5837,23 +5517,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "retry" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9166d72162de3575f950507683fac47e30f6f2c3836b71b7fbc61aa517c9c5f4" - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac 0.12.1", - "zeroize", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -5888,17 +5551,6 @@ dependencies = [ "digest 0.10.6", ] -[[package]] -name = "ripemd160" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - [[package]] name = "rkyv" version = "0.7.42" @@ -6084,18 +5736,6 @@ dependencies = [ "security-framework", ] -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", -] - [[package]] name = "rustls-pemfile" version = "1.0.3" @@ -6227,15 +5867,6 @@ dependencies = [ "windows-sys 0.42.0", ] -[[package]] -name = "scheduled-thread-pool" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" -dependencies = [ - "parking_lot", -] - [[package]] name = "scoped-tls" version = "1.0.1" @@ -6286,54 +5917,20 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.7", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "sec1" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" dependencies = [ - "base16ct 0.2.0", - "der 0.7.7", + "base16ct", + "der", "generic-array 0.14.7", "pkcs8", "subtle 2.4.1", "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" -dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "secp256k1-sys", - "serde 1.0.163", -] - -[[package]] -name = "secp256k1-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" -dependencies = [ - "cc", -] - [[package]] name = "security-framework" version = "2.3.1" @@ -6508,19 +6105,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - [[package]] name = "sha1" version = "0.10.5" @@ -6617,10 +6201,6 @@ name = "signature" version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.6", - "rand_core 0.6.4", -] [[package]] name = "signature" @@ -6644,21 +6224,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc47a29ce97772ca5c927f75bac34866b16d64e07f330c3248e2d7226623901b" -[[package]] -name = "skeptic" -version = "0.13.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" -dependencies = [ - "bytecount", - "cargo_metadata 0.14.2", - "error-chain", - "glob", - "pulldown-cmark", - "tempfile", - "walkdir", -] - [[package]] name = "slab" version = "0.4.8" @@ -6699,7 +6264,7 @@ version = "0.3.1-pre" source = "git+https://github.com/heliaxdev/sparse-merkle-tree?rev=e086b235ed6e68929bf73f617dd61cd17b000a56#e086b235ed6e68929bf73f617dd61cd17b000a56" dependencies = [ "blake2b-rs", - "borsh", + "borsh 0.9.4", "cfg-if 1.0.0", "ics23", "sha2 0.9.9", @@ -6724,7 +6289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", - "der 0.7.7", + "der", ] [[package]] @@ -6837,9 +6402,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sysinfo" -version = "0.29.4" +version = "0.27.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "751e810399bba86e9326f5762b7f32ac5a085542df78da6a78d94e07d14d7c11" +checksum = "a902e9050fca0a5d6877550b769abd2bd1ce8c04634b941dbe2809735e1a1e33" dependencies = [ "cfg-if 1.0.0", "core-foundation-sys", @@ -6849,12 +6414,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - [[package]] name = "tap" version = "1.0.1" @@ -6902,12 +6461,10 @@ dependencies = [ "ed25519-dalek", "flex-error", "futures", - "k256 0.11.6", "num-traits 0.2.15", "once_cell", "prost", "prost-types", - "ripemd160", "serde 1.0.163", "serde_bytes", "serde_json", @@ -6990,7 +6547,6 @@ version = "0.23.6" source = "git+https://github.com/heliaxdev/tendermint-rs.git?rev=b7d1e5afc6f2ccb3fd1545c2174bab1cc48d7fa7#b7d1e5afc6f2ccb3fd1545c2174bab1cc48d7fa7" dependencies = [ "async-trait", - "async-tungstenite", "bytes", "flex-error", "futures", @@ -7134,25 +6690,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "tiny-bip39" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" -dependencies = [ - "anyhow", - "hmac 0.12.1", - "once_cell", - "pbkdf2 0.11.0", - "rand 0.8.5", - "rustc-hash", - "sha2 0.10.6", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - [[package]] name = "tiny-hderive" version = "0.3.0" @@ -7263,17 +6800,6 @@ dependencies = [ "webpki 0.21.4", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki 0.22.0", -] - [[package]] name = "tokio-stream" version = "0.1.14" @@ -7307,7 +6833,7 @@ dependencies = [ "futures-util", "log", "tokio", - "tungstenite 0.18.0", + "tungstenite", ] [[package]] @@ -7403,10 +6929,7 @@ dependencies = [ "pin-project", "prost", "prost-derive", - "rustls-native-certs 0.6.3", - "rustls-pemfile", "tokio", - "tokio-rustls 0.23.4", "tokio-stream", "tokio-util 0.7.8", "tower", @@ -7658,37 +7181,12 @@ dependencies = [ "tracing-futures 0.2.5 (git+https://github.com/tokio-rs/tracing/?tag=tracing-0.1.30)", ] -[[package]] -name = "triomphe" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee8098afad3fb0c54a9007aab6804558410503ad676d4633f9c2559a00ac0f" - [[package]] name = "try-lock" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" -[[package]] -name = "tungstenite" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" -dependencies = [ - "base64 0.13.1", - "byteorder", - "bytes", - "http", - "httparse", - "input_buffer", - "log", - "rand 0.8.5", - "sha-1", - "url", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.18.0" @@ -7840,9 +7338,6 @@ name = "uuid" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2" -dependencies = [ - "getrandom 0.2.9", -] [[package]] name = "valuable" diff --git a/Cargo.toml b/Cargo.toml index 4019e0e50ee..2d50daf0b64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ members = [ exclude = [ "wasm", "wasm_for_tests", + "test_fixtures", ] [workspace.package] @@ -31,7 +32,7 @@ keywords = ["blockchain", "privacy", "crypto", "protocol", "network"] license = "GPL-3.0" readme = "README.md" repository = "https://github.com/anoma/namada" -version = "0.20.1" +version = "0.21.1" [workspace.dependencies] ark-bls12-381 = {version = "0.3"} @@ -76,8 +77,6 @@ flate2 = "1.0.22" fs_extra = "1.2.0" futures = "0.3" git2 = "0.13.25" -ibc-relayer = {git = "https://github.com/heliaxdev/hermes.git", rev = "fea6928dace1af3e38c5b223f933c1d07720811d", default-features = false} -ibc-relayer-types = {git = "https://github.com/heliaxdev/hermes.git", rev = "fea6928dace1af3e38c5b223f933c1d07720811d", default-features = false } ics23 = "0.9.0" index-set = {git = "https://github.com/heliaxdev/index-set", tag = "v0.7.1", features = ["serialize-borsh", "serialize-serde"]} itertools = "0.10.0" @@ -117,10 +116,11 @@ sha2 = "0.9.3" signal-hook = "0.3.9" slip10_ed25519 = "0.1.3" # sysinfo with disabled multithread feature -sysinfo = {version = "0.29.4", default-features = false} +sysinfo = {version = "0.27.8", default-features = false} tar = "0.4.37" tempfile = {version = "3.2.0"} tendermint-config = {git = "https://github.com/heliaxdev/tendermint-rs.git", rev = "b7d1e5afc6f2ccb3fd1545c2174bab1cc48d7fa7"} +tendermint-light-client = {git = "https://github.com/heliaxdev/tendermint-rs.git", rev = "b7d1e5afc6f2ccb3fd1545c2174bab1cc48d7fa7"} test-log = {version = "0.2.7", default-features = false, features = ["trace"]} tiny-bip39 = {git = "https://github.com/anoma/tiny-bip39.git", rev = "bf0f6d8713589b83af7a917366ec31f5275c0e57"} tiny-hderive = "0.3.0" diff --git a/Makefile b/Makefile index 638b28ceaf7..0b6345a50da 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ package = namada NAMADA_E2E_USE_PREBUILT_BINARIES ?= true NAMADA_E2E_DEBUG ?= true RUST_BACKTRACE ?= 1 +NAMADA_MASP_TEST_SEED ?= 0 cargo := $(env) cargo rustup := $(env) rustup @@ -116,12 +117,14 @@ audit: test: test-unit test-e2e test-wasm -# Unit tests with coverage report test-coverage: + # Run integration tests with pre-built MASP proofs + NAMADA_MASP_TEST_SEED=$(NAMADA_MASP_TEST_SEED) \ + NAMADA_MASP_TEST_PROOFS=load \ $(cargo) +$(nightly) llvm-cov --output-dir target \ --features namada/testing \ --html \ - -- --skip e2e --skip integration -Z unstable-options --report-time + -- --skip e2e -Z unstable-options --report-time # NOTE: `TEST_FILTER` is prepended with `e2e::`. Since filters in `cargo test` # work with a substring search, TEST_FILTER only works if it contains a string @@ -137,7 +140,23 @@ test-e2e: --test-threads=1 \ -Z unstable-options --report-time +# Run integration tests with pre-built MASP proofs test-integration: + NAMADA_MASP_TEST_SEED=$(NAMADA_MASP_TEST_SEED) \ + NAMADA_MASP_TEST_PROOFS=load \ + make test-integration-slow + +# Clear pre-built proofs, run integration tests and save the new proofs +test-integration-save-proofs: + # Clear old proofs first + rm --force test_fixtures/masp_proofs/*.bin || true + NAMADA_MASP_TEST_SEED=$(NAMADA_MASP_TEST_SEED) \ + NAMADA_MASP_TEST_PROOFS=save \ + TEST_FILTER=masp \ + make test-integration-slow + +# Run integration tests without specifiying any pre-built MASP proofs option +test-integration-slow: RUST_BACKTRACE=$(RUST_BACKTRACE) \ $(cargo) +$(nightly) test integration::$(TEST_FILTER) \ -Z unstable-options \ diff --git a/README.md b/README.md index 10b2230009b..39c53909eae 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## Overview -[Namada](http://namada.net) is a Proof-of-Stake L1 for interchain asset-agnostic privacy. Namada uses Tendermint BFT +[Namada](http://namada.net) is a Proof-of-Stake L1 for interchain asset-agnostic privacy. Namada uses CometBFT consensus and enables multi-asset shielded transfers for any native or non-native asset. Namada features full IBC protocol support, a natively integrated Ethereum bridge, a modern proof-of-stake @@ -27,7 +27,7 @@ interaction with the protocol. ## 💾 Installing -There is a single command to build and install Namada executables from source (the node, the client and the wallet). This command will also verify that a compatible version of [Tendermint](#dependencies) is available and if not, attempt to install it. Note that currently at least 16GB RAM is needed to build from source. +There is a single command to build and install Namada executables from source (the node, the client and the wallet). This command will also verify that a compatible version of [CometBFT](#dependencies) is available and if not, attempt to install it. Note that currently at least 16GB RAM is needed to build from source. ```shell make install @@ -72,7 +72,7 @@ To change the log level, set `NAMADA_LOG` environment variable to one of: * `debug` * `trace` -The default is set to `info` for all the modules, expect for Tendermint ABCI, which has a lot of `debug` logging. +The default is set to `info` for all the modules, expect for CombetBFT ABCI, which has a lot of `debug` logging. For more fine-grained logging levels settings, please refer to the [tracing subscriber docs](https://docs.rs/tracing-subscriber/0.2.18/tracing_subscriber/struct.EnvFilter.html#directives) for more information. @@ -84,4 +84,4 @@ Please see the [contributing page](./CONTRIBUTING.md). ### Dependencies -The ledger currently requires that the Heliax fork of tendermint[v0.1.4-abciplus] is installed and available on path. This can be achieved through following [these instructions](https://docs.namada.net/user-guide/install/installing-tendermint.html) +The ledger currently requires [CometBFT v0.37.2](https://github.com/cometbft/cometbft/releases/tag/v0.37.2) is installed and available on path. This can be achieved through following [these instructions](https://github.com/cometbft/cometbft/blob/main/docs/guides/install.md) diff --git a/apps/src/bin/namada-client/cli.rs b/apps/src/bin/namada-client/cli.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/apps/src/bin/namada/cli.rs b/apps/src/bin/namada/cli.rs index 8c7a1e0b494..0259ba525aa 100644 --- a/apps/src/bin/namada/cli.rs +++ b/apps/src/bin/namada/cli.rs @@ -47,7 +47,7 @@ fn handle_command(cmd: cli::cmds::Namada, raw_sub_cmd: String) -> Result<()> { | cli::cmds::Namada::TxCustom(_) | cli::cmds::Namada::TxTransfer(_) | cli::cmds::Namada::TxIbcTransfer(_) - | cli::cmds::Namada::TxUpdateVp(_) + | cli::cmds::Namada::TxUpdateAccount(_) | cli::cmds::Namada::TxRevealPk(_) | cli::cmds::Namada::TxInitProposal(_) | cli::cmds::Namada::TxVoteProposal(_) => { diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 12927cca13e..31b28977f36 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -58,7 +58,7 @@ pub mod cmds { TxCustom(TxCustom), TxTransfer(TxTransfer), TxIbcTransfer(TxIbcTransfer), - TxUpdateVp(TxUpdateVp), + TxUpdateAccount(TxUpdateAccount), TxInitProposal(TxInitProposal), TxVoteProposal(TxVoteProposal), TxRevealPk(TxRevealPk), @@ -75,7 +75,7 @@ pub mod cmds { .subcommand(TxCustom::def()) .subcommand(TxTransfer::def()) .subcommand(TxIbcTransfer::def()) - .subcommand(TxUpdateVp::def()) + .subcommand(TxUpdateAccount::def()) .subcommand(TxInitProposal::def()) .subcommand(TxVoteProposal::def()) .subcommand(TxRevealPk::def()) @@ -93,7 +93,8 @@ pub mod cmds { let tx_transfer = SubCmd::parse(matches).map(Self::TxTransfer); let tx_ibc_transfer = SubCmd::parse(matches).map(Self::TxIbcTransfer); - let tx_update_vp = SubCmd::parse(matches).map(Self::TxUpdateVp); + let tx_update_account = + SubCmd::parse(matches).map(Self::TxUpdateAccount); let tx_init_proposal = SubCmd::parse(matches).map(Self::TxInitProposal); let tx_vote_proposal = @@ -107,7 +108,7 @@ pub mod cmds { .or(tx_custom) .or(tx_transfer) .or(tx_ibc_transfer) - .or(tx_update_vp) + .or(tx_update_account) .or(tx_init_proposal) .or(tx_vote_proposal) .or(tx_reveal_pk) @@ -214,7 +215,7 @@ pub mod cmds { .subcommand(TxCustom::def().display_order(1)) .subcommand(TxTransfer::def().display_order(1)) .subcommand(TxIbcTransfer::def().display_order(1)) - .subcommand(TxUpdateVp::def().display_order(1)) + .subcommand(TxUpdateAccount::def().display_order(1)) .subcommand(TxInitAccount::def().display_order(1)) .subcommand(TxRevealPk::def().display_order(1)) // Proposal transactions @@ -231,6 +232,7 @@ pub mod cmds { .subcommand(AddToEthBridgePool::def().display_order(3)) // Queries .subcommand(QueryEpoch::def().display_order(4)) + .subcommand(QueryAccount::def().display_order(4)) .subcommand(QueryTransfers::def().display_order(4)) .subcommand(QueryConversions::def().display_order(4)) .subcommand(QueryBlock::def().display_order(4)) @@ -245,9 +247,12 @@ pub mod cmds { .subcommand(QueryProposal::def().display_order(4)) .subcommand(QueryProposalResult::def().display_order(4)) .subcommand(QueryProtocolParameters::def().display_order(4)) + .subcommand(QueryPgf::def().display_order(4)) .subcommand(QueryValidatorState::def().display_order(4)) + // Actions + .subcommand(SignTx::def().display_order(5)) // Utils - .subcommand(Utils::def().display_order(5)) + .subcommand(Utils::def().display_order(6)) } fn parse(matches: &ArgMatches) -> Option { @@ -255,7 +260,8 @@ pub mod cmds { let tx_custom = Self::parse_with_ctx(matches, TxCustom); let tx_transfer = Self::parse_with_ctx(matches, TxTransfer); let tx_ibc_transfer = Self::parse_with_ctx(matches, TxIbcTransfer); - let tx_update_vp = Self::parse_with_ctx(matches, TxUpdateVp); + let tx_update_account = + Self::parse_with_ctx(matches, TxUpdateAccount); let tx_init_account = Self::parse_with_ctx(matches, TxInitAccount); let tx_init_validator = Self::parse_with_ctx(matches, TxInitValidator); @@ -272,6 +278,7 @@ pub mod cmds { let unbond = Self::parse_with_ctx(matches, Unbond); let withdraw = Self::parse_with_ctx(matches, Withdraw); let query_epoch = Self::parse_with_ctx(matches, QueryEpoch); + let query_account = Self::parse_with_ctx(matches, QueryAccount); let query_transfers = Self::parse_with_ctx(matches, QueryTransfers); let query_conversions = Self::parse_with_ctx(matches, QueryConversions); @@ -292,15 +299,17 @@ pub mod cmds { Self::parse_with_ctx(matches, QueryProposalResult); let query_protocol_parameters = Self::parse_with_ctx(matches, QueryProtocolParameters); + let query_pgf = Self::parse_with_ctx(matches, QueryPgf); let query_validator_state = Self::parse_with_ctx(matches, QueryValidatorState); let add_to_eth_bridge_pool = Self::parse_with_ctx(matches, AddToEthBridgePool); + let sign_tx = Self::parse_with_ctx(matches, SignTx); let utils = SubCmd::parse(matches).map(Self::WithoutContext); tx_custom .or(tx_transfer) .or(tx_ibc_transfer) - .or(tx_update_vp) + .or(tx_update_account) .or(tx_init_account) .or(tx_reveal_pk) .or(tx_init_proposal) @@ -327,7 +336,10 @@ pub mod cmds { .or(query_proposal) .or(query_proposal_result) .or(query_protocol_parameters) + .or(query_pgf) .or(query_validator_state) + .or(query_account) + .or(sign_tx) .or(utils) } } @@ -369,7 +381,7 @@ pub mod cmds { TxTransfer(TxTransfer), TxIbcTransfer(TxIbcTransfer), QueryResult(QueryResult), - TxUpdateVp(TxUpdateVp), + TxUpdateAccount(TxUpdateAccount), TxInitAccount(TxInitAccount), TxInitValidator(TxInitValidator), TxCommissionRateChange(TxCommissionRateChange), @@ -382,6 +394,7 @@ pub mod cmds { Withdraw(Withdraw), AddToEthBridgePool(AddToEthBridgePool), QueryEpoch(QueryEpoch), + QueryAccount(QueryAccount), QueryTransfers(QueryTransfers), QueryConversions(QueryConversions), QueryBlock(QueryBlock), @@ -396,7 +409,9 @@ pub mod cmds { QueryProposal(QueryProposal), QueryProposalResult(QueryProposalResult), QueryProtocolParameters(QueryProtocolParameters), + QueryPgf(QueryPgf), QueryValidatorState(QueryValidatorState), + SignTx(SignTx), } #[allow(clippy::large_enum_variant)] @@ -1175,6 +1190,28 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct QueryPgf(pub args::QueryPgf); + + impl SubCmd for QueryPgf { + const CMD: &'static str = "query-pgf"; + + fn parse(matches: &ArgMatches) -> Option + where + Self: Sized, + { + matches + .subcommand_matches(Self::CMD) + .map(|matches| QueryPgf(args::QueryPgf::parse(matches))) + } + + fn def() -> App { + App::new(Self::CMD) + .about("Query pgf stewards and continous funding.") + .add_args::>() + } + } + #[derive(Clone, Debug)] pub struct TxCustom(pub args::TxCustom); @@ -1233,15 +1270,15 @@ pub mod cmds { } #[derive(Clone, Debug)] - pub struct TxUpdateVp(pub args::TxUpdateVp); + pub struct TxUpdateAccount(pub args::TxUpdateAccount); - impl SubCmd for TxUpdateVp { - const CMD: &'static str = "update"; + impl SubCmd for TxUpdateAccount { + const CMD: &'static str = "update-account"; fn parse(matches: &ArgMatches) -> Option { - matches - .subcommand_matches(Self::CMD) - .map(|matches| TxUpdateVp(args::TxUpdateVp::parse(matches))) + matches.subcommand_matches(Self::CMD).map(|matches| { + TxUpdateAccount(args::TxUpdateAccount::parse(matches)) + }) } fn def() -> App { @@ -1250,7 +1287,7 @@ pub mod cmds { "Send a signed transaction to update account's validity \ predicate.", ) - .add_args::>() + .add_args::>() } } @@ -1395,6 +1432,28 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct QueryAccount(pub args::QueryAccount); + + impl SubCmd for QueryAccount { + const CMD: &'static str = "query-account"; + + fn parse(matches: &ArgMatches) -> Option { + matches + .subcommand_matches(Self::CMD) + .map(|matches| QueryAccount(args::QueryAccount::parse(matches))) + } + + fn def() -> App { + App::new(Self::CMD) + .about( + "Query the substorage space of a specific enstablished \ + address.", + ) + .add_args::>() + } + } + #[derive(Clone, Debug)] pub struct QueryConversions(pub args::QueryConversions); @@ -1490,6 +1549,25 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct SignTx(pub args::SignTx); + + impl SubCmd for SignTx { + const CMD: &'static str = "sign-tx"; + + fn parse(matches: &ArgMatches) -> Option { + matches + .subcommand_matches(Self::CMD) + .map(|matches| SignTx(args::SignTx::parse(matches))) + } + + fn def() -> App { + App::new(Self::CMD) + .about("Query PoS bonded stake.") + .add_args::>() + } + } + #[derive(Clone, Debug)] pub struct QueryValidatorState( pub args::QueryValidatorState, @@ -2317,6 +2395,7 @@ pub mod args { pub const TX_INIT_PROPOSAL: &str = "tx_init_proposal.wasm"; pub const TX_INIT_VALIDATOR_WASM: &str = "tx_init_validator.wasm"; pub const TX_REVEAL_PK: &str = "tx_reveal_pk.wasm"; + pub const TX_UPDATE_ACCOUNT_WASM: &str = "tx_update_account.wasm"; pub const TX_TRANSFER_WASM: &str = "tx_transfer.wasm"; pub const TX_UNBOND_WASM: &str = "tx_unbond.wasm"; pub const TX_UNJAIL_VALIDATOR_WASM: &str = "tx_unjail_validator.wasm"; @@ -2379,15 +2458,8 @@ pub mod args { ); pub const ETH_SYNC: ArgFlag = flag("sync"); pub const EXPIRATION_OPT: ArgOpt = arg_opt("expiration"); - pub const FEE_AMOUNT: ArgDefault = arg_default( - "fee-amount", - DefaultFn(|| token::DenominatedAmount { - amount: token::Amount::default(), - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }), - ); - pub const FEE_PAYER: Arg = arg("fee-payer"); pub const FORCE: ArgFlag = flag("force"); + pub const GAS_PAYER: ArgOpt = arg("gas-payer").opt(); pub const GAS_AMOUNT: ArgDefault = arg_default( "gas-amount", DefaultFn(|| token::DenominatedAmount { @@ -2404,6 +2476,14 @@ pub mod args { ); pub const GAS_TOKEN: ArgDefaultFromCtx = arg_default_from_ctx("gas-token", DefaultFn(|| "NAM".parse().unwrap())); + pub const FEE_PAYER: Arg = arg("fee-payer"); + pub const FEE_AMOUNT: ArgDefault = arg_default( + "fee-amount", + DefaultFn(|| token::DenominatedAmount { + amount: token::Amount::default(), + denom: NATIVE_MAX_DECIMAL_PLACES.into(), + }), + ); pub const GENESIS_PATH: Arg = arg("genesis-path"); pub const GENESIS_VALIDATOR: ArgOpt = arg("genesis-validator").opt(); @@ -2413,6 +2493,7 @@ pub mod args { pub const HD_WALLET_DERIVATION_PATH_OPT: ArgOpt = HD_WALLET_DERIVATION_PATH.opt(); pub const HISTORIC: ArgFlag = flag("historic"); + pub const IBC_TRANSFER_MEMO: ArgOpt = arg_opt("memo"); pub const LEDGER_ADDRESS_ABOUT: &str = "Address of a ledger node as \"{scheme}://{host}:{port}\". If the \ scheme is not supplied, it is assumed to be TCP."; @@ -2434,6 +2515,8 @@ pub mod args { pub const NAMADA_START_TIME: ArgOpt = arg_opt("time"); pub const NO_CONVERSIONS: ArgFlag = flag("no-conversions"); pub const OUT_FILE_PATH_OPT: ArgOpt = arg_opt("out-file-path"); + pub const OUTPUT_FOLDER_PATH: ArgOpt = + arg_opt("output-folder-path"); pub const OWNER: Arg = arg("owner"); pub const OWNER_OPT: ArgOpt = OWNER.opt(); pub const PIN: ArgFlag = flag("pin"); @@ -2441,10 +2524,14 @@ pub mod args { "port-id", DefaultFn(|| PortId::from_str("transfer").unwrap()), ); + pub const PROPOSAL_ETH: ArgFlag = flag("eth"); + pub const PROPOSAL_PGF_STEWARD: ArgFlag = flag("pgf-stewards"); + pub const PROPOSAL_PGF_FUNDING: ArgFlag = flag("pgf-funding"); pub const PROPOSAL_OFFLINE: ArgFlag = flag("offline"); pub const PROTOCOL_KEY: ArgOpt = arg_opt("protocol-key"); pub const PRE_GENESIS_PATH: ArgOpt = arg_opt("pre-genesis-path"); pub const PUBLIC_KEY: Arg = arg("public-key"); + pub const PUBLIC_KEYS: ArgMulti = arg_multi("public-keys"); pub const PROPOSAL_ID: Arg = arg("proposal-id"); pub const PROPOSAL_ID_OPT: ArgOpt = arg_opt("proposal-id"); pub const PROPOSAL_VOTE_PGF_OPT: ArgOpt = arg_opt("pgf"); @@ -2460,9 +2547,8 @@ pub mod args { pub const SAFE_MODE: ArgFlag = flag("safe-mode"); pub const SCHEME: ArgDefault = arg_default("scheme", DefaultFn(|| SchemeType::Ed25519)); - pub const SIGNER: ArgOpt = arg_opt("signer"); - pub const SIGNING_KEY_OPT: ArgOpt = SIGNING_KEY.opt(); - pub const SIGNING_KEY: Arg = arg("signing-key"); + pub const SIGNING_KEYS: ArgMulti = arg_multi("signing-keys"); + pub const SIGNATURES: ArgMulti = arg_multi("signatures"); pub const SOURCE: Arg = arg("source"); pub const SOURCE_OPT: ArgOpt = SOURCE.opt(); pub const STORAGE_KEY: Arg = arg("storage-key"); @@ -2475,16 +2561,19 @@ pub mod args { pub const TRANSFER_SOURCE: Arg = arg("source"); pub const TRANSFER_TARGET: Arg = arg("target"); pub const TX_HASH: Arg = arg("tx-hash"); + pub const THRESOLD: ArgOpt = arg_opt("threshold"); pub const UNSAFE_DONT_ENCRYPT: ArgFlag = flag("unsafe-dont-encrypt"); pub const UNSAFE_SHOW_SECRET: ArgFlag = flag("unsafe-show-secret"); pub const VALIDATOR: Arg = arg("validator"); pub const VALIDATOR_OPT: ArgOpt = VALIDATOR.opt(); pub const VALIDATOR_ACCOUNT_KEY: ArgOpt = arg_opt("account-key"); - pub const VALIDATOR_CODE_PATH: ArgOpt = - arg_opt("validator-code-path"); + pub const VALIDATOR_ACCOUNT_KEYS: ArgMulti = + arg_multi("account-keys"); pub const VALIDATOR_CONSENSUS_KEY: ArgOpt = arg_opt("consensus-key"); + pub const VALIDATOR_CODE_PATH: ArgOpt = + arg_opt("validator-code-path"); pub const VALIDATOR_ETH_COLD_KEY: ArgOpt = arg_opt("eth-cold-key"); pub const VALIDATOR_ETH_HOT_KEY: ArgOpt = @@ -2496,6 +2585,8 @@ pub mod args { pub const WALLET_ALIAS_FORCE: ArgFlag = flag("wallet-alias-force"); pub const WASM_CHECKSUMS_PATH: Arg = arg("wasm-checksums-path"); pub const WASM_DIR: ArgOpt = arg_opt("wasm-dir"); + pub const TX_PATH: Arg = arg("tx-path"); + pub const TX_PATH_OPT: ArgOpt = TX_PATH.opt(); /// Global command arguments #[derive(Clone, Debug)] @@ -2702,9 +2793,9 @@ pub mod args { recipient: self.recipient, sender: ctx.get(&self.sender), amount: self.amount, - gas_amount: self.gas_amount, - gas_payer: ctx.get(&self.gas_payer), - code_path: ctx.read_wasm(self.code_path), + fee_amount: self.fee_amount, + fee_payer: ctx.get(&self.fee_payer), + code_path: self.code_path, } } } @@ -2716,8 +2807,8 @@ pub mod args { let recipient = ETH_ADDRESS.parse(matches); let sender = ADDRESS.parse(matches); let amount = InputAmount::Unvalidated(AMOUNT.parse(matches)); - let gas_amount = FEE_AMOUNT.parse(matches).amount; - let gas_payer = FEE_PAYER.parse(matches); + let fee_amount = FEE_AMOUNT.parse(matches).amount; + let fee_payer = FEE_PAYER.parse(matches); let code_path = PathBuf::from(TX_BRIDGE_POOL_WASM); Self { tx, @@ -2725,8 +2816,8 @@ pub mod args { recipient, sender, amount, - gas_amount, - gas_payer, + fee_amount, + fee_payer, code_path, } } @@ -3110,11 +3201,15 @@ pub mod args { fn to_sdk(self, ctx: &mut Context) -> TxCustom { TxCustom:: { tx: self.tx.to_sdk(ctx), - code_path: ctx.read_wasm(self.code_path), + code_path: self.code_path, data_path: self.data_path.map(|data_path| { std::fs::read(data_path) - .expect("Expected a file at given data path") + .expect("Expected a file at given path") }), + serialized_tx: self.serialized_tx.map(|path| { + std::fs::read(path).expect("Expected a file at given path") + }), + owner: ctx.get(&self.owner), } } } @@ -3122,26 +3217,50 @@ pub mod args { impl Args for TxCustom { fn parse(matches: &ArgMatches) -> Self { let tx = Tx::parse(matches); - let code_path = CODE_PATH.parse(matches); + let code_path = CODE_PATH_OPT.parse(matches); let data_path = DATA_PATH_OPT.parse(matches); + let serialized_tx = TX_PATH_OPT.parse(matches); + let owner = OWNER.parse(matches); Self { tx, code_path, data_path, + serialized_tx, + owner, } } fn def(app: App) -> App { app.add_args::>() .arg( - CODE_PATH + CODE_PATH_OPT .def() - .help("The path to the transaction's WASM code."), + .help("The path to the transaction's WASM code.") + .conflicts_with(TX_PATH_OPT.name), ) - .arg(DATA_PATH_OPT.def().help( - "The data file at this path containing arbitrary bytes \ - will be passed to the transaction code when it's \ - executed.", + .arg( + DATA_PATH_OPT + .def() + .help( + "The data file at this path containing arbitrary \ + bytes will be passed to the transaction code \ + when it's executed.", + ) + .requires(CODE_PATH_OPT.name) + .conflicts_with(TX_PATH_OPT.name), + ) + .arg( + TX_PATH_OPT + .def() + .help("The path to a serialized transaction.") + .conflicts_with_all([ + CODE_PATH_OPT.name, + DATA_PATH_OPT.name, + ]), + ) + .arg(OWNER.def().help( + "The address corresponding to the signatures or signing \ + keys.", )) } } @@ -3206,6 +3325,7 @@ pub mod args { channel_id: self.channel_id, timeout_height: self.timeout_height, timeout_sec_offset: self.timeout_sec_offset, + memo: self.memo, tx_code_path: self.tx_code_path.to_path_buf(), } } @@ -3222,6 +3342,7 @@ pub mod args { let channel_id = CHANNEL_ID.parse(matches); let timeout_height = TIMEOUT_HEIGHT.parse(matches); let timeout_sec_offset = TIMEOUT_SEC_OFFSET.parse(matches); + let memo = IBC_TRANSFER_MEMO.parse(matches); let tx_code_path = PathBuf::from(TX_IBC_WASM); Self { tx, @@ -3233,6 +3354,7 @@ pub mod args { channel_id, timeout_height, timeout_sec_offset, + memo, tx_code_path, } } @@ -3256,6 +3378,11 @@ pub mod args { .help("The timeout height of the destination chain."), ) .arg(TIMEOUT_SEC_OFFSET.def().help("The timeout as seconds.")) + .arg( + IBC_TRANSFER_MEMO + .def() + .help("Memo field of ICS20 transfer."), + ) } } @@ -3263,10 +3390,14 @@ pub mod args { fn to_sdk(self, ctx: &mut Context) -> TxInitAccount { TxInitAccount:: { tx: self.tx.to_sdk(ctx), - source: ctx.get(&self.source), - vp_code_path: self.vp_code_path.to_path_buf(), - tx_code_path: self.tx_code_path.to_path_buf(), - public_key: ctx.get_cached(&self.public_key), + vp_code_path: self.vp_code_path, + tx_code_path: self.tx_code_path, + public_keys: self + .public_keys + .iter() + .map(|pk| ctx.get_cached(pk)) + .collect(), + threshold: self.threshold, } } } @@ -3274,34 +3405,36 @@ pub mod args { impl Args for TxInitAccount { fn parse(matches: &ArgMatches) -> Self { let tx = Tx::parse(matches); - let source = SOURCE.parse(matches); let vp_code_path = CODE_PATH_OPT .parse(matches) .unwrap_or_else(|| PathBuf::from(VP_USER_WASM)); let tx_code_path = PathBuf::from(TX_INIT_ACCOUNT_WASM); - let public_key = PUBLIC_KEY.parse(matches); + let public_keys = PUBLIC_KEYS.parse(matches); + let threshold = THRESOLD.parse(matches); Self { tx, - source, vp_code_path, - public_key, + public_keys, + threshold, tx_code_path, } } fn def(app: App) -> App { app.add_args::>() - .arg(SOURCE.def().help( - "The source account's address that signs the transaction.", - )) .arg(CODE_PATH_OPT.def().help( "The path to the validity predicate WASM code to be used \ for the new account. Uses the default user VP if none \ specified.", )) - .arg(PUBLIC_KEY.def().help( - "A public key to be used for the new account in \ - hexadecimal encoding.", + .arg(PUBLIC_KEYS.def().help( + "A list public keys to be associated with the new account \ + in hexadecimal encoding.", + )) + .arg(THRESOLD.def().help( + "The minimum number of signature to be provided for \ + authorization. Must be less then the maximum number of \ + public keys provided.", )) } } @@ -3310,9 +3443,13 @@ pub mod args { fn to_sdk(self, ctx: &mut Context) -> TxInitValidator { TxInitValidator:: { tx: self.tx.to_sdk(ctx), - source: ctx.get(&self.source), scheme: self.scheme, - account_key: self.account_key.map(|x| ctx.get_cached(&x)), + account_keys: self + .account_keys + .iter() + .map(|x| ctx.get_cached(x)) + .collect(), + threshold: self.threshold, consensus_key: self.consensus_key.map(|x| ctx.get_cached(&x)), eth_cold_key: self.eth_cold_key.map(|x| ctx.get_cached(&x)), eth_hot_key: self.eth_hot_key.map(|x| ctx.get_cached(&x)), @@ -3331,9 +3468,8 @@ pub mod args { impl Args for TxInitValidator { fn parse(matches: &ArgMatches) -> Self { let tx = Tx::parse(matches); - let source = SOURCE.parse(matches); let scheme = SCHEME.parse(matches); - let account_key = VALIDATOR_ACCOUNT_KEY.parse(matches); + let account_keys = VALIDATOR_ACCOUNT_KEYS.parse(matches); let consensus_key = VALIDATOR_CONSENSUS_KEY.parse(matches); let eth_cold_key = VALIDATOR_ETH_COLD_KEY.parse(matches); let eth_hot_key = VALIDATOR_ETH_HOT_KEY.parse(matches); @@ -3346,11 +3482,12 @@ pub mod args { .unwrap_or_else(|| PathBuf::from(VP_USER_WASM)); let unsafe_dont_encrypt = UNSAFE_DONT_ENCRYPT.parse(matches); let tx_code_path = PathBuf::from(TX_INIT_VALIDATOR_WASM); + let threshold = THRESOLD.parse(matches); Self { tx, - source, scheme, - account_key, + account_keys, + threshold, consensus_key, eth_cold_key, eth_hot_key, @@ -3365,16 +3502,14 @@ pub mod args { fn def(app: App) -> App { app.add_args::>() - .arg(SOURCE.def().help( - "The source account's address that signs the transaction.", - )) .arg(SCHEME.def().help( "The key scheme/type used for the validator keys. \ Currently supports ed25519 and secp256k1.", )) - .arg(VALIDATOR_ACCOUNT_KEY.def().help( - "A public key for the validator account. A new one will \ - be generated if none given.", + .arg(VALIDATOR_ACCOUNT_KEYS.def().help( + "A list public keys to be associated with the new account \ + in hexadecimal encoding. A new one will be generated if \ + none given.", )) .arg(VALIDATOR_CONSENSUS_KEY.def().help( "A consensus key for the validator account. A new one \ @@ -3415,38 +3550,53 @@ pub mod args { "UNSAFE: Do not encrypt the generated keypairs. Do not \ use this for keys used in a live network.", )) + .arg(THRESOLD.def().help( + "The minimum number of signature to be provided for \ + authorization. Must be less then the maximum number of \ + public keys provided.", + )) } } - impl CliToSdk> for TxUpdateVp { - fn to_sdk(self, ctx: &mut Context) -> TxUpdateVp { - TxUpdateVp:: { + impl CliToSdk> for TxUpdateAccount { + fn to_sdk(self, ctx: &mut Context) -> TxUpdateAccount { + TxUpdateAccount:: { tx: self.tx.to_sdk(ctx), vp_code_path: self.vp_code_path, tx_code_path: self.tx_code_path, addr: ctx.get(&self.addr), + public_keys: self + .public_keys + .iter() + .map(|pk| ctx.get_cached(pk)) + .collect(), + threshold: self.threshold, } } } - impl Args for TxUpdateVp { + impl Args for TxUpdateAccount { fn parse(matches: &ArgMatches) -> Self { let tx = Tx::parse(matches); - let vp_code_path = CODE_PATH.parse(matches); + let vp_code_path = CODE_PATH_OPT.parse(matches); let addr = ADDRESS.parse(matches); - let tx_code_path = PathBuf::from(TX_UPDATE_VP_WASM); + let tx_code_path = PathBuf::from(TX_UPDATE_ACCOUNT_WASM); + let public_keys = PUBLIC_KEYS.parse(matches); + let threshold = THRESOLD.parse(matches); Self { tx, vp_code_path, addr, tx_code_path, + public_keys, + threshold, } } fn def(app: App) -> App { app.add_args::>() .arg( - CODE_PATH.def().help( + CODE_PATH_OPT.def().help( "The path to the new validity predicate WASM code.", ), ) @@ -3454,6 +3604,15 @@ pub mod args { "The account's address. It's key is used to produce the \ signature.", )) + .arg(PUBLIC_KEYS.def().help( + "A list public keys to be associated with the new account \ + in hexadecimal encoding.", + )) + .arg(THRESOLD.def().help( + "The minimum number of signature to be provided for \ + authorization. Must be less then the maximum number of \ + public keys provided.", + )) } } @@ -3557,26 +3716,15 @@ pub mod args { )) } } - #[derive(Clone, Debug)] - pub struct InitProposal { - /// Common tx arguments - pub tx: Tx, - /// The proposal file path - pub proposal_data: PathBuf, - /// Flag if proposal should be run offline - pub offline: bool, - /// Native token address - pub native_token: C::NativeAddress, - /// Path to the TX WASM code file - pub tx_code_path: PathBuf, - } impl CliToSdk> for InitProposal { fn to_sdk(self, ctx: &mut Context) -> InitProposal { InitProposal:: { tx: self.tx.to_sdk(ctx), - proposal_data: self.proposal_data, - offline: self.offline, + proposal_data: std::fs::read(self.proposal_data).expect(""), + is_offline: self.is_offline, + is_pgf_stewards: self.is_pgf_stewards, + is_pgf_funding: self.is_pgf_funding, native_token: ctx.native_token.clone(), tx_code_path: self.tx_code_path, } @@ -3587,15 +3735,19 @@ pub mod args { fn parse(matches: &ArgMatches) -> Self { let tx = Tx::parse(matches); let proposal_data = DATA_PATH.parse(matches); - let offline = PROPOSAL_OFFLINE.parse(matches); + let is_offline = PROPOSAL_OFFLINE.parse(matches); + let is_pgf_stewards = PROPOSAL_PGF_STEWARD.parse(matches); + let is_pgf_funding = PROPOSAL_PGF_FUNDING.parse(matches); let tx_code_path = PathBuf::from(TX_INIT_PROPOSAL); Self { tx, proposal_data, - offline, native_token: (), tx_code_path, + is_offline, + is_pgf_stewards, + is_pgf_funding, } } @@ -3607,42 +3759,66 @@ pub mod args { .arg( PROPOSAL_OFFLINE .def() - .help("Flag if the proposal vote should run offline."), + .help( + "Flag if the proposal should be serialized \ + offline (only for default types).", + ) + .conflicts_with_all([ + PROPOSAL_PGF_FUNDING.name, + PROPOSAL_PGF_STEWARD.name, + PROPOSAL_ETH.name, + ]), + ) + .arg( + PROPOSAL_ETH + .def() + .help("Flag if the proposal is of type eth.") + .conflicts_with_all([ + PROPOSAL_PGF_FUNDING.name, + PROPOSAL_PGF_STEWARD.name, + ]), + ) + .arg( + PROPOSAL_PGF_STEWARD + .def() + .help( + "Flag if the proposal is of type pgf-stewards. \ + Used to elect/remove stewards.", + ) + .conflicts_with_all([ + PROPOSAL_ETH.name, + PROPOSAL_PGF_FUNDING.name, + ]), + ) + .arg( + PROPOSAL_PGF_FUNDING + .def() + .help( + "Flag if the proposal is of type pgf-funding. \ + Used to control continous/retro pgf fundings.", + ) + .conflicts_with_all([ + PROPOSAL_ETH.name, + PROPOSAL_PGF_STEWARD.name, + ]), ) } } - #[derive(Clone, Debug)] - pub struct VoteProposal { - /// Common tx arguments - pub tx: Tx, - /// Proposal id - pub proposal_id: Option, - /// The vote - pub vote: String, - /// PGF proposal - pub proposal_pgf: Option, - /// ETH proposal - pub proposal_eth: Option, - /// Flag if proposal vote should be run offline - pub offline: bool, - /// The proposal file path - pub proposal_data: Option, - /// Path to the TX WASM code file - pub tx_code_path: PathBuf, - } - impl CliToSdk> for VoteProposal { fn to_sdk(self, ctx: &mut Context) -> VoteProposal { VoteProposal:: { tx: self.tx.to_sdk(ctx), proposal_id: self.proposal_id, vote: self.vote, - offline: self.offline, - proposal_data: self.proposal_data, + voter: ctx.get(&self.voter), + is_offline: self.is_offline, + proposal_data: self.proposal_data.map(|path| { + println!("Not able to read {}.", path.to_string_lossy()); + std::fs::read(path) + .expect("Should be able to read the file.") + }), tx_code_path: self.tx_code_path.to_path_buf(), - proposal_pgf: self.proposal_pgf, - proposal_eth: self.proposal_eth, } } } @@ -3651,10 +3827,9 @@ pub mod args { fn parse(matches: &ArgMatches) -> Self { let tx = Tx::parse(matches); let proposal_id = PROPOSAL_ID_OPT.parse(matches); - let proposal_pgf = PROPOSAL_VOTE_PGF_OPT.parse(matches); - let proposal_eth = PROPOSAL_VOTE_ETH_OPT.parse(matches); let vote = PROPOSAL_VOTE.parse(matches); - let offline = PROPOSAL_OFFLINE.parse(matches); + let voter = ADDRESS.parse(matches); + let is_offline = PROPOSAL_OFFLINE.parse(matches); let proposal_data = DATA_PATH_OPT.parse(matches); let tx_code_path = PathBuf::from(TX_VOTE_PROPOSAL); @@ -3662,9 +3837,8 @@ pub mod args { tx, proposal_id, vote, - proposal_pgf, - proposal_eth, - offline, + is_offline, + voter, proposal_data, tx_code_path, } @@ -3684,29 +3858,7 @@ pub mod args { .arg( PROPOSAL_VOTE .def() - .help("The vote for the proposal. Either yay or nay"), - ) - .arg( - PROPOSAL_VOTE_PGF_OPT - .def() - .help( - "The list of proposed councils and spending \ - caps:\n$council1 $cap1 $council2 $cap2 ... \ - (council is bech32m encoded address, cap is \ - expressed in microNAM", - ) - .requires(PROPOSAL_ID.name) - .conflicts_with(PROPOSAL_VOTE_ETH_OPT.name), - ) - .arg( - PROPOSAL_VOTE_ETH_OPT - .def() - .help( - "The signing key and message bytes (hex encoded) \ - to be signed: $signing_key $message", - ) - .requires(PROPOSAL_ID.name) - .conflicts_with(PROPOSAL_VOTE_PGF_OPT.name), + .help("The vote for the proposal. Either yay or nay."), ) .arg( PROPOSAL_OFFLINE @@ -3721,8 +3873,10 @@ pub mod args { "The data path file (json) that describes the \ proposal.", ) + .requires(PROPOSAL_OFFLINE.name) .conflicts_with(PROPOSAL_ID.name), ) + .arg(ADDRESS.def().help("The address of the voter.")) } } @@ -3767,7 +3921,7 @@ pub mod args { } fn def(app: App) -> App { - app.add_args::>() + app.add_args::>() .arg(PROPOSAL_ID_OPT.def().help("The proposal identifier.")) } } @@ -3812,7 +3966,15 @@ pub mod args { fn def(app: App) -> App { app.add_args::>() - .arg(PROPOSAL_ID_OPT.def().help("The proposal identifier.")) + .arg( + PROPOSAL_ID_OPT + .def() + .help("The proposal identifier.") + .conflicts_with_all([ + PROPOSAL_OFFLINE.name, + DATA_PATH_OPT.name, + ]), + ) .arg( PROPOSAL_OFFLINE .def() @@ -3820,16 +3982,18 @@ pub mod args { "Flag if the proposal result should run on \ offline data.", ) - .conflicts_with(PROPOSAL_ID.name), + .conflicts_with(PROPOSAL_ID.name) + .requires(DATA_PATH_OPT.name), ) .arg( DATA_PATH_OPT .def() .help( "The path to the folder containing the proposal \ - json and votes", + and votes files in json format.", ) - .conflicts_with(PROPOSAL_ID.name), + .conflicts_with(PROPOSAL_ID.name) + .requires(PROPOSAL_OFFLINE.name), ) } } @@ -3859,6 +4023,26 @@ pub mod args { } } + impl CliToSdk> for QueryPgf { + fn to_sdk(self, ctx: &mut Context) -> QueryPgf { + QueryPgf:: { + query: self.query.to_sdk(ctx), + } + } + } + + impl Args for QueryPgf { + fn parse(matches: &ArgMatches) -> Self { + let query = Query::parse(matches); + + Self { query } + } + + fn def(app: App) -> App { + app.add_args::>() + } + } + impl CliToSdk> for Withdraw { fn to_sdk(self, ctx: &mut Context) -> Withdraw { Withdraw:: { @@ -3932,6 +4116,32 @@ pub mod args { } } + impl CliToSdk> for QueryAccount { + fn to_sdk(self, ctx: &mut Context) -> QueryAccount { + QueryAccount:: { + query: self.query.to_sdk(ctx), + owner: ctx.get(&self.owner), + } + } + } + + impl Args for QueryAccount { + fn parse(matches: &ArgMatches) -> Self { + let query = Query::parse(matches); + let owner = OWNER.parse(matches); + Self { query, owner } + } + + fn def(app: App) -> App { + app.add_args::>().arg( + OWNER + .def() + .help("The substorage space address to query.") + .required(true), + ) + } + } + impl CliToSdk> for QueryBalance { fn to_sdk(self, ctx: &mut Context) -> QueryBalance { QueryBalance:: { @@ -4188,6 +4398,39 @@ pub mod args { } } + impl CliToSdk> for SignTx { + fn to_sdk(self, ctx: &mut Context) -> SignTx { + SignTx:: { + tx: self.tx.to_sdk(ctx), + tx_data: std::fs::read(self.tx_data).expect(""), + owner: ctx.get(&self.owner), + } + } + } + + impl Args for SignTx { + fn parse(matches: &ArgMatches) -> Self { + let tx = Tx::parse(matches); + let tx_path = TX_PATH.parse(matches); + let owner = OWNER.parse(matches); + Self { + tx, + tx_data: tx_path, + owner, + } + } + + fn def(app: App) -> App { + app.add_args::>() + .arg( + TX_PATH.def().help( + "The path to the tx file with the serialized tx.", + ), + ) + .arg(OWNER.def().help("The address of the account owner")) + } + } + impl CliToSdk> for QueryCommissionRate { fn to_sdk(self, ctx: &mut Context) -> QueryCommissionRate { QueryCommissionRate:: { @@ -4342,19 +4585,29 @@ pub mod args { Tx:: { dry_run: self.dry_run, dump_tx: self.dump_tx, + output_folder: self.output_folder, force: self.force, broadcast_only: self.broadcast_only, ledger_address: (), initialized_account_alias: self.initialized_account_alias, wallet_alias_force: self.wallet_alias_force, - fee_amount: self.fee_amount, - fee_token: ctx.get(&self.fee_token), + gas_payer: ctx.get_opt_cached(&self.gas_payer), + gas_amount: self.gas_amount, + gas_token: ctx.get(&self.gas_token), gas_limit: self.gas_limit, - signing_key: self.signing_key.map(|x| ctx.get_cached(&x)), + signing_keys: self + .signing_keys + .iter() + .map(|key| ctx.get_cached(key)) + .collect(), + signatures: self + .signatures + .iter() + .map(|path| std::fs::read(path).unwrap()) + .collect(), verification_key: self .verification_key - .map(|x| ctx.get_cached(&x)), - signer: self.signer.map(|x| ctx.get(&x)), + .map(|public_key| ctx.get_cached(&public_key)), tx_reveal_code_path: self.tx_reveal_code_path, password: self.password, expiration: self.expiration, @@ -4396,6 +4649,10 @@ pub mod args { .arg(WALLET_ALIAS_FORCE.def().help( "Override the alias without confirmation if it already exists.", )) + .arg(GAS_PAYER.def().help( + "The implicit address of the gas payer. It defaults to the \ + address associated to the first key passed to --signing-keys.", + )) .arg(GAS_AMOUNT.def().help( "The amount being paid for the inclusion of this transaction", )) @@ -4412,26 +4669,35 @@ pub mod args { 12:12:12Z\n2012- 12-12T12: 12:12Z", )) .arg( - SIGNING_KEY_OPT + SIGNING_KEYS .def() .help( "Sign the transaction with the key for the given \ public key, public key hash or alias from your \ wallet.", ) - .conflicts_with(SIGNER.name) - .conflicts_with(VERIFICATION_KEY.name), + .conflicts_with_all([ + SIGNATURES.name, + VERIFICATION_KEY.name, + ]), ) .arg( - SIGNER + SIGNATURES .def() .help( - "Sign the transaction with the keypair of the public \ - key of the given address.", + "List of file paths containing a serialized signature \ + to be attached to a transaction. Requires to provide \ + a gas payer.", ) - .conflicts_with(SIGNING_KEY_OPT.name) - .conflicts_with(VERIFICATION_KEY.name), + .conflicts_with_all([ + SIGNING_KEYS.name, + VERIFICATION_KEY.name, + ]) + .requires(GAS_PAYER.name), ) + .arg(OUTPUT_FOLDER_PATH.def().help( + "The output folder path where the artifact will be stored.", + )) .arg( VERIFICATION_KEY .def() @@ -4440,8 +4706,7 @@ pub mod args { public key, public key hash or alias from your \ wallet.", ) - .conflicts_with(SIGNER.name) - .conflicts_with(SIGNING_KEY_OPT.name), + .conflicts_with_all([SIGNING_KEYS.name, SIGNATURES.name]), ) .arg(CHAIN_ID_OPT.def().help("The chain ID.")) } @@ -4454,17 +4719,19 @@ pub mod args { let ledger_address = LEDGER_ADDRESS_DEFAULT.parse(matches); let initialized_account_alias = ALIAS_OPT.parse(matches); let wallet_alias_force = WALLET_ALIAS_FORCE.parse(matches); - let fee_amount = + let gas_payer = GAS_PAYER.parse(matches); + let gas_amount = InputAmount::Unvalidated(GAS_AMOUNT.parse(matches)); - let fee_token = GAS_TOKEN.parse(matches); + let gas_token = GAS_TOKEN.parse(matches); let gas_limit = GAS_LIMIT.parse(matches).amount.into(); let expiration = EXPIRATION_OPT.parse(matches); - let signing_key = SIGNING_KEY_OPT.parse(matches); + let signing_keys = SIGNING_KEYS.parse(matches); + let signatures = SIGNATURES.parse(matches); let verification_key = VERIFICATION_KEY.parse(matches); - let signer = SIGNER.parse(matches); let tx_reveal_code_path = PathBuf::from(TX_REVEAL_PK); let chain_id = CHAIN_ID_OPT.parse(matches); let password = None; + let output_folder = OUTPUT_FOLDER_PATH.parse(matches); Self { dry_run, dump_tx, @@ -4473,16 +4740,18 @@ pub mod args { ledger_address, initialized_account_alias, wallet_alias_force, - fee_amount, - fee_token, + gas_payer, + gas_amount, + gas_token, gas_limit, expiration, - signing_key, + signing_keys, + signatures, verification_key, - signer, tx_reveal_code_path, password, chain_id, + output_folder, } } } diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 6980874fc6a..68ec1728ba5 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -1,5 +1,6 @@ use color_eyre::eyre::{eyre, Report, Result}; use namada::ledger::eth_bridge::bridge_pool; +use namada::ledger::tx::dump_tx; use namada::ledger::{signing, tx as sdk_tx}; use namada::types::control_flow::ProceedOrElse; use namada::types::io::Io; @@ -80,7 +81,7 @@ impl CliApi { tx::submit_ibc_transfer::<_, IO>(&client, ctx, args) .await?; } - Sub::TxUpdateVp(TxUpdateVp(mut args)) => { + Sub::TxUpdateAccount(TxUpdateAccount(mut args)) => { let client = client.unwrap_or_else(|| { C::from_tendermint_address( &mut args.tx.ledger_address, @@ -91,8 +92,10 @@ impl CliApi { .await .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); - tx::submit_update_vp::<_, IO>(&client, &mut ctx, args) - .await?; + tx::submit_update_account::<_, IO>( + &client, &mut ctx, args, + ) + .await?; } Sub::TxInitAccount(TxInitAccount(mut args)) => { let client = client.unwrap_or_else(|| { @@ -250,37 +253,59 @@ impl CliApi { .proceed_or_else(error)?; let args = args.to_sdk(&mut ctx); let tx_args = args.tx.clone(); - let (mut tx, addr, pk) = - bridge_pool::build_bridge_pool_tx::<_, _, IO>( + + let default_signer = Some(args.sender.clone()); + let signing_data = + signing::aux_signing_data::<_, _, IO>( &client, &mut ctx.wallet, - args, + &args.tx, + &Some(args.sender.clone()), + default_signer, ) - .await - .unwrap(); - tx::submit_reveal_aux::<_, IO>( - &client, - &mut ctx, - &tx_args, - addr, - pk.clone(), - &mut tx, - ) - .await?; - signing::sign_tx( - &mut ctx.wallet, - &mut tx, - &tx_args, - &pk, - ) - .await?; - sdk_tx::process_tx::<_, _, IO>( + .await?; + + let mut tx = + bridge_pool::build_bridge_pool_tx::<_, IO>( + &client, + args.clone(), + signing_data.gas_payer.clone(), + ) + .await?; + + signing::generate_test_vector::<_, _, IO>( &client, &mut ctx.wallet, - &tx_args, - tx, + &tx, ) - .await?; + .await; + + if args.tx.dump_tx { + dump_tx::(&args.tx, tx); + } else { + tx::submit_reveal_aux::<_, IO>( + &client, + &mut ctx, + tx_args.clone(), + &args.sender, + ) + .await?; + + signing::sign_tx( + &mut ctx.wallet, + &tx_args, + &mut tx, + signing_data, + ); + + sdk_tx::process_tx::<_, _, IO>( + &client, + &mut ctx.wallet, + &tx_args, + tx, + ) + .await?; + } } Sub::TxUnjailValidator(TxUnjailValidator(mut args)) => { let client = client.unwrap_or_else(|| { @@ -562,6 +587,45 @@ impl CliApi { rpc::query_protocol_parameters::<_, IO>(&client, args) .await; } + Sub::QueryPgf(QueryPgf(mut args)) => { + let client = client.unwrap_or_else(|| { + C::from_tendermint_address( + &mut args.query.ledger_address, + ) + }); + client + .wait_until_node_is_synced::() + .await + .proceed_or_else(error)?; + let args = args.to_sdk(&mut ctx); + rpc::query_pgf::<_, IO>(&client, args).await; + } + Sub::QueryAccount(QueryAccount(mut args)) => { + let client = client.unwrap_or_else(|| { + C::from_tendermint_address( + &mut args.query.ledger_address, + ) + }); + client + .wait_until_node_is_synced::() + .await + .proceed_or_else(error)?; + let args = args.to_sdk(&mut ctx); + rpc::query_account::<_, IO>(&client, args).await; + } + Sub::SignTx(SignTx(mut args)) => { + let client = client.unwrap_or_else(|| { + C::from_tendermint_address( + &mut args.tx.ledger_address, + ) + }); + client + .wait_until_node_is_synced::() + .await + .proceed_or_else(error)?; + let args = args.to_sdk(&mut ctx); + tx::sign_tx::<_, IO>(&client, &mut ctx, args).await?; + } } } cli::NamadaClient::WithoutContext(cmd, global_args) => match cmd { diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index c35298976c5..4ae8e4adbc3 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -225,6 +225,27 @@ where } } +impl ArgMulti> +where + T: FromStr, + ::Err: Debug, +{ + pub fn def(&self) -> ClapArg { + ClapArg::new(self.name) + .long(self.name) + .num_args(1..) + .value_delimiter(',') + } + + pub fn parse(&self, matches: &ArgMatches) -> Vec> { + matches + .get_many(self.name) + .unwrap_or_default() + .map(|raw: &String| FromContext::new(raw.to_string())) + .collect() + } +} + impl ArgDefaultFromCtx> where T: FromStr, diff --git a/apps/src/lib/client/mod.rs b/apps/src/lib/client/mod.rs index 57f3c5a043d..8862c5a5643 100644 --- a/apps/src/lib/client/mod.rs +++ b/apps/src/lib/client/mod.rs @@ -1,4 +1,3 @@ pub mod rpc; -pub mod signing; pub mod tx; pub mod utils; diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index efdc8ee8c3f..a49be3f89e9 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -2,10 +2,9 @@ use std::cmp::Ordering; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; -use std::fs::File; +use std::fs::{self, read_dir}; use std::io; use std::iter::Iterator; -use std::path::PathBuf; use std::str::FromStr; use borsh::{BorshDeserialize, BorshSerialize}; @@ -15,22 +14,28 @@ use masp_primitives::asset_type::AssetType; use masp_primitives::merkle_tree::MerklePath; use masp_primitives::sapling::{Node, ViewingKey}; use masp_primitives::zip32::ExtendedFullViewingKey; -use namada::core::types::transaction::governance::ProposalType; +use namada::core::ledger::governance::cli::offline::{ + find_offline_proposal, find_offline_votes, read_offline_files, + OfflineSignedProposal, OfflineVote, +}; +use namada::core::ledger::governance::parameters::GovernanceParameters; +use namada::core::ledger::governance::storage::keys as governance_storage; +use namada::core::ledger::governance::storage::proposal::{ + PGFTarget, StorageProposal, +}; +use namada::core::ledger::governance::utils::{ + compute_proposal_result, ProposalVotes, TallyType, TallyVote, VotePower, +}; use namada::ledger::events::Event; -use namada::ledger::governance::parameters::GovParams; -use namada::ledger::governance::storage as gov_storage; use namada::ledger::masp::{ Conversions, MaspAmount, MaspChange, PinnedBalanceError, ShieldedContext, ShieldedUtils, }; -use namada::ledger::native_vp::governance::utils::{self, Votes}; use namada::ledger::parameters::{storage as param_storage, EpochDuration}; -use namada::ledger::pos::{ - self, BondId, BondsAndUnbondsDetail, CommissionPair, PosParams, Slash, -}; +use namada::ledger::pos::{CommissionPair, PosParams, Slash}; use namada::ledger::queries::RPC; use namada::ledger::rpc::{ - enriched_bonds_and_unbonds, format_denominated_amount, query_epoch, + self, enriched_bonds_and_unbonds, format_denominated_amount, query_epoch, TxResponse, }; use namada::ledger::storage::ConversionState; @@ -38,9 +43,6 @@ use namada::ledger::wallet::{AddressVpType, Wallet}; use namada::proof_of_stake::types::{ValidatorState, WeightedValidator}; use namada::types::address::{masp, Address}; use namada::types::control_flow::ProceedOrElse; -use namada::types::governance::{ - OfflineProposal, OfflineVote, ProposalVote, VotePower, VoteType, -}; use namada::types::hash::Hash; use namada::types::io::Io; use namada::types::key::*; @@ -377,7 +379,7 @@ pub async fn query_transparent_balance< client, &token, balance, ) .await; - println!("{}: {}", token_alias, balance); + display_line!(IO, "{}: {}", token_alias, balance); } } } @@ -650,162 +652,51 @@ pub async fn query_proposal< client: &C, args: args::QueryProposal, ) { - async fn print_proposal< - C: namada::ledger::queries::Client + Sync, - IO: Io, - >( - client: &C, - id: u64, - current_epoch: Epoch, - details: bool, - ) -> Option<()> { - let author_key = gov_storage::get_author_key(id); - let start_epoch_key = gov_storage::get_voting_start_epoch_key(id); - let end_epoch_key = gov_storage::get_voting_end_epoch_key(id); - let proposal_type_key = gov_storage::get_proposal_type_key(id); - - let author = - query_storage_value::(client, &author_key).await?; - let start_epoch = - query_storage_value::(client, &start_epoch_key).await?; - let end_epoch = - query_storage_value::(client, &end_epoch_key).await?; - let proposal_type = - query_storage_value::(client, &proposal_type_key) - .await?; - - if details { - let content_key = gov_storage::get_content_key(id); - let grace_epoch_key = gov_storage::get_grace_epoch_key(id); - let content = query_storage_value::>( - client, - &content_key, - ) - .await?; - let grace_epoch = - query_storage_value::(client, &grace_epoch_key) - .await?; - - display_line!(IO, "Proposal: {}", id); - display_line!(IO, "{:4}Type: {}", "", proposal_type); - display_line!(IO, "{:4}Author: {}", "", author); - display_line!(IO, "{:4}Content:", ""); - for (key, value) in &content { - display_line!(IO, "{:8}{}: {}", "", key, value); - } - display_line!(IO, "{:4}Start Epoch: {}", "", start_epoch); - display_line!(IO, "{:4}End Epoch: {}", "", end_epoch); - display_line!(IO, "{:4}Grace Epoch: {}", "", grace_epoch); - let votes = - get_proposal_votes::<_, IO>(client, start_epoch, id).await; - let total_stake = get_total_staked_tokens(client, start_epoch) + let current_epoch = query_and_print_epoch::<_, IO>(client).await; + + if let Some(id) = args.proposal_id { + let proposal = query_proposal_by_id(client, id).await; + if let Some(proposal) = proposal { + display_line!( + IO, + "{}", + proposal.to_string_with_status(current_epoch) + ); + } else { + edisplay_line!(IO, "No proposal found with id: {}", id); + } + } else { + let last_proposal_id_key = governance_storage::get_counter_key(); + let last_proposal_id = + query_storage_value::(client, &last_proposal_id_key) .await - .try_into() .unwrap(); - if start_epoch > current_epoch { - display_line!(IO, "{:4}Status: pending", ""); - } else if start_epoch <= current_epoch && current_epoch <= end_epoch - { - match utils::compute_tally(votes, total_stake, &proposal_type) { - Ok(partial_proposal_result) => { - display_line!( - IO, - "{:4}Yay votes: {}", - "", - partial_proposal_result.total_yay_power - ); - display_line!( - IO, - "{:4}Nay votes: {}", - "", - partial_proposal_result.total_nay_power - ); - display_line!(IO, "{:4}Status: on-going", ""); - } - Err(msg) => { - edisplay_line!( - IO, - "Error in tally computation: {}", - msg - ); - } - } - } else { - match utils::compute_tally(votes, total_stake, &proposal_type) { - Ok(proposal_result) => { - display_line!(IO, "{:4}Status: done", ""); - display_line!( - IO, - "{:4}Result: {}", - "", - proposal_result - ); - } - Err(msg) => { - edisplay_line!( - IO, - "Error in tally computation: {}", - msg - ); - } - } - } + + let from_id = if last_proposal_id > 10 { + last_proposal_id - 10 } else { - display_line!(IO, "Proposal: {}", id); - display_line!(IO, "{:4}Type: {}", "", proposal_type); - display_line!(IO, "{:4}Author: {}", "", author); - display_line!(IO, "{:4}Start Epoch: {}", "", start_epoch); - display_line!(IO, "{:4}End Epoch: {}", "", end_epoch); - if start_epoch > current_epoch { - display_line!(IO, "{:4}Status: pending", ""); - } else if start_epoch <= current_epoch && current_epoch <= end_epoch - { - display_line!(IO, "{:4}Status: on-going", ""); - } else { - display_line!(IO, "{:4}Status: done", ""); - } - } + 0 + }; - Some(()) - } + display_line!(IO, "id: {}", last_proposal_id); - let current_epoch = query_and_print_epoch::<_, IO>(client).await; - match args.proposal_id { - Some(id) => { - if print_proposal::(client, id, current_epoch, true) + for id in from_id..last_proposal_id { + let proposal = query_proposal_by_id(client, id) .await - .is_none() - { - edisplay_line!( - IO, - "No valid proposal was found with id {}", - id - ); - } - } - None => { - let last_proposal_id_key = gov_storage::get_counter_key(); - let last_proposal_id = - query_storage_value::(client, &last_proposal_id_key) - .await - .unwrap(); - - for id in 0..last_proposal_id { - if print_proposal::(client, id, current_epoch, false) - .await - .is_none() - { - edisplay_line!( - IO, - "No valid proposal was found with id {}", - id - ); - }; - } + .expect("Proposal should be written to storage."); + display_line!(IO, "{}", proposal); } } } +/// Query proposal by Id +pub async fn query_proposal_by_id( + client: &C, + proposal_id: u64, +) -> Option { + namada::ledger::rpc::query_proposal_by_id(client, proposal_id).await +} + /// Query token shielded balance(s) pub async fn query_shielded_balance< C: namada::ledger::queries::Client + Sync, @@ -1119,196 +1010,159 @@ pub async fn query_proposal_result< client: &C, args: args::QueryProposalResult, ) { - let current_epoch = query_epoch(client).await; + if args.proposal_id.is_some() { + let proposal_id = + args.proposal_id.expect("Proposal id should be defined."); + let proposal = if let Some(proposal) = + query_proposal_by_id(client, proposal_id).await + { + proposal + } else { + edisplay_line!(IO, "Proposal {} not found.", proposal_id); + return; + }; - match args.proposal_id { - Some(id) => { - let end_epoch_key = gov_storage::get_voting_end_epoch_key(id); - let end_epoch = - query_storage_value::(client, &end_epoch_key).await; - - match end_epoch { - Some(end_epoch) => { - if current_epoch > end_epoch { - let votes = - get_proposal_votes::<_, IO>(client, end_epoch, id) - .await; - let proposal_type_key = - gov_storage::get_proposal_type_key(id); - let proposal_type = query_storage_value::< - C, - ProposalType, - >( - client, &proposal_type_key - ) - .await - .expect("Could not read proposal type from storage"); - let total_stake = - get_total_staked_tokens(client, end_epoch) - .await - .try_into() - .unwrap(); - display_line!(IO, "Proposal: {}", id); - match utils::compute_tally( - votes, - total_stake, - &proposal_type, - ) { - Ok(proposal_result) => { - display_line!( - IO, - "{:4}Result: {}", - "", - proposal_result - ); - } - Err(msg) => { - edisplay_line!( - IO, - "Error in tally computation: {}", - msg - ); - } - } - } else { - edisplay_line!(IO, "Proposal is still in progress."); - cli::safe_exit(1) - } - } - None => { - edisplay_line!(IO, "Error while retriving proposal."); - cli::safe_exit(1) - } - } - } - None => { - if args.offline { - match args.proposal_folder { - Some(path) => { - let mut dir = tokio::fs::read_dir(&path) - .await - .expect("Should be able to read the directory."); - let mut files = HashSet::new(); - let mut is_proposal_present = false; - - while let Some(entry) = - dir.next_entry().await.transpose() - { - match entry { - Ok(entry) => match entry.file_type().await { - Ok(entry_stat) => { - if entry_stat.is_file() { - if entry.file_name().eq(&"proposal") - { - is_proposal_present = true - } else if entry - .file_name() - .to_string_lossy() - .starts_with("proposal-vote-") - { - // Folder may contain other - // files than just the proposal - // and the votes - files.insert(entry.path()); - } - } - } - Err(e) => { - edisplay_line!( - IO, - "Can't read entry type: {}.", - e - ); - cli::safe_exit(1) - } - }, - Err(e) => { - edisplay_line!( - IO, - "Can't read entry: {}.", - e - ); - cli::safe_exit(1) - } - } - } + let tally_type = proposal.get_tally_type(); + let total_voting_power = + get_total_staked_tokens(client, proposal.voting_end_epoch).await; - if !is_proposal_present { - edisplay_line!( - IO, - "The folder must contain the offline proposal \ - in a file named \"proposal\"" - ); - cli::safe_exit(1) - } + let votes = compute_proposal_votes( + client, + proposal_id, + proposal.voting_end_epoch, + ) + .await; - let file = File::open(path.join("proposal")) - .expect("Proposal file must exist."); - let proposal: OfflineProposal = - serde_json::from_reader(file).expect( - "JSON was not well-formatted for proposal.", - ); - - let public_key = - get_public_key(client, &proposal.address) - .await - .expect("Public key should exist."); - - if !proposal.check_signature(&public_key) { - edisplay_line!(IO, "Bad proposal signature."); - cli::safe_exit(1) - } + let proposal_result = + compute_proposal_result(votes, total_voting_power, tally_type); - let votes = get_proposal_offline_votes( - client, - proposal.clone(), - files, - ) - .await; - let total_stake = get_total_staked_tokens( - client, - proposal.tally_epoch, - ) - .await - .try_into() - .unwrap(); - match utils::compute_tally( - votes, - total_stake, - &ProposalType::Default(None), - ) { - Ok(proposal_result) => { - display_line!( - IO, - "{:4}Result: {}", - "", - proposal_result - ); - } - Err(msg) => { - edisplay_line!( - IO, - "Error in tally computation: {}", - msg - ); - } - } - } - None => { - edisplay_line!( - IO, - "Offline flag must be followed by data-path." - ); - cli::safe_exit(1) - } - }; + display_line!(IO, "Proposal Id: {} ", proposal_id); + display_line!(IO, "{:4}{}", "", proposal_result); + } else { + let proposal_folder = args.proposal_folder.expect( + "The argument --proposal-folder is required with --offline.", + ); + let data_directory = read_dir(&proposal_folder).unwrap_or_else(|_| { + panic!( + "Should be able to read {} directory.", + proposal_folder.to_string_lossy() + ) + }); + let files = read_offline_files(data_directory); + let proposal_path = find_offline_proposal(&files); + + let proposal = if let Some(path) = proposal_path { + let proposal_file = + fs::File::open(path).expect("file should open read only"); + let proposal: OfflineSignedProposal = + serde_json::from_reader(proposal_file) + .expect("file should be proper JSON"); + + let author_account = + rpc::get_account_info(client, &proposal.proposal.author) + .await + .expect("Account should exist."); + + let proposal = proposal.validate( + &author_account.public_keys_map, + author_account.threshold, + ); + + if proposal.is_ok() { + proposal.unwrap() } else { - edisplay_line!( + edisplay_line!(IO, "The offline proposal is not valid."); + return; + } + } else { + edisplay_line!( + IO, + "Couldn't find a file name offline_proposal_*.json." + ); + return; + }; + + let votes = find_offline_votes(&files) + .iter() + .map(|path| { + let vote_file = fs::File::open(path).expect(""); + let vote: OfflineVote = + serde_json::from_reader(vote_file).expect(""); + vote + }) + .collect::>(); + + let proposal_votes = compute_offline_proposal_votes::<_, IO>( + client, + &proposal, + votes.clone(), + ) + .await; + let total_voting_power = + get_total_staked_tokens(client, proposal.proposal.tally_epoch) + .await; + + let proposal_result = compute_proposal_result( + proposal_votes, + total_voting_power, + TallyType::TwoThird, + ); + + display_line!(IO, "Proposal offline: {}", proposal.proposal.hash()); + display_line!(IO, "Parsed {} votes.", votes.len()); + display_line!(IO, "{:4}{}", "", proposal_result); + } +} + +pub async fn query_account< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( + client: &C, + args: args::QueryAccount, +) { + let account = rpc::get_account_info(client, &args.owner).await; + if let Some(account) = account { + display_line!(IO, "Address: {}", account.address); + display_line!(IO, "Threshold: {}", account.threshold); + display_line!(IO, "Public keys:"); + for (public_key, _) in account.public_keys_map.pk_to_idx { + display_line!(IO, "- {}", public_key); + } + } else { + display_line!(IO, "No account exists for {}", args.owner); + } +} + +pub async fn query_pgf( + client: &C, + _args: args::QueryPgf, +) { + let stewards = query_pgf_stewards(client).await; + let fundings = query_pgf_fundings(client).await; + + match stewards.len() { + 0 => display_line!(IO, "Pgf stewards: no stewards are currectly set."), + _ => { + display_line!(IO, "Pgf stewards:"); + for steward in stewards { + display_line!(IO, "{:4}- {}", "", steward); + } + } + } + + match fundings.len() { + 0 => display_line!(IO, "Pgf fundings: no fundings are currently set."), + _ => { + display_line!(IO, "Pgf fundings:"); + for payment in fundings { + display_line!(IO, "{:4}- {}", "", payment.target); + display_line!( IO, - "Either --proposal-id or --data-path should be provided \ - as arguments." + "{:6}{}", + "", + payment.amount.to_string_native() ); - cli::safe_exit(1) } } } @@ -1321,7 +1175,7 @@ pub async fn query_protocol_parameters< client: &C, _args: args::QueryProtocolParameters, ) { - let gov_parameters = get_governance_parameters(client).await; + let gov_parameters = query_governance_parameters(client).await; display_line!(IO, "Governance Parameters\n {:4}", gov_parameters); display_line!(IO, "Protocol parameters"); @@ -1361,10 +1215,7 @@ pub async fn query_protocol_parameters< display_line!(IO, "{:4}Transactions whitelist: {:?}", "", tx_whitelist); display_line!(IO, "PoS parameters"); - let key = pos::params_key(); - let pos_params = query_storage_value::(client, &key) - .await - .expect("Parameter should be defined."); + let pos_params = query_pos_parameters(client).await; display_line!( IO, "{:4}Block proposer reward: {}", @@ -1431,6 +1282,30 @@ pub async fn query_unbond_with_slashing< ) } +pub async fn query_pos_parameters( + client: &C, +) -> PosParams { + unwrap_client_response::( + RPC.vp().pos().pos_params(client).await, + ) +} + +pub async fn query_pgf_stewards( + client: &C, +) -> BTreeSet
{ + unwrap_client_response::>( + RPC.vp().pgf().stewards(client).await, + ) +} + +pub async fn query_pgf_fundings( + client: &C, +) -> BTreeSet { + unwrap_client_response::>( + RPC.vp().pgf().funding(client).await, + ) +} + pub async fn query_and_print_unbonds< C: namada::ledger::queries::Client + Sync, IO: Io, @@ -2036,8 +1911,9 @@ where pub async fn get_public_key( client: &C, address: &Address, + index: u8, ) -> Option { - namada::ledger::rpc::get_public_key(client, address).await + namada::ledger::rpc::get_public_key_at(client, address, index).await } /// Check if the given address is a known validator. @@ -2301,203 +2177,6 @@ pub async fn epoch_sleep( } } -pub async fn get_proposal_votes< - C: namada::ledger::queries::Client + Sync, - IO: Io, ->( - client: &C, - epoch: Epoch, - proposal_id: u64, -) -> Votes { - namada::ledger::rpc::get_proposal_votes::<_, IO>(client, epoch, proposal_id) - .await -} - -pub async fn get_proposal_offline_votes< - C: namada::ledger::queries::Client + Sync, ->( - client: &C, - proposal: OfflineProposal, - files: HashSet, -) -> Votes { - // let validators = get_all_validators(client, proposal.tally_epoch).await; - - let proposal_hash = proposal.compute_hash(); - - let mut yay_validators: HashMap = - HashMap::new(); - let mut delegators: HashMap< - Address, - HashMap, - > = HashMap::new(); - - for path in files { - let file = File::open(&path).expect("Proposal file must exist."); - let proposal_vote: OfflineVote = serde_json::from_reader(file) - .expect("JSON was not well-formatted for offline vote."); - - let key = pk_key(&proposal_vote.address); - let public_key = query_storage_value(client, &key) - .await - .expect("Public key should exist."); - - if !proposal_vote.proposal_hash.eq(&proposal_hash) - || !proposal_vote.check_signature(&public_key) - { - continue; - } - - if proposal_vote.vote.is_yay() - // && validators.contains(&proposal_vote.address) - && unwrap_client_response::( - RPC.vp().pos().is_validator(client, &proposal_vote.address).await, - ) - { - let amount: VotePower = get_validator_stake( - client, - proposal.tally_epoch, - &proposal_vote.address, - ) - .await - .unwrap_or_default() - .try_into() - .expect("Amount out of bounds"); - yay_validators.insert( - proposal_vote.address, - (amount, ProposalVote::Yay(VoteType::Default)), - ); - } else if is_delegator_at( - client, - &proposal_vote.address, - proposal.tally_epoch, - ) - .await - { - // TODO: decide whether to do this with `bond_with_slashing` RPC - // endpoint or with `bonds_and_unbonds` - let bonds_and_unbonds: pos::types::BondsAndUnbondsDetails = - unwrap_client_response::( - RPC.vp() - .pos() - .bonds_and_unbonds( - client, - &Some(proposal_vote.address.clone()), - &None, - ) - .await, - ); - for ( - BondId { - source: _, - validator, - }, - BondsAndUnbondsDetail { - bonds, - unbonds: _, - slashes: _, - }, - ) in bonds_and_unbonds - { - let mut delegated_amount = token::Amount::zero(); - for delta in bonds { - if delta.start <= proposal.tally_epoch { - delegated_amount += delta.amount - - delta.slashed_amount.unwrap_or_default(); - } - } - - let entry = delegators - .entry(proposal_vote.address.clone()) - .or_default(); - entry.insert( - validator, - ( - VotePower::try_from(delegated_amount).unwrap(), - proposal_vote.vote.clone(), - ), - ); - } - - // let key = pos::bonds_for_source_prefix(&proposal_vote.address); - // let bonds_iter = - // query_storage_prefix::(client, &key).await; - // if let Some(bonds) = bonds_iter { - // for (key, epoched_bonds) in bonds { - // // Look-up slashes for the validator in this key and - // // apply them if any - // let validator = - // pos::get_validator_address_from_bond(&key) - // .expect( - // "Delegation key should contain validator - // address.", ); - // let slashes_key = pos::validator_slashes_key(&validator); - // let slashes = query_storage_value::( - // client, - // &slashes_key, - // ) - // .await - // .unwrap_or_default(); - // let mut delegated_amount: token::Amount = 0.into(); - // let bond = epoched_bonds - // .get(proposal.tally_epoch) - // .expect("Delegation bond should be defined."); - // let mut to_deduct = bond.neg_deltas; - // for (start_epoch, &(mut delta)) in - // bond.pos_deltas.iter().sorted() - // { - // // deduct bond's neg_deltas - // if to_deduct > delta { - // to_deduct -= delta; - // // If the whole bond was deducted, continue to - // // the next one - // continue; - // } else { - // delta -= to_deduct; - // to_deduct = token::Amount::zero(); - // } - - // delta = apply_slashes( - // &slashes, - // delta, - // *start_epoch, - // None, - // None, - // ); - // delegated_amount += delta; - // } - - // let validator_address = - // pos::get_validator_address_from_bond(&key).expect( - // "Delegation key should contain validator - // address.", ); - // if proposal_vote.vote.is_yay() { - // let entry = yay_delegators - // .entry(proposal_vote.address.clone()) - // .or_default(); - // entry.insert( - // validator_address, - // VotePower::from(delegated_amount), - // ); - // } else { - // let entry = nay_delegators - // .entry(proposal_vote.address.clone()) - // .or_default(); - // entry.insert( - // validator_address, - // VotePower::from(delegated_amount), - // ); - // } - // } - // } - } - } - - Votes { - yay_validators, - delegators, - } -} - pub async fn get_bond_amount_at( client: &C, delegator: &Address, @@ -2556,12 +2235,23 @@ pub async fn get_delegators_delegation< namada::ledger::rpc::get_delegators_delegation(client, address).await } -pub async fn get_governance_parameters< +pub async fn get_delegators_delegation_at< C: namada::ledger::queries::Client + Sync, >( client: &C, -) -> GovParams { - namada::ledger::rpc::get_governance_parameters(client).await + address: &Address, + epoch: Epoch, +) -> HashMap { + namada::ledger::rpc::get_delegators_delegation_at(client, address, epoch) + .await +} + +pub async fn query_governance_parameters< + C: namada::ledger::queries::Client + Sync, +>( + client: &C, +) -> GovernanceParameters { + namada::ledger::rpc::query_governance_parameters(client).await } /// A helper to unwrap client's response. Will shut down process on error. @@ -2573,3 +2263,123 @@ fn unwrap_client_response( cli::safe_exit(1) }) } + +pub async fn compute_offline_proposal_votes< + C: namada::ledger::queries::Client + Sync, + IO: Io, +>( + client: &C, + proposal: &OfflineSignedProposal, + votes: Vec, +) -> ProposalVotes { + let mut validators_vote: HashMap = HashMap::default(); + let mut validator_voting_power: HashMap = + HashMap::default(); + let mut delegators_vote: HashMap = HashMap::default(); + let mut delegator_voting_power: HashMap< + Address, + HashMap, + > = HashMap::default(); + for vote in votes { + let is_validator = is_validator(client, &vote.address).await; + let is_delegator = is_delegator(client, &vote.address).await; + if is_validator { + let validator_stake = get_validator_stake( + client, + proposal.proposal.tally_epoch, + &vote.address, + ) + .await + .unwrap_or_default(); + validators_vote.insert(vote.address.clone(), vote.clone().into()); + validator_voting_power + .insert(vote.address.clone(), validator_stake); + } else if is_delegator { + let validators = get_delegators_delegation_at( + client, + &vote.address.clone(), + proposal.proposal.tally_epoch, + ) + .await; + + for validator in vote.delegations.clone() { + let delegator_stake = + validators.get(&validator).cloned().unwrap_or_default(); + + delegators_vote + .insert(vote.address.clone(), vote.clone().into()); + delegator_voting_power + .entry(vote.address.clone()) + .or_default() + .insert(validator, delegator_stake); + } + } else { + display_line!( + IO, + "Skipping vote, not a validator/delegator at epoch {}.", + proposal.proposal.tally_epoch + ); + } + } + + ProposalVotes { + validators_vote, + validator_voting_power, + delegators_vote, + delegator_voting_power, + } +} + +pub async fn compute_proposal_votes< + C: namada::ledger::queries::Client + Sync, +>( + client: &C, + proposal_id: u64, + epoch: Epoch, +) -> ProposalVotes { + let votes = + namada::ledger::rpc::query_proposal_votes(client, proposal_id).await; + + let mut validators_vote: HashMap = HashMap::default(); + let mut validator_voting_power: HashMap = + HashMap::default(); + let mut delegators_vote: HashMap = HashMap::default(); + let mut delegator_voting_power: HashMap< + Address, + HashMap, + > = HashMap::default(); + + for vote in votes { + if vote.is_validator() { + let validator_stake = + get_validator_stake(client, epoch, &vote.validator.clone()) + .await + .unwrap_or_default(); + + validators_vote.insert(vote.validator.clone(), vote.data.into()); + validator_voting_power.insert(vote.validator, validator_stake); + } else { + let delegator_stake = get_bond_amount_at( + client, + &vote.delegator, + &vote.validator, + epoch, + ) + .await + .unwrap_or_default(); + + delegators_vote.insert(vote.delegator.clone(), vote.data.into()); + delegator_voting_power + .entry(vote.delegator.clone()) + .or_default() + .insert(vote.validator, delegator_stake); + } + } + + ProposalVotes { + validators_vote, + validator_voting_power, + delegators_vote, + delegator_voting_power, + } +} diff --git a/apps/src/lib/client/signing.rs b/apps/src/lib/client/signing.rs index 34ee2bcc299..dd855b0d5e9 100644 --- a/apps/src/lib/client/signing.rs +++ b/apps/src/lib/client/signing.rs @@ -33,7 +33,7 @@ where /// signer. Return the given signing key or public key of the given signer if /// possible. If no explicit signer given, use the `default`. If no `default` /// is given, panics. -pub async fn tx_signer( +pub async fn tx_signers( client: &C, wallet: &mut Wallet, args: &args::Tx, @@ -44,7 +44,7 @@ where C::Error: std::fmt::Display, U: WalletUtils, { - namada::ledger::signing::tx_signer::( + namada::ledger::signing::tx_signers::( client, wallet, args, default, ) .await diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 1d6144454c9..3398c1686ff 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -1,4 +1,3 @@ -use std::collections::HashSet; use std::env; use std::fmt::Debug; use std::fs::{File, OpenOptions}; @@ -7,34 +6,29 @@ use std::path::PathBuf; use async_trait::async_trait; use borsh::{BorshDeserialize, BorshSerialize}; -use data_encoding::HEXLOWER_PERMISSIVE; use masp_proofs::prover::LocalTxProver; -use namada::ledger::governance::storage as gov_storage; +use namada::core::ledger::governance::cli::offline::{ + OfflineSignedProposal, OfflineVote, +}; +use namada::core::ledger::governance::cli::onchain::{ + DefaultProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, +}; use namada::ledger::queries::Client; use namada::ledger::rpc::{TxBroadcastData, TxResponse}; -use namada::ledger::signing::TxSigningKey; use namada::ledger::wallet::{Wallet, WalletUtils}; use namada::ledger::{masp, pos, signing, tx}; use namada::proof_of_stake::parameters::PosParams; -use namada::proto::{Code, Data, Section, Tx}; -use namada::types::address::Address; +use namada::proto::Tx; +use namada::types::address::{Address, ImplicitAddress}; use namada::types::dec::Dec; -use namada::types::governance::{ - OfflineProposal, OfflineVote, Proposal, ProposalVote, VoteType, -}; use namada::types::io::Io; use namada::types::key::{self, *}; -use namada::types::storage::{Epoch, Key}; -use namada::types::token; -use namada::types::transaction::governance::{ProposalType, VoteProposalData}; -use namada::types::transaction::{InitValidator, TxType}; +use namada::types::transaction::pos::InitValidator; use namada::{display_line, edisplay_line}; use super::rpc; -use crate::cli::context::WalletAddress; use crate::cli::{args, safe_exit, Context}; use crate::client::rpc::query_wasm_code_hash; -use crate::client::signing::find_pk; use crate::client::tx::tx::ProcessTxResponse; use crate::config::TendermintMode; use crate::facade::tendermint_rpc::endpoint::broadcast::tx_sync::Response; @@ -48,35 +42,53 @@ pub async fn submit_reveal_aux< >( client: &C, ctx: &mut Context, - args: &args::Tx, - addr: Option
, - pk: common::PublicKey, - tx: &mut Tx, + args: args::Tx, + address: &Address, ) -> Result<(), tx::Error> { - if let Some(Address::Implicit(_)) = addr { - let reveal_pk = tx::build_reveal_pk::<_, _, IO>( - client, - &mut ctx.wallet, - args::RevealPk { - tx: args.clone(), - public_key: pk.clone(), - }, - ) - .await?; - if let Some((mut rtx, _, pk)) = reveal_pk { - // Sign the reveal public key transaction with the fee payer - signing::sign_tx(&mut ctx.wallet, &mut rtx, args, &pk).await?; - // Submit the reveal public key transaction first - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, args, rtx) - .await?; - // Update the stateful PoW challenge of the outer transaction - #[cfg(not(feature = "mainnet"))] - signing::update_pow_challenge::<_, IO>( - client, args, tx, &pk, false, + if args.dump_tx { + return Ok(()); + } + + if let Address::Implicit(ImplicitAddress(pkh)) = address { + let key = ctx + .wallet + .find_key_by_pkh(pkh, args.clone().password) + .map_err(|e| tx::Error::Other(e.to_string()))?; + let public_key = key.ref_to(); + + if tx::is_reveal_pk_needed::(client, address, args.force).await? { + let signing_data = signing::aux_signing_data::<_, _, IO>( + client, + &mut ctx.wallet, + &args, + &None, + None, + ) + .await?; + + let mut tx = tx::build_reveal_pk_aux::( + client, + &args, + address, + &public_key, + &signing_data.gas_payer, + ) + .await?; + + signing::generate_test_vector::<_, _, IO>( + client, + &mut ctx.wallet, + &tx, ) .await; + + signing::sign_tx(&mut ctx.wallet, &args, &mut tx, signing_data); + + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args, tx) + .await?; } } + Ok(()) } @@ -89,46 +101,77 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = - tx::build_custom::<_, _, IO>(client, &mut ctx.wallet, args.clone()) - .await?; - submit_reveal_aux::<_, IO>( + let default_signer = Some(args.owner.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, - ctx, + &mut ctx.wallet, &args.tx, - addr, - pk.clone(), - &mut tx, + &Some(args.owner.clone()), + default_signer, + ) + .await?; + + submit_reveal_aux::<_, IO>(client, ctx, args.tx.clone(), &args.owner) + .await?; + + let mut tx = tx::build_custom::<_, IO>( + client, + args.clone(), + &signing_data.gas_payer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + } + Ok(()) } -pub async fn submit_update_vp( +pub async fn submit_update_account( client: &C, ctx: &mut Context, - args: args::TxUpdateVp, + args: args::TxUpdateAccount, ) -> Result<(), tx::Error> where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = - tx::build_update_vp::<_, _, IO>(client, &mut ctx.wallet, args.clone()) - .await?; - submit_reveal_aux::<_, IO>( + let default_signer = Some(args.addr.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, - ctx, + &mut ctx.wallet, &args.tx, - addr, - pk.clone(), - &mut tx, + &Some(args.addr.clone()), + default_signer, + ) + .await?; + + let mut tx = tx::build_update_account::<_, IO>( + client, + args.clone(), + &signing_data.gas_payer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + } + Ok(()) } @@ -141,23 +184,33 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = tx::build_init_account::<_, _, IO>( + let signing_data = signing::aux_signing_data::<_, _, IO>( client, &mut ctx.wallet, - args.clone(), + &args.tx, + &None, + None, ) .await?; - submit_reveal_aux::<_, IO>( + + let mut tx = tx::build_init_account::<_, IO>( client, - ctx, - &args.tx, - addr, - pk.clone(), - &mut tx, + args.clone(), + &signing_data.gas_payer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + } + Ok(()) } @@ -166,9 +219,9 @@ pub async fn submit_init_validator( mut ctx: Context, args::TxInitValidator { tx: tx_args, - source, scheme, - account_key, + account_keys, + threshold, consensus_key, eth_cold_key, eth_hot_key, @@ -199,25 +252,19 @@ where let validator_key_alias = format!("{}-key", alias); let consensus_key_alias = format!("{}-consensus-key", alias); + + let threshold = match threshold { + Some(threshold) => threshold, + None => { + if account_keys.len() == 1 { + 1u8 + } else { + safe_exit(1) + } + } + }; let eth_hot_key_alias = format!("{}-eth-hot-key", alias); let eth_cold_key_alias = format!("{}-eth-cold-key", alias); - let account_key = account_key.unwrap_or_else(|| { - display_line!(IO, "Generating validator account key..."); - let password = - read_and_confirm_encryption_password(unsafe_dont_encrypt); - ctx.wallet - .gen_key( - scheme, - Some(validator_key_alias.clone()), - tx_args.wallet_alias_force, - password, - None, - ) - .expect("Key generation should not fail.") - .expect("No existing alias expected.") - .1 - .ref_to() - }); let consensus_key = consensus_key .map(|key| match key { @@ -352,12 +399,14 @@ where .await .unwrap(); - let mut tx = Tx::new(TxType::Raw); - let extra = tx.add_section(Section::ExtraData(Code::from_hash( - validator_vp_code_hash, - ))); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + let extra_section_hash = + tx.add_extra_section_from_hash(validator_vp_code_hash); + let data = InitValidator { - account_key, + account_keys, + threshold, consensus_key: consensus_key.ref_to(), eth_cold_key: key::secp256k1::PublicKey::try_from_pk(ð_cold_pk) .unwrap(), @@ -367,110 +416,128 @@ where dkg_key, commission_rate, max_commission_rate_change, - validator_vp_code_hash: extra.get_hash(), + validator_vp_code_hash: extra_section_hash, }; - let data = data.try_to_vec().expect("Encoding tx data shouldn't fail"); - tx.header.chain_id = tx_args.chain_id.clone().unwrap(); - tx.header.expiration = tx_args.expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); - let (mut tx, addr, pk) = tx::prepare_tx::<_, _, IO>( + tx.add_code_from_hash(tx_code_hash).add_data(data); + + let signing_data = signing::aux_signing_data::<_, _, IO>( client, &mut ctx.wallet, &tx_args, - tx, - TxSigningKey::WalletAddress(source), - #[cfg(not(feature = "mainnet"))] - false, + &None, + None, ) .await?; - submit_reveal_aux::<_, IO>( + + tx::prepare_tx::<_, IO>( client, - &mut ctx, &tx_args, - addr, - pk.clone(), &mut tx, + signing_data.gas_payer.clone(), + #[cfg(not(feature = "mainnet"))] + false, ) - .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &tx_args, &pk).await?; - let result = - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &tx_args, tx) - .await? - .initialized_accounts(); - - if !tx_args.dry_run { - let (validator_address_alias, validator_address) = match &result[..] { - // There should be 1 account for the validator itself - [validator_address] => { - if let Some(alias) = ctx.wallet.find_alias(validator_address) { - (alias.clone(), validator_address.clone()) - } else { + .await; + + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if tx_args.dump_tx { + tx::dump_tx::(&tx_args, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &tx_args, &mut tx, signing_data); + + let result = + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &tx_args, tx) + .await? + .initialized_accounts(); + + if !tx_args.dry_run { + let (validator_address_alias, validator_address) = match &result[..] + { + // There should be 1 account for the validator itself + [validator_address] => { + if let Some(alias) = + ctx.wallet.find_alias(validator_address) + { + (alias.clone(), validator_address.clone()) + } else { + edisplay_line!( + IO, + "Expected one account to be created" + ); + safe_exit(1) + } + } + _ => { edisplay_line!(IO, "Expected one account to be created"); safe_exit(1) } - } - _ => { - edisplay_line!(IO, "Expected one account to be created"); - safe_exit(1) - } - }; - // add validator address and keys to the wallet - ctx.wallet - .add_validator_data(validator_address, validator_keys); - crate::wallet::save(&ctx.wallet) - .unwrap_or_else(|err| edisplay_line!(IO, "{}", err)); - - let tendermint_home = ctx.config.ledger.cometbft_dir(); - tendermint_node::write_validator_key(&tendermint_home, &consensus_key); - tendermint_node::write_validator_state(tendermint_home); - - // Write Namada config stuff or figure out how to do the above - // tendermint_node things two epochs in the future!!! - ctx.config.ledger.shell.tendermint_mode = TendermintMode::Validator; - ctx.config - .write( - &ctx.config.ledger.shell.base_dir, - &ctx.config.ledger.chain_id, - true, - ) - .unwrap(); + }; + // add validator address and keys to the wallet + ctx.wallet + .add_validator_data(validator_address, validator_keys); + crate::wallet::save(&ctx.wallet) + .unwrap_or_else(|err| edisplay_line!(IO, "{}", err)); + + let tendermint_home = ctx.config.ledger.cometbft_dir(); + tendermint_node::write_validator_key( + &tendermint_home, + &consensus_key, + ); + tendermint_node::write_validator_state(tendermint_home); + + // Write Namada config stuff or figure out how to do the above + // tendermint_node things two epochs in the future!!! + ctx.config.ledger.shell.tendermint_mode = TendermintMode::Validator; + ctx.config + .write( + &ctx.config.ledger.shell.base_dir, + &ctx.config.ledger.chain_id, + true, + ) + .unwrap(); - let key = pos::params_key(); - let pos_params = rpc::query_storage_value::(client, &key) - .await - .expect("Pos parameter should be defined."); + let key = pos::params_key(); + let pos_params = + rpc::query_storage_value::(client, &key) + .await + .expect("Pos parameter should be defined."); - display_line!(IO, ""); - display_line!( - IO, - "The validator's addresses and keys were stored in the wallet:" - ); - display_line!( - IO, - " Validator address \"{}\"", - validator_address_alias - ); - display_line!( - IO, - " Validator account key \"{}\"", - validator_key_alias - ); - display_line!(IO, " Consensus key \"{}\"", consensus_key_alias); - display_line!( - IO, - "The ledger node has been setup to use this validator's address \ - and consensus key." - ); - display_line!( - IO, - "Your validator will be active in {} epochs. Be sure to restart \ - your node for the changes to take effect!", - pos_params.pipeline_len - ); - } else { - display_line!(IO, "Transaction dry run. No addresses have been saved."); + display_line!(IO, ""); + display_line!( + IO, + "The validator's addresses and keys were stored in the wallet:" + ); + display_line!( + IO, + " Validator address \"{}\"", + validator_address_alias + ); + display_line!( + IO, + " Validator account key \"{}\"", + validator_key_alias + ); + display_line!(IO, " Consensus key \"{}\"", consensus_key_alias); + display_line!( + IO, + "The ledger node has been setup to use this validator's \ + address and consensus key." + ); + display_line!( + IO, + "Your validator will be active in {} epochs. Be sure to \ + restart your node for the changes to take effect!", + pos_params.pipeline_len + ); + } else { + display_line!( + IO, + "Transaction dry run. No addresses have been saved." + ); + } } Ok(()) } @@ -592,53 +659,73 @@ pub async fn submit_transfer( args: args::TxTransfer, ) -> Result<(), tx::Error> { for _ in 0..2 { - let arg = args.clone(); - let (mut tx, addr, pk, tx_epoch, _isf) = - tx::build_transfer::<_, _, _, IO>( - client, - &mut ctx.wallet, - &mut ctx.shielded, - arg, - ) - .await?; + let default_signer = Some(args.source.effective_address()); + let signing_data = signing::aux_signing_data::<_, _, IO>( + client, + &mut ctx.wallet, + &args.tx, + &Some(args.source.effective_address()), + default_signer, + ) + .await?; + submit_reveal_aux::<_, IO>( client, &mut ctx, - &args.tx, - addr, - pk.clone(), - &mut tx, + args.tx.clone(), + &args.source.effective_address(), ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - let result = - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) - .await?; - // Query the epoch in which the transaction was probably submitted - let submission_epoch = - rpc::query_and_print_epoch::<_, IO>(client).await; - - match result { - ProcessTxResponse::Applied(resp) if - // If a transaction is shielded - tx_epoch.is_some() && - // And it is rejected by a VP - resp.code == 1.to_string() && - // And the its submission epoch doesn't match construction epoch - tx_epoch.unwrap() != submission_epoch => - { - // Then we probably straddled an epoch boundary. Let's retry... - edisplay_line!(IO, - "MASP transaction rejected and this may be due to the \ - epoch changing. Attempting to resubmit transaction.", - ); - continue; - }, - // Otherwise either the transaction was successful or it will not - // benefit from resubmission - _ => break, + + let arg = args.clone(); + let (mut tx, tx_epoch) = tx::build_transfer::<_, _, IO>( + client, + &mut ctx.shielded, + arg, + &signing_data.gas_payer, + ) + .await?; + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + let result = tx::process_tx::<_, _, IO>( + client, + &mut ctx.wallet, + &args.tx, + tx, + ) + .await?; + + let submission_epoch = + rpc::query_and_print_epoch::<_, IO>(client).await; + + match result { + ProcessTxResponse::Applied(resp) if + // If a transaction is shielded + tx_epoch.is_some() && + // And it is rejected by a VP + resp.code == 1.to_string() && + // And its submission epoch doesn't match construction epoch + tx_epoch.unwrap() != submission_epoch => + { + // Then we probably straddled an epoch boundary. Let's retry... + edisplay_line!(IO, + "MASP transaction rejected and this may be due to the \ + epoch changing. Attempting to resubmit transaction.", + ); + continue; + }, + // Otherwise either the transaction was successful or it will not + // benefit from resubmission + _ => break, + } } } + Ok(()) } @@ -651,23 +738,36 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = tx::build_ibc_transfer::<_, _, IO>( + let default_signer = Some(args.source.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, &mut ctx.wallet, - args.clone(), + &args.tx, + &Some(args.source.clone()), + default_signer, ) .await?; - submit_reveal_aux::<_, IO>( + + submit_reveal_aux::<_, IO>(client, &mut ctx, args.tx.clone(), &args.source) + .await?; + + let mut tx = tx::build_ibc_transfer::<_, IO>( client, - &mut ctx, - &args.tx, - addr, - pk.clone(), - &mut tx, + args.clone(), + &signing_data.gas_payer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + } + Ok(()) } @@ -680,195 +780,181 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let file = File::open(&args.proposal_data).expect("File must exist."); - let proposal: Proposal = - serde_json::from_reader(file).expect("JSON was not well-formatted"); - - let signer = WalletAddress::new(proposal.clone().author.to_string()); let current_epoch = rpc::query_and_print_epoch::<_, IO>(client).await; + let governance_parameters = rpc::query_governance_parameters(client).await; - let governance_parameters = rpc::get_governance_parameters(client).await; - if proposal.voting_start_epoch <= current_epoch - || proposal.voting_start_epoch.0 - % governance_parameters.min_proposal_period - != 0 - { - display_line!(IO, "{}", proposal.voting_start_epoch <= current_epoch); - display_line!( - IO, - "{}", - proposal.voting_start_epoch.0 - % governance_parameters.min_proposal_period - == 0 - ); - edisplay_line!( - IO, - "Invalid proposal start epoch: {} must be greater than current \ - epoch {} and a multiple of {}", - proposal.voting_start_epoch, - current_epoch, - governance_parameters.min_proposal_period - ); - if !args.tx.force { - safe_exit(1) - } - } else if proposal.voting_end_epoch <= proposal.voting_start_epoch - || proposal.voting_end_epoch.0 - proposal.voting_start_epoch.0 - < governance_parameters.min_proposal_period - || proposal.voting_end_epoch.0 - proposal.voting_start_epoch.0 - > governance_parameters.max_proposal_period - || proposal.voting_end_epoch.0 % 3 != 0 - { - edisplay_line!( - IO, - "Invalid proposal end epoch: difference between proposal start \ - and end epoch must be at least {} and at max {} and end epoch \ - must be a multiple of {}", - governance_parameters.min_proposal_period, - governance_parameters.max_proposal_period, - governance_parameters.min_proposal_period - ); - if !args.tx.force { - safe_exit(1) - } - } else if proposal.grace_epoch <= proposal.voting_end_epoch - || proposal.grace_epoch.0 - proposal.voting_end_epoch.0 - < governance_parameters.min_proposal_grace_epochs - { - edisplay_line!( - IO, - "Invalid proposal grace epoch: difference between proposal grace \ - and end epoch must be at least {}", - governance_parameters.min_proposal_grace_epochs - ); - if !args.tx.force { - safe_exit(1) - } - } - - if args.offline { - let signer = ctx.get(&signer); - let key = find_pk::<_, _, IO>(client, &mut ctx.wallet, &signer).await?; - let signing_key = - signing::find_key_by_pk(&mut ctx.wallet, &args.tx, &key)?; - let offline_proposal = - OfflineProposal::new(proposal, signer, &signing_key); - let proposal_filename = args - .proposal_data - .parent() - .expect("No parent found") - .join("proposal"); - let out = File::create(&proposal_filename).unwrap(); - match serde_json::to_writer_pretty(out, &offline_proposal) { - Ok(_) => { - display_line!( - IO, - "Proposal created: {}.", - proposal_filename.to_string_lossy() - ); - } - Err(e) => { - edisplay_line!( - IO, - "Error while creating proposal file: {}.", - e - ); - safe_exit(1) - } - } - Ok(()) - } else { - let signer = ctx.get(&signer); - let tx_data = proposal.clone().try_into(); - let (mut init_proposal_data, init_proposal_content, init_proposal_code) = - if let Ok(data) = tx_data { - data - } else { - edisplay_line!( - IO, - "Invalid data for init proposal transaction." - ); - safe_exit(1) - }; + let (mut tx_builder, signing_data) = if args.is_offline { + let proposal = namada::core::ledger::governance::cli::offline::OfflineProposal::try_from(args.proposal_data.as_ref()).map_err(|e| tx::Error::FailedGovernaneProposalDeserialize(e.to_string()))?.validate(current_epoch) + .map_err(|e| tx::Error::InvalidProposal(e.to_string()))?; - let balance = - rpc::get_token_balance(client, &ctx.native_token, &proposal.author) - .await; - if balance - < token::Amount::from_uint( - governance_parameters.min_proposal_fund, - 0, - ) - .unwrap() - { - edisplay_line!( - IO, - "Address {} doesn't have enough funds.", - &proposal.author - ); - safe_exit(1); - } + let default_signer = Some(proposal.author.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( + client, + &mut ctx.wallet, + &args.tx, + &Some(proposal.author.clone()), + default_signer, + ) + .await?; - if init_proposal_content.len() - > governance_parameters.max_proposal_content_size as usize - { - edisplay_line!(IO, "Proposal content size too big."); - safe_exit(1); - } + let signed_offline_proposal = proposal.sign( + args.tx.signing_keys, + &signing_data.account_public_keys_map.unwrap(), + ); + let output_file_path = signed_offline_proposal + .serialize(args.tx.output_folder) + .map_err(|e| { + tx::Error::FailedGovernaneProposalDeserialize(e.to_string()) + })?; + + display_line!(IO, "Proposal serialized to: {}", output_file_path); + return Ok(()); + } else if args.is_pgf_funding { + let proposal = + PgfFundingProposal::try_from(args.proposal_data.as_ref()) + .map_err(|e| { + tx::Error::FailedGovernaneProposalDeserialize(e.to_string()) + })? + .validate(&governance_parameters, current_epoch) + .map_err(|e| tx::Error::InvalidProposal(e.to_string()))?; + + let default_signer = Some(proposal.proposal.author.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( + client, + &mut ctx.wallet, + &args.tx, + &Some(proposal.proposal.author.clone()), + default_signer, + ) + .await?; - let mut tx = Tx::new(TxType::Raw); - let tx_code_hash = - query_wasm_code_hash::<_, IO>(client, args::TX_INIT_PROPOSAL) - .await - .unwrap(); - tx.header.chain_id = ctx.config.ledger.chain_id.clone(); - tx.header.expiration = args.tx.expiration; - // Put the content of this proposal into an extra section - { - let content_sec = tx.add_section(Section::ExtraData(Code::new( - init_proposal_content, - ))); - let content_sec_hash = content_sec.get_hash(); - init_proposal_data.content = content_sec_hash; - } - // Put any proposal code into an extra section - if let Some(init_proposal_code) = init_proposal_code { - let code_sec = tx - .add_section(Section::ExtraData(Code::new(init_proposal_code))); - let code_sec_hash = code_sec.get_hash(); - init_proposal_data.r#type = - ProposalType::Default(Some(code_sec_hash)); - } - let data = init_proposal_data - .try_to_vec() - .expect("Encoding proposal data shouldn't fail"); - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); + submit_reveal_aux::<_, IO>( + client, + &mut ctx, + args.tx.clone(), + &proposal.proposal.author, + ) + .await?; - let (mut tx, addr, pk) = tx::prepare_tx::<_, _, IO>( + ( + tx::build_pgf_funding_proposal::<_, IO>( + client, + args.clone(), + proposal, + &signing_data.gas_payer, + ) + .await?, + signing_data, + ) + } else if args.is_pgf_stewards { + let proposal = PgfStewardProposal::try_from( + args.proposal_data.as_ref(), + ) + .map_err(|e| { + tx::Error::FailedGovernaneProposalDeserialize(e.to_string()) + })?; + let author_balane = rpc::get_token_balance( + client, + &ctx.native_token, + &proposal.proposal.author, + ) + .await; + let proposal = proposal + .validate(&governance_parameters, current_epoch, author_balane) + .map_err(|e| tx::Error::InvalidProposal(e.to_string()))?; + + let default_signer = Some(proposal.proposal.author.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, &mut ctx.wallet, &args.tx, - tx, - TxSigningKey::WalletAddress(signer), - #[cfg(not(feature = "mainnet"))] - false, + &Some(proposal.proposal.author.clone()), + default_signer, ) .await?; + submit_reveal_aux::<_, IO>( client, &mut ctx, + args.tx.clone(), + &proposal.proposal.author, + ) + .await?; + + ( + tx::build_pgf_stewards_proposal::<_, IO>( + client, + args.clone(), + proposal, + &signing_data.gas_payer, + ) + .await?, + signing_data, + ) + } else { + let proposal = DefaultProposal::try_from(args.proposal_data.as_ref()) + .map_err(|e| { + tx::Error::FailedGovernaneProposalDeserialize(e.to_string()) + })?; + let author_balane = rpc::get_token_balance( + client, + &ctx.native_token, + &proposal.proposal.author, + ) + .await; + let proposal = proposal + .validate(&governance_parameters, current_epoch, author_balane) + .map_err(|e| tx::Error::InvalidProposal(e.to_string()))?; + + let default_signer = Some(proposal.proposal.author.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( + client, + &mut ctx.wallet, &args.tx, - addr, - pk.clone(), - &mut tx, + &Some(proposal.proposal.author.clone()), + default_signer, + ) + .await?; + + submit_reveal_aux::<_, IO>( + client, + &mut ctx, + args.tx.clone(), + &proposal.proposal.author, + ) + .await?; + + ( + tx::build_default_proposal::<_, IO>( + client, + args.clone(), + proposal, + &signing_data.gas_payer, + ) + .await?, + signing_data, + ) + }; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx_builder); + } else { + signing::sign_tx( + &mut ctx.wallet, + &args.tx, + &mut tx_builder, + signing_data, + ); + tx::process_tx::<_, _, IO>( + client, + &mut ctx.wallet, + &args.tx, + tx_builder, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) - .await?; - Ok(()) } + + Ok(()) } pub async fn submit_vote_proposal( @@ -880,293 +966,174 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let signer = if let Some(addr) = &args.tx.signer { - addr - } else { - edisplay_line!(IO, "Missing mandatory argument --signer."); - safe_exit(1) - }; - - // Construct vote - let proposal_vote = match args.vote.to_ascii_lowercase().as_str() { - "yay" => { - if let Some(pgf) = args.proposal_pgf { - let splits = pgf.trim().split_ascii_whitespace(); - let address_iter = splits.clone().step_by(2); - let cap_iter = splits.into_iter().skip(1).step_by(2); - let mut set = HashSet::new(); - for (address, cap) in - address_iter.zip(cap_iter).map(|(addr, cap)| { - ( - addr.parse() - .expect("Failed to parse pgf council address"), - cap.parse::() - .expect("Failed to parse pgf spending cap"), - ) - }) - { - set.insert(( - address, - token::Amount::from_uint(cap, 0).unwrap(), - )); - } - - ProposalVote::Yay(VoteType::PGFCouncil(set)) - } else if let Some(eth) = args.proposal_eth { - let mut splits = eth.trim().split_ascii_whitespace(); - // Sign the message - let sigkey = splits - .next() - .expect("Expected signing key") - .parse::() - .expect("Signing key parsing failed."); - - let msg = splits.next().expect("Missing message to sign"); - if splits.next().is_some() { - edisplay_line!(IO, "Unexpected argument after message"); - safe_exit(1); - } + let current_epoch = rpc::query_and_print_epoch::<_, IO>(client).await; - ProposalVote::Yay(VoteType::ETHBridge(common::SigScheme::sign( - &sigkey, - HEXLOWER_PERMISSIVE - .decode(msg.as_bytes()) - .expect("Error while decoding message"), - ))) - } else { - ProposalVote::Yay(VoteType::Default) - } - } - "nay" => ProposalVote::Nay, - _ => { - edisplay_line!(IO, "Vote must be either yay or nay"); - safe_exit(1); - } - }; + let default_signer = Some(args.voter.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( + client, + &mut ctx.wallet, + &args.tx, + &Some(args.voter.clone()), + default_signer.clone(), + ) + .await?; - if args.offline { - if !proposal_vote.is_default_vote() { - edisplay_line!( - IO, - "Wrong vote type for offline proposal. Just vote yay or nay!" - ); - safe_exit(1); - } - let proposal_file_path = - args.proposal_data.expect("Proposal file should exist."); - let file = File::open(&proposal_file_path).expect("File must exist."); + let mut tx_builder = if args.is_offline { + let proposal_vote = ProposalVote::try_from(args.vote) + .map_err(|_| tx::Error::InvalidProposalVote)?; - let proposal: OfflineProposal = - serde_json::from_reader(file).expect("JSON was not well-formatted"); - let public_key = rpc::get_public_key(client, &proposal.address) - .await - .expect("Public key should exist."); - if !proposal.check_signature(&public_key) { - edisplay_line!(IO, "Proposal signature mismatch!"); - safe_exit(1) - } + let proposal = OfflineSignedProposal::try_from( + args.proposal_data.clone().unwrap().as_ref(), + ) + .map_err(|e| tx::Error::InvalidProposal(e.to_string()))? + .validate( + &signing_data.account_public_keys_map.clone().unwrap(), + signing_data.threshold, + ) + .map_err(|e| tx::Error::InvalidProposal(e.to_string()))?; + let delegations = rpc::get_delegators_delegation_at( + client, + &args.voter, + proposal.proposal.tally_epoch, + ) + .await + .keys() + .cloned() + .collect::>(); - let key = find_pk::<_, _, IO>(client, &mut ctx.wallet, signer).await?; - let signing_key = - signing::find_key_by_pk(&mut ctx.wallet, &args.tx, &key)?; let offline_vote = OfflineVote::new( &proposal, proposal_vote, - signer.clone(), - &signing_key, + args.voter.clone(), + delegations, ); - let proposal_vote_filename = proposal_file_path - .parent() - .expect("No parent found") - .join(format!("proposal-vote-{}", &signer.to_string())); - let out = File::create(&proposal_vote_filename).unwrap(); - match serde_json::to_writer_pretty(out, &offline_vote) { - Ok(_) => { - display_line!( - IO, - "Proposal vote created: {}.", - proposal_vote_filename.to_string_lossy() - ); - Ok(()) - } - Err(e) => { - edisplay_line!( - IO, - "Error while creating proposal vote file: {}.", - e - ); - safe_exit(1) - } - } + let offline_signed_vote = offline_vote.sign( + args.tx.signing_keys, + &signing_data.account_public_keys_map.unwrap(), + ); + let output_file_path = offline_signed_vote + .serialize(args.tx.output_folder) + .expect("Should be able to serialize the offline proposal"); + + display_line!(IO, "Proposal vote serialized to: {}", output_file_path); + return Ok(()); } else { - let current_epoch = rpc::query_and_print_epoch::<_, IO>(client).await; + tx::build_vote_proposal::<_, IO>( + client, + args.clone(), + current_epoch, + &signing_data.gas_payer, + ) + .await? + }; - let voter_address = signer.clone(); - let proposal_id = args.proposal_id.unwrap(); - let proposal_start_epoch_key = - gov_storage::get_voting_start_epoch_key(proposal_id); - let proposal_start_epoch = rpc::query_storage_value::( + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx_builder); + } else { + signing::sign_tx( + &mut ctx.wallet, + &args.tx, + &mut tx_builder, + signing_data, + ); + tx::process_tx::<_, _, IO>( client, - &proposal_start_epoch_key, + &mut ctx.wallet, + &args.tx, + tx_builder, ) - .await; + .await?; + } - // Check vote type and memo - let proposal_type_key = gov_storage::get_proposal_type_key(proposal_id); - let proposal_type: ProposalType = rpc::query_storage_value::< - C, - ProposalType, - >(client, &proposal_type_key) - .await - .unwrap_or_else(|| { - panic!("Didn't find type of proposal id {} in storage", proposal_id) - }); + Ok(()) +} + +pub async fn sign_tx( + client: &C, + ctx: &mut Context, + args::SignTx { + tx: tx_args, + tx_data, + owner, + }: args::SignTx, +) -> Result<(), tx::Error> +where + C: namada::ledger::queries::Client + Sync, + C::Error: std::fmt::Display, +{ + let tx = if let Ok(transaction) = Tx::deserialize(tx_data.as_ref()) { + transaction + } else { + edisplay_line!(IO, "Couldn't decode the transaction."); + safe_exit(1) + }; + + let default_signer = Some(owner.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( + client, + &mut ctx.wallet, + &tx_args, + &Some(owner), + default_signer, + ) + .await?; - if let ProposalVote::Yay(ref vote_type) = proposal_vote { - if &proposal_type != vote_type { + let secret_keys = &signing_data + .public_keys + .iter() + .filter_map(|public_key| { + if let Ok(secret_key) = + signing::find_key_by_pk(&mut ctx.wallet, &tx_args, public_key) + { + Some(secret_key) + } else { edisplay_line!( IO, - "Expected vote of type {}, found {}", - proposal_type, - args.vote + "Couldn't find the secret key for {}. Skipping signature \ + generation.", + public_key ); - safe_exit(1); - } else if let VoteType::PGFCouncil(set) = vote_type { - // Check that addresses proposed as council are established and - // are present in storage - for (address, _) in set { - match address { - Address::Established(_) => { - let vp_key = Key::validity_predicate(address); - if !rpc::query_has_storage_key::(client, &vp_key) - .await - { - edisplay_line!( - IO, - "Proposed PGF council {} cannot be found \ - in storage", - address - ); - safe_exit(1); - } - } - _ => { - edisplay_line!( - IO, - "PGF council vote contains a non-established \ - address: {}", - address - ); - safe_exit(1); - } - } - } + None } - } + }) + .collect::>(); - match proposal_start_epoch { - Some(epoch) => { - if current_epoch < epoch { - edisplay_line!( - IO, - "Current epoch {} is not greater than proposal start \ - epoch {}", - current_epoch, - epoch - ); + if let Some(account_public_keys_map) = signing_data.account_public_keys_map + { + let signatures = + tx.compute_section_signature(secret_keys, &account_public_keys_map); + + for signature in &signatures { + let filename = format!( + "offline_signature_{}_{}.tx", + tx.header_hash(), + signature.index + ); + let output_path = match &tx_args.output_folder { + Some(path) => path.join(filename), + None => filename.into(), + }; - if !args.tx.force { - safe_exit(1) - } - } - let mut delegations = - rpc::get_delegators_delegation(client, &voter_address) - .await; - - // Optimize by quering if a vote from a validator - // is equal to ours. If so, we can avoid voting, but ONLY if we - // are voting in the last third of the voting - // window, otherwise there's the risk of the - // validator changing his vote and, effectively, invalidating - // the delgator's vote - if !args.tx.force - && is_safe_voting_window(client, proposal_id, epoch).await? - { - delegations = filter_delegations( - client, - delegations, - proposal_id, - &proposal_vote, - ) - .await; - } + let signature_path = File::create(&output_path) + .expect("Should be able to create signature file."); - let tx_data = VoteProposalData { - id: proposal_id, - vote: proposal_vote, - voter: voter_address, - delegations: delegations.into_iter().collect(), - }; - - let chain_id = args.tx.chain_id.clone().unwrap(); - let expiration = args.tx.expiration; - let data = tx_data - .try_to_vec() - .expect("Encoding proposal data shouldn't fail"); - - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = chain_id; - tx.header.expiration = expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); - - let (mut tx, addr, pk) = tx::prepare_tx::<_, _, IO>( - client, - &mut ctx.wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(signer.clone()), - #[cfg(not(feature = "mainnet"))] - false, - ) - .await?; - submit_reveal_aux::<_, IO>( - client, - &mut ctx, - &args.tx, - addr, - pk.clone(), - &mut tx, - ) - .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk) - .await?; - tx::process_tx::<_, _, IO>( - client, - &mut ctx.wallet, - &args.tx, - tx, - ) - .await?; - Ok(()) - } - None => { - edisplay_line!( - IO, - "Proposal start epoch for proposal id {} is not definied.", - proposal_id - ); - if !args.tx.force { safe_exit(1) } else { Ok(()) } - } + serde_json::to_writer_pretty( + signature_path, + &signature.serialize(), + ) + .expect("Signature should be deserializable."); + display_line!( + IO, + "Signature for {} serialized at {}", + &account_public_keys_map + .get_public_key_from_index(signature.index) + .unwrap(), + output_path.display() + ); } } + Ok(()) } pub async fn submit_reveal_pk( @@ -1178,73 +1145,15 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let reveal_tx = - tx::build_reveal_pk::<_, _, IO>(client, &mut ctx.wallet, args.clone()) - .await?; - if let Some((mut tx, _, pk)) = reveal_tx { - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) - .await?; - } - Ok(()) -} - -/// Check if current epoch is in the last third of the voting period of the -/// proposal. This ensures that it is safe to optimize the vote writing to -/// storage. -async fn is_safe_voting_window( - client: &C, - proposal_id: u64, - proposal_start_epoch: Epoch, -) -> Result -where - C: namada::ledger::queries::Client + Sync, - C::Error: std::fmt::Display, -{ - tx::is_safe_voting_window(client, proposal_id, proposal_start_epoch).await -} - -/// Removes validators whose vote corresponds to that of the delegator (needless -/// vote) -async fn filter_delegations( - client: &C, - delegations: HashSet
, - proposal_id: u64, - delegator_vote: &ProposalVote, -) -> HashSet
-where - C: namada::ledger::queries::Client + Sync, - C::Error: std::fmt::Display, -{ - // Filter delegations by their validator's vote concurrently - let delegations = futures::future::join_all( - delegations - .into_iter() - // we cannot use `filter/filter_map` directly because we want to - // return a future - .map(|validator_address| async { - let vote_key = gov_storage::get_vote_proposal_key( - proposal_id, - validator_address.to_owned(), - validator_address.to_owned(), - ); - - if let Some(validator_vote) = - rpc::query_storage_value::( - client, &vote_key, - ) - .await - { - if &validator_vote == delegator_vote { - return None; - } - } - Some(validator_address) - }), + submit_reveal_aux::<_, IO>( + client, + ctx, + args.tx, + &(&args.public_key).into(), ) - .await; - // Take out the `None`s - delegations.into_iter().flatten().collect() + .await?; + + Ok(()) } pub async fn submit_bond( @@ -1256,20 +1165,35 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = - tx::build_bond::(client, &mut ctx.wallet, args.clone()) - .await?; - submit_reveal_aux::<_, IO>( + let default_address = args.source.clone().unwrap_or(args.validator.clone()); + let default_signer = Some(default_address.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, - ctx, + &mut ctx.wallet, &args.tx, - addr, - pk.clone(), - &mut tx, + &Some(default_address.clone()), + default_signer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + + submit_reveal_aux::<_, IO>(client, ctx, args.tx.clone(), &default_address) + .await?; + + let mut tx = + tx::build_bond::(client, args.clone(), &signing_data.gas_payer) + .await?; + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + } + Ok(()) } @@ -1282,22 +1206,39 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk, latest_withdrawal_pre) = - tx::build_unbond::<_, _, IO>(client, &mut ctx.wallet, args.clone()) - .await?; - submit_reveal_aux::<_, IO>( + let default_address = args.source.clone().unwrap_or(args.validator.clone()); + let default_signer = Some(default_address.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, - ctx, + &mut ctx.wallet, &args.tx, - addr, - pk.clone(), - &mut tx, + &Some(default_address), + default_signer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; - tx::query_unbonds::<_, IO>(client, args.clone(), latest_withdrawal_pre) - .await?; + + let (mut tx, latest_withdrawal_pre) = tx::build_unbond::<_, _, IO>( + client, + &mut ctx.wallet, + args.clone(), + &signing_data.gas_payer, + ) + .await?; + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + + tx::query_unbonds::<_, IO>(client, args.clone(), latest_withdrawal_pre) + .await?; + } + Ok(()) } @@ -1310,20 +1251,35 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = - tx::build_withdraw::<_, _, IO>(client, &mut ctx.wallet, args.clone()) - .await?; - submit_reveal_aux::<_, IO>( + let default_address = args.source.clone().unwrap_or(args.validator.clone()); + let default_signer = Some(default_address.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, - &mut ctx, + &mut ctx.wallet, &args.tx, - addr, - pk.clone(), - &mut tx, + &Some(default_address), + default_signer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + + let mut tx = tx::build_withdraw::<_, IO>( + client, + args.clone(), + &signing_data.gas_payer, + ) + .await?; + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + } + Ok(()) } @@ -1336,24 +1292,34 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let arg = args.clone(); - let (mut tx, addr, pk) = tx::build_validator_commission_change::<_, _, IO>( + let default_signer = Some(args.validator.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, &mut ctx.wallet, - arg, + &args.tx, + &Some(args.validator.clone()), + default_signer, ) .await?; - submit_reveal_aux::<_, IO>( + + let mut tx = tx::build_validator_commission_change::<_, IO>( client, - &mut ctx, - &args.tx, - addr, - pk.clone(), - &mut tx, + args.clone(), + &signing_data.gas_payer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + } + Ok(()) } @@ -1369,23 +1335,34 @@ where C: namada::ledger::queries::Client + Sync, C::Error: std::fmt::Display, { - let (mut tx, addr, pk) = tx::build_unjail_validator::<_, _, IO>( + let default_signer = Some(args.validator.clone()); + let signing_data = signing::aux_signing_data::<_, _, IO>( client, &mut ctx.wallet, - args.clone(), + &args.tx, + &Some(args.validator.clone()), + default_signer, ) .await?; - submit_reveal_aux::<_, IO>( + + let mut tx = tx::build_unjail_validator::<_, IO>( client, - &mut ctx, - &args.tx, - addr, - pk.clone(), - &mut tx, + args.clone(), + &signing_data.gas_payer, ) .await?; - signing::sign_tx(&mut ctx.wallet, &mut tx, &args.tx, &pk).await?; - tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx).await?; + signing::generate_test_vector::<_, _, IO>(client, &mut ctx.wallet, &tx) + .await; + + if args.tx.dump_tx { + tx::dump_tx::(&args.tx, tx); + } else { + signing::sign_tx(&mut ctx.wallet, &args.tx, &mut tx, signing_data); + + tx::process_tx::<_, _, IO>(client, &mut ctx.wallet, &args.tx, tx) + .await?; + } + Ok(()) } @@ -1436,12 +1413,11 @@ where #[cfg(test)] mod test_tx { use masp_primitives::transaction::components::Amount; + use namada::core::types::storage::Epoch; use namada::ledger::masp::{make_asset_type, MaspAmount}; use namada::types::address::testing::gen_established_address; use namada::types::token::MaspDenom; - use super::*; - #[test] fn test_masp_add_amount() { let address_1 = gen_established_address(); diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index 5c86debcb63..e9abf6c26d9 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -4,10 +4,11 @@ use std::collections::HashMap; use borsh::{BorshDeserialize, BorshSerialize}; use derivative::Derivative; +use namada::core::ledger::governance::parameters::GovernanceParameters; +use namada::core::ledger::pgf::parameters::PgfParameters; #[cfg(not(feature = "mainnet"))] use namada::core::ledger::testnet_pow; use namada::ledger::eth_bridge::EthereumBridgeConfig; -use namada::ledger::governance::parameters::GovParams; use namada::ledger::parameters::EpochDuration; use namada::ledger::pos::{Dec, GenesisValidator, PosParams}; use namada::types::address::Address; @@ -22,16 +23,17 @@ use namada::types::{storage, token}; /// Genesis configuration file format pub mod genesis_config { use std::array::TryFromSliceError; - use std::collections::HashMap; + use std::collections::{BTreeSet, HashMap}; use std::convert::TryInto; use std::path::Path; use std::str::FromStr; use data_encoding::HEXLOWER; use eyre::Context; + use namada::core::ledger::governance::parameters::GovernanceParameters; + use namada::core::ledger::pgf::parameters::PgfParameters; #[cfg(not(feature = "mainnet"))] use namada::core::ledger::testnet_pow; - use namada::ledger::governance::parameters::GovParams; use namada::ledger::parameters::EpochDuration; use namada::ledger::pos::{Dec, GenesisValidator, PosParams}; use namada::types::address::Address; @@ -135,6 +137,8 @@ pub mod genesis_config { pub pos_params: PosParamsConfig, // Governance parameters pub gov_params: GovernanceParamsConfig, + // Pgf parameters + pub pgf_params: PgfParametersConfig, // Ethereum bridge config pub ethereum_bridge_params: Option, // Wasm definitions @@ -148,7 +152,7 @@ pub mod genesis_config { // Maximum size of proposal in kibibytes (KiB) pub max_proposal_code_size: u64, // Minimum proposal period length in epochs - pub min_proposal_period: u64, + pub min_proposal_voting_period: u64, // Maximum proposal period length in epochs pub max_proposal_period: u64, // Maximum number of characters in the proposal content @@ -157,6 +161,16 @@ pub mod genesis_config { pub min_proposal_grace_epochs: u64, } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct PgfParametersConfig { + /// The set of stewards + pub stewards: BTreeSet
, + /// The pgf inflation rate + pub pgf_inflation_rate: Dec, + /// The stewards inflation rate + pub stewards_inflation_rate: Dec, + } + /// Validator pre-genesis configuration can be created with client utils /// `init-genesis-validator` command and added to a genesis for /// `init-network` cmd and that can be subsequently read by `join-network` @@ -261,6 +275,8 @@ pub mod genesis_config { pub implicit_vp: String, /// Expected number of epochs per year pub epochs_per_year: u64, + /// Max signature per transaction + pub max_signatures_per_transaction: u8, /// PoS gain p pub pos_gain_p: Dec, /// PoS gain d @@ -524,6 +540,7 @@ pub mod genesis_config { parameters, pos_params, gov_params, + pgf_params, wasm, ethereum_bridge_params, } = config; @@ -601,30 +618,44 @@ pub mod genesis_config { implicit_vp_code_path, implicit_vp_sha256, epochs_per_year: parameters.epochs_per_year, + max_signatures_per_transaction: parameters + .max_signatures_per_transaction, pos_gain_p: parameters.pos_gain_p, pos_gain_d: parameters.pos_gain_d, staked_ratio: Dec::zero(), pos_inflation_amount: token::Amount::zero(), + #[cfg(not(feature = "mainnet"))] wrapper_tx_fees: parameters.wrapper_tx_fees, }; let GovernanceParamsConfig { min_proposal_fund, max_proposal_code_size, - min_proposal_period, + min_proposal_voting_period, max_proposal_content_size, min_proposal_grace_epochs, max_proposal_period, } = gov_params; - let gov_params = GovParams { - min_proposal_fund, + let gov_params = GovernanceParameters { + min_proposal_fund: token::Amount::native_whole(min_proposal_fund), max_proposal_code_size, - min_proposal_period, + min_proposal_voting_period, max_proposal_content_size, min_proposal_grace_epochs, max_proposal_period, }; + let PgfParametersConfig { + stewards, + pgf_inflation_rate, + stewards_inflation_rate, + } = pgf_params; + let pgf_params = PgfParameters { + stewards, + pgf_inflation_rate, + stewards_inflation_rate, + }; + let PosParamsConfig { max_validator_slots, pipeline_len, @@ -639,6 +670,7 @@ pub mod genesis_config { cubic_slashing_window_length, validator_stake_threshold, } = pos_params; + let pos_params = PosParams { max_validator_slots, pipeline_len, @@ -668,6 +700,7 @@ pub mod genesis_config { parameters, pos_params, gov_params, + pgf_params, ethereum_bridge_params, }; genesis.init(); @@ -720,7 +753,8 @@ pub struct Genesis { pub implicit_accounts: Vec, pub parameters: Parameters, pub pos_params: PosParams, - pub gov_params: GovParams, + pub gov_params: GovernanceParameters, + pub pgf_params: PgfParameters, // Ethereum bridge config pub ethereum_bridge_params: Option, } @@ -848,6 +882,8 @@ pub struct Parameters { pub implicit_vp_sha256: [u8; 32], /// Expected number of epochs per year (read only) pub epochs_per_year: u64, + /// Maximum amount of signatures per transaction + pub max_signatures_per_transaction: u8, /// PoS gain p (read only) pub pos_gain_p: Dec, /// PoS gain d (read only) @@ -969,12 +1005,14 @@ pub fn genesis(num_validators: u64) -> Genesis { tx_whitelist: vec![], implicit_vp_code_path: vp_implicit_path.into(), implicit_vp_sha256: Default::default(), + max_signatures_per_transaction: 15, epochs_per_year: 525_600, /* seconds in yr (60*60*24*365) div seconds * per epoch (60 = min_duration) */ pos_gain_p: Dec::new(1, 1).expect("This can't fail"), pos_gain_d: Dec::new(1, 1).expect("This can't fail"), staked_ratio: Dec::zero(), pos_inflation_amount: token::Amount::zero(), + #[cfg(not(feature = "mainnet"))] wrapper_tx_fees: Some(token::Amount::native_whole(0)), }; let albert = EstablishedAccount { @@ -1074,7 +1112,8 @@ pub fn genesis(num_validators: u64) -> Genesis { token_accounts, parameters, pos_params: PosParams::default(), - gov_params: GovParams::default(), + gov_params: GovernanceParameters::default(), + pgf_params: PgfParameters::default(), ethereum_bridge_params: Some(EthereumBridgeConfig { eth_start_height: Default::default(), min_confirmations: Default::default(), diff --git a/apps/src/lib/config/mod.rs b/apps/src/lib/config/mod.rs index 0bcb1b5f615..f6307c6bd14 100644 --- a/apps/src/lib/config/mod.rs +++ b/apps/src/lib/config/mod.rs @@ -283,7 +283,7 @@ impl Config { .and_then(|c| c.merge(config::File::with_name(file_name))) .and_then(|c| { c.merge( - config::Environment::with_prefix("namada").separator("__"), + config::Environment::with_prefix("NAMADA").separator("__"), ) }) .map_err(Error::ReadError)?; diff --git a/apps/src/lib/node/ledger/mod.rs b/apps/src/lib/node/ledger/mod.rs index 37b447b4daa..e421fc6e6bb 100644 --- a/apps/src/lib/node/ledger/mod.rs +++ b/apps/src/lib/node/ledger/mod.rs @@ -14,8 +14,8 @@ use std::thread; use byte_unit::Byte; use futures::future::TryFutureExt; +use namada::core::ledger::governance::storage::keys as governance_storage; use namada::eth_bridge::ethers::providers::{Http, Provider}; -use namada::ledger::governance::storage as gov_storage; use namada::types::storage::Key; use once_cell::unsync::Lazy; use sysinfo::{RefreshKind, System, SystemExt}; @@ -64,7 +64,7 @@ const ENV_VAR_RAYON_THREADS: &str = "NAMADA_RAYON_THREADS"; //``` impl Shell { fn load_proposals(&mut self) { - let proposals_key = gov_storage::get_commiting_proposals_prefix( + let proposals_key = governance_storage::get_commiting_proposals_prefix( self.wl_storage.storage.last_epoch.0, ); @@ -73,7 +73,7 @@ impl Shell { for (key, _, _) in proposal_iter { let key = Key::from_str(key.as_str()).expect("Key should be parsable"); - if gov_storage::get_commit_proposal_epoch(&key).unwrap() + if governance_storage::get_commit_proposal_epoch(&key).unwrap() != self.wl_storage.storage.last_epoch.0 { // NOTE: `iter_prefix` iterate over the matching prefix. In this @@ -85,7 +85,7 @@ impl Shell { continue; } - let proposal_id = gov_storage::get_commit_proposal_id(&key); + let proposal_id = governance_storage::get_commit_proposal_id(&key); if let Some(id) = proposal_id { self.proposal_data.insert(id); } @@ -329,7 +329,7 @@ async fn run_aux_setup( // Find the system available memory let available_memory_bytes = Lazy::new(|| { let sys = System::new_with_specifics(RefreshKind::new().with_memory()); - let available_memory_bytes = sys.available_memory() * 1024; + let available_memory_bytes = sys.available_memory(); tracing::info!( "Available memory: {}", Byte::from_bytes(available_memory_bytes as u128) diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 2f178eb47e7..8af2d1a7461 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -3,6 +3,8 @@ use std::collections::HashMap; use data_encoding::HEXUPPER; +use namada::core::ledger::pgf::storage::keys as pgf_storage; +use namada::core::ledger::pgf::ADDRESS as pgf_address; use namada::ledger::parameters::storage as params_storage; use namada::ledger::pos::{namada_proof_of_stake, staking_token_address}; use namada::ledger::storage::EPOCH_SWITCH_BLOCKS_DELAY; @@ -92,8 +94,7 @@ where &mut self.wl_storage, )?; - let _proposals_result = - execute_governance_proposals(self, &mut response)?; + execute_governance_proposals(self, &mut response)?; // Copy the new_epoch + pipeline_len - 1 validator set into // new_epoch + pipeline_len @@ -247,15 +248,15 @@ where self.invalidate_pow_solution_if_valid(wrapper); // Charge fee - let fee_payer = + let gas_payer = if wrapper.pk != address::masp_tx_key().ref_to() { - wrapper.fee_payer() + wrapper.gas_payer() } else { address::masp() }; let balance_key = - token::balance_key(&wrapper.fee.token, &fee_payer); + token::balance_key(&wrapper.fee.token, &gas_payer); let balance: token::Amount = self .wl_storage .read(&balance_key) @@ -817,6 +818,68 @@ where .remove(&mut self.wl_storage, &address)?; } + // Pgf inflation + let pgf_inflation_rate_key = pgf_storage::get_pgf_inflation_rate_key(); + let pgf_inflation_rate = self + .read_storage_key::(&pgf_inflation_rate_key) + .unwrap_or_default(); + + let pgf_pd_rate = pgf_inflation_rate / Dec::from(epochs_per_year); + let pgf_inflation = Dec::from(total_tokens) * pgf_pd_rate; + let pgf_inflation_amount = token::Amount::from(pgf_inflation); + + credit_tokens( + &mut self.wl_storage, + &staking_token, + &pgf_address, + pgf_inflation_amount, + )?; + + tracing::info!( + "Minting {} tokens for PGF rewards distribution into the PGF \ + account.", + pgf_inflation_amount.to_string_native() + ); + + // Pgf steward inflation + let pgf_stewards_inflation_rate_key = + pgf_storage::get_steward_inflation_rate_key(); + let pgf_stewards_inflation_rate = self + .read_storage_key::(&pgf_stewards_inflation_rate_key) + .unwrap_or_default(); + + let pgf_stewards_pd_rate = + pgf_stewards_inflation_rate / Dec::from(epochs_per_year); + let pgf_steward_inflation = + Dec::from(total_tokens) * pgf_stewards_pd_rate; + + let pgf_stewards_key = pgf_storage::get_stewards_key(); + let pgf_stewards: BTreeSet
= + self.read_storage_key(&pgf_stewards_key).unwrap_or_default(); + + let pgf_steward_reward = match pgf_stewards.len() { + 0 => Dec::zero(), + _ => pgf_steward_inflation + .trunc_div(&Dec::from(pgf_stewards.len())) + .unwrap_or_default(), + }; + let pgf_steward_reward = token::Amount::from(pgf_steward_reward); + + for steward in pgf_stewards { + credit_tokens( + &mut self.wl_storage, + &staking_token, + &steward, + pgf_steward_reward, + )?; + tracing::info!( + "Minting {} tokens for PGF Steward rewards distribution into \ + the steward address {}.", + pgf_steward_reward.to_string_native(), + steward, + ); + } + Ok(()) } @@ -941,6 +1004,11 @@ mod test_finalize_block { use data_encoding::HEXUPPER; use namada::core::ledger::eth_bridge::storage::wrapped_erc20s; + use namada::core::ledger::governance::storage::keys::get_proposal_execution_key; + use namada::core::ledger::governance::storage::proposal::ProposalType; + use namada::core::ledger::governance::storage::vote::{ + StorageProposalVote, VoteType, + }; use namada::eth_bridge::storage::bridge_pool::{ self, get_key_from_hash, get_nonce_key, get_signed_root_key, }; @@ -973,7 +1041,6 @@ mod test_finalize_block { use namada::types::ethereum_events::{ EthAddress, TransferToEthereum, Uint as ethUint, }; - use namada::types::governance::ProposalVote; use namada::types::hash::Hash; use namada::types::keccak::KeccakHash; use namada::types::key::tm_consensus_key_raw_hash; @@ -981,7 +1048,7 @@ mod test_finalize_block { use namada::types::time::{DateTimeUtc, DurationSecs}; use namada::types::token::{Amount, NATIVE_MAX_DECIMAL_PLACES}; use namada::types::transaction::governance::{ - InitProposalData, ProposalType, VoteProposalData, + InitProposalData, VoteProposalData, }; use namada::types::transaction::protocol::EthereumTxData; use namada::types::transaction::{Fee, WrapperTx, MIN_FEE_AMOUNT}; @@ -1007,7 +1074,7 @@ mod test_finalize_block { keypair: &common::SecretKey, ) -> (Tx, ProcessedTx) { let mut wrapper_tx = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: MIN_FEE_AMOUNT, token: shell.wl_storage.storage.native_token.clone(), @@ -1047,17 +1114,18 @@ mod test_finalize_block { keypair: &common::SecretKey, ) -> ProcessedTx { let tx_code = TestWasms::TxNoOp.read_bytes(); - let mut outer_tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: MIN_FEE_AMOUNT, - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut outer_tx = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: MIN_FEE_AMOUNT, + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); outer_tx.header.chain_id = shell.chain_id.clone(); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new( @@ -1155,17 +1223,18 @@ mod test_finalize_block { fn test_process_proposal_rejected_decrypted_tx() { let (mut shell, _, _, _) = setup(); let keypair = gen_keypair(); - let mut outer_tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Default::default(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut outer_tx = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Default::default(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); outer_tx.header.chain_id = shell.chain_id.clone(); outer_tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); outer_tx.set_data(Data::new( @@ -1221,7 +1290,7 @@ mod test_finalize_block { pow_solution: None, }; let processed_tx = ProcessedTx { - tx: Tx::new(TxType::Decrypted(DecryptedTx::Undecryptable)) + tx: Tx::from_type(TxType::Decrypted(DecryptedTx::Undecryptable)) .to_bytes(), result: TxResult { code: ErrorCodes::Ok.into(), @@ -1229,7 +1298,7 @@ mod test_finalize_block { }, }; - let tx = Tx::new(TxType::Wrapper(Box::new(wrapper))); + let tx = Tx::from_type(TxType::Wrapper(Box::new(wrapper))); shell.enqueue_tx(tx); // check that correct error message is returned @@ -1754,11 +1823,8 @@ mod test_finalize_block { }; // Add a proposal to be accepted and one to be rejected. - add_proposal( - 0, - ProposalVote::Yay(namada::types::governance::VoteType::Default), - ); - add_proposal(1, ProposalVote::Nay); + add_proposal(0, StorageProposalVote::Yay(VoteType::Default)); + add_proposal(1, StorageProposalVote::Nay); // Commit the genesis state shell.wl_storage.commit_block().unwrap(); @@ -2189,7 +2255,7 @@ mod test_finalize_block { let tx_code = std::fs::read(wasm_path) .expect("Expected a file at given code path"); let mut wrapper_tx = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: Amount::zero(), token: shell.wl_storage.storage.native_token.clone(), @@ -3505,16 +3571,15 @@ mod test_finalize_block { /// Test that updating the ethereum bridge params via governance works. #[tokio::test] async fn test_eth_bridge_param_updates() { - use namada::ledger::governance::storage as gov_storage; let (mut shell, _broadcaster, _, mut control_receiver) = setup_at_height(3u64); - let proposal_execution_key = gov_storage::get_proposal_execution_key(0); + let proposal_execution_key = get_proposal_execution_key(0); shell .wl_storage .write(&proposal_execution_key, 0u64) .expect("Test failed."); - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(0u64.try_to_vec().expect("Test failed"))); + let mut tx = Tx::new(shell.chain_id.clone(), None); + tx.add_code_from_hash(Hash::default()).add_data(0u64); let new_min_confirmations = MinimumConfirmations::from(unsafe { NonZeroU64::new_unchecked(42) }); diff --git a/apps/src/lib/node/ledger/shell/governance.rs b/apps/src/lib/node/ledger/shell/governance.rs index e488cbf2b80..09f0c9dac34 100644 --- a/apps/src/lib/node/ledger/shell/governance.rs +++ b/apps/src/lib/node/ledger/shell/governance.rs @@ -1,22 +1,30 @@ -use namada::core::ledger::slash_fund::ADDRESS as slash_fund_address; -use namada::core::types::transaction::governance::ProposalType; -use namada::ledger::events::EventType; -use namada::ledger::governance::{ - storage as gov_storage, ADDRESS as gov_address, +use std::collections::{BTreeSet, HashMap}; + +use namada::core::ledger::governance::storage::keys as gov_storage; +use namada::core::ledger::governance::storage::proposal::{ + AddRemove, PGFAction, PGFTarget, ProposalType, }; -use namada::ledger::native_vp::governance::utils::{ - compute_tally, get_proposal_votes, ProposalEvent, +use namada::core::ledger::governance::utils::{ + compute_proposal_result, ProposalVotes, TallyResult, TallyType, TallyVote, + VotePower, }; +use namada::core::ledger::governance::ADDRESS as gov_address; +use namada::core::ledger::pgf::storage::keys as pgf_storage; +use namada::core::ledger::pgf::ADDRESS; +use namada::core::ledger::storage_api::governance as gov_api; +use namada::ledger::governance::utils::ProposalEvent; +use namada::ledger::pos::BondId; use namada::ledger::protocol; use namada::ledger::storage::types::encode; use namada::ledger::storage::{DBIter, StorageHasher, DB}; use namada::ledger::storage_api::{token, StorageWrite}; -use namada::proof_of_stake::read_total_stake; +use namada::proof_of_stake::parameters::PosParams; +use namada::proof_of_stake::{bond_amount, read_total_stake}; use namada::proto::{Code, Data}; use namada::types::address::Address; -use namada::types::governance::{Council, Tally, TallyResult, VotePower}; use namada::types::storage::Epoch; +use super::utils::force_read; use super::*; #[derive(Default)] @@ -40,218 +48,333 @@ where let proposal_end_epoch_key = gov_storage::get_voting_end_epoch_key(id); let proposal_type_key = gov_storage::get_proposal_type_key(id); - let funds = shell - .read_storage_key::(&proposal_funds_key) - .ok_or_else(|| { - Error::BadProposal(id, "Invalid proposal funds.".to_string()) - })?; - let proposal_end_epoch = shell - .read_storage_key::(&proposal_end_epoch_key) - .ok_or_else(|| { - Error::BadProposal( - id, - "Invalid proposal end_epoch.".to_string(), - ) - })?; - - let proposal_type = shell - .read_storage_key::(&proposal_type_key) - .ok_or_else(|| { - Error::BadProposal(id, "Invalid proposal type".to_string()) - })?; - - let votes = - get_proposal_votes(&shell.wl_storage, proposal_end_epoch, id) - .map_err(|msg| Error::BadProposal(id, msg.to_string()))?; - let params = read_pos_params(&shell.wl_storage) - .map_err(|msg| Error::BadProposal(id, msg.to_string()))?; - let total_stake = - read_total_stake(&shell.wl_storage, ¶ms, proposal_end_epoch) - .map_err(|msg| Error::BadProposal(id, msg.to_string()))?; - let total_stake = VotePower::try_from(total_stake) - .expect("Voting power exceeds NAM supply"); - let tally_result = compute_tally(votes, total_stake, &proposal_type) - .map_err(|msg| Error::BadProposal(id, msg.to_string()))? - .result; - - // Execute proposal if succesful - let transfer_address = match tally_result { - TallyResult::Passed(tally) => { - let (successful_execution, proposal_event) = match tally { - Tally::Default => execute_default_proposal(shell, id), - Tally::PGFCouncil(council) => { - execute_pgf_proposal(id, council) + let funds: token::Amount = + force_read(&shell.wl_storage, &proposal_funds_key)?; + let proposal_end_epoch: Epoch = + force_read(&shell.wl_storage, &proposal_end_epoch_key)?; + let proposal_type: ProposalType = + force_read(&shell.wl_storage, &proposal_type_key)?; + + let params = read_pos_params(&shell.wl_storage)?; + let total_voting_power = + read_total_stake(&shell.wl_storage, ¶ms, proposal_end_epoch)?; + + let tally_type = TallyType::from(proposal_type.clone()); + let votes = compute_proposal_votes( + &shell.wl_storage, + ¶ms, + id, + proposal_end_epoch, + )?; + let proposal_result = + compute_proposal_result(votes, total_voting_power, tally_type); + + let transfer_address = match proposal_result.result { + TallyResult::Passed => { + let proposal_event = match proposal_type { + ProposalType::Default(_) => { + let proposal_code_key = + gov_storage::get_proposal_code_key(id); + let proposal_code = + shell.wl_storage.read_bytes(&proposal_code_key)?; + let result = execute_default_proposal( + shell, + id, + proposal_code.clone(), + )?; + tracing::info!( + "Governance proposal (default) {} has been \ + executed ({}) and passed.", + id, + result + ); + + ProposalEvent::default_proposal_event( + id, + proposal_code.is_some(), + result, + ) + .into() } - Tally::ETHBridge => execute_eth_proposal(id), - }; + ProposalType::PGFSteward(stewards) => { + let result = execute_pgf_steward_proposal( + &mut shell.wl_storage, + stewards, + )?; + tracing::info!( + "Governance proposal (pgf stewards){} has been \ + executed and passed.", + id + ); + + ProposalEvent::pgf_steward_proposal_event(id, result) + .into() + } + ProposalType::PGFPayment(payments) => { + let native_token = + &shell.wl_storage.get_native_token()?; + let result = execute_pgf_payment_proposal( + &mut shell.wl_storage, + native_token, + payments, + )?; + tracing::info!( + "Governance proposal (pgs payments) {} has been \ + executed and passed.", + id + ); + ProposalEvent::pgf_payments_proposal_event(id, result) + .into() + } + }; response.events.push(proposal_event); - if successful_execution { - proposals_result.passed.push(id); - shell - .read_storage_key::
( - &gov_storage::get_author_key(id), - ) - .ok_or_else(|| { - Error::BadProposal( - id, - "Invalid proposal author.".to_string(), - ) - })? - } else { - proposals_result.rejected.push(id); - slash_fund_address - } + proposals_result.passed.push(id); + + let proposal_author_key = gov_storage::get_author_key(id); + shell.wl_storage.read::
(&proposal_author_key)? } TallyResult::Rejected => { - let proposal_event: Event = ProposalEvent::new( - EventType::Proposal.to_string(), - TallyResult::Rejected, - id, - false, - false, - ) - .into(); + if let ProposalType::PGFPayment(_) = proposal_type { + let two_third_nay = proposal_result.two_third_nay(); + if two_third_nay { + let pgf_stewards_key = pgf_storage::get_stewards_key(); + let proposal_author = gov_storage::get_author_key(id); + + let mut pgf_stewards = shell + .wl_storage + .read::>(&pgf_stewards_key)? + .unwrap_or_default(); + let proposal_author: Address = + force_read(&shell.wl_storage, &proposal_author)?; + + pgf_stewards.remove(&proposal_author); + shell + .wl_storage + .write(&pgf_stewards_key, pgf_stewards)?; + + tracing::info!( + "Governance proposal {} was rejected with 2/3 of \ + nay votes. Removing {} from stewards set.", + id, + proposal_author + ); + } + } + let proposal_event = + ProposalEvent::rejected_proposal_event(id).into(); response.events.push(proposal_event); proposals_result.rejected.push(id); - slash_fund_address + tracing::info!( + "Governance proposal {} has been executed and rejected.", + id + ); + + None } }; let native_token = shell.wl_storage.storage.native_token.clone(); - // transfer proposal locked funds - token::transfer( - &mut shell.wl_storage, - &native_token, - &gov_address, - &transfer_address, - funds, - ) - .expect( - "Must be able to transfer governance locked funds after proposal \ - has been tallied", - ); + if let Some(address) = transfer_address { + token::transfer( + &mut shell.wl_storage, + &native_token, + &gov_address, + &address, + funds, + )?; + } else { + token::burn( + &mut shell.wl_storage, + &native_token, + &gov_address, + funds, + )?; + } } Ok(proposals_result) } +fn compute_proposal_votes( + storage: &S, + params: &PosParams, + proposal_id: u64, + epoch: Epoch, +) -> storage_api::Result +where + S: StorageRead, +{ + let votes = gov_api::get_proposal_votes(storage, proposal_id)?; + + let mut validators_vote: HashMap = HashMap::default(); + let mut validator_voting_power: HashMap = + HashMap::default(); + let mut delegators_vote: HashMap = HashMap::default(); + let mut delegator_voting_power: HashMap< + Address, + HashMap, + > = HashMap::default(); + + for vote in votes { + if vote.is_validator() { + let validator = vote.validator.clone(); + let vote_data = vote.data.clone(); + + let validator_stake = + read_total_stake(storage, params, epoch).unwrap_or_default(); + + validators_vote.insert(validator.clone(), vote_data.into()); + validator_voting_power.insert(validator, validator_stake); + } else { + let validator = vote.validator.clone(); + let delegator = vote.delegator.clone(); + let vote_data = vote.data.clone(); + + let bond_id = BondId { + source: delegator.clone(), + validator: validator.clone(), + }; + let (_, delegator_stake) = + bond_amount(storage, &bond_id, epoch).unwrap_or_default(); + + delegators_vote.insert(delegator.clone(), vote_data.into()); + delegator_voting_power + .entry(delegator) + .or_default() + .insert(validator, delegator_stake); + } + } + + Ok(ProposalVotes { + validators_vote, + validator_voting_power, + delegators_vote, + delegator_voting_power, + }) +} + fn execute_default_proposal( shell: &mut Shell, id: u64, -) -> (bool, Event) + proposal_code: Option>, +) -> storage_api::Result where D: DB + for<'iter> DBIter<'iter> + Sync + 'static, H: StorageHasher + Sync + 'static, { - let proposal_code_key = gov_storage::get_proposal_code_key(id); - let proposal_code = shell.read_storage_key_bytes(&proposal_code_key); - match proposal_code { - Some(proposal_code) => { - let mut tx = Tx::new(TxType::Decrypted(DecryptedTx::Decrypted { - #[cfg(not(feature = "mainnet"))] - has_valid_pow: false, - })); - tx.header.chain_id = shell.chain_id.clone(); - tx.set_data(Data::new(encode(&id))); - tx.set_code(Code::new(proposal_code)); - let pending_execution_key = - gov_storage::get_proposal_execution_key(id); - shell - .wl_storage - .write(&pending_execution_key, ()) - .expect("Should be able to write to storage."); - let tx_result = protocol::dispatch_tx( - tx, - 0, /* this is used to compute the fee - * based on the code size. We dont - * need it here. */ - TxIndex::default(), - &mut BlockGasMeter::default(), - &mut shell.wl_storage, - &mut shell.vp_wasm_cache, - &mut shell.tx_wasm_cache, - ); - shell - .wl_storage - .storage - .delete(&pending_execution_key) - .expect("Should be able to delete the storage."); - match tx_result { - Ok(tx_result) if tx_result.is_accepted() => { + if let Some(code) = proposal_code { + let pending_execution_key = gov_storage::get_proposal_execution_key(id); + shell.wl_storage.write(&pending_execution_key, ())?; + + let mut tx = Tx::from_type(TxType::Decrypted(DecryptedTx::Decrypted { + #[cfg(not(feature = "mainnet"))] + has_valid_pow: false, + })); + tx.header.chain_id = shell.chain_id.clone(); + tx.set_data(Data::new(encode(&id))); + tx.set_code(Code::new(code)); + + // 0 parameter is used to compute the fee + // based on the code size. We dont + // need it here. + let tx_result = protocol::dispatch_tx( + tx, + 0, /* this is used to compute the fee + * based on the code size. We dont + * need it here. */ + TxIndex::default(), + &mut BlockGasMeter::default(), + &mut shell.wl_storage, + &mut shell.vp_wasm_cache, + &mut shell.tx_wasm_cache, + ); + shell + .wl_storage + .storage + .delete(&pending_execution_key) + .expect("Should be able to delete the storage."); + match tx_result { + Ok(tx_result) => { + if tx_result.is_accepted() { shell.wl_storage.commit_tx(); - ( - tx_result.is_accepted(), - ProposalEvent::new( - EventType::Proposal.to_string(), - TallyResult::Passed(Tally::Default), - id, - true, - tx_result.is_accepted(), - ) - .into(), - ) - } - _ => { - shell.wl_storage.drop_tx(); - ( - false, - ProposalEvent::new( - EventType::Proposal.to_string(), - TallyResult::Passed(Tally::Default), - id, - true, - false, - ) - .into(), - ) + Ok(true) + } else { + Ok(false) } } + Err(_) => { + shell.wl_storage.drop_tx(); + Ok(false) + } } - None => ( - true, - ProposalEvent::new( - EventType::Proposal.to_string(), - TallyResult::Passed(Tally::Default), - id, - false, - false, - ) - .into(), - ), + } else { + tracing::info!( + "Governance proposal {} doesn't have any associated proposal code.", + id + ); + Ok(true) } } -fn execute_pgf_proposal(id: u64, council: Council) -> (bool, Event) { - // TODO: implement when PGF is in place, update the PGF - // council in storage - ( - true, - ProposalEvent::new( - EventType::Proposal.to_string(), - TallyResult::Passed(Tally::PGFCouncil(council)), - id, - false, - false, - ) - .into(), - ) +fn execute_pgf_steward_proposal( + storage: &mut S, + stewards: HashSet>, +) -> Result +where + S: StorageRead + StorageWrite, +{ + let stewards_key = pgf_storage::get_stewards_key(); + let mut storage_stewards: BTreeSet
= + storage.read(&stewards_key)?.unwrap_or_default(); + + for action in stewards { + match action { + AddRemove::Add(steward) => storage_stewards.insert(steward), + AddRemove::Remove(steward) => storage_stewards.remove(&steward), + }; + } + + let write_result = storage.write(&stewards_key, storage_stewards); + Ok(write_result.is_ok()) } -fn execute_eth_proposal(id: u64) -> (bool, Event) { - // TODO: implement when ETH Bridge. Apply the - // modification requested by the proposal - // - ( - true, - ProposalEvent::new( - EventType::Proposal.to_string(), - TallyResult::Passed(Tally::ETHBridge), - id, - false, - false, - ) - .into(), - ) +fn execute_pgf_payment_proposal( + storage: &mut S, + token: &Address, + payments: Vec, +) -> Result +where + S: StorageRead + StorageWrite, +{ + let continous_payments_key = pgf_storage::get_payments_key(); + let mut continous_payments: BTreeSet = + storage.read(&continous_payments_key)?.unwrap_or_default(); + + for payment in payments { + match payment { + PGFAction::Continuous(action) => match action { + AddRemove::Add(target) => { + continous_payments.insert(target); + } + AddRemove::Remove(target) => { + continous_payments.remove(&target); + } + }, + PGFAction::Retro(target) => { + token::transfer( + storage, + token, + &ADDRESS, + &target.target, + target.amount, + )?; + } + } + } + + let write_result = + storage.write(&continous_payments_key, continous_payments); + Ok(write_result.is_ok()) } diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index ef08373789d..8ad61ee45e7 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -90,6 +90,7 @@ where implicit_vp_code_path, implicit_vp_sha256, epochs_per_year, + max_signatures_per_transaction, pos_gain_p, pos_gain_d, staked_ratio, @@ -182,6 +183,7 @@ where tx_whitelist, implicit_vp_code_hash, epochs_per_year, + max_signatures_per_transaction, pos_gain_p, pos_gain_d, staked_ratio, @@ -200,6 +202,13 @@ where .gov_params .init_storage(&mut self.wl_storage) .expect("Initializing chain parameters must not fail"); + + // Initialize pgf parameters + genesis + .pgf_params + .init_storage(&mut self.wl_storage) + .expect("Initializing chain parameters must not fail"); + // configure the Ethereum bridge if the configuration is set. if let Some(config) = genesis.ethereum_bridge_params { tracing::debug!("Initializing Ethereum bridge storage."); @@ -289,10 +298,12 @@ where .unwrap(); if let Some(pk) = public_key { - let pk_storage_key = pk_key(&address); - self.wl_storage - .write_bytes(&pk_storage_key, pk.try_to_vec().unwrap()) - .unwrap(); + storage_api::account::set_public_key_at( + &mut self.wl_storage, + &address, + &pk, + 0, + )?; } for (key, value) in storage { @@ -328,9 +339,14 @@ where ) { // Initialize genesis implicit for genesis::ImplicitAccount { public_key } in accounts { - let address: Address = (&public_key).into(); - let pk_storage_key = pk_key(&address); - self.wl_storage.write(&pk_storage_key, public_key).unwrap(); + let address: address::Address = (&public_key).into(); + storage_api::account::set_public_key_at( + &mut self.wl_storage, + &address, + &public_key, + 0, + ) + .unwrap(); } } @@ -390,10 +406,13 @@ where .write_bytes(&Key::validity_predicate(addr), vp_code_hash) .expect("Unable to write user VP"); // Validator account key - let pk_key = pk_key(addr); - self.wl_storage - .write(&pk_key, &validator.account_key) - .expect("Unable to set genesis user public key"); + storage_api::account::set_public_key_at( + &mut self.wl_storage, + addr, + &validator.account_key, + 0, + ) + .unwrap(); // Balances // Account balance (tokens not staked in PoS) diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 2b7a0b7ac71..c65fbb3f99f 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -16,6 +16,7 @@ mod stats; #[cfg(any(test, feature = "testing"))] #[allow(dead_code)] pub mod testing; +pub mod utils; mod vote_extensions; use std::collections::{BTreeSet, HashSet}; @@ -1242,13 +1243,13 @@ where } // Check balance for fee - let fee_payer = if wrapper.pk != masp_tx_key().ref_to() { - wrapper.fee_payer() + let gas_payer = if wrapper.pk != masp_tx_key().ref_to() { + wrapper.gas_payer() } else { masp() }; // check that the fee payer has sufficient balance - let balance = self.get_balance(&wrapper.fee.token, &fee_payer); + let balance = self.get_balance(&wrapper.fee.token, &gas_payer); // In testnets with a faucet, tx is allowed to skip fees if // it includes a valid PoW @@ -1287,38 +1288,6 @@ where response } - /// Lookup a validator's keypair for their established account from their - /// wallet. If the node is not validator, this function returns None - #[allow(dead_code)] - fn get_account_keypair(&self) -> Option { - let wallet_path = &self.base_dir.join(self.chain_id.as_str()); - let genesis_path = &self - .base_dir - .join(format!("{}.toml", self.chain_id.as_str())); - let mut wallet = crate::wallet::load_or_new_from_genesis( - wallet_path, - genesis::genesis_config::open_genesis_config(genesis_path).unwrap(), - ); - self.mode.get_validator_address().map(|addr| { - let sk: common::SecretKey = self - .wl_storage - .read(&pk_key(addr)) - .expect( - "A validator should have a public key associated with \ - it's established account", - ) - .expect( - "A validator should have a public key associated with \ - it's established account", - ); - let pk = sk.ref_to(); - wallet.find_key_by_pk(&pk, None).expect( - "A validator's established keypair should be stored in its \ - wallet", - ) - }) - } - #[cfg(not(feature = "mainnet"))] /// Check if the tx has a valid PoW solution. Unlike /// `apply_pow_solution_if_valid`, this won't invalidate the solution. @@ -1922,17 +1891,18 @@ mod test_utils { .expect("begin_block failed"); let keypair = gen_keypair(); // enqueue a wrapper tx - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Default::default(), - token: native_token, - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Default::default(), + token: native_token, + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -2118,10 +2088,11 @@ mod abciplus_mempool_tests { ext }; let tx = { - let mut tx = Tx::new(TxType::Protocol(Box::new(ProtocolTx { - pk: protocol_key.ref_to(), - tx: ProtocolTxType::BridgePoolVext, - }))); + let mut tx = + Tx::from_type(TxType::Protocol(Box::new(ProtocolTx { + pk: protocol_key.ref_to(), + tx: ProtocolTxType::BridgePoolVext, + }))); // invalid tx type, it doesn't match the // tx type declared in the header tx.set_data(Data::new(ext.try_to_vec().expect("Test falied"))); @@ -2153,7 +2124,7 @@ mod test_mempool_validate { let keypair = super::test_utils::gen_keypair(); let mut unsigned_wrapper = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: token::Amount::from_uint(100, 0) .expect("This can't fail"), @@ -2190,7 +2161,7 @@ mod test_mempool_validate { let keypair = super::test_utils::gen_keypair(); let mut invalid_wrapper = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: token::Amount::from_uint(100, 0) .expect("This can't fail"), @@ -2234,10 +2205,8 @@ mod test_mempool_validate { fn test_wrong_tx_type() { let (shell, _recv, _, _) = test_utils::setup(); - // Test Raw TxType - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = shell.chain_id.clone(); - tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); + let mut tx = Tx::new(shell.chain_id.clone(), None); + tx.add_code("wasm_code".as_bytes().to_owned()); let result = shell.mempool_validate( tx.to_bytes().as_ref(), @@ -2259,18 +2228,19 @@ mod test_mempool_validate { let keypair = super::test_utils::gen_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: token::Amount::from_uint(100, 0) - .expect("This can't fail"), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: token::Amount::from_uint(100, 0) + .expect("This can't fail"), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -2366,18 +2336,10 @@ mod test_mempool_validate { let keypair = super::test_utils::gen_keypair(); let wrong_chain_id = ChainId("Wrong chain id".to_string()); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wrong_chain_id.clone(); - tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); - tx.set_data(Data::new("transaction data".as_bytes().to_owned())); - tx.add_section(Section::Signature(Signature::new( - vec![ - tx.header_hash(), - tx.sections[0].get_hash(), - tx.sections[1].get_hash(), - ], - &keypair, - ))); + let mut tx = Tx::new(wrong_chain_id.clone(), None); + tx.add_code("wasm_code".as_bytes().to_owned()) + .add_data("transaction data".as_bytes().to_owned()) + .sign_wrapper(keypair); let result = shell.mempool_validate( tx.to_bytes().as_ref(), @@ -2401,19 +2363,11 @@ mod test_mempool_validate { let keypair = super::test_utils::gen_keypair(); - let mut tx = Tx::new(TxType::Raw); - tx.header.expiration = Some(DateTimeUtc::default()); - tx.header.chain_id = shell.chain_id.clone(); - tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); - tx.set_data(Data::new("transaction data".as_bytes().to_owned())); - tx.add_section(Section::Signature(Signature::new( - vec![ - tx.header_hash(), - tx.sections[0].get_hash(), - tx.sections[1].get_hash(), - ], - &keypair, - ))); + let mut tx = + Tx::new(shell.chain_id.clone(), Some(DateTimeUtc::default())); + tx.add_code("wasm_code".as_bytes().to_owned()) + .add_data("transaction data".as_bytes().to_owned()) + .sign_wrapper(keypair); let result = shell.mempool_validate( tx.to_bytes().as_ref(), diff --git a/apps/src/lib/node/ledger/shell/prepare_proposal.rs b/apps/src/lib/node/ledger/shell/prepare_proposal.rs index e1e94be61ed..4c9356f44ab 100644 --- a/apps/src/lib/node/ledger/shell/prepare_proposal.rs +++ b/apps/src/lib/node/ledger/shell/prepare_proposal.rs @@ -217,7 +217,7 @@ where let mut tx = tx.clone(); match tx.decrypt(privkey).ok() { - Some(()) => { + Some(_) => { tx.update_header(TxType::Decrypted(DecryptedTx::Decrypted { #[cfg(not(feature = "mainnet"))] has_valid_pow: *has_valid_pow, @@ -543,7 +543,7 @@ mod test_prepare_proposal { #[test] fn test_prepare_proposal_rejects_non_wrapper_tx() { let (shell, _recv, _, _) = test_utils::setup(); - let mut tx = Tx::new(TxType::Decrypted(DecryptedTx::Decrypted { + let mut tx = Tx::from_type(TxType::Decrypted(DecryptedTx::Decrypted { has_valid_pow: true, })); tx.header.chain_id = shell.chain_id.clone(); @@ -562,17 +562,18 @@ mod test_prepare_proposal { let (shell, _recv, _, _) = test_utils::setup(); let keypair = gen_keypair(); // an unsigned wrapper will cause an error in processing - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Default::default(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Default::default(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction_data".as_bytes().to_owned())); @@ -938,17 +939,18 @@ mod test_prepare_proposal { // create a request with two new wrappers from mempool and // two wrappers from the previous block to be decrypted for i in 0..2 { - let mut tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Default::default(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut tx = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Default::default(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); tx.header.chain_id = shell.chain_id.clone(); tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); tx.set_data(Data::new( @@ -1006,17 +1008,18 @@ mod test_prepare_proposal { let (mut shell, _recv, _, _) = test_utils::setup(); let keypair = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: 0.into(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: 0.into(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -1057,17 +1060,18 @@ mod test_prepare_proposal { let (shell, _recv, _, _) = test_utils::setup(); let keypair = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: 0.into(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: 0.into(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -1097,17 +1101,18 @@ mod test_prepare_proposal { let (mut shell, _recv, _, _) = test_utils::setup(); let keypair = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -1149,17 +1154,18 @@ mod test_prepare_proposal { let keypair = crate::wallet::defaults::daewon_keypair(); let keypair_2 = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: 0.into(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: 0.into(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); let tx_code = Code::new("wasm_code".as_bytes().to_owned()); wrapper.set_code(tx_code.clone()); @@ -1171,7 +1177,7 @@ mod test_prepare_proposal { ))); let mut new_wrapper = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: 0.into(), token: shell.wl_storage.storage.native_token.clone(), @@ -1212,7 +1218,7 @@ mod test_prepare_proposal { let keypair = gen_keypair(); let tx_time = DateTimeUtc::now(); let mut wrapper_tx = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: 0.into(), token: shell.wl_storage.storage.native_token.clone(), diff --git a/apps/src/lib/node/ledger/shell/process_proposal.rs b/apps/src/lib/node/ledger/shell/process_proposal.rs index ce4f71a6f5a..5010a4f2115 100644 --- a/apps/src/lib/node/ledger/shell/process_proposal.rs +++ b/apps/src/lib/node/ledger/shell/process_proposal.rs @@ -841,14 +841,14 @@ where // transaction key, then the fee payer is effectively // the MASP, otherwise derive // the payer from public key. - let fee_payer = if wrapper.pk != masp_tx_key().ref_to() { - wrapper.fee_payer() + let gas_payer = if wrapper.pk != masp_tx_key().ref_to() { + wrapper.gas_payer() } else { masp() }; // check that the fee payer has sufficient balance let balance = - self.get_balance(&wrapper.fee.token, &fee_payer); + self.get_balance(&wrapper.fee.token, &gas_payer); // In testnets, tx is allowed to skip fees if it // includes a valid PoW @@ -1537,20 +1537,23 @@ mod test_process_proposal { fn test_unsigned_wrapper_rejected() { let (mut shell, _recv, _, _) = test_utils::setup_at_height(3u64); let keypair = gen_keypair(); - let mut outer_tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Default::default(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let public_key = keypair.ref_to(); + let mut outer_tx = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Default::default(), + token: shell.wl_storage.storage.native_token.clone(), + }, + public_key, + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); outer_tx.header.chain_id = shell.chain_id.clone(); outer_tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); outer_tx.set_data(Data::new("transaction data".as_bytes().to_owned())); + let tx = outer_tx.to_bytes(); let response = { @@ -1568,12 +1571,14 @@ mod test_process_proposal { } }; + println!("{}", response.result.info); + assert_eq!(response.result.code, u32::from(ErrorCodes::InvalidSig)); assert_eq!( response.result.info, String::from( - "WrapperTx signature verification failed: Transaction doesn't \ - have any data with a signature." + "WrapperTx signature verification failed: The wrapper \ + signature is invalid." ) ); } @@ -1584,17 +1589,18 @@ mod test_process_proposal { fn test_wrapper_bad_signature_rejected() { let (mut shell, _recv, _, _) = test_utils::setup_at_height(3u64); let keypair = gen_keypair(); - let mut outer_tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::from_uint(100, 0).expect("Test failed"), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut outer_tx = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::from_uint(100, 0).expect("Test failed"), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); outer_tx.header.chain_id = shell.chain_id.clone(); outer_tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); outer_tx.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -1622,8 +1628,8 @@ mod test_process_proposal { panic!("Test failed") }; let expected_error = "WrapperTx signature verification \ - failed: Transaction doesn't have any \ - data with a signature."; + failed: The wrapper signature is \ + invalid."; assert_eq!( response.result.code, u32::from(ErrorCodes::InvalidSig) @@ -1652,17 +1658,18 @@ mod test_process_proposal { ) .unwrap(); let keypair = gen_keypair(); - let mut outer_tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::from_uint(1, 0).expect("Test failed"), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut outer_tx = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::from_uint(1, 0).expect("Test failed"), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); outer_tx.header.chain_id = shell.chain_id.clone(); outer_tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); outer_tx.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -1721,17 +1728,18 @@ mod test_process_proposal { ) .unwrap(); - let mut outer_tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::native_whole(1_000_100), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut outer_tx = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::native_whole(1_000_100), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); outer_tx.header.chain_id = shell.chain_id.clone(); outer_tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); outer_tx.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -1774,7 +1782,7 @@ mod test_process_proposal { let mut txs = vec![]; for i in 0..3 { let mut outer_tx = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: Amount::native_whole(i as u64), token: shell.wl_storage.storage.native_token.clone(), @@ -1852,7 +1860,7 @@ mod test_process_proposal { let (mut shell, _recv, _, _) = test_utils::setup_at_height(3u64); let keypair = gen_keypair(); - let mut tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + let mut tx = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: Default::default(), token: shell.wl_storage.storage.native_token.clone(), @@ -1904,7 +1912,7 @@ mod test_process_proposal { let (mut shell, _recv, _, _) = test_utils::setup_at_height(3u64); let keypair = crate::wallet::defaults::daewon_keypair(); - let mut tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + let mut tx = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: Default::default(), token: shell.wl_storage.storage.native_token.clone(), @@ -1961,7 +1969,7 @@ mod test_process_proposal { pow_solution: None, }; - let tx = Tx::new(TxType::Wrapper(Box::new(wrapper))); + let tx = Tx::from_type(TxType::Wrapper(Box::new(wrapper))); let mut decrypted = tx.clone(); decrypted.update_header(TxType::Decrypted(DecryptedTx::Undecryptable)); @@ -1989,7 +1997,7 @@ mod test_process_proposal { #[test] fn test_too_many_decrypted_txs() { let (mut shell, _recv, _, _) = test_utils::setup_at_height(3u64); - let mut tx = Tx::new(TxType::Decrypted(DecryptedTx::Decrypted { + let mut tx = Tx::from_type(TxType::Decrypted(DecryptedTx::Decrypted { #[cfg(not(feature = "mainnet"))] has_valid_pow: false, })); @@ -2023,10 +2031,12 @@ mod test_process_proposal { fn test_raw_tx_rejected() { let (mut shell, _recv, _, _) = test_utils::setup_at_height(3u64); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = shell.chain_id.clone(); - tx.set_code(Code::new("wasm_code".as_bytes().to_owned())); - tx.set_data(Data::new("transaction data".as_bytes().to_owned())); + let keypair = crate::wallet::defaults::daewon_keypair(); + + let mut tx = Tx::new(shell.chain_id.clone(), None); + tx.add_code("wasm_code".as_bytes().to_owned()) + .add_data("transaction data".as_bytes().to_owned()) + .sign_wrapper(keypair); let response = { let request = ProcessProposal { @@ -2062,17 +2072,18 @@ mod test_process_proposal { let keypair = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); @@ -2136,17 +2147,18 @@ mod test_process_proposal { ) .unwrap(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -2193,17 +2205,18 @@ mod test_process_proposal { let keypair = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -2282,17 +2295,18 @@ mod test_process_proposal { ) .unwrap(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); @@ -2351,17 +2365,18 @@ mod test_process_proposal { let (mut shell, _recv, _, _) = test_utils::setup(); let keypair = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); let wrong_chain_id = ChainId("Wrong chain id".to_string()); wrapper.header.chain_id = wrong_chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); @@ -2413,17 +2428,18 @@ mod test_process_proposal { let keypair = crate::wallet::defaults::daewon_keypair(); let wrong_chain_id = ChainId("Wrong chain id".to_string()); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: token::Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: token::Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = wrong_chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper @@ -2473,17 +2489,18 @@ mod test_process_proposal { let (mut shell, _recv, _, _) = test_utils::setup(); let keypair = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: token::Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: token::Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.header.expiration = Some(DateTimeUtc::default()); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); @@ -2515,17 +2532,18 @@ mod test_process_proposal { let (mut shell, _recv, _, _) = test_utils::setup(); let keypair = crate::wallet::defaults::daewon_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: token::Amount::zero(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: token::Amount::zero(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.header.expiration = Some(DateTimeUtc::default()); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); @@ -2571,17 +2589,18 @@ mod test_process_proposal { fn test_include_only_protocol_txs() { let (mut shell, _recv, _, _) = test_utils::setup_at_height(1u64); let keypair = gen_keypair(); - let mut wrapper = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: 0.into(), - token: shell.wl_storage.storage.native_token.clone(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut wrapper = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: 0.into(), + token: shell.wl_storage.storage.native_token.clone(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); wrapper.header.chain_id = shell.chain_id.clone(); wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); diff --git a/apps/src/lib/node/ledger/shell/utils.rs b/apps/src/lib/node/ledger/shell/utils.rs new file mode 100644 index 00000000000..e55f54e8f82 --- /dev/null +++ b/apps/src/lib/node/ledger/shell/utils.rs @@ -0,0 +1,14 @@ +use borsh::BorshDeserialize; +use namada::ledger::storage_api::{self, StorageRead}; +use namada::types::storage::Key; + +pub(super) fn force_read(storage: &S, key: &Key) -> storage_api::Result +where + S: StorageRead, + T: BorshDeserialize, +{ + storage + .read::(key) + .transpose() + .expect("Storage key must be present.") +} diff --git a/apps/src/lib/wallet/defaults.rs b/apps/src/lib/wallet/defaults.rs index 81ca184f161..8ab728c96f7 100644 --- a/apps/src/lib/wallet/defaults.rs +++ b/apps/src/lib/wallet/defaults.rs @@ -8,7 +8,7 @@ pub use dev::{ validator_keys, }; use namada::ledger::wallet::alias::Alias; -use namada::ledger::{eth_bridge, governance, pos}; +use namada::ledger::{eth_bridge, governance, pgf, pos}; use namada::types::address::Address; use namada::types::key::*; @@ -22,6 +22,7 @@ pub fn addresses_from_genesis(genesis: GenesisConfig) -> Vec<(Alias, Address)> { ("pos_slash_pool".into(), pos::SLASH_POOL_ADDRESS), ("governance".into(), governance::ADDRESS), ("eth_bridge".into(), eth_bridge::ADDRESS), + ("pgf".into(), pgf::ADDRESS), ]; // Genesis validators let validator_addresses = @@ -75,7 +76,7 @@ mod dev { use borsh::BorshDeserialize; use namada::ledger::wallet::alias::Alias; - use namada::ledger::{governance, pos}; + use namada::ledger::{governance, pgf, pos}; use namada::types::address::{ apfel, btc, dot, eth, kartoffel, nam, schnitzel, Address, }; @@ -146,6 +147,7 @@ mod dev { ("pos".into(), pos::ADDRESS), ("pos_slash_pool".into(), pos::SLASH_POOL_ADDRESS), ("governance".into(), governance::ADDRESS), + ("governance".into(), pgf::ADDRESS), ("validator".into(), validator_address()), ("albert".into(), albert_address()), ("bertha".into(), bertha_address()), diff --git a/core/Cargo.toml b/core/Cargo.toml index 8b58481c170..7c5addad7cc 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -40,7 +40,6 @@ abciplus = [ ibc-mocks = [ "ibc/mocks", - "ibc/std", ] ethers-derive = [ @@ -73,8 +72,8 @@ ferveo = {optional = true, git = "https://github.com/anoma/ferveo", rev = "e5abd ferveo-common = {git = "https://github.com/anoma/ferveo", rev = "e5abd0acc938da90140351a65a26472eb495ce4d"} tpke = {package = "group-threshold-cryptography", optional = true, git = "https://github.com/anoma/ferveo", rev = "e5abd0acc938da90140351a65a26472eb495ce4d"} # TODO using the same version of tendermint-rs as we do here. -ibc = { git = "https://github.com/heliaxdev/cosmos-ibc-rs.git", rev = "634f4ede136d045dd6f1ff8f4984dd0006aa15f0", default-features = false, features = ["serde"], optional = true} -ibc-proto = {git = "https://github.com/heliaxdev/ibc-proto-rs.git", rev = "bb16e17a4d9260d5f20516a8eda43fa52377fad2", default-features = false, optional = true} +ibc = { git = "https://github.com/heliaxdev/cosmos-ibc-rs.git", rev = "38a827d3901e590b2935ee5b6b81b4d67c399560", features = ["serde"], optional = true} +ibc-proto = {git = "https://github.com/heliaxdev/ibc-proto-rs.git", rev = "31892ee743b2af017d5629b2af419ee20b6100c7", default-features = false, optional = true} ics23.workspace = true impl-num-traits = "0.1.2" index-set.workspace = true diff --git a/core/src/ledger/governance/cli/mod.rs b/core/src/ledger/governance/cli/mod.rs new file mode 100644 index 00000000000..45b839d1f44 --- /dev/null +++ b/core/src/ledger/governance/cli/mod.rs @@ -0,0 +1,6 @@ +/// CLi governance offline structures +pub mod offline; +/// CLi governance on chain structures +pub mod onchain; +/// CLi governance validation +mod validation; diff --git a/core/src/ledger/governance/cli/offline.rs b/core/src/ledger/governance/cli/offline.rs new file mode 100644 index 00000000000..e63ac2ff498 --- /dev/null +++ b/core/src/ledger/governance/cli/offline.rs @@ -0,0 +1,389 @@ +use std::collections::{BTreeMap, BTreeSet}; +use std::fs::{File, ReadDir}; +use std::path::PathBuf; + +use borsh::{BorshDeserialize, BorshSerialize}; +use serde::{Deserialize, Serialize}; + +use super::onchain::ProposalVote; +use super::validation::{is_valid_tally_epoch, ProposalValidation}; +use crate::proto::SignatureIndex; +use crate::types::account::AccountPublicKeysMap; +use crate::types::address::Address; +use crate::types::hash::Hash; +use crate::types::key::{common, RefTo, SigScheme}; +use crate::types::storage::Epoch; + +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +/// The offline proposal structure +pub struct OfflineProposal { + /// The proposal content + pub content: BTreeMap, + /// The proposal author address + pub author: Address, + /// The epoch from which this changes are executed + pub tally_epoch: Epoch, +} + +impl OfflineProposal { + /// Validate the offline proposal + pub fn validate( + self, + current_epoch: Epoch, + ) -> Result { + is_valid_tally_epoch(self.tally_epoch, current_epoch)?; + + Ok(self) + } + + /// Hash an offline proposal + pub fn hash(&self) -> Hash { + let content_serialized = serde_json::to_vec(&self.content) + .expect("Conversion to bytes shouldn't fail."); + let author_serialized = serde_json::to_vec(&self.author) + .expect("Conversion to bytes shouldn't fail."); + let tally_epoch_serialized = serde_json::to_vec(&self.tally_epoch) + .expect("Conversion to bytes shouldn't fail."); + let proposal_serialized = &[ + content_serialized, + author_serialized, + tally_epoch_serialized, + ] + .concat(); + Hash::sha256(proposal_serialized) + } + + /// Sign an offline proposal + pub fn sign( + self, + signing_keys: Vec, + account_public_keys_map: &AccountPublicKeysMap, + ) -> OfflineSignedProposal { + let proposal_hash = self.hash(); + + let signatures_index = compute_signatures_index( + &signing_keys, + account_public_keys_map, + &proposal_hash, + ); + + OfflineSignedProposal { + proposal: self, + signatures: signatures_index, + } + } +} + +impl TryFrom<&[u8]> for OfflineProposal { + type Error = serde_json::Error; + + fn try_from(value: &[u8]) -> Result { + serde_json::from_slice(value) + } +} + +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +/// The signed offline proposal structure +pub struct OfflineSignedProposal { + /// The proposal content + pub proposal: OfflineProposal, + /// The signatures over proposal data + pub signatures: BTreeSet, +} + +impl TryFrom<&[u8]> for OfflineSignedProposal { + type Error = serde_json::Error; + + fn try_from(value: &[u8]) -> Result { + serde_json::from_slice(value) + } +} + +impl OfflineSignedProposal { + /// Serialize the proposal to file. Returns the filename if successful. + pub fn serialize( + &self, + output_folder: Option, + ) -> Result { + let proposal_filename = + format!("offline_proposal_{}.json", self.proposal.hash()); + + let filepath = match output_folder { + Some(base_path) => base_path + .join(proposal_filename) + .to_str() + .unwrap() + .to_owned(), + None => proposal_filename, + }; + + let out = + File::create(&filepath).expect("Should be able to create a file."); + serde_json::to_writer_pretty(out, self)?; + + Ok(filepath) + } + + /// Check whether the signature is valid or not + fn check_signature( + &self, + account_public_keys_map: &AccountPublicKeysMap, + threshold: u8, + ) -> bool { + let proposal_hash = self.proposal.hash(); + if self.signatures.len() < threshold as usize { + return false; + } + + let valid_signatures = compute_total_valid_signatures( + &self.signatures, + account_public_keys_map, + &proposal_hash, + ); + + valid_signatures >= threshold + } + + /// Validate an offline proposal + pub fn validate( + self, + account_public_keys_map: &AccountPublicKeysMap, + threshold: u8, + ) -> Result { + let valid_signature = + self.check_signature(account_public_keys_map, threshold); + if !valid_signature { + Err(ProposalValidation::OkNoSignature) + } else { + Ok(self) + } + } +} + +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +/// The offline proposal structure +pub struct OfflineVote { + /// The proposal data hash + pub proposal_hash: Hash, + /// The proposal vote + pub vote: ProposalVote, + /// The signature over proposal data + pub signatures: BTreeSet, + /// The address corresponding to the signature pk + pub address: Address, + /// The validators address to which this address delegated to + pub delegations: Vec
, +} + +impl OfflineVote { + /// Create an offline vote for a proposal + pub fn new( + proposal: &OfflineSignedProposal, + vote: ProposalVote, + address: Address, + delegations: Vec
, + ) -> Self { + let proposal_hash = proposal.proposal.hash(); + + Self { + proposal_hash, + vote, + delegations, + signatures: BTreeSet::default(), + address, + } + } + + /// Sign the offline vote + pub fn sign( + self, + keypairs: Vec, + account_public_keys_map: &AccountPublicKeysMap, + ) -> Self { + let proposal_vote_data = self + .vote + .try_to_vec() + .expect("Conversion to bytes shouldn't fail."); + let delegations_hash = self + .delegations + .try_to_vec() + .expect("Conversion to bytes shouldn't fail."); + + let vote_hash = Hash::sha256( + [ + self.proposal_hash.to_vec(), + proposal_vote_data, + delegations_hash, + ] + .concat(), + ); + + let signatures = compute_signatures_index( + &keypairs, + account_public_keys_map, + &vote_hash, + ); + + Self { signatures, ..self } + } + + /// Check if the vote is yay + pub fn is_yay(&self) -> bool { + self.vote.is_yay() + } + + /// compute the hash of a proposal + pub fn compute_hash(&self) -> Hash { + let proposal_hash_data = self + .proposal_hash + .try_to_vec() + .expect("Conversion to bytes shouldn't fail."); + let proposal_vote_data = self + .vote + .try_to_vec() + .expect("Conversion to bytes shouldn't fail."); + let delegations_hash = self + .delegations + .try_to_vec() + .expect("Conversion to bytes shouldn't fail."); + let vote_serialized = + &[proposal_hash_data, proposal_vote_data, delegations_hash] + .concat(); + + Hash::sha256(vote_serialized) + } + + /// Check whether the signature is valid or not + pub fn check_signature( + &self, + account_public_keys_map: &AccountPublicKeysMap, + threshold: u8, + ) -> bool { + if self.signatures.len() < threshold as usize { + return false; + } + let vote_data_hash = self.compute_hash(); + + let valid_signatures = compute_total_valid_signatures( + &self.signatures, + account_public_keys_map, + &vote_data_hash, + ); + + valid_signatures >= threshold + } + + /// Serialize the proposal to file. Returns the filename if successful. + pub fn serialize( + &self, + output_folder: Option, + ) -> Result { + let vote_filename = format!( + "offline_vote_{}_{}.json", + self.proposal_hash, self.address + ); + let filepath = match output_folder { + Some(base_path) => { + base_path.join(vote_filename).to_str().unwrap().to_owned() + } + None => vote_filename, + }; + let out = File::create(&filepath).unwrap(); + serde_json::to_writer_pretty(out, self)?; + + Ok(filepath) + } +} + +/// Compute the signatures index +fn compute_signatures_index( + keys: &[common::SecretKey], + account_public_keys_map: &AccountPublicKeysMap, + hashed_data: &Hash, +) -> BTreeSet { + keys.iter() + .filter_map(|signing_key| { + let public_key = signing_key.ref_to(); + let public_key_index = + account_public_keys_map.get_index_from_public_key(&public_key); + if public_key_index.is_some() { + let signature = + common::SigScheme::sign(signing_key, hashed_data); + Some(SignatureIndex::from_single_signature(signature)) + } else { + None + } + }) + .collect::>() +} + +/// Compute the total amount of signatures +fn compute_total_valid_signatures( + signatures: &BTreeSet, + account_public_keys_map: &AccountPublicKeysMap, + hashed_data: &Hash, +) -> u8 { + signatures.iter().fold(0_u8, |acc, signature_index| { + let public_key = account_public_keys_map + .get_public_key_from_index(signature_index.index); + if let Some(pk) = public_key { + let sig_check = common::SigScheme::verify_signature( + &pk, + hashed_data, + &signature_index.signature, + ); + if sig_check.is_ok() { acc + 1 } else { acc } + } else { + acc + } + }) +} + +/// Read all offline files from a folder +pub fn read_offline_files(path: ReadDir) -> Vec { + path.filter_map(|path| { + if let Ok(path) = path { + let file_type = path.file_type(); + if let Ok(file_type) = file_type { + if file_type.is_file() + && path.file_name().to_string_lossy().contains("offline_") + { + Some(path.path()) + } else { + None + } + } else { + None + } + } else { + None + } + }) + .collect::>() +} + +/// Find offline votes from a folder +pub fn find_offline_proposal(files: &[PathBuf]) -> Option { + files + .iter() + .filter(|path| path.to_string_lossy().contains("offline_proposal_")) + .cloned() + .collect::>() + .first() + .cloned() +} + +/// Find offline votes from a folder +pub fn find_offline_votes(files: &[PathBuf]) -> Vec { + files + .iter() + .filter(|path| path.to_string_lossy().contains("offline_vote_")) + .cloned() + .collect::>() +} diff --git a/core/src/ledger/governance/cli/onchain.rs b/core/src/ledger/governance/cli/onchain.rs new file mode 100644 index 00000000000..e4051353d3a --- /dev/null +++ b/core/src/ledger/governance/cli/onchain.rs @@ -0,0 +1,333 @@ +use std::collections::BTreeMap; + +use borsh::{BorshDeserialize, BorshSerialize}; +use serde::{Deserialize, Serialize}; + +use super::validation::{ + is_valid_author_balance, is_valid_content, is_valid_default_proposal_data, + is_valid_end_epoch, is_valid_grace_epoch, is_valid_pgf_funding_data, + is_valid_pgf_stewards_data, is_valid_proposal_period, is_valid_start_epoch, + ProposalValidation, +}; +use crate::ledger::governance::parameters::GovernanceParameters; +use crate::ledger::storage_api::token; +use crate::types::address::Address; +use crate::types::storage::Epoch; + +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +/// The proposal structure +pub struct OnChainProposal { + /// The proposal id + pub id: Option, + /// The proposal content + pub content: BTreeMap, + /// The proposal author address + pub author: Address, + /// The epoch from which voting is allowed + pub voting_start_epoch: Epoch, + /// The epoch from which voting is stopped + pub voting_end_epoch: Epoch, + /// The epoch from which this changes are executed + pub grace_epoch: Epoch, +} + +/// Pgf default proposal +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub struct DefaultProposal { + /// The proposal data + pub proposal: OnChainProposal, + /// The default proposal extra data + pub data: Option>, +} + +impl DefaultProposal { + /// Validate a default funding proposal + pub fn validate( + self, + governance_parameters: &GovernanceParameters, + current_epoch: Epoch, + balance: token::Amount, + ) -> Result { + is_valid_start_epoch( + self.proposal.voting_start_epoch, + current_epoch, + governance_parameters.min_proposal_voting_period, + )?; + is_valid_end_epoch( + self.proposal.voting_start_epoch, + self.proposal.voting_end_epoch, + current_epoch, + governance_parameters.min_proposal_voting_period, + governance_parameters.min_proposal_voting_period, + governance_parameters.max_proposal_period, + )?; + is_valid_grace_epoch( + self.proposal.grace_epoch, + self.proposal.voting_end_epoch, + governance_parameters.min_proposal_grace_epochs, + )?; + is_valid_proposal_period( + self.proposal.voting_start_epoch, + self.proposal.grace_epoch, + governance_parameters.max_proposal_period, + )?; + is_valid_author_balance( + balance, + governance_parameters.min_proposal_fund, + )?; + is_valid_content( + &self.proposal.content, + governance_parameters.max_proposal_content_size, + )?; + is_valid_default_proposal_data( + &self.data, + governance_parameters.max_proposal_code_size, + )?; + + Ok(self) + } +} + +impl TryFrom<&[u8]> for DefaultProposal { + type Error = serde_json::Error; + + fn try_from(value: &[u8]) -> Result { + serde_json::from_slice(value) + } +} + +/// Pgf stewards proposal +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub struct PgfStewardProposal { + /// The proposal data + pub proposal: OnChainProposal, + /// The Pgf steward proposal extra data + pub data: Vec, +} + +impl PgfStewardProposal { + /// Validate a Pgf stewards proposal + pub fn validate( + self, + governance_parameters: &GovernanceParameters, + current_epoch: Epoch, + balance: token::Amount, + ) -> Result { + is_valid_start_epoch( + self.proposal.voting_start_epoch, + current_epoch, + governance_parameters.min_proposal_voting_period, + )?; + is_valid_end_epoch( + self.proposal.voting_start_epoch, + self.proposal.voting_end_epoch, + current_epoch, + governance_parameters.min_proposal_voting_period, + governance_parameters.min_proposal_voting_period, + governance_parameters.max_proposal_period, + )?; + is_valid_grace_epoch( + self.proposal.grace_epoch, + self.proposal.voting_end_epoch, + governance_parameters.min_proposal_grace_epochs, + )?; + is_valid_proposal_period( + self.proposal.voting_start_epoch, + self.proposal.grace_epoch, + governance_parameters.max_proposal_period, + )?; + is_valid_author_balance( + balance, + governance_parameters.min_proposal_fund, + )?; + is_valid_content( + &self.proposal.content, + governance_parameters.max_proposal_content_size, + )?; + is_valid_pgf_stewards_data(&self.data, &self.proposal.author)?; + + Ok(self) + } +} + +impl TryFrom<&[u8]> for PgfStewardProposal { + type Error = serde_json::Error; + + fn try_from(value: &[u8]) -> Result { + serde_json::from_slice(value) + } +} + +/// Pgf funding proposal +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub struct PgfFundingProposal { + /// The proposal data + pub proposal: OnChainProposal, + /// The Pgf funding proposal extra data + pub data: PgfFunding, +} + +impl PgfFundingProposal { + /// Validate a Pgf funding proposal + pub fn validate( + self, + governance_parameters: &GovernanceParameters, + current_epoch: Epoch, + ) -> Result { + is_valid_start_epoch( + self.proposal.voting_start_epoch, + current_epoch, + governance_parameters.min_proposal_voting_period, + )?; + is_valid_end_epoch( + self.proposal.voting_start_epoch, + self.proposal.voting_end_epoch, + current_epoch, + governance_parameters.min_proposal_voting_period, + governance_parameters.min_proposal_voting_period, + governance_parameters.max_proposal_period, + )?; + is_valid_grace_epoch( + self.proposal.grace_epoch, + self.proposal.voting_end_epoch, + governance_parameters.min_proposal_grace_epochs, + )?; + is_valid_proposal_period( + self.proposal.voting_start_epoch, + self.proposal.grace_epoch, + governance_parameters.max_proposal_period, + )?; + is_valid_content( + &self.proposal.content, + governance_parameters.max_proposal_content_size, + )?; + is_valid_pgf_funding_data(&self.data)?; + + Ok(self) + } +} + +impl TryFrom<&[u8]> for PgfFundingProposal { + type Error = serde_json::Error; + + fn try_from(value: &[u8]) -> Result { + serde_json::from_slice(value) + } +} + +/// Pgf stewards +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub struct PgfSteward { + /// Pgf action + pub action: PgfAction, + /// steward address + pub address: Address, +} + +/// Pgf action +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub enum PgfAction { + /// Add action + Add, + /// Remove action + Remove, +} + +impl PgfAction { + /// Check if a pgf action is adding a steward + pub fn is_add(&self) -> bool { + matches!(self, PgfAction::Add) + } +} + +/// Pgf fundings +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub struct PgfFunding { + /// Pgf continous funding + pub continous: Vec, + /// pgf retro fundings + pub retro: Vec, +} + +/// Pgf continous funding +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub struct PgfContinous { + /// Pgf target + pub target: PgfFundingTarget, + /// Pgf action + pub action: PgfAction, +} + +/// Pgf retro funding +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub struct PgfRetro { + /// Pgf retro target + pub target: PgfFundingTarget, +} + +/// Pgf Target +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +pub struct PgfFundingTarget { + /// Target amount + pub amount: token::Amount, + /// Target address + pub address: Address, +} + +/// Rappresent an proposal vote +#[derive( + Debug, + Clone, + BorshSerialize, + BorshDeserialize, + Serialize, + Deserialize, + PartialEq, +)] +pub enum ProposalVote { + /// Rappresent an yay proposal vote + Yay, + /// Rappresent an nay proposal vote + Nay, + /// Rappresent an invalid proposal vote + Invalid, +} + +impl TryFrom for ProposalVote { + type Error = String; + + fn try_from(value: String) -> Result { + match value.trim().to_lowercase().as_str() { + "yay" => Ok(ProposalVote::Yay), + "nay" => Ok(ProposalVote::Nay), + _ => Err("invalid vote".to_string()), + } + } +} + +impl ProposalVote { + /// Check if the proposal type is yay + pub fn is_yay(&self) -> bool { + matches!(self, ProposalVote::Yay) + } +} diff --git a/core/src/ledger/governance/cli/utils.rs b/core/src/ledger/governance/cli/utils.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/core/src/ledger/governance/cli/validation.rs b/core/src/ledger/governance/cli/validation.rs new file mode 100644 index 00000000000..7ea5b50c0a8 --- /dev/null +++ b/core/src/ledger/governance/cli/validation.rs @@ -0,0 +1,259 @@ +use std::collections::BTreeMap; + +use thiserror::Error; + +use super::onchain::{PgfFunding, PgfSteward}; +use crate::types::address::Address; +use crate::types::storage::Epoch; +use crate::types::token; + +/// This enum raprresent a proposal data +#[derive(Clone, Debug, PartialEq, Error)] +pub enum ProposalValidation { + /// The proposal field are correct but there is no signature + #[error("The proposal is not signed. Can't vote on it")] + OkNoSignature, + /// The proposal start epoch is invalid + #[error( + "Invalid proposal start epoch: {0} must be greater than current epoch \ + {1} and a multiple of {2}" + )] + InvalidStartEpoch(Epoch, Epoch, u64), + /// The proposal difference between start and end epoch is invalid + #[error( + "Invalid proposal end epoch: difference between proposal start and \ + end epoch must be at least {0}, at max {1} and the end epoch must be \ + a multiple of {0}" + )] + InvalidStartEndDifference(u64, u64), + /// The proposal difference between end and grace epoch is invalid + #[error( + "Invalid proposal grace epoch: difference between proposal grace and \ + end epoch must be at least {0}, but found {1}" + )] + InvalidEndGraceDifference(u64, u64), + /// The proposal difference between end and grace epoch is invalid + #[error( + "Invalid proposal period: difference between proposal start and grace \ + epoch must be at most {1}, but found {0}" + )] + InvalidProposalPeriod(u64, u64), + /// The proposal author does not have enought balance to pay for proposal + /// fees + #[error( + "Invalid proposal minimum funds: the author address has {0} but \ + minimum is {1}" + )] + InvalidBalance(String, String), + /// The proposal content is too large + #[error( + "Invalid proposal content length: the proposal content length is {0} \ + but maximum is {1}" + )] + InvalidContentLength(u64, u64), + /// Invalid offline proposal tally epoch + #[error( + "Invalid proposal tally epoch: tally epoch ({0}) must be less than \ + current epoch ({1})" + )] + InvalidTallyEPoch(Epoch, Epoch), + /// The proposal wasm code is not valid + #[error( + "Invalid proposal extra data: file doesn't exist or content size \ + ({0}) is to big (max {1})" + )] + InvalidDefaultProposalExtraData(u64, u64), + /// The pgf stewards data is not valid + #[error("Invalid proposal extra data: cannot be empty.")] + InvalidPgfStewardsExtraData, + /// The pgf funding data is not valid + #[error("invalid proposal extra data: cannot be empty.")] + InvalidPgfFundingExtraData, +} + +pub fn is_valid_author_balance( + author_balance: token::Amount, + min_proposal_fund: token::Amount, +) -> Result<(), ProposalValidation> { + if author_balance.can_spend(&min_proposal_fund) { + Ok(()) + } else { + Err(ProposalValidation::InvalidBalance( + author_balance.to_string_native(), + min_proposal_fund.to_string_native(), + )) + } +} + +pub fn is_valid_start_epoch( + proposal_start_epoch: Epoch, + current_epoch: Epoch, + proposal_epoch_multiplier: u64, +) -> Result<(), ProposalValidation> { + let start_epoch_greater_than_current = proposal_start_epoch > current_epoch; + let start_epoch_is_multipler = + proposal_start_epoch.0 % proposal_epoch_multiplier == 0; + + if start_epoch_greater_than_current && start_epoch_is_multipler { + Ok(()) + } else { + Err(ProposalValidation::InvalidStartEpoch( + proposal_start_epoch, + current_epoch, + proposal_epoch_multiplier, + )) + } +} + +pub fn is_valid_end_epoch( + proposal_start_epoch: Epoch, + proposal_end_epoch: Epoch, + _current_epoch: Epoch, + proposal_epoch_multiplier: u64, + min_proposal_voting_period: u64, + max_proposal_period: u64, +) -> Result<(), ProposalValidation> { + let voting_period = proposal_end_epoch.0 - proposal_start_epoch.0; + let end_epoch_is_multipler = + proposal_end_epoch % proposal_epoch_multiplier == 0; + let is_valid_voting_period = voting_period > 0 + && voting_period >= min_proposal_voting_period + && min_proposal_voting_period <= max_proposal_period; + + if end_epoch_is_multipler && is_valid_voting_period { + Ok(()) + } else { + Err(ProposalValidation::InvalidStartEndDifference( + min_proposal_voting_period, + max_proposal_period, + )) + } +} + +pub fn is_valid_grace_epoch( + proposal_grace_epoch: Epoch, + proposal_end_epoch: Epoch, + min_proposal_grace_epoch: u64, +) -> Result<(), ProposalValidation> { + let grace_period = proposal_grace_epoch.0 - proposal_end_epoch.0; + + if grace_period > 0 && grace_period >= min_proposal_grace_epoch { + Ok(()) + } else { + Err(ProposalValidation::InvalidEndGraceDifference( + grace_period, + min_proposal_grace_epoch, + )) + } +} + +pub fn is_valid_proposal_period( + proposal_start_epoch: Epoch, + proposal_grace_epoch: Epoch, + max_proposal_period: u64, +) -> Result<(), ProposalValidation> { + let proposal_period = proposal_grace_epoch.0 - proposal_start_epoch.0; + + if proposal_period > 0 && proposal_period <= max_proposal_period { + Ok(()) + } else { + Err(ProposalValidation::InvalidProposalPeriod( + proposal_period, + max_proposal_period, + )) + } +} + +pub fn is_valid_content( + proposal_content: &BTreeMap, + max_content_length: u64, +) -> Result<(), ProposalValidation> { + let proposal_content_keys_length: u64 = + proposal_content.keys().map(|key| key.len() as u64).sum(); + let proposal_content_values_length: u64 = proposal_content + .values() + .map(|value| value.len() as u64) + .sum(); + let proposal_content_length = + proposal_content_values_length + proposal_content_keys_length; + + if proposal_content_length <= max_content_length { + Ok(()) + } else { + Err(ProposalValidation::InvalidContentLength( + proposal_content_length, + max_content_length, + )) + } +} + +pub fn is_valid_tally_epoch( + tally_epoch: Epoch, + current_epoch: Epoch, +) -> Result<(), ProposalValidation> { + if tally_epoch <= current_epoch { + Ok(()) + } else { + Err(ProposalValidation::InvalidTallyEPoch( + tally_epoch, + current_epoch, + )) + } +} + +pub fn is_valid_default_proposal_data( + data: &Option>, + max_extra_data_size: u64, +) -> Result<(), ProposalValidation> { + match data { + Some(content) => { + let extra_data_length = content.len() as u64; + if extra_data_length <= max_extra_data_size { + Ok(()) + } else { + Err(ProposalValidation::InvalidDefaultProposalExtraData( + extra_data_length, + max_extra_data_size, + )) + } + } + None => Ok(()), + } +} + +pub fn is_valid_pgf_stewards_data( + data: &Vec, + author: &Address, +) -> Result<(), ProposalValidation> { + if !data.is_empty() { + let total_added_stewards = data + .iter() + .filter(|steward| steward.action.is_add()) + .cloned() + .collect::>(); + if total_added_stewards.len() > 1 { + Err(ProposalValidation::InvalidPgfStewardsExtraData) + } else if total_added_stewards.is_empty() { + Ok(()) + } else { + let steward_address = &total_added_stewards.get(0).unwrap().address; + if steward_address.eq(author) { + return Ok(()); + } else { + return Err(ProposalValidation::InvalidPgfStewardsExtraData); + } + } + } else { + Err(ProposalValidation::InvalidPgfStewardsExtraData) + } +} + +pub fn is_valid_pgf_funding_data( + data: &PgfFunding, +) -> Result<(), ProposalValidation> { + if !data.continous.is_empty() || !data.retro.is_empty() { + Ok(()) + } else { + Err(ProposalValidation::InvalidPgfFundingExtraData) + } +} diff --git a/core/src/ledger/governance/mod.rs b/core/src/ledger/governance/mod.rs index ae488383bfc..00fcb3a990d 100644 --- a/core/src/ledger/governance/mod.rs +++ b/core/src/ledger/governance/mod.rs @@ -2,10 +2,14 @@ use crate::types::address::{self, Address}; +/// governance CLI structures +pub mod cli; /// governance parameters pub mod parameters; /// governance storage pub mod storage; +/// Governance utility functions/structs +pub mod utils; /// The governance internal address pub const ADDRESS: Address = address::GOV; diff --git a/core/src/ledger/governance/parameters.rs b/core/src/ledger/governance/parameters.rs index 2d247bc24f2..ebb28372af6 100644 --- a/core/src/ledger/governance/parameters.rs +++ b/core/src/ledger/governance/parameters.rs @@ -2,9 +2,9 @@ use std::fmt::Display; use borsh::{BorshDeserialize, BorshSerialize}; -use super::storage as gov_storage; +use super::storage::keys as goverance_storage; use crate::ledger::storage_api::{self, StorageRead, StorageWrite}; -use crate::types::token::Amount; +use crate::types::token; #[derive( Clone, @@ -18,13 +18,13 @@ use crate::types::token::Amount; BorshDeserialize, )] /// Governance parameter structure -pub struct GovParams { +pub struct GovernanceParameters { /// Minimum amount of locked funds - pub min_proposal_fund: u64, + pub min_proposal_fund: token::Amount, /// Maximum kibibyte length for proposal code pub max_proposal_code_size: u64, /// Minimum proposal voting period in epochs - pub min_proposal_period: u64, + pub min_proposal_voting_period: u64, /// Maximum proposal voting period in epochs pub max_proposal_period: u64, /// Maximum number of characters for proposal content @@ -33,16 +33,16 @@ pub struct GovParams { pub min_proposal_grace_epochs: u64, } -impl Display for GovParams { +impl Display for GovernanceParameters { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, "Min. proposal fund: {}\nMax. proposal code size: {}\nMin. \ proposal period: {}\nMax. proposal period: {}\nMax. proposal \ content size: {}\nMin. proposal grace epochs: {}", - self.min_proposal_fund, + self.min_proposal_fund.to_string_native(), self.max_proposal_code_size, - self.min_proposal_period, + self.min_proposal_voting_period, self.max_proposal_period, self.max_proposal_content_size, self.min_proposal_grace_epochs @@ -50,12 +50,12 @@ impl Display for GovParams { } } -impl Default for GovParams { +impl Default for GovernanceParameters { fn default() -> Self { Self { - min_proposal_fund: 500, + min_proposal_fund: token::Amount::native_whole(500), max_proposal_code_size: 300_000, - min_proposal_period: 3, + min_proposal_voting_period: 3, max_proposal_period: 27, max_proposal_content_size: 10_000, min_proposal_grace_epochs: 6, @@ -63,7 +63,7 @@ impl Default for GovParams { } } -impl GovParams { +impl GovernanceParameters { /// Initialize governance parameters into storage pub fn init_storage(&self, storage: &mut S) -> storage_api::Result<()> where @@ -72,39 +72,42 @@ impl GovParams { let Self { min_proposal_fund, max_proposal_code_size, - min_proposal_period, + min_proposal_voting_period, max_proposal_period, max_proposal_content_size, min_proposal_grace_epochs, } = self; - let min_proposal_fund_key = gov_storage::get_min_proposal_fund_key(); - let amount = Amount::native_whole(*min_proposal_fund); - storage.write(&min_proposal_fund_key, amount)?; + let min_proposal_fund_key = + goverance_storage::get_min_proposal_fund_key(); + storage.write(&min_proposal_fund_key, min_proposal_fund)?; let max_proposal_code_size_key = - gov_storage::get_max_proposal_code_size_key(); + goverance_storage::get_max_proposal_code_size_key(); storage.write(&max_proposal_code_size_key, max_proposal_code_size)?; - let min_proposal_period_key = - gov_storage::get_min_proposal_period_key(); - storage.write(&min_proposal_period_key, min_proposal_period)?; + let min_proposal_voting_period_key = + goverance_storage::get_min_proposal_voting_period_key(); + storage.write( + &min_proposal_voting_period_key, + min_proposal_voting_period, + )?; let max_proposal_period_key = - gov_storage::get_max_proposal_period_key(); + goverance_storage::get_max_proposal_period_key(); storage.write(&max_proposal_period_key, max_proposal_period)?; let max_proposal_content_size_key = - gov_storage::get_max_proposal_content_key(); + goverance_storage::get_max_proposal_content_key(); storage .write(&max_proposal_content_size_key, max_proposal_content_size)?; let min_proposal_grace_epoch_key = - gov_storage::get_min_proposal_grace_epoch_key(); + goverance_storage::get_min_proposal_grace_epoch_key(); storage .write(&min_proposal_grace_epoch_key, min_proposal_grace_epochs)?; - let counter_key = gov_storage::get_counter_key(); + let counter_key = goverance_storage::get_counter_key(); storage.write(&counter_key, u64::MIN) } } diff --git a/core/src/ledger/governance/storage.rs b/core/src/ledger/governance/storage/keys.rs similarity index 78% rename from core/src/ledger/governance/storage.rs rename to core/src/ledger/governance/storage/keys.rs index e00c4be6787..a975b6541fd 100644 --- a/core/src/ledger/governance/storage.rs +++ b/core/src/ledger/governance/storage/keys.rs @@ -1,27 +1,32 @@ +use namada_macros::StorageKeys; + use crate::ledger::governance::ADDRESS; use crate::types::address::Address; use crate::types::storage::{DbKeySeg, Key, KeySeg}; -const PROPOSAL_PREFIX: &str = "proposal"; -const PROPOSAL_VOTE: &str = "vote"; -const PROPOSAL_AUTHOR: &str = "author"; -const PROPOSAL_TYPE: &str = "type"; -const PROPOSAL_CONTENT: &str = "content"; -const PROPOSAL_START_EPOCH: &str = "start_epoch"; -const PROPOSAL_END_EPOCH: &str = "end_epoch"; -const PROPOSAL_GRACE_EPOCH: &str = "grace_epoch"; -const PROPOSAL_FUNDS: &str = "funds"; -const PROPOSAL_CODE: &str = "proposal_code"; -const PROPOSAL_COMMITTING_EPOCH: &str = "epoch"; - -const MIN_PROPOSAL_FUND_KEY: &str = "min_fund"; -const MAX_PROPOSAL_CODE_SIZE_KEY: &str = "max_code_size"; -const MIN_PROPOSAL_PERIOD_KEY: &str = "min_period"; -const MAX_PROPOSAL_PERIOD_KEY: &str = "max_period"; -const MAX_PROPOSAL_CONTENT_SIZE_KEY: &str = "max_content"; -const MIN_GRACE_EPOCH_KEY: &str = "min_grace_epoch"; -const COUNTER_KEY: &str = "counter"; -const PENDING_PROPOSAL: &str = "pending"; +/// Storage keys for governance internal address. +#[derive(StorageKeys)] +struct Keys { + proposal: &'static str, + vote: &'static str, + author: &'static str, + proposal_type: &'static str, + content: &'static str, + start_epoch: &'static str, + end_epoch: &'static str, + grace_epoch: &'static str, + funds: &'static str, + proposal_code: &'static str, + committing_epoch: &'static str, + min_fund: &'static str, + max_code_size: &'static str, + min_period: &'static str, + max_period: &'static str, + max_content: &'static str, + min_grace_epoch: &'static str, + counter: &'static str, + pending: &'static str, +} /// Check if key is inside governance address space pub fn is_governance_key(key: &Key) -> bool { @@ -39,8 +44,8 @@ pub fn is_vote_key(key: &Key) -> bool { DbKeySeg::AddressSeg(_validator_address), DbKeySeg::AddressSeg(_address), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && vote == PROPOSAL_VOTE => + && prefix == Keys::VALUES.proposal + && vote == Keys::VALUES.vote => { id.parse::().is_ok() } @@ -57,8 +62,8 @@ pub fn is_author_key(key: &Key) -> bool { DbKeySeg::StringSeg(id), DbKeySeg::StringSeg(author), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && author == PROPOSAL_AUTHOR => + && prefix == Keys::VALUES.proposal + && author == Keys::VALUES.author => { id.parse::().is_ok() } @@ -75,8 +80,8 @@ pub fn is_proposal_code_key(key: &Key) -> bool { DbKeySeg::StringSeg(id), DbKeySeg::StringSeg(proposal_code), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && proposal_code == PROPOSAL_CODE => + && prefix == Keys::VALUES.proposal + && proposal_code == Keys::VALUES.proposal_code => { id.parse::().is_ok() } @@ -93,8 +98,8 @@ pub fn is_grace_epoch_key(key: &Key) -> bool { DbKeySeg::StringSeg(id), DbKeySeg::StringSeg(grace_epoch), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && grace_epoch == PROPOSAL_GRACE_EPOCH => + && prefix == Keys::VALUES.proposal + && grace_epoch == Keys::VALUES.grace_epoch => { id.parse::().is_ok() } @@ -111,8 +116,8 @@ pub fn is_content_key(key: &Key) -> bool { DbKeySeg::StringSeg(id), DbKeySeg::StringSeg(content), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && content == PROPOSAL_CONTENT => + && prefix == Keys::VALUES.proposal + && content == Keys::VALUES.content => { id.parse::().is_ok() } @@ -129,8 +134,8 @@ pub fn is_balance_key(key: &Key) -> bool { DbKeySeg::StringSeg(id), DbKeySeg::StringSeg(funds), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && funds == PROPOSAL_FUNDS => + && prefix == Keys::VALUES.proposal + && funds == Keys::VALUES.funds => { id.parse::().is_ok() } @@ -147,8 +152,8 @@ pub fn is_start_epoch_key(key: &Key) -> bool { DbKeySeg::StringSeg(id), DbKeySeg::StringSeg(start_epoch), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && start_epoch == PROPOSAL_START_EPOCH => + && prefix == Keys::VALUES.proposal + && start_epoch == Keys::VALUES.start_epoch => { id.parse::().is_ok() } @@ -165,8 +170,8 @@ pub fn is_end_epoch_key(key: &Key) -> bool { DbKeySeg::StringSeg(id), DbKeySeg::StringSeg(end_epoch), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && end_epoch == PROPOSAL_END_EPOCH => + && prefix == Keys::VALUES.proposal + && end_epoch == Keys::VALUES.end_epoch => { id.parse::().is_ok() } @@ -183,8 +188,8 @@ pub fn is_proposal_type_key(key: &Key) -> bool { DbKeySeg::StringSeg(id), DbKeySeg::StringSeg(proposal_type), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && proposal_type == PROPOSAL_TYPE => + && prefix == Keys::VALUES.proposal + && proposal_type == Keys::VALUES.proposal_type => { id.parse::().is_ok() } @@ -194,7 +199,7 @@ pub fn is_proposal_type_key(key: &Key) -> bool { /// Check if key is counter key pub fn is_counter_key(key: &Key) -> bool { - matches!(&key.segments[..], [DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(counter)] if addr == &ADDRESS && counter == COUNTER_KEY) + matches!(&key.segments[..], [DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(counter)] if addr == &ADDRESS && counter == Keys::VALUES.counter) } /// Check if key is a proposal fund parameter key @@ -202,7 +207,7 @@ pub fn is_min_proposal_fund_key(key: &Key) -> bool { matches!(&key.segments[..], [ DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(min_funds_param), - ] if addr == &ADDRESS && min_funds_param == MIN_PROPOSAL_FUND_KEY) + ] if addr == &ADDRESS && min_funds_param == Keys::VALUES.min_fund) } /// Check if key is a proposal max content parameter key @@ -211,7 +216,7 @@ pub fn is_max_content_size_key(key: &Key) -> bool { DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(max_content_size_param), ] if addr == &ADDRESS - && max_content_size_param == MAX_PROPOSAL_CONTENT_SIZE_KEY) + && max_content_size_param == Keys::VALUES.max_content) } /// Check if key is a max proposal size key @@ -220,16 +225,16 @@ pub fn is_max_proposal_code_size_key(key: &Key) -> bool { DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(max_content_size_param), ] if addr == &ADDRESS - && max_content_size_param == MAX_PROPOSAL_CONTENT_SIZE_KEY) + && max_content_size_param == Keys::VALUES.max_code_size) } /// Check if key is a min proposal period param key -pub fn is_min_proposal_period_key(key: &Key) -> bool { +pub fn is_min_proposal_voting_period_key(key: &Key) -> bool { matches!(&key.segments[..], [ DbKeySeg::AddressSeg(addr), - DbKeySeg::StringSeg(min_proposal_period_param), + DbKeySeg::StringSeg(min_proposal_voting_period_param), ] if addr == &ADDRESS - && min_proposal_period_param == MIN_PROPOSAL_PERIOD_KEY) + && min_proposal_voting_period_param == Keys::VALUES.min_period) } /// Check if key is a max proposal period param key @@ -238,7 +243,7 @@ pub fn is_max_proposal_period_key(key: &Key) -> bool { DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(max_proposal_period_param), ] if addr == &ADDRESS - && max_proposal_period_param == MAX_PROPOSAL_PERIOD_KEY) + && max_proposal_period_param == Keys::VALUES.max_period) } /// Check if key is a min grace epoch key @@ -250,8 +255,8 @@ pub fn is_commit_proposal_key(key: &Key) -> bool { DbKeySeg::StringSeg(_epoch), DbKeySeg::StringSeg(_id), ] if addr == &ADDRESS - && prefix == PROPOSAL_PREFIX - && epoch_prefix == PROPOSAL_COMMITTING_EPOCH + && prefix == Keys::VALUES.proposal + && epoch_prefix == Keys::VALUES.committing_epoch ) } @@ -261,7 +266,7 @@ pub fn is_min_grace_epoch_key(key: &Key) -> bool { DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(min_grace_epoch_param), ] if addr == &ADDRESS - && min_grace_epoch_param == MIN_GRACE_EPOCH_KEY) + && min_grace_epoch_param == Keys::VALUES.min_grace_epoch) } /// Check if key is parameter key @@ -269,7 +274,7 @@ pub fn is_parameter_key(key: &Key) -> bool { is_min_proposal_fund_key(key) || is_max_content_size_key(key) || is_max_proposal_code_size_key(key) - || is_min_proposal_period_key(key) + || is_min_proposal_voting_period_key(key) || is_max_proposal_period_key(key) || is_min_grace_epoch_key(key) } @@ -282,56 +287,56 @@ pub fn is_start_or_end_epoch_key(key: &Key) -> bool { /// Get governance prefix key pub fn proposal_prefix() -> Key { Key::from(ADDRESS.to_db_key()) - .push(&PROPOSAL_PREFIX.to_owned()) + .push(&Keys::VALUES.proposal.to_owned()) .expect("Cannot obtain a storage key") } /// Get key for the minimum proposal fund pub fn get_min_proposal_fund_key() -> Key { Key::from(ADDRESS.to_db_key()) - .push(&MIN_PROPOSAL_FUND_KEY.to_owned()) + .push(&Keys::VALUES.min_fund.to_owned()) .expect("Cannot obtain a storage key") } /// Get maximum proposal code size key pub fn get_max_proposal_code_size_key() -> Key { Key::from(ADDRESS.to_db_key()) - .push(&MAX_PROPOSAL_CODE_SIZE_KEY.to_owned()) + .push(&Keys::VALUES.max_code_size.to_owned()) .expect("Cannot obtain a storage key") } /// Get minimum proposal period key -pub fn get_min_proposal_period_key() -> Key { +pub fn get_min_proposal_voting_period_key() -> Key { Key::from(ADDRESS.to_db_key()) - .push(&MIN_PROPOSAL_PERIOD_KEY.to_owned()) + .push(&Keys::VALUES.min_period.to_owned()) .expect("Cannot obtain a storage key") } /// Get maximum proposal period key pub fn get_max_proposal_period_key() -> Key { Key::from(ADDRESS.to_db_key()) - .push(&MAX_PROPOSAL_PERIOD_KEY.to_owned()) + .push(&Keys::VALUES.max_period.to_owned()) .expect("Cannot obtain a storage key") } /// Get maximum proposal content key pub fn get_max_proposal_content_key() -> Key { Key::from(ADDRESS.to_db_key()) - .push(&MAX_PROPOSAL_CONTENT_SIZE_KEY.to_owned()) + .push(&Keys::VALUES.max_content.to_owned()) .expect("Cannot obtain a storage key") } /// Get min grace epoch proposal key pub fn get_min_proposal_grace_epoch_key() -> Key { Key::from(ADDRESS.to_db_key()) - .push(&MIN_GRACE_EPOCH_KEY.to_owned()) + .push(&Keys::VALUES.min_grace_epoch.to_owned()) .expect("Cannot obtain a storage key") } /// Get key of proposal ids counter pub fn get_counter_key() -> Key { Key::from(ADDRESS.to_db_key()) - .push(&COUNTER_KEY.to_owned()) + .push(&Keys::VALUES.counter.to_owned()) .expect("Cannot obtain a storage key") } @@ -340,7 +345,7 @@ pub fn get_content_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_CONTENT.to_owned()) + .push(&Keys::VALUES.content.to_owned()) .expect("Cannot obtain a storage key") } @@ -349,7 +354,7 @@ pub fn get_author_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_AUTHOR.to_owned()) + .push(&Keys::VALUES.author.to_owned()) .expect("Cannot obtain a storage key") } @@ -358,7 +363,7 @@ pub fn get_proposal_type_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_TYPE.to_owned()) + .push(&Keys::VALUES.proposal_type.to_owned()) .expect("Cannot obtain a storage key") } @@ -367,7 +372,7 @@ pub fn get_voting_start_epoch_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_START_EPOCH.to_owned()) + .push(&Keys::VALUES.start_epoch.to_owned()) .expect("Cannot obtain a storage key") } @@ -376,7 +381,7 @@ pub fn get_voting_end_epoch_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_END_EPOCH.to_owned()) + .push(&Keys::VALUES.end_epoch.to_owned()) .expect("Cannot obtain a storage key") } @@ -385,7 +390,7 @@ pub fn get_funds_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_FUNDS.to_owned()) + .push(&Keys::VALUES.funds.to_owned()) .expect("Cannot obtain a storage key") } @@ -394,14 +399,14 @@ pub fn get_grace_epoch_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_GRACE_EPOCH.to_owned()) + .push(&Keys::VALUES.grace_epoch.to_owned()) .expect("Cannot obtain a storage key") } /// Get the proposal committing key prefix pub fn get_commiting_proposals_prefix(epoch: u64) -> Key { proposal_prefix() - .push(&PROPOSAL_COMMITTING_EPOCH.to_owned()) + .push(&Keys::VALUES.committing_epoch.to_owned()) .expect("Cannot obtain a storage key") .push(&epoch.to_string()) .expect("Cannot obtain a storage key") @@ -412,7 +417,7 @@ pub fn get_proposal_code_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_CODE.to_owned()) + .push(&Keys::VALUES.proposal_code.to_owned()) .expect("Cannot obtain a storage key") } @@ -428,7 +433,7 @@ pub fn get_proposal_vote_prefix_key(id: u64) -> Key { proposal_prefix() .push(&id.to_string()) .expect("Cannot obtain a storage key") - .push(&PROPOSAL_VOTE.to_owned()) + .push(&Keys::VALUES.vote.to_owned()) .expect("Cannot obtain a storage key") } @@ -448,7 +453,7 @@ pub fn get_vote_proposal_key( /// Get the proposal execution key pub fn get_proposal_execution_key(id: u64) -> Key { Key::from(ADDRESS.to_db_key()) - .push(&PENDING_PROPOSAL.to_owned()) + .push(&Keys::VALUES.pending.to_owned()) .expect("Cannot obtain a storage key") .push(&id.to_string()) .expect("Cannot obtain a storage key") diff --git a/core/src/ledger/governance/storage/mod.rs b/core/src/ledger/governance/storage/mod.rs new file mode 100644 index 00000000000..e2de8e6ab89 --- /dev/null +++ b/core/src/ledger/governance/storage/mod.rs @@ -0,0 +1,6 @@ +/// Governance proposal keys +pub mod keys; +/// Proposal structures +pub mod proposal; +/// Vote structures +pub mod vote; diff --git a/core/src/ledger/governance/storage/proposal.rs b/core/src/ledger/governance/storage/proposal.rs new file mode 100644 index 00000000000..b5ac1284c47 --- /dev/null +++ b/core/src/ledger/governance/storage/proposal.rs @@ -0,0 +1,270 @@ +use std::collections::{BTreeMap, HashSet}; +use std::fmt::Display; + +use borsh::{BorshDeserialize, BorshSerialize}; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +use crate::ledger::governance::cli::onchain::{ + PgfAction, PgfContinous, PgfRetro, PgfSteward, +}; +use crate::ledger::governance::utils::{ProposalStatus, TallyType}; +use crate::ledger::storage_api::token::Amount; +use crate::types::address::Address; +use crate::types::hash::Hash; +use crate::types::storage::Epoch; + +#[allow(missing_docs)] +#[derive(Debug, Error)] +pub enum ProposalTypeError { + #[error("Invalid proposal type.")] + InvalidProposalType, +} + +/// An add or remove action for PGF +#[derive( + Debug, + Clone, + Hash, + PartialEq, + Eq, + PartialOrd, + BorshSerialize, + BorshDeserialize, + Serialize, + Deserialize, +)] +pub enum AddRemove { + /// Add + Add(T), + /// Remove + Remove(T), +} + +/// The target of a PGF payment +#[derive( + Debug, + Clone, + PartialEq, + BorshSerialize, + BorshDeserialize, + Serialize, + Deserialize, + Ord, + Eq, + PartialOrd, +)] +pub struct PGFTarget { + /// The target address + pub target: Address, + /// The amount of token to fund the target address + pub amount: Amount, +} + +/// The actions that a PGF Steward can propose to execute +#[derive( + Debug, + Clone, + PartialEq, + BorshSerialize, + BorshDeserialize, + Serialize, + Deserialize, +)] +pub enum PGFAction { + /// A continuous payment + Continuous(AddRemove), + /// A retro payment + Retro(PGFTarget), +} + +/// The type of a Proposal +#[derive( + Debug, + Clone, + PartialEq, + BorshSerialize, + BorshDeserialize, + Serialize, + Deserialize, +)] +pub enum ProposalType { + /// Default governance proposal with the optional wasm code + Default(Option), + /// PGF stewards proposal + PGFSteward(HashSet>), + /// PGF funding proposal + PGFPayment(Vec), +} + +impl ProposalType { + /// Check if the proposal type is default + pub fn is_default(&self) -> bool { + matches!(self, ProposalType::Default(_)) + } +} + +impl Display for ProposalType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + ProposalType::Default(_) => write!(f, "Default"), + ProposalType::PGFSteward(_) => write!(f, "Pgf steward"), + ProposalType::PGFPayment(_) => write!(f, "Pgf funding"), + } + } +} + +impl TryFrom for AddRemove
{ + type Error = ProposalTypeError; + + fn try_from(value: PgfSteward) -> Result { + match value.action { + PgfAction::Add => Ok(AddRemove::Add(value.address)), + PgfAction::Remove => Ok(AddRemove::Remove(value.address)), + } + } +} + +impl TryFrom for PGFAction { + type Error = ProposalTypeError; + + fn try_from(value: PgfContinous) -> Result { + match value.action { + PgfAction::Add => { + Ok(PGFAction::Continuous(AddRemove::Add(PGFTarget { + target: value.target.address, + amount: value.target.amount, + }))) + } + PgfAction::Remove => { + Ok(PGFAction::Continuous(AddRemove::Remove(PGFTarget { + target: value.target.address, + amount: value.target.amount, + }))) + } + } + } +} + +impl TryFrom for PGFAction { + type Error = ProposalTypeError; + + fn try_from(value: PgfRetro) -> Result { + Ok(PGFAction::Retro(PGFTarget { + target: value.target.address, + amount: value.target.amount, + })) + } +} + +#[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] +/// Proposal rappresentation when fetched from the storage +pub struct StorageProposal { + /// The proposal id + pub id: u64, + /// The proposal content + pub content: BTreeMap, + /// The proposal author address + pub author: Address, + /// The proposal type + pub r#type: ProposalType, + /// The epoch from which voting is allowed + pub voting_start_epoch: Epoch, + /// The epoch from which voting is stopped + pub voting_end_epoch: Epoch, + /// The epoch from which this changes are executed + pub grace_epoch: Epoch, +} + +impl StorageProposal { + /// Check if the proposal can be voted + pub fn can_be_voted( + &self, + current_epoch: Epoch, + is_validator: bool, + ) -> bool { + if is_validator { + self.voting_start_epoch < self.voting_end_epoch + && current_epoch * 3 + <= self.voting_start_epoch + self.voting_end_epoch * 2 + } else { + let valid_start_epoch = current_epoch >= self.voting_start_epoch; + let valid_end_epoch = current_epoch <= self.voting_end_epoch; + valid_start_epoch && valid_end_epoch + } + } + + /// Return the type of tally for the proposal + pub fn get_tally_type(&self) -> TallyType { + TallyType::from(self.r#type.clone()) + } + + /// Return the status of a proposal + pub fn get_status(&self, current_epoch: Epoch) -> ProposalStatus { + if self.voting_start_epoch > self.voting_end_epoch { + ProposalStatus::Pending + } else if self.voting_start_epoch <= current_epoch + && current_epoch <= self.voting_end_epoch + { + ProposalStatus::OnGoing + } else { + ProposalStatus::Ended + } + } + + /// Serialize a proposal to string + pub fn to_string_with_status(&self, current_epoch: Epoch) -> String { + format!( + "Proposal Id: {} + {:2}Type: {} + {:2}Author: {} + {:2}Content: {:?} + {:2}Start Epoch: {} + {:2}End Epoch: {} + {:2}Grace Epoch: {} + {:2}Status: {} + ", + self.id, + "", + self.r#type, + "", + self.author, + "", + self.content, + "", + self.voting_start_epoch, + "", + self.voting_end_epoch, + "", + self.grace_epoch, + "", + self.get_status(current_epoch) + ) + } +} + +impl Display for StorageProposal { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Proposal Id: {} + {:2}Type: {} + {:2}Author: {} + {:2}Start Epoch: {} + {:2}End Epoch: {} + {:2}Grace Epoch: {} + ", + self.id, + "", + self.r#type, + "", + self.author, + "", + self.voting_start_epoch, + "", + self.voting_end_epoch, + "", + self.grace_epoch + ) + } +} diff --git a/core/src/ledger/governance/storage/vote.rs b/core/src/ledger/governance/storage/vote.rs new file mode 100644 index 00000000000..3ba8ec2ae25 --- /dev/null +++ b/core/src/ledger/governance/storage/vote.rs @@ -0,0 +1,127 @@ +use std::fmt::Display; + +use borsh::{BorshDeserialize, BorshSerialize}; +use serde::{Deserialize, Serialize}; + +use super::super::cli::onchain::ProposalVote; +use super::proposal::ProposalType; + +/// The type of a governance vote with the optional associated Memo +#[derive( + Debug, + Clone, + PartialEq, + BorshSerialize, + BorshDeserialize, + Eq, + Serialize, + Deserialize, +)] +pub enum VoteType { + /// A default vote without Memo + Default, + /// A vote for the PGF stewards + PGFSteward, + /// A vote for a PGF payment proposal + PGFPayment, +} + +#[derive( + Debug, + Clone, + PartialEq, + BorshSerialize, + BorshDeserialize, + Eq, + Serialize, + Deserialize, +)] +/// The vote for a proposal +pub enum StorageProposalVote { + /// Yes + Yay(VoteType), + /// No + Nay, +} + +impl StorageProposalVote { + /// Check if a vote is yay + pub fn is_yay(&self) -> bool { + matches!(self, StorageProposalVote::Yay(_)) + } + + /// Check if vote is of type default + pub fn is_default_vote(&self) -> bool { + matches!( + self, + StorageProposalVote::Yay(VoteType::Default) + | StorageProposalVote::Nay + ) + } + + /// Check if a vote is compatible with a proposal + pub fn is_compatible(&self, proposal_type: &ProposalType) -> bool { + match self { + StorageProposalVote::Yay(vote_type) => proposal_type.eq(vote_type), + StorageProposalVote::Nay => true, + } + } + + /// Create a new vote + pub fn build( + proposal_vote: &ProposalVote, + proposal_type: &ProposalType, + ) -> Option { + match (proposal_vote, proposal_type) { + (ProposalVote::Yay, ProposalType::Default(_)) => { + Some(StorageProposalVote::Yay(VoteType::Default)) + } + (ProposalVote::Yay, ProposalType::PGFSteward(_)) => { + Some(StorageProposalVote::Yay(VoteType::PGFSteward)) + } + (ProposalVote::Yay, ProposalType::PGFPayment(_)) => { + Some(StorageProposalVote::Yay(VoteType::PGFPayment)) + } + (ProposalVote::Nay, ProposalType::Default(_)) => { + Some(StorageProposalVote::Nay) + } + (ProposalVote::Nay, ProposalType::PGFSteward(_)) => { + Some(StorageProposalVote::Nay) + } + (ProposalVote::Nay, ProposalType::PGFPayment(_)) => { + Some(StorageProposalVote::Nay) + } + _ => None, + } + } +} + +impl Display for StorageProposalVote { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + StorageProposalVote::Yay(vote_type) => match vote_type { + VoteType::Default + | VoteType::PGFSteward + | VoteType::PGFPayment => write!(f, "yay"), + }, + + StorageProposalVote::Nay => write!(f, "nay"), + } + } +} + +impl PartialEq for ProposalType { + fn eq(&self, other: &VoteType) -> bool { + match self { + Self::Default(_) => { + matches!(other, VoteType::Default) + } + Self::PGFSteward(_) => { + matches!(other, VoteType::PGFSteward) + } + Self::PGFPayment(_) => { + matches!(other, VoteType::PGFPayment) + } + } + } +} diff --git a/core/src/ledger/governance/utils.rs b/core/src/ledger/governance/utils.rs new file mode 100644 index 00000000000..30df25e3fb3 --- /dev/null +++ b/core/src/ledger/governance/utils.rs @@ -0,0 +1,291 @@ +use std::collections::HashMap; +use std::fmt::Display; + +use borsh::{BorshDeserialize, BorshSerialize}; + +use super::cli::offline::OfflineVote; +use super::storage::proposal::ProposalType; +use super::storage::vote::StorageProposalVote; +use crate::types::address::Address; +use crate::types::storage::Epoch; +use crate::types::token; + +/// Proposal status +pub enum ProposalStatus { + /// Pending proposal status + Pending, + /// Ongoing proposal status + OnGoing, + /// Ended proposal status + Ended, +} + +impl Display for ProposalStatus { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + ProposalStatus::Pending => write!(f, "pending"), + ProposalStatus::OnGoing => write!(f, "on-going"), + ProposalStatus::Ended => write!(f, "ended"), + } + } +} + +/// Alias to comulate voting power +pub type VotePower = token::Amount; + +/// Structure rappresenting a proposal vote +#[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] +pub struct Vote { + /// Field holding the address of the validator + pub validator: Address, + /// Field holding the address of the delegator + pub delegator: Address, + /// Field holding vote data + pub data: StorageProposalVote, +} + +impl Vote { + /// Check if a vote is from a validator + pub fn is_validator(&self) -> bool { + self.validator.eq(&self.delegator) + } +} + +/// Rappresent a tally type +pub enum TallyType { + /// Rappresent a tally type for proposal requiring 2/3 of the votes + TwoThird, + /// Rappresent a tally type for proposal requiring 1/3 of the votes + OneThird, + /// Rappresent a tally type for proposal requiring less than 1/3 of the + /// votes to be nay + LessOneThirdNay, +} + +impl From for TallyType { + fn from(proposal_type: ProposalType) -> Self { + match proposal_type { + ProposalType::Default(_) => TallyType::TwoThird, + ProposalType::PGFSteward(_) => TallyType::TwoThird, + ProposalType::PGFPayment(_) => TallyType::LessOneThirdNay, + } + } +} + +/// The result of a proposal +pub enum TallyResult { + /// Proposal was accepted with the associated value + Passed, + /// Proposal was rejected + Rejected, +} + +impl Display for TallyResult { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + TallyResult::Passed => write!(f, "passed"), + TallyResult::Rejected => write!(f, "rejected"), + } + } +} + +impl TallyResult { + /// Create a new tally result + pub fn new( + tally_type: &TallyType, + yay_voting_power: VotePower, + nay_voting_power: VotePower, + total_voting_power: VotePower, + ) -> Self { + let passed = match tally_type { + TallyType::TwoThird => { + let at_least_two_third_voted = yay_voting_power + + nay_voting_power + >= total_voting_power / 3 * 2; + let at_last_half_voted_yay = + yay_voting_power > nay_voting_power; + at_least_two_third_voted && at_last_half_voted_yay + } + TallyType::OneThird => { + let at_least_two_third_voted = yay_voting_power + + nay_voting_power + >= total_voting_power / 3; + let at_last_half_voted_yay = + yay_voting_power > nay_voting_power; + at_least_two_third_voted && at_last_half_voted_yay + } + TallyType::LessOneThirdNay => { + nay_voting_power <= total_voting_power / 3 + } + }; + + if passed { Self::Passed } else { Self::Rejected } + } +} + +/// The result with votes of a proposal +pub struct ProposalResult { + /// The result of a proposal + pub result: TallyResult, + /// The total voting power during the proposal tally + pub total_voting_power: VotePower, + /// The total voting power from yay votes + pub total_yay_power: VotePower, + /// The total voting power from nay votes (unused at the moment) + pub total_nay_power: VotePower, +} + +impl Display for ProposalResult { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let percentage = self + .total_yay_power + .checked_div(self.total_voting_power) + .unwrap_or_default(); + + write!( + f, + "{} with {} yay votes and {} nay votes ({:.2}%)", + self.result, + self.total_yay_power.to_string_native(), + self.total_nay_power.to_string_native(), + percentage + .checked_mul(token::Amount::from_u64(100)) + .unwrap_or_default() + .to_string_native() + ) + } +} + +impl ProposalResult { + /// Return true if two third of total voting power voted nay + pub fn two_third_nay(&self) -> bool { + self.total_nay_power >= (self.total_voting_power / 3) * 2 + } +} + +/// /// General rappresentation of a vote +pub enum TallyVote { + /// Rappresent a vote for a proposal onchain + OnChain(StorageProposalVote), + /// Rappresent a vote for a proposal offline + Offline(OfflineVote), +} + +impl From for TallyVote { + fn from(vote: StorageProposalVote) -> Self { + Self::OnChain(vote) + } +} + +impl From for TallyVote { + fn from(vote: OfflineVote) -> Self { + Self::Offline(vote) + } +} + +impl TallyVote { + /// Check if a vote is yay + pub fn is_yay(&self) -> bool { + match self { + TallyVote::OnChain(vote) => vote.is_yay(), + TallyVote::Offline(vote) => vote.is_yay(), + } + } + + /// Check if two votes are equal + pub fn is_same_side(&self, other: &TallyVote) -> bool { + let both_yay = self.is_yay() && other.is_yay(); + let both_nay = !self.is_yay() && !other.is_yay(); + + both_yay || !both_nay + } +} + +/// Proposal structure holding votes information necessary to compute the +/// outcome +pub struct ProposalVotes { + /// Map from validator address to vote + pub validators_vote: HashMap, + /// Map from validator to their voting power + pub validator_voting_power: HashMap, + /// Map from delegation address to their vote + pub delegators_vote: HashMap, + /// Map from delegator address to the corresponding validator voting power + pub delegator_voting_power: HashMap>, +} + +/// Compute the result of a proposal +pub fn compute_proposal_result( + votes: ProposalVotes, + total_voting_power: VotePower, + tally_at: TallyType, +) -> ProposalResult { + let mut yay_voting_power = VotePower::default(); + let mut nay_voting_power = VotePower::default(); + + for (address, vote_power) in votes.validator_voting_power { + let vote_type = votes.validators_vote.get(&address); + if let Some(vote) = vote_type { + if vote.is_yay() { + yay_voting_power += vote_power; + } else { + nay_voting_power += vote_power; + } + } + } + + for (delegator, degalations) in votes.delegator_voting_power { + let delegator_vote = match votes.delegators_vote.get(&delegator) { + Some(vote) => vote, + None => continue, + }; + for (validator, voting_power) in degalations { + let validator_vote = votes.validators_vote.get(&validator); + if let Some(validator_vote) = validator_vote { + if !validator_vote.is_same_side(delegator_vote) { + if delegator_vote.is_yay() { + yay_voting_power += voting_power; + nay_voting_power -= voting_power; + } else { + nay_voting_power += voting_power; + yay_voting_power -= voting_power; + } + } + } else if delegator_vote.is_yay() { + yay_voting_power += voting_power; + } else { + nay_voting_power += voting_power; + } + } + } + + let tally_result = TallyResult::new( + &tally_at, + yay_voting_power, + nay_voting_power, + total_voting_power, + ); + + ProposalResult { + result: tally_result, + total_voting_power, + total_yay_power: yay_voting_power, + total_nay_power: nay_voting_power, + } +} + +/// Calculate the valid voting window for validator given a proposal epoch +/// details +pub fn is_valid_validator_voting_period( + current_epoch: Epoch, + voting_start_epoch: Epoch, + voting_end_epoch: Epoch, +) -> bool { + if voting_start_epoch >= voting_end_epoch { + false + } else { + let duration = voting_end_epoch - voting_start_epoch; + let two_third_duration = (duration / 3) * 2; + current_epoch <= voting_start_epoch + two_third_duration + } +} diff --git a/core/src/ledger/ibc/context/common.rs b/core/src/ledger/ibc/context/common.rs index 4c96c034b53..c3e9b1d08da 100644 --- a/core/src/ledger/ibc/context/common.rs +++ b/core/src/ledger/ibc/context/common.rs @@ -22,12 +22,12 @@ use crate::ibc::core::ics24_host::identifier::{ClientId, ConnectionId}; use crate::ibc::core::ics24_host::path::{ ChannelEndPath, ClientConsensusStatePath, CommitmentPath, Path, SeqSendPath, }; +use crate::ibc::core::timestamp::Timestamp; use crate::ibc::core::ContextError; #[cfg(any(feature = "ibc-mocks-abcipp", feature = "ibc-mocks"))] use crate::ibc::mock::client_state::MockClientState; #[cfg(any(feature = "ibc-mocks-abcipp", feature = "ibc-mocks"))] use crate::ibc::mock::consensus_state::MockConsensusState; -use crate::ibc::timestamp::Timestamp; use crate::ibc_proto::google::protobuf::Any; use crate::ibc_proto::protobuf::Protobuf; use crate::ledger::ibc::storage; @@ -48,11 +48,11 @@ pub trait IbcCommonContext: IbcStorageContext { })?; self.decode_client_state(any) } - Ok(None) => { - Err(ContextError::ClientError(ClientError::ClientNotFound { + Ok(None) => Err(ContextError::ClientError( + ClientError::ClientStateNotFound { client_id: client_id.clone(), - })) - } + }, + )), Err(_) => Err(ContextError::ClientError(ClientError::Other { description: format!( "Reading the client state failed: ID {}", @@ -145,11 +145,11 @@ pub trait IbcCommonContext: IbcStorageContext { }) }), Ok(None) => { - let port_channel_id = + let (port_id, channel_id) = storage::port_channel_id(&key).expect("invalid key"); Err(ContextError::ChannelError(ChannelError::ChannelNotFound { - channel_id: port_channel_id.channel_id, - port_id: port_channel_id.port_id, + channel_id, + port_id, })) } Err(_) => Err(ContextError::ChannelError(ChannelError::Other { diff --git a/core/src/ledger/ibc/context/execution.rs b/core/src/ledger/ibc/context/execution.rs index ae84afa614e..ec0708ce2af 100644 --- a/core/src/ledger/ibc/context/execution.rs +++ b/core/src/ledger/ibc/context/execution.rs @@ -3,8 +3,8 @@ use borsh::{BorshDeserialize, BorshSerialize}; use super::super::{IbcActions, IbcCommonContext}; +use crate::ibc::core::events::IbcEvent; use crate::ibc::core::ics02_client::client_state::ClientState; -use crate::ibc::core::ics02_client::client_type::ClientType; use crate::ibc::core::ics02_client::consensus_state::ConsensusState; use crate::ibc::core::ics02_client::error::ClientError; use crate::ibc::core::ics03_connection::connection::ConnectionEnd; @@ -18,12 +18,11 @@ use crate::ibc::core::ics04_channel::packet::{Receipt, Sequence}; use crate::ibc::core::ics24_host::identifier::{ClientId, ConnectionId}; use crate::ibc::core::ics24_host::path::{ AckPath, ChannelEndPath, ClientConnectionPath, ClientConsensusStatePath, - ClientStatePath, ClientTypePath, CommitmentPath, ConnectionPath, Path, - ReceiptPath, SeqAckPath, SeqRecvPath, SeqSendPath, + ClientStatePath, CommitmentPath, ConnectionPath, Path, ReceiptPath, + SeqAckPath, SeqRecvPath, SeqSendPath, }; +use crate::ibc::core::timestamp::Timestamp; use crate::ibc::core::{ContextError, ExecutionContext, ValidationContext}; -use crate::ibc::events::IbcEvent; -use crate::ibc::timestamp::Timestamp; use crate::ibc::Height; use crate::ibc_proto::protobuf::Protobuf; use crate::ledger::ibc::storage; @@ -33,25 +32,6 @@ impl ExecutionContext for IbcActions<'_, C> where C: IbcCommonContext, { - fn store_client_type( - &mut self, - client_type_path: ClientTypePath, - client_type: ClientType, - ) -> Result<(), ContextError> { - let path = Path::ClientType(client_type_path); - let key = storage::ibc_key(path.to_string()) - .expect("Creating a key for the client state shouldn't fail"); - let bytes = client_type.as_str().as_bytes().to_vec(); - self.ctx.borrow_mut().write(&key, bytes).map_err(|_| { - ContextError::ClientError(ClientError::Other { - description: format!( - "Writing the client state failed: Key {}", - key - ), - }) - }) - } - fn store_client_state( &mut self, client_state_path: ClientStatePath, @@ -60,7 +40,7 @@ where let path = Path::ClientState(client_state_path); let key = storage::ibc_key(path.to_string()) .expect("Creating a key for the client state shouldn't fail"); - let bytes = client_state.encode_vec().expect("encoding shouldn't fail"); + let bytes = client_state.encode_vec(); self.ctx.borrow_mut().write(&key, bytes).map_err(|_| { ContextError::ClientError(ClientError::Other { description: format!( @@ -79,9 +59,7 @@ where let path = Path::ClientConsensusState(consensus_state_path); let key = storage::ibc_key(path.to_string()) .expect("Creating a key for the client state shouldn't fail"); - let bytes = consensus_state - .encode_vec() - .expect("encoding shouldn't fail"); + let bytes = consensus_state.encode_vec(); self.ctx.borrow_mut().write(&key, bytes).map_err(|_| { ContextError::ClientError(ClientError::Other { description: format!( @@ -140,7 +118,7 @@ where host_height: Height, ) -> Result<(), ContextError> { let key = storage::client_update_height_key(&client_id); - let bytes = host_height.encode_vec().expect("encoding shouldn't fail"); + let bytes = host_height.encode_vec(); self.ctx.borrow_mut().write(&key, bytes).map_err(|_| { ContextError::ClientError(ClientError::Other { description: format!( @@ -159,9 +137,7 @@ where let path = Path::Connection(connection_path.clone()); let key = storage::ibc_key(path.to_string()) .expect("Creating a key for the client state shouldn't fail"); - let bytes = connection_end - .encode_vec() - .expect("encoding shouldn't fail"); + let bytes = connection_end.encode_vec(); self.ctx.borrow_mut().write(&key, bytes).map_err(|_| { ContextError::ConnectionError(ConnectionError::Other { description: format!( @@ -321,7 +297,7 @@ where let path = Path::ChannelEnd(path.clone()); let key = storage::ibc_key(path.to_string()) .expect("Creating a key for the client state shouldn't fail"); - let bytes = channel_end.encode_vec().expect("encoding shouldn't fail"); + let bytes = channel_end.encode_vec(); self.ctx.borrow_mut().write(&key, bytes).map_err(|_| { ContextError::ChannelError(ChannelError::Other { description: format!( diff --git a/core/src/ledger/ibc/context/router.rs b/core/src/ledger/ibc/context/router.rs index 62d676c3a21..dfa0d9be820 100644 --- a/core/src/ledger/ibc/context/router.rs +++ b/core/src/ledger/ibc/context/router.rs @@ -3,9 +3,8 @@ use std::rc::Rc; use super::super::{IbcActions, IbcCommonContext}; -use crate::ibc::core::context::Router; use crate::ibc::core::ics24_host::identifier::PortId; -use crate::ibc::core::ics26_routing::context::{Module, ModuleId}; +use crate::ibc::core::router::{Module, ModuleId, Router}; impl Router for IbcActions<'_, C> where diff --git a/core/src/ledger/ibc/context/transfer_mod.rs b/core/src/ledger/ibc/context/transfer_mod.rs index 8280f7c36b1..0684432dab2 100644 --- a/core/src/ledger/ibc/context/transfer_mod.rs +++ b/core/src/ledger/ibc/context/transfer_mod.rs @@ -3,7 +3,6 @@ use std::cell::RefCell; use std::fmt::Debug; use std::rc::Rc; -use std::str::FromStr; use super::common::IbcCommonContext; use crate::ibc::applications::transfer::coin::PrefixedCoin; @@ -22,6 +21,7 @@ use crate::ibc::applications::transfer::context::{ use crate::ibc::applications::transfer::denom::PrefixedDenom; use crate::ibc::applications::transfer::error::TokenTransferError; use crate::ibc::applications::transfer::MODULE_ID_STR; +use crate::ibc::core::events::IbcEvent; use crate::ibc::core::ics02_client::client_state::ClientState; use crate::ibc::core::ics02_client::consensus_state::ConsensusState; use crate::ibc::core::ics03_connection::connection::ConnectionEnd; @@ -33,9 +33,9 @@ use crate::ibc::core::ics04_channel::context::{ SendPacketExecutionContext, SendPacketValidationContext, }; use crate::ibc::core::ics04_channel::error::{ChannelError, PacketError}; -use crate::ibc::core::ics04_channel::handler::ModuleExtras; -use crate::ibc::core::ics04_channel::msgs::acknowledgement::Acknowledgement; -use crate::ibc::core::ics04_channel::packet::{Packet, Sequence}; +use crate::ibc::core::ics04_channel::packet::{ + Acknowledgement, Packet, Sequence, +}; use crate::ibc::core::ics04_channel::Version; use crate::ibc::core::ics24_host::identifier::{ ChannelId, ClientId, ConnectionId, PortId, @@ -43,10 +43,9 @@ use crate::ibc::core::ics24_host::identifier::{ use crate::ibc::core::ics24_host::path::{ ChannelEndPath, ClientConsensusStatePath, CommitmentPath, SeqSendPath, }; -use crate::ibc::core::ics26_routing::context::{Module, ModuleId}; +use crate::ibc::core::router::{Module, ModuleExtras, ModuleId}; use crate::ibc::core::ContextError; -use crate::ibc::events::IbcEvent; -use crate::ibc::signer::Signer; +use crate::ibc::Signer; use crate::ledger::ibc::storage; use crate::types::address::{Address, InternalAddress}; use crate::types::token; @@ -81,7 +80,7 @@ where /// Get the module ID pub fn module_id(&self) -> ModuleId { - ModuleId::from_str(MODULE_ID_STR).expect("should be parsable") + ModuleId::new(MODULE_ID_STR.to_string()) } } @@ -593,7 +592,7 @@ pub mod testing { impl DummyTransferModule { /// Get the module ID pub fn module_id(&self) -> ModuleId { - ModuleId::from_str(MODULE_ID_STR).expect("should be parsable") + ModuleId::new(MODULE_ID_STR.to_string()) } } diff --git a/core/src/ledger/ibc/context/validation.rs b/core/src/ledger/ibc/context/validation.rs index 9e138208830..9ad3dd26542 100644 --- a/core/src/ledger/ibc/context/validation.rs +++ b/core/src/ledger/ibc/context/validation.rs @@ -4,8 +4,6 @@ use prost::Message; use super::super::{IbcActions, IbcCommonContext}; use crate::ibc::clients::ics07_tendermint::consensus_state::ConsensusState as TmConsensusState; -#[cfg(any(feature = "ibc-mocks-abcipp", feature = "ibc-mocks"))] -use crate::ibc::core::ics02_client::client_state::downcast_client_state; use crate::ibc::core::ics02_client::client_state::ClientState; use crate::ibc::core::ics02_client::consensus_state::ConsensusState; use crate::ibc::core::ics02_client::error::ClientError; @@ -25,12 +23,12 @@ use crate::ibc::core::ics24_host::path::{ AckPath, ChannelEndPath, ClientConsensusStatePath, CommitmentPath, Path, ReceiptPath, SeqAckPath, SeqRecvPath, SeqSendPath, }; +use crate::ibc::core::timestamp::Timestamp; use crate::ibc::core::{ContextError, ValidationContext}; use crate::ibc::hosts::tendermint::ValidateSelfClientContext; #[cfg(any(feature = "ibc-mocks-abcipp", feature = "ibc-mocks"))] use crate::ibc::mock::client_state::MockClientState; -use crate::ibc::timestamp::Timestamp; -use crate::ibc::Height; +use crate::ibc::{Height, Signer}; use crate::ibc_proto::google::protobuf::Any; use crate::ibc_proto::protobuf::Protobuf; use crate::ledger::ibc::storage; @@ -260,14 +258,8 @@ where ) -> Result<(), ContextError> { #[cfg(any(feature = "ibc-mocks-abcipp", feature = "ibc-mocks"))] { - let client_state = self - .decode_client_state(counterparty_client_state.clone()) - .map_err(|_| ClientError::Other { - description: "Decoding the client state failed".to_string(), - })?; - - if let Some(_mock) = - downcast_client_state::(client_state.as_ref()) + if MockClientState::try_from(counterparty_client_state.clone()) + .is_ok() { return Ok(()); } @@ -496,6 +488,14 @@ where _ => unreachable!("The parameter should be initialized"), } } + + fn validate_message_signer( + &self, + _signer: &Signer, + ) -> Result<(), ContextError> { + // The signer of a transaction should be validated + Ok(()) + } } impl ValidateSelfClientContext for IbcActions<'_, C> diff --git a/core/src/ledger/ibc/mod.rs b/core/src/ledger/ibc/mod.rs index b56e8ce54a2..75ff6659145 100644 --- a/core/src/ledger/ibc/mod.rs +++ b/core/src/ledger/ibc/mod.rs @@ -9,7 +9,6 @@ use std::fmt::Debug; use std::rc::Rc; use std::time::Duration; -use borsh::BorshDeserialize; pub use context::common::IbcCommonContext; pub use context::storage::{IbcStorageContext, ProofSpec}; pub use context::transfer_mod::{ModuleWrapper, TransferModule}; @@ -18,21 +17,16 @@ use thiserror::Error; use crate::ibc::applications::transfer::denom::TracePrefix; use crate::ibc::applications::transfer::error::TokenTransferError; -use crate::ibc::applications::transfer::msgs::transfer::{ - MsgTransfer, TYPE_URL as MSG_TRANSFER_TYPE_URL, -}; +use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc::applications::transfer::packet::PacketData; -use crate::ibc::applications::transfer::relay::send_transfer::{ +use crate::ibc::applications::transfer::{ send_transfer_execute, send_transfer_validate, }; -use crate::ibc::core::context::Router; use crate::ibc::core::ics04_channel::msgs::PacketMsg; use crate::ibc::core::ics23_commitment::specs::ProofSpecs; use crate::ibc::core::ics24_host::identifier::{ChainId as IbcChainId, PortId}; -use crate::ibc::core::ics26_routing::context::{Module, ModuleId}; -use crate::ibc::core::ics26_routing::error::RouterError; -use crate::ibc::core::ics26_routing::msgs::MsgEnvelope; -use crate::ibc::core::{execute, validate}; +use crate::ibc::core::router::{Module, ModuleId, Router}; +use crate::ibc::core::{execute, validate, MsgEnvelope, RouterError}; use crate::ibc_proto::google::protobuf::Any; use crate::types::chain::ChainId; @@ -115,66 +109,32 @@ where /// Execute according to the message in an IBC transaction or VP pub fn execute(&mut self, tx_data: &[u8]) -> Result<(), Error> { - let msg = Any::decode(tx_data).map_err(Error::DecodingData)?; - match msg.type_url.as_str() { - MSG_TRANSFER_TYPE_URL => { - let msg = - MsgTransfer::try_from(msg).map_err(Error::TokenTransfer)?; + let any_msg = Any::decode(tx_data).map_err(Error::DecodingData)?; + match MsgTransfer::try_from(any_msg.clone()) { + Ok(msg) => { let port_id = msg.port_id_on_a.clone(); match self.get_route_mut_by_port(&port_id) { Some(_module) => { let mut module = TransferModule::new(self.ctx.clone()); - // restore the denom if it is hashed - let msg = self.restore_denom(msg)?; send_transfer_execute(&mut module, msg) .map_err(Error::TokenTransfer) } None => Err(Error::NoModule), } } - _ => { - execute(self, msg.clone()).map_err(Error::Execution)?; + Err(_) => { + let envelope = + MsgEnvelope::try_from(any_msg).map_err(Error::Execution)?; + execute(self, envelope.clone()).map_err(Error::Execution)?; // the current ibc-rs execution doesn't store the denom for the // token hash when transfer with MsgRecvPacket - self.store_denom(msg) + self.store_denom(envelope) } } } - /// Restore the denom when it is hashed - fn restore_denom(&self, msg: MsgTransfer) -> Result { - let mut msg = msg; - // lookup the original denom with the IBC token hash - if let Some(token_hash) = - storage::token_hash_from_denom(&msg.token.denom).map_err(|e| { - Error::Denom(format!("Invalid denom: error {}", e)) - })? - { - let denom_key = storage::ibc_denom_key(token_hash); - let denom = match self.ctx.borrow().read(&denom_key) { - Ok(Some(v)) => String::try_from_slice(&v[..]).map_err(|e| { - Error::Denom(format!( - "Decoding the denom string failed: {}", - e - )) - })?, - _ => { - return Err(Error::Denom(format!( - "No original denom: denom_key {}", - denom_key - ))); - } - }; - msg.token.denom = denom; - } - Ok(msg) - } - /// Store the denom when transfer with MsgRecvPacket - fn store_denom(&mut self, msg: Any) -> Result<(), Error> { - let envelope = MsgEnvelope::try_from(msg).map_err(|e| { - Error::Denom(format!("Decoding the message failed: {}", e)) - })?; + fn store_denom(&mut self, envelope: MsgEnvelope) -> Result<(), Error> { match envelope { MsgEnvelope::Packet(PacketMsg::Recv(msg)) => { let data = match serde_json::from_slice::( @@ -205,24 +165,24 @@ where /// Validate according to the message in IBC VP pub fn validate(&self, tx_data: &[u8]) -> Result<(), Error> { - let msg = Any::decode(tx_data).map_err(Error::DecodingData)?; - match msg.type_url.as_str() { - MSG_TRANSFER_TYPE_URL => { - let msg = - MsgTransfer::try_from(msg).map_err(Error::TokenTransfer)?; + let any_msg = Any::decode(tx_data).map_err(Error::DecodingData)?; + match MsgTransfer::try_from(any_msg.clone()) { + Ok(msg) => { let port_id = msg.port_id_on_a.clone(); match self.get_route_by_port(&port_id) { Some(_module) => { let module = TransferModule::new(self.ctx.clone()); - // restore the denom if it is hashed - let msg = self.restore_denom(msg)?; send_transfer_validate(&module, msg) .map_err(Error::TokenTransfer) } None => Err(Error::NoModule), } } - _ => validate(self, msg).map_err(Error::Validation), + Err(_) => { + let envelope = MsgEnvelope::try_from(any_msg) + .map_err(Error::Validation)?; + validate(self, envelope).map_err(Error::Validation) + } } } } diff --git a/core/src/ledger/ibc/storage.rs b/core/src/ledger/ibc/storage.rs index 1a47680f004..9a80766c47d 100644 --- a/core/src/ledger/ibc/storage.rs +++ b/core/src/ledger/ibc/storage.rs @@ -8,14 +8,13 @@ use thiserror::Error; use crate::ibc::core::ics02_client::height::Height; use crate::ibc::core::ics04_channel::packet::Sequence; use crate::ibc::core::ics24_host::identifier::{ - ChannelId, ClientId, ConnectionId, PortChannelId, PortId, + ChannelId, ClientId, ConnectionId, PortId, }; use crate::ibc::core::ics24_host::path::{ AckPath, ChannelEndPath, ClientConnectionPath, ClientConsensusStatePath, - ClientStatePath, ClientTypePath, CommitmentPath, ConnectionPath, PortPath, + ClientStatePath, CommitmentPath, ConnectionPath, Path, PortPath, ReceiptPath, SeqAckPath, SeqRecvPath, SeqSendPath, }; -use crate::ibc::core::ics24_host::Path; use crate::types::address::{Address, InternalAddress, HASH_HEX_LEN}; use crate::types::storage::{self, DbKeySeg, Key, KeySeg}; @@ -70,13 +69,6 @@ pub fn channel_counter_key() -> Key { .expect("Creating a key for the channel counter shouldn't fail") } -/// Returns a key for the client type -pub fn client_type_key(client_id: &ClientId) -> Key { - let path = Path::ClientType(ClientTypePath(client_id.clone())); - ibc_key(path.to_string()) - .expect("Creating a key for the client state shouldn't fail") -} - /// Returns a key for the client state pub fn client_state_key(client_id: &ClientId) -> Key { let path = Path::ClientState(ClientStatePath(client_id.clone())); @@ -117,11 +109,9 @@ pub fn connection_key(conn_id: &ConnectionId) -> Key { } /// Returns a key for the channel end -pub fn channel_key(port_channel_id: &PortChannelId) -> Key { - let path = Path::ChannelEnd(ChannelEndPath( - port_channel_id.port_id.clone(), - port_channel_id.channel_id.clone(), - )); +pub fn channel_key(port_id: &PortId, channel_id: &ChannelId) -> Key { + let path = + Path::ChannelEnd(ChannelEndPath(port_id.clone(), channel_id.clone())); ibc_key(path.to_string()) .expect("Creating a key for the channel shouldn't fail") } @@ -141,31 +131,22 @@ pub fn port_key(port_id: &PortId) -> Key { } /// Returns a key for nextSequenceSend -pub fn next_sequence_send_key(port_channel_id: &PortChannelId) -> Key { - let path = Path::SeqSend(SeqSendPath( - port_channel_id.port_id.clone(), - port_channel_id.channel_id.clone(), - )); +pub fn next_sequence_send_key(port_id: &PortId, channel_id: &ChannelId) -> Key { + let path = Path::SeqSend(SeqSendPath(port_id.clone(), channel_id.clone())); ibc_key(path.to_string()) .expect("Creating a key for nextSequenceSend shouldn't fail") } /// Returns a key for nextSequenceRecv -pub fn next_sequence_recv_key(port_channel_id: &PortChannelId) -> Key { - let path = Path::SeqRecv(SeqRecvPath( - port_channel_id.port_id.clone(), - port_channel_id.channel_id.clone(), - )); +pub fn next_sequence_recv_key(port_id: &PortId, channel_id: &ChannelId) -> Key { + let path = Path::SeqRecv(SeqRecvPath(port_id.clone(), channel_id.clone())); ibc_key(path.to_string()) .expect("Creating a key for nextSequenceRecv shouldn't fail") } /// Returns a key for nextSequenceAck -pub fn next_sequence_ack_key(port_channel_id: &PortChannelId) -> Key { - let path = Path::SeqAck(SeqAckPath( - port_channel_id.port_id.clone(), - port_channel_id.channel_id.clone(), - )); +pub fn next_sequence_ack_key(port_id: &PortId, channel_id: &ChannelId) -> Key { + let path = Path::SeqAck(SeqAckPath(port_id.clone(), channel_id.clone())); ibc_key(path.to_string()) .expect("Creating a key for nextSequenceAck shouldn't fail") } @@ -295,7 +276,7 @@ pub fn connection_id(key: &Key) -> Result { /// Returns a pair of port ID and channel ID from the given channel/sequence key /// `#IBC//ports//channels/` -pub fn port_channel_id(key: &Key) -> Result { +pub fn port_channel_id(key: &Key) -> Result<(PortId, ChannelId)> { match &key.segments[..] { [ DbKeySeg::AddressSeg(addr), @@ -316,10 +297,7 @@ pub fn port_channel_id(key: &Key) -> Result { .map_err(|e| Error::InvalidKey(e.to_string()))?; let channel_id = ChannelId::from_str(&channel.raw()) .map_err(|e| Error::InvalidKey(e.to_string()))?; - Ok(PortChannelId { - port_id, - channel_id, - }) + Ok((port_id, channel_id)) } _ => Err(Error::InvalidKey(format!( "The key doesn't have port ID and channel ID: Key {}", diff --git a/core/src/ledger/mod.rs b/core/src/ledger/mod.rs index 89b8105551c..9a84fbc1264 100644 --- a/core/src/ledger/mod.rs +++ b/core/src/ledger/mod.rs @@ -6,8 +6,8 @@ pub mod governance; #[cfg(any(feature = "abciplus", feature = "abcipp"))] pub mod ibc; pub mod parameters; +pub mod pgf; pub mod replay_protection; -pub mod slash_fund; pub mod storage; pub mod storage_api; pub mod testnet_pow; diff --git a/core/src/ledger/parameters/mod.rs b/core/src/ledger/parameters/mod.rs index c507e55d493..03d27fa2da7 100644 --- a/core/src/ledger/parameters/mod.rs +++ b/core/src/ledger/parameters/mod.rs @@ -46,6 +46,8 @@ pub struct Parameters { pub implicit_vp_code_hash: Hash, /// Expected number of epochs per year (read only) pub epochs_per_year: u64, + /// Maximum number of signature per transaction + pub max_signatures_per_transaction: u8, /// PoS gain p (read only) pub pos_gain_p: Dec, /// PoS gain d (read only) @@ -117,6 +119,7 @@ impl Parameters { tx_whitelist, implicit_vp_code_hash, epochs_per_year, + max_signatures_per_transaction, pos_gain_p, pos_gain_d, staked_ratio, @@ -168,6 +171,13 @@ impl Parameters { let epochs_per_year_key = storage::get_epochs_per_year_key(); storage.write(&epochs_per_year_key, epochs_per_year)?; + let max_signatures_per_transaction_key = + storage::get_max_signatures_per_transaction_key(); + storage.write( + &max_signatures_per_transaction_key, + max_signatures_per_transaction, + )?; + let pos_gain_p_key = storage::get_pos_gain_p_key(); storage.write(&pos_gain_p_key, pos_gain_p)?; @@ -197,6 +207,17 @@ impl Parameters { } } +/// Get the max signatures per transactio parameter +pub fn max_signatures_per_transaction( + storage: &S, +) -> storage_api::Result> +where + S: StorageRead, +{ + let key = storage::get_max_signatures_per_transaction_key(); + storage.read(&key) +} + /// Update the max_expected_time_per_block parameter in storage. Returns the /// parameters and gas cost. pub fn update_max_expected_time_per_block_parameter( @@ -340,6 +361,20 @@ where storage.write_bytes(&key, implicit_vp) } +/// Update the max signatures per transaction storage parameter +pub fn update_max_signature_per_tx( + storage: &mut S, + value: u8, +) -> storage_api::Result<()> +where + S: StorageRead + StorageWrite, +{ + let key = storage::get_max_signatures_per_transaction_key(); + // Using `fn write_bytes` here, because implicit_vp doesn't need to be + // encoded, it's bytes already. + storage.write(&key, value) +} + /// Read the the epoch duration parameter from store pub fn read_epoch_duration_parameter( storage: &S, @@ -434,6 +469,15 @@ where .ok_or(ReadError::ParametersMissing) .into_storage_result()?; + // read the maximum signatures per transaction + let max_signatures_per_transaction_key = + storage::get_max_signatures_per_transaction_key(); + let value: Option = + storage.read(&max_signatures_per_transaction_key)?; + let max_signatures_per_transaction: u8 = value + .ok_or(ReadError::ParametersMissing) + .into_storage_result()?; + // read PoS gain P let pos_gain_p_key = storage::get_pos_gain_p_key(); let value = storage.read(&pos_gain_p_key)?; @@ -478,6 +522,7 @@ where tx_whitelist, implicit_vp_code_hash, epochs_per_year, + max_signatures_per_transaction, pos_gain_p, pos_gain_d, staked_ratio, diff --git a/core/src/ledger/parameters/storage.rs b/core/src/ledger/parameters/storage.rs index 94498e3578f..d32b1d221f9 100644 --- a/core/src/ledger/parameters/storage.rs +++ b/core/src/ledger/parameters/storage.rs @@ -44,6 +44,7 @@ struct Keys { max_proposal_bytes: &'static str, faucet_account: &'static str, wrapper_tx_fees: &'static str, + max_signatures_per_transaction: &'static str, } /// Returns if the key is a parameter key. @@ -183,3 +184,8 @@ pub fn get_faucet_account_key() -> Key { pub fn get_wrapper_tx_fees_key() -> Key { get_wrapper_tx_fees_key_at_addr(ADDRESS) } + +/// Storage key used for the max signatures per transaction key +pub fn get_max_signatures_per_transaction_key() -> Key { + get_max_signatures_per_transaction_key_at_addr(ADDRESS) +} diff --git a/core/src/ledger/slash_fund/mod.rs b/core/src/ledger/pgf/mod.rs similarity index 55% rename from core/src/ledger/slash_fund/mod.rs rename to core/src/ledger/pgf/mod.rs index 7a7d53963b0..a36621e49e1 100644 --- a/core/src/ledger/slash_fund/mod.rs +++ b/core/src/ledger/pgf/mod.rs @@ -1,8 +1,11 @@ -//! SlashFund library code +//! Pgf library code use crate::types::address::{Address, InternalAddress}; -/// Internal SlashFund address -pub const ADDRESS: Address = Address::Internal(InternalAddress::SlashFund); - +/// Pgf parameters +pub mod parameters; +/// Pgf storage pub mod storage; + +/// The Pgf internal address +pub const ADDRESS: Address = Address::Internal(InternalAddress::Pgf); diff --git a/core/src/ledger/pgf/parameters.rs b/core/src/ledger/pgf/parameters.rs new file mode 100644 index 00000000000..f7e33f06a23 --- /dev/null +++ b/core/src/ledger/pgf/parameters.rs @@ -0,0 +1,63 @@ +use std::collections::BTreeSet; + +use borsh::{BorshDeserialize, BorshSerialize}; + +use super::storage::keys as pgf_storage; +use crate::ledger::storage_api::{self, StorageRead, StorageWrite}; +use crate::types::address::Address; +use crate::types::dec::Dec; + +#[derive( + Clone, + Debug, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + BorshSerialize, + BorshDeserialize, +)] +/// Pgf parameter structure +pub struct PgfParameters { + /// The set of stewards + pub stewards: BTreeSet
, + /// The pgf funding inflation rate + pub pgf_inflation_rate: Dec, + /// The pgf stewards inflation rate + pub stewards_inflation_rate: Dec, +} + +impl Default for PgfParameters { + fn default() -> Self { + Self { + stewards: BTreeSet::default(), + pgf_inflation_rate: Dec::new(10, 2).unwrap(), + stewards_inflation_rate: Dec::new(1, 2).unwrap(), + } + } +} + +impl PgfParameters { + /// Initialize governance parameters into storage + pub fn init_storage(&self, storage: &mut S) -> storage_api::Result<()> + where + S: StorageRead + StorageWrite, + { + let Self { + stewards, + pgf_inflation_rate, + stewards_inflation_rate, + } = self; + + let stewards_key = pgf_storage::get_stewards_key(); + storage.write(&stewards_key, stewards)?; + + let pgf_inflation_rate_key = pgf_storage::get_pgf_inflation_rate_key(); + storage.write(&pgf_inflation_rate_key, pgf_inflation_rate)?; + + let steward_inflation_rate_key = + pgf_storage::get_steward_inflation_rate_key(); + storage.write(&steward_inflation_rate_key, stewards_inflation_rate) + } +} diff --git a/core/src/ledger/pgf/storage/keys.rs b/core/src/ledger/pgf/storage/keys.rs new file mode 100644 index 00000000000..fa4875bb779 --- /dev/null +++ b/core/src/ledger/pgf/storage/keys.rs @@ -0,0 +1,67 @@ +use namada_macros::StorageKeys; + +use crate::ledger::pgf::ADDRESS; +use crate::types::address::Address; +use crate::types::storage::{DbKeySeg, Key, KeySeg}; + +/// Storage keys for pgf internal address. +#[derive(StorageKeys)] +struct Keys { + stewards: &'static str, + payments: &'static str, + pgf_inflation_rate: &'static str, + steward_inflation_rate: &'static str, +} + +/// Check if key is inside governance address space +pub fn is_pgf_key(key: &Key) -> bool { + matches!(&key.segments[0], DbKeySeg::AddressSeg(addr) if addr == &ADDRESS) +} + +/// Check if key is a steward key +pub fn is_stewards_key(key: &Key) -> bool { + matches!(&key.segments[..], [DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(prefix)] if addr == &ADDRESS && prefix == Keys::VALUES.stewards) +} + +/// Check if key is a payments key +pub fn is_payments_key(key: &Key) -> bool { + matches!(&key.segments[..], [DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(prefix)] if addr == &ADDRESS && prefix == Keys::VALUES.payments) +} + +/// Check if key is a pgf inflation rate key +pub fn is_pgf_inflation_rate_key(key: &Key) -> bool { + matches!(&key.segments[..], [DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(prefix)] if addr == &ADDRESS && prefix == Keys::VALUES.pgf_inflation_rate) +} + +/// Check if key is a steward inflation rate key +pub fn is_steward_inflation_rate_key(key: &Key) -> bool { + matches!(&key.segments[..], [DbKeySeg::AddressSeg(addr), DbKeySeg::StringSeg(prefix)] if addr == &ADDRESS && prefix == Keys::VALUES.steward_inflation_rate) +} + +/// Get key for stewards key +pub fn get_stewards_key() -> Key { + Key::from(ADDRESS.to_db_key()) + .push(&Keys::VALUES.stewards.to_owned()) + .expect("Cannot obtain a storage key") +} + +/// Get key for payments key +pub fn get_payments_key() -> Key { + Key::from(ADDRESS.to_db_key()) + .push(&Keys::VALUES.payments.to_owned()) + .expect("Cannot obtain a storage key") +} + +/// Get key for inflation rate key +pub fn get_pgf_inflation_rate_key() -> Key { + Key::from(ADDRESS.to_db_key()) + .push(&Keys::VALUES.pgf_inflation_rate.to_owned()) + .expect("Cannot obtain a storage key") +} + +/// Get key for inflation rate key +pub fn get_steward_inflation_rate_key() -> Key { + Key::from(ADDRESS.to_db_key()) + .push(&Keys::VALUES.steward_inflation_rate.to_owned()) + .expect("Cannot obtain a storage key") +} diff --git a/core/src/ledger/pgf/storage/mod.rs b/core/src/ledger/pgf/storage/mod.rs new file mode 100644 index 00000000000..fb9d6f8896c --- /dev/null +++ b/core/src/ledger/pgf/storage/mod.rs @@ -0,0 +1,2 @@ +/// Pgf storage keys +pub mod keys; diff --git a/core/src/ledger/slash_fund/storage.rs b/core/src/ledger/slash_fund/storage.rs deleted file mode 100644 index 9c437da591c..00000000000 --- a/core/src/ledger/slash_fund/storage.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Slash fund storage - -use crate::types::storage::{DbKeySeg, Key}; - -/// Check if a key is a slash fund key -pub fn is_slash_fund_key(key: &Key) -> bool { - matches!(&key.segments[0], DbKeySeg::AddressSeg(addr) if addr == &super::ADDRESS) -} diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index 6509c02d342..94669a34f4d 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -1225,6 +1225,7 @@ mod tests { tx_whitelist: vec![], implicit_vp_code_hash: Hash::zero(), epochs_per_year: 100, + max_signatures_per_transaction: 15, pos_gain_p: Dec::new(1,1).expect("Cannot fail"), pos_gain_d: Dec::new(1,1).expect("Cannot fail"), staked_ratio: Dec::new(1,1).expect("Cannot fail"), diff --git a/core/src/ledger/storage_api/account.rs b/core/src/ledger/storage_api/account.rs new file mode 100644 index 00000000000..4896de635fe --- /dev/null +++ b/core/src/ledger/storage_api/account.rs @@ -0,0 +1,106 @@ +//! Cryptographic signature keys storage API + +use super::*; +use crate::types::account::AccountPublicKeysMap; +use crate::types::address::Address; +use crate::types::key::*; +use crate::types::storage::Key; + +/// Init the subspace of a new account +pub fn init_account_storage( + storage: &mut S, + owner: &Address, + public_keys: &[common::PublicKey], + threshold: u8, +) -> Result<()> +where + S: StorageWrite + StorageRead, +{ + for (index, public_key) in public_keys.iter().enumerate() { + let index = index as u8; + pks_handle(owner).insert(storage, index, public_key.clone())?; + } + let threshold_key = threshold_key(owner); + storage.write(&threshold_key, threshold) +} + +/// Get the threshold associated with an account +pub fn threshold(storage: &S, owner: &Address) -> Result> +where + S: StorageRead, +{ + let threshold_key = threshold_key(owner); + storage.read(&threshold_key) +} + +/// Get the public keys associated with an account +pub fn public_keys( + storage: &S, + owner: &Address, +) -> Result> +where + S: StorageRead, +{ + let public_keys = pks_handle(owner) + .iter(storage)? + .filter_map(|data| match data { + Ok((_index, public_key)) => Some(public_key), + Err(_) => None, + }) + .collect::>(); + + Ok(public_keys) +} + +/// Get the public key index map associated with an account +pub fn public_keys_index_map( + storage: &S, + owner: &Address, +) -> Result +where + S: StorageRead, +{ + let public_keys = public_keys(storage, owner)?; + + Ok(AccountPublicKeysMap::from_iter(public_keys)) +} + +/// Check if an account exists in storage +pub fn exists(storage: &S, owner: &Address) -> Result +where + S: StorageRead, +{ + match owner { + Address::Established(_) => { + let vp_key = Key::validity_predicate(owner); + storage.has_key(&vp_key) + } + Address::Implicit(_) | Address::Internal(_) => Ok(true), + } +} + +/// Set public key at specific index +pub fn set_public_key_at( + storage: &mut S, + owner: &Address, + public_key: &common::PublicKey, + index: u8, +) -> Result<()> +where + S: StorageWrite + StorageRead, +{ + pks_handle(owner).insert(storage, index, public_key.clone())?; + Ok(()) +} + +/// Clear the public keys account subtorage space +pub fn clear_public_keys(storage: &mut S, owner: &Address) -> Result<()> +where + S: StorageWrite + StorageRead, +{ + let total_pks = pks_handle(owner).len(storage)?; + for index in 0..total_pks as u8 { + pks_handle(owner).remove(storage, &index)?; + } + Ok(()) +} diff --git a/core/src/ledger/storage_api/governance.rs b/core/src/ledger/storage_api/governance.rs index c2316bffa74..1d4d3f767ef 100644 --- a/core/src/ledger/storage_api/governance.rs +++ b/core/src/ledger/storage_api/governance.rs @@ -1,12 +1,25 @@ //! Governance +use std::collections::BTreeMap; + +use borsh::BorshDeserialize; + use super::token; -use crate::ledger::governance::{storage, ADDRESS as governance_address}; +use crate::ledger::governance::storage::keys as governance_keys; +use crate::ledger::governance::storage::proposal::{ + ProposalType, StorageProposal, +}; +use crate::ledger::governance::storage::vote::StorageProposalVote; +use crate::ledger::governance::utils::Vote; +use crate::ledger::governance::ADDRESS as governance_address; use crate::ledger::storage_api::{self, StorageRead, StorageWrite}; +use crate::types::address::Address; +use crate::types::storage::Epoch; use crate::types::transaction::governance::{ - InitProposalData, ProposalType, VoteProposalData, + InitProposalData, VoteProposalData, }; +/// A proposal creation transaction. /// A proposal creation transaction. pub fn init_proposal( storage: &mut S, @@ -17,25 +30,26 @@ pub fn init_proposal( where S: StorageRead + StorageWrite, { - let counter_key = storage::get_counter_key(); + let counter_key = governance_keys::get_counter_key(); let proposal_id = if let Some(id) = data.id { id } else { storage.read(&counter_key)?.unwrap() }; - let content_key = storage::get_content_key(proposal_id); + let content_key = governance_keys::get_content_key(proposal_id); storage.write_bytes(&content_key, content)?; - let author_key = storage::get_author_key(proposal_id); + let author_key = governance_keys::get_author_key(proposal_id); storage.write(&author_key, data.author.clone())?; - let proposal_type_key = storage::get_proposal_type_key(proposal_id); + let proposal_type_key = governance_keys::get_proposal_type_key(proposal_id); match data.r#type { ProposalType::Default(Some(_)) => { // Remove wasm code and write it under a different subkey storage.write(&proposal_type_key, ProposalType::Default(None))?; - let proposal_code_key = storage::get_proposal_code_key(proposal_id); + let proposal_code_key = + governance_keys::get_proposal_code_key(proposal_id); let proposal_code = code.clone().ok_or( storage_api::Error::new_const("Missing proposal code"), )?; @@ -45,17 +59,19 @@ where } let voting_start_epoch_key = - storage::get_voting_start_epoch_key(proposal_id); + governance_keys::get_voting_start_epoch_key(proposal_id); storage.write(&voting_start_epoch_key, data.voting_start_epoch)?; - let voting_end_epoch_key = storage::get_voting_end_epoch_key(proposal_id); + let voting_end_epoch_key = + governance_keys::get_voting_end_epoch_key(proposal_id); storage.write(&voting_end_epoch_key, data.voting_end_epoch)?; - let grace_epoch_key = storage::get_grace_epoch_key(proposal_id); + let grace_epoch_key = governance_keys::get_grace_epoch_key(proposal_id); storage.write(&grace_epoch_key, data.grace_epoch)?; if let ProposalType::Default(Some(_)) = data.r#type { - let proposal_code_key = storage::get_proposal_code_key(proposal_id); + let proposal_code_key = + governance_keys::get_proposal_code_key(proposal_id); let proposal_code = code.ok_or(storage_api::Error::new_const("Missing proposal code"))?; storage.write_bytes(&proposal_code_key, proposal_code)?; @@ -63,16 +79,19 @@ where storage.write(&counter_key, proposal_id + 1)?; - let min_proposal_funds_key = storage::get_min_proposal_fund_key(); + let min_proposal_funds_key = governance_keys::get_min_proposal_fund_key(); let min_proposal_funds: token::Amount = storage.read(&min_proposal_funds_key)?.unwrap(); - let funds_key = storage::get_funds_key(proposal_id); + let funds_key = governance_keys::get_funds_key(proposal_id); storage.write(&funds_key, min_proposal_funds)?; // this key must always be written for each proposal let committing_proposals_key = - storage::get_committing_proposals_key(proposal_id, data.grace_epoch.0); + governance_keys::get_committing_proposals_key( + proposal_id, + data.grace_epoch.0, + ); storage.write(&committing_proposals_key, ())?; token::transfer( @@ -93,7 +112,7 @@ where S: StorageRead + StorageWrite, { for delegation in data.delegations { - let vote_key = storage::get_vote_proposal_key( + let vote_key = governance_keys::get_vote_proposal_key( data.id, data.voter.clone(), delegation, @@ -102,3 +121,99 @@ where } Ok(()) } + +/// Read a proposal by id from storage +pub fn get_proposal_by_id( + storage: &S, + id: u64, +) -> storage_api::Result> +where + S: StorageRead, +{ + let author_key = governance_keys::get_author_key(id); + let content = governance_keys::get_content_key(id); + let start_epoch_key = governance_keys::get_voting_start_epoch_key(id); + let end_epoch_key = governance_keys::get_voting_end_epoch_key(id); + let grace_epoch_key = governance_keys::get_grace_epoch_key(id); + let proposal_type_key = governance_keys::get_proposal_type_key(id); + + let author: Option
= storage.read(&author_key)?; + let content: Option> = storage.read(&content)?; + let voting_start_epoch: Option = storage.read(&start_epoch_key)?; + let voting_end_epoch: Option = storage.read(&end_epoch_key)?; + let grace_epoch: Option = storage.read(&grace_epoch_key)?; + let proposal_type: Option = + storage.read(&proposal_type_key)?; + + let proposal = proposal_type.map(|proposal_type| StorageProposal { + id, + content: content.unwrap(), + author: author.unwrap(), + r#type: proposal_type, + voting_start_epoch: voting_start_epoch.unwrap(), + voting_end_epoch: voting_end_epoch.unwrap(), + grace_epoch: grace_epoch.unwrap(), + }); + + Ok(proposal) +} + +/// Query all the votes for a proposal_id +pub fn get_proposal_votes( + storage: &S, + proposal_id: u64, +) -> storage_api::Result> +where + S: storage_api::StorageRead, +{ + let vote_prefix_key = + governance_keys::get_proposal_vote_prefix_key(proposal_id); + let vote_iter = storage_api::iter_prefix::( + storage, + &vote_prefix_key, + )?; + + let votes = vote_iter + .filter_map(|vote_result| { + if let Ok((vote_key, vote)) = vote_result { + let voter_address = + governance_keys::get_voter_address(&vote_key); + let delegator_address = + governance_keys::get_vote_delegation_address(&vote_key); + match (voter_address, delegator_address) { + (Some(delegator_address), Some(validator_address)) => { + Some(Vote { + validator: validator_address.to_owned(), + delegator: delegator_address.to_owned(), + data: vote, + }) + } + _ => None, + } + } else { + None + } + }) + .collect::>(); + + Ok(votes) +} + +/// Check if an accepted proposal is being executed +pub fn is_proposal_accepted( + storage: &S, + tx_data: &[u8], +) -> storage_api::Result +where + S: storage_api::StorageRead, +{ + let proposal_id = u64::try_from_slice(tx_data).ok(); + match proposal_id { + Some(id) => { + let proposal_execution_key = + governance_keys::get_proposal_execution_key(id); + storage.has_key(&proposal_execution_key) + } + None => Ok(false), + } +} diff --git a/core/src/ledger/storage_api/key.rs b/core/src/ledger/storage_api/key.rs index 6e3eba64aa8..69bdd507203 100644 --- a/core/src/ledger/storage_api/key.rs +++ b/core/src/ledger/storage_api/key.rs @@ -4,23 +4,17 @@ use super::*; use crate::types::address::Address; use crate::types::key::*; -/// Get the public key associated with the given address. Returns `Ok(None)` if -/// not found. -pub fn get(storage: &S, owner: &Address) -> Result> -where - S: StorageRead, -{ - let key = pk_key(owner); - storage.read(&key) -} - /// Reveal a PK of an implicit account - the PK is written into the storage /// of the address derived from the PK. -pub fn reveal_pk(storage: &mut S, pk: &common::PublicKey) -> Result<()> +pub fn reveal_pk( + storage: &mut S, + public_key: &common::PublicKey, +) -> Result<()> where - S: StorageWrite, + S: StorageWrite + StorageRead, { - let addr: Address = pk.into(); - let key = pk_key(&addr); - storage.write(&key, pk) + let owner: Address = public_key.into(); + pks_handle(&owner).insert(storage, 0, public_key.clone())?; + + Ok(()) } diff --git a/core/src/ledger/storage_api/mod.rs b/core/src/ledger/storage_api/mod.rs index 451996d0e58..1108c44e3d0 100644 --- a/core/src/ledger/storage_api/mod.rs +++ b/core/src/ledger/storage_api/mod.rs @@ -1,10 +1,12 @@ //! The common storage read trait is implemented in the storage, client RPC, tx //! and VPs (both native and WASM). +pub mod account; pub mod collections; mod error; pub mod governance; pub mod key; +pub mod pgf; pub mod token; pub mod validation; diff --git a/core/src/ledger/storage_api/pgf.rs b/core/src/ledger/storage_api/pgf.rs new file mode 100644 index 00000000000..8dfafee0fb7 --- /dev/null +++ b/core/src/ledger/storage_api/pgf.rs @@ -0,0 +1,30 @@ +//! Pgf + +use std::collections::BTreeSet; + +use crate::ledger::governance::storage::proposal::PGFTarget; +use crate::ledger::pgf::storage::keys as pgf_keys; +use crate::ledger::storage_api::{self}; +use crate::types::address::Address; + +/// Query the current pgf steward set +pub fn get_stewards(storage: &S) -> storage_api::Result> +where + S: storage_api::StorageRead, +{ + let stewards_key = pgf_keys::get_stewards_key(); + let stewards: Option> = storage.read(&stewards_key)?; + + Ok(stewards.unwrap_or_default()) +} + +/// Query the current pgf continous payments +pub fn get_payments(storage: &S) -> storage_api::Result> +where + S: storage_api::StorageRead, +{ + let payment_key = pgf_keys::get_payments_key(); + let payments: Option> = storage.read(&payment_key)?; + + Ok(payments.unwrap_or_default()) +} diff --git a/core/src/ledger/storage_api/token.rs b/core/src/ledger/storage_api/token.rs index 1985d8325c7..95987d6a83f 100644 --- a/core/src/ledger/storage_api/token.rs +++ b/core/src/ledger/storage_api/token.rs @@ -134,3 +134,35 @@ where storage.write(&balance_key, new_balance)?; storage.write(&total_supply_key, new_supply) } + +/// Burn an amount of token for a specific address. +pub fn burn( + storage: &mut S, + token: &Address, + source: &Address, + amount: token::Amount, +) -> storage_api::Result<()> +where + S: StorageRead + StorageWrite, +{ + let key = token::balance_key(token, source); + let balance = read_balance(storage, token, source)?; + + let amount_to_burn = match balance.checked_sub(amount) { + Some(new_balance) => { + storage.write(&key, new_balance)?; + amount + } + None => { + storage.write(&key, token::Amount::default())?; + balance + } + }; + + let total_supply = read_total_supply(&*storage, source)?; + let new_total_supply = + total_supply.checked_sub(amount_to_burn).unwrap_or_default(); + + let total_supply_key = token::minted_balance_key(token); + storage.write(&total_supply_key, new_total_supply) +} diff --git a/core/src/proto/mod.rs b/core/src/proto/mod.rs index 27ae37ff695..e8411a41d2d 100644 --- a/core/src/proto/mod.rs +++ b/core/src/proto/mod.rs @@ -4,8 +4,9 @@ pub mod generated; mod types; pub use types::{ - Code, Commitment, Data, Dkg, Error, Header, MaspBuilder, Section, Signable, - SignableEthMessage, Signature, Signed, Tx, TxError, + Code, Commitment, Data, Dkg, Error, Header, MaspBuilder, MultiSignature, + Section, Signable, SignableEthMessage, Signature, SignatureIndex, Signed, + Tx, TxError, }; #[cfg(test)] diff --git a/core/src/proto/types.rs b/core/src/proto/types.rs index 610d4536544..59c035561e2 100644 --- a/core/src/proto/types.rs +++ b/core/src/proto/types.rs @@ -1,5 +1,6 @@ use std::borrow::Cow; -use std::collections::{HashMap, HashSet}; +use std::cmp::Ordering; +use std::collections::{BTreeSet, HashMap, HashSet}; use std::convert::TryFrom; use std::hash::{Hash, Hasher}; use std::marker::PhantomData; @@ -10,6 +11,7 @@ use ark_ec::AffineCurve; use ark_ec::PairingEngine; use borsh::schema::{Declaration, Definition}; use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; +use data_encoding::HEXUPPER; use masp_primitives::transaction::builder::Builder; use masp_primitives::transaction::components::sapling::builder::SaplingMetadata; use masp_primitives::transaction::Transaction; @@ -22,8 +24,10 @@ use thiserror::Error; use super::generated::types; use crate::ledger::storage::{KeccakHasher, Sha256Hasher, StorageHasher}; +use crate::ledger::testnet_pow; #[cfg(any(feature = "tendermint", feature = "tendermint-abcipp"))] use crate::tendermint_proto::abci::ResponseDeliverTx; +use crate::types::account::AccountPublicKeysMap; use crate::types::address::Address; use crate::types::chain::ChainId; use crate::types::keccak::{keccak_hash, KeccakHash}; @@ -41,7 +45,9 @@ use crate::types::transaction::EllipticCurve; use crate::types::transaction::EncryptionKey; #[cfg(feature = "ferveo-tpke")] use crate::types::transaction::WrapperTxErr; -use crate::types::transaction::{hash_tx, DecryptedTx, TxType, WrapperTx}; +use crate::types::transaction::{ + hash_tx, DecryptedTx, Fee, GasLimit, TxType, WrapperTx, +}; #[derive(Error, Debug)] pub enum Error { @@ -49,6 +55,8 @@ pub enum Error { TxDecodingError(prost::DecodeError), #[error("Error deserializing transaction field bytes: {0}")] TxDeserializingError(std::io::Error), + #[error("Error deserializing transaction")] + OfflineTxDeserializationError, #[error("Error decoding an DkgGossipMessage from bytes: {0}")] DkgDecodingError(prost::DecodeError), #[error("Dkg is empty")] @@ -57,6 +65,12 @@ pub enum Error { NoTimestampError, #[error("Timestamp is invalid: {0}")] InvalidTimestamp(prost_types::TimestampError), + #[error("The section signature is invalid: {0}")] + InvalidSectionSignature(String), + #[error("Couldn't serialize transaction from JSON at {0}")] + InvalidJSONDeserialization(String), + #[error("The wrapper signature is invalid.")] + InvalidWrapperSignature, } pub type Result = std::result::Result; @@ -360,6 +374,164 @@ impl Code { } } +#[derive( + Clone, + Debug, + BorshSerialize, + BorshDeserialize, + BorshSchema, + Serialize, + Deserialize, + Eq, + PartialEq, +)] +pub struct SignatureIndex { + pub signature: common::Signature, + pub index: u8, +} + +impl SignatureIndex { + pub fn from_single_signature(signature: common::Signature) -> Self { + Self { + signature, + index: 0, + } + } + + pub fn to_vec(&self) -> Vec { + vec![self.clone()] + } + + pub fn verify( + &self, + public_key_index_map: &AccountPublicKeysMap, + data: &impl SignableBytes, + ) -> std::result::Result<(), VerifySigError> { + let public_key = + public_key_index_map.get_public_key_from_index(self.index); + if let Some(public_key) = public_key { + common::SigScheme::verify_signature( + &public_key, + data, + &self.signature, + ) + } else { + Err(VerifySigError::MissingData) + } + } + + pub fn serialize(&self) -> String { + let signature_bytes = + self.try_to_vec().expect("Signature should be serializable"); + HEXUPPER.encode(&signature_bytes) + } + + pub fn deserialize(data: &[u8]) -> Result { + if let Ok(hex) = serde_json::from_slice::(data) { + match HEXUPPER.decode(hex.as_bytes()) { + Ok(bytes) => Self::try_from_slice(&bytes) + .map_err(Error::TxDeserializingError), + Err(_) => Err(Error::OfflineTxDeserializationError), + } + } else { + Err(Error::OfflineTxDeserializationError) + } + } +} + +impl Ord for SignatureIndex { + fn cmp(&self, other: &Self) -> Ordering { + self.index.cmp(&other.index) + } +} + +impl PartialOrd for SignatureIndex { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +/// A section representing a multisig over another section +#[derive( + Clone, + Debug, + BorshSerialize, + BorshDeserialize, + BorshSchema, + Serialize, + Deserialize, +)] +pub struct MultiSignature { + /// The hash of the section being signed + pub targets: Vec, + /// The signature over the above hash + pub signatures: BTreeSet, +} + +impl MultiSignature { + /// Sign the given section hash with the given key and return a section + pub fn new( + targets: Vec, + secret_keys: &[common::SecretKey], + public_keys_index_map: &AccountPublicKeysMap, + ) -> Self { + let target = Self { + targets: targets.clone(), + signatures: BTreeSet::new(), + } + .get_hash(); + + let signatures_public_keys_map = + secret_keys.iter().map(|secret_key: &common::SecretKey| { + let signature = common::SigScheme::sign(secret_key, target); + let public_key = secret_key.ref_to(); + (public_key, signature) + }); + + let signatures = signatures_public_keys_map + .filter_map(|(public_key, signature)| { + let public_key_index = public_keys_index_map + .get_index_from_public_key(&public_key); + public_key_index + .map(|index| SignatureIndex { signature, index }) + }) + .collect::>(); + + Self { + targets, + signatures, + } + } + + pub fn total_signatures(&self) -> u8 { + self.signatures.len() as u8 + } + + /// Hash this signature section + pub fn hash<'a>(&self, hasher: &'a mut Sha256) -> &'a mut Sha256 { + hasher.update( + self.try_to_vec() + .expect("unable to serialize multisignature section"), + ); + hasher + } + + /// Get the hash of this section + pub fn get_hash(&self) -> crate::types::hash::Hash { + crate::types::hash::Hash( + self.hash(&mut Sha256::new()).finalize_reset().into(), + ) + } + + pub fn get_raw_hash(&self) -> crate::types::hash::Hash { + Self { + signatures: BTreeSet::new(), + ..self.clone() + } + .get_hash() + } +} + /// A section representing the signature over another section #[derive( Clone, @@ -371,26 +543,19 @@ impl Code { Deserialize, )] pub struct Signature { - /// Additional random data - salt: [u8; 8], /// The hash of the section being signed targets: Vec, - /// The public key to verify the below signature - pub_key: common::PublicKey, /// The signature over the above hashes pub signature: Option, } impl Signature { - /// Sign the given section hash with the given key and return a section pub fn new( targets: Vec, sec_key: &common::SecretKey, ) -> Self { let mut sec = Self { - salt: DateTimeUtc::now().0.timestamp_millis().to_le_bytes(), targets, - pub_key: sec_key.ref_to(), signature: None, }; sec.signature = Some(common::SigScheme::sign(sec_key, sec.get_hash())); @@ -414,11 +579,14 @@ impl Signature { } /// Verify that the signature contained in this section is valid - pub fn verify_signature(&self) -> std::result::Result<(), VerifySigError> { + pub fn verify_signature( + &self, + public_key: &common::PublicKey, + ) -> std::result::Result<(), VerifySigError> { let signature = self.signature.as_ref().ok_or(VerifySigError::MissingData)?; common::SigScheme::verify_signature( - &self.pub_key, + public_key, &Self { signature: None, ..self.clone() @@ -730,6 +898,8 @@ pub enum Section { /// Transaction code. Sending to hardware wallets optional Code(Code), /// A transaction signature. Often produced by hardware wallets + SectionSignature(MultiSignature), + /// A transaction header/protocol signature Signature(Signature), /// Ciphertext obtained by encrypting arbitrary transaction sections Ciphertext(Ciphertext), @@ -759,7 +929,8 @@ impl Section { Self::Data(data) => data.hash(hasher), Self::ExtraData(extra) => extra.hash(hasher), Self::Code(code) => code.hash(hasher), - Self::Signature(sig) => sig.hash(hasher), + Self::Signature(signature) => signature.hash(hasher), + Self::SectionSignature(signatures) => signatures.hash(hasher), Self::Ciphertext(ct) => ct.hash(hasher), Self::MaspBuilder(mb) => mb.hash(hasher), Self::MaspTx(tx) => { @@ -831,6 +1002,15 @@ impl Section { } } + /// Extract the section signature from this section if possible + pub fn section_signature(&self) -> Option { + if let Self::SectionSignature(data) = self { + Some(data.clone()) + } else { + None + } + } + /// Extract the ciphertext from this section if possible pub fn ciphertext(&self) -> Option { if let Self::Ciphertext(data) = self { @@ -978,15 +1158,57 @@ impl TryFrom<&[u8]> for Tx { } } +impl Default for Tx { + fn default() -> Self { + Self { + header: Header::new(TxType::Raw), + sections: vec![], + } + } +} + impl Tx { + /// Initialize a new transaction builder + pub fn new(chain_id: ChainId, expiration: Option) -> Self { + Tx { + sections: vec![], + header: Header { + chain_id, + expiration, + ..Header::new(TxType::Raw) + }, + } + } + /// Create a transaction of the given type - pub fn new(header: TxType) -> Self { + pub fn from_type(header: TxType) -> Self { Tx { header: Header::new(header), sections: vec![], } } + /// Serialize tx to hex string + pub fn serialize(&self) -> String { + let tx_bytes = self + .try_to_vec() + .expect("Transation should be serializable"); + HEXUPPER.encode(&tx_bytes) + } + + // Deserialize from hex encoding + pub fn deserialize(data: &[u8]) -> Result { + if let Ok(hex) = serde_json::from_slice::(data) { + match HEXUPPER.decode(hex.as_bytes()) { + Ok(bytes) => Tx::try_from_slice(&bytes) + .map_err(Error::TxDeserializingError), + Err(_) => Err(Error::OfflineTxDeserializationError), + } + } else { + Err(Error::OfflineTxDeserializationError) + } + } + /// Get the transaction header pub fn header(&self) -> Header { self.header.clone() @@ -1105,36 +1327,113 @@ impl Tx { bytes } + /// Get the inner section hashes + pub fn inner_section_targets(&self) -> Vec { + self.sections + .iter() + .filter_map(|section| match section { + Section::Data(_) | Section::Code(_) => Some(section.get_hash()), + _ => None, + }) + .collect() + } + + /// Verify that the section with the given hash has been signed by the given + /// public key + pub fn verify_section_signatures( + &self, + hashes: &[crate::types::hash::Hash], + public_keys_index_map: AccountPublicKeysMap, + threshold: u8, + max_signatures: Option, + ) -> std::result::Result<(), Error> { + let max_signatures = max_signatures.unwrap_or(u8::MAX); + let mut valid_signatures = 0; + + for section in &self.sections { + if let Section::SectionSignature(signatures) = section { + if !hashes.iter().all(|x| { + signatures.targets.contains(x) || section.get_hash() == *x + }) { + return Err(Error::InvalidSectionSignature( + "missing target hash.".to_string(), + )); + } + + for target in &signatures.targets { + if self.get_section(target).is_none() { + return Err(Error::InvalidSectionSignature( + "Missing target section.".to_string(), + )); + } + } + + if signatures.total_signatures() > max_signatures { + return Err(Error::InvalidSectionSignature( + "too many signatures.".to_string(), + )); + } + + if signatures.total_signatures() < threshold { + return Err(Error::InvalidSectionSignature( + "too few signatures.".to_string(), + )); + } + + for signature_index in &signatures.signatures { + let is_valid_signature = signature_index + .verify( + &public_keys_index_map, + &signatures.get_raw_hash(), + ) + .is_ok(); + if is_valid_signature { + valid_signatures += 1; + } + if valid_signatures >= threshold { + return Ok(()); + } + } + } + } + Err(Error::InvalidSectionSignature( + "invalid signatures.".to_string(), + )) + } + /// Verify that the sections with the given hashes have been signed together /// by the given public key. I.e. this function looks for one signature that /// covers over the given slice of hashes. pub fn verify_signature( &self, - pk: &common::PublicKey, + public_key: &common::PublicKey, hashes: &[crate::types::hash::Hash], - ) -> std::result::Result<&Signature, VerifySigError> { + ) -> Result<&Signature> { for section in &self.sections { - if let Section::Signature(sig_sec) = section { - // Check that the signer is matched and that the hashes being + if let Section::Signature(signature) = section { + // Check that the hashes being // checked are a subset of those in this section - if sig_sec.pub_key == *pk - && hashes.iter().all(|x| { - sig_sec.targets.contains(x) || section.get_hash() == *x - }) - { + if hashes.iter().all(|x| { + signature.targets.contains(x) || section.get_hash() == *x + }) { // Ensure that all the sections the signature signs over are // present - for target in &sig_sec.targets { + for target in &signature.targets { if self.get_section(target).is_none() { - return Err(VerifySigError::MissingData); + return Err(Error::InvalidSectionSignature( + "Target section is missing.".to_string(), + )); } } // Finally verify that the signature itself is valid - return sig_sec.verify_signature().map(|_| sig_sec); + return signature + .verify_signature(public_key) + .map(|_| signature) + .map_err(|_| Error::InvalidWrapperSignature); } } } - Err(VerifySigError::MissingData) + Err(Error::InvalidWrapperSignature) } /// Validate any and all ciphertexts stored in this transaction @@ -1153,6 +1452,16 @@ impl Tx { valid } + pub fn compute_section_signature( + &self, + secret_keys: &[common::SecretKey], + public_keys_index_map: &AccountPublicKeysMap, + ) -> BTreeSet { + let targets = [*self.data_sechash(), *self.code_sechash()].to_vec(); + MultiSignature::new(targets, secret_keys, public_keys_index_map) + .signatures + } + /// Decrypt any and all ciphertexts stored in this transaction use the /// given decryption key #[cfg(feature = "ferveo-tpke")] @@ -1180,7 +1489,7 @@ impl Tx { /// Encrypt all sections in this transaction other than the header and /// signatures over it #[cfg(feature = "ferveo-tpke")] - pub fn encrypt(&mut self, pubkey: &EncryptionKey) { + pub fn encrypt(&mut self, pubkey: &EncryptionKey) -> &mut Self { let header_hash = self.header_hash(); let mut plaintexts = vec![]; // Iterate backwrds to sidestep the effects of deletion on indexing @@ -1195,6 +1504,7 @@ impl Tx { // Encrypt all eligible sections in one go self.sections .push(Section::Ciphertext(Ciphertext::new(plaintexts, pubkey))); + self } /// Determines the type of the input Tx @@ -1280,6 +1590,139 @@ impl Tx { } filtered } + + /// Add an extra section to the tx builder by hash + pub fn add_extra_section_from_hash( + &mut self, + hash: crate::types::hash::Hash, + ) -> crate::types::hash::Hash { + let sechash = self + .add_section(Section::ExtraData(Code::from_hash(hash))) + .get_hash(); + sechash + } + + /// Add an extra section to the tx builder by code + pub fn add_extra_section( + &mut self, + code: Vec, + ) -> (&mut Self, crate::types::hash::Hash) { + let sechash = self + .add_section(Section::ExtraData(Code::new(code))) + .get_hash(); + (self, sechash) + } + + /// Add a masp tx section to the tx builder + pub fn add_masp_tx_section( + &mut self, + tx: Transaction, + ) -> (&mut Self, crate::types::hash::Hash) { + let sechash = self.add_section(Section::MaspTx(tx)).get_hash(); + (self, sechash) + } + + /// Add a masp builder section to the tx builder + pub fn add_masp_builder(&mut self, builder: MaspBuilder) -> &mut Self { + let _sec = self.add_section(Section::MaspBuilder(builder)); + self + } + + /// Add wasm code to the tx builder from hash + pub fn add_code_from_hash( + &mut self, + code_hash: crate::types::hash::Hash, + ) -> &mut Self { + self.set_code(Code::from_hash(code_hash)); + self + } + + /// Add wasm code to the tx builder + pub fn add_code(&mut self, code: Vec) -> &mut Self { + self.set_code(Code::new(code)); + self + } + + /// Add wasm data to the tx builder + pub fn add_data(&mut self, data: impl BorshSerialize) -> &mut Self { + let bytes = data.try_to_vec().expect("Encoding tx data shouldn't fail"); + self.set_data(Data::new(bytes)); + self + } + + /// Add wasm data already serialized to the tx builder + pub fn add_serialized_data(&mut self, bytes: Vec) -> &mut Self { + self.set_data(Data::new(bytes)); + self + } + + /// Add wrapper tx to the tx builder + pub fn add_wrapper( + &mut self, + fee: Fee, + gas_payer: common::PublicKey, + epoch: Epoch, + gas_limit: GasLimit, + #[cfg(not(feature = "mainnet"))] requires_pow: Option< + testnet_pow::Solution, + >, + ) -> &mut Self { + self.header.tx_type = TxType::Wrapper(Box::new(WrapperTx::new( + fee, + gas_payer, + epoch, + gas_limit, + #[cfg(not(feature = "mainnet"))] + requires_pow, + ))); + self + } + + /// Add fee payer keypair to the tx builder + pub fn sign_wrapper(&mut self, keypair: common::SecretKey) -> &mut Self { + self.protocol_filter(); + self.add_section(Section::Signature(Signature::new( + self.sechashes(), + &keypair, + ))); + self + } + + /// Add signing keys to the tx builder + pub fn sign_raw( + &mut self, + keypairs: Vec, + account_public_keys_map: AccountPublicKeysMap, + ) -> &mut Self { + self.protocol_filter(); + let hashes = self + .sections + .iter() + .filter_map(|section| match section { + Section::Data(_) | Section::Code(_) => Some(section.get_hash()), + _ => None, + }) + .collect(); + self.add_section(Section::SectionSignature(MultiSignature::new( + hashes, + &keypairs, + &account_public_keys_map, + ))); + self + } + + /// Add signature + pub fn add_signatures( + &mut self, + signatures: BTreeSet, + ) -> &mut Self { + self.protocol_filter(); + self.add_section(Section::SectionSignature(MultiSignature { + targets: self.inner_section_targets(), + signatures, + })); + self + } } #[cfg(any(feature = "tendermint", feature = "tendermint-abcipp"))] diff --git a/core/src/types/account.rs b/core/src/types/account.rs new file mode 100644 index 00000000000..d66876ba37b --- /dev/null +++ b/core/src/types/account.rs @@ -0,0 +1,92 @@ +//! Helper structures to manage accounts + +use std::collections::HashMap; + +use borsh::{BorshDeserialize, BorshSerialize}; +use serde::{Deserialize, Serialize}; + +use super::address::Address; +use super::key::common; + +#[derive( + Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, +)] +/// Account data +pub struct Account { + /// The map between indexes and public keys for an account + pub public_keys_map: AccountPublicKeysMap, + /// The account signature threshold + pub threshold: u8, + /// The address corresponding to the account owner + pub address: Address, +} + +impl Account { + /// Retrive a public key from the index + pub fn get_public_key_from_index( + &self, + index: u8, + ) -> Option { + self.public_keys_map.get_public_key_from_index(index) + } + + /// Retrive the index of a public key + pub fn get_index_from_public_key( + &self, + public_key: &common::PublicKey, + ) -> Option { + self.public_keys_map.get_index_from_public_key(public_key) + } +} + +#[derive( + Debug, + Clone, + BorshSerialize, + BorshDeserialize, + Serialize, + Deserialize, + Default, +)] +/// Holds the public key map data as a bimap for efficient quering +pub struct AccountPublicKeysMap { + /// Hashmap from public key to index + pub pk_to_idx: HashMap, + /// Hashmap from index key to public key + pub idx_to_pk: HashMap, +} + +impl FromIterator for AccountPublicKeysMap { + fn from_iter>(iter: T) -> Self { + let mut pk_to_idx = HashMap::new(); + let mut idx_to_pk = HashMap::new(); + + for (index, public_key) in iter.into_iter().enumerate() { + pk_to_idx.insert(public_key.to_owned(), index as u8); + idx_to_pk.insert(index as u8, public_key.to_owned()); + } + + Self { + pk_to_idx, + idx_to_pk, + } + } +} + +impl AccountPublicKeysMap { + /// Retrive a public key from the index + pub fn get_public_key_from_index( + &self, + index: u8, + ) -> Option { + self.idx_to_pk.get(&index).cloned() + } + + /// Retrive the index of a public key + pub fn get_index_from_public_key( + &self, + public_key: &common::PublicKey, + ) -> Option { + self.pk_to_idx.get(public_key).cloned() + } +} diff --git a/core/src/types/address.rs b/core/src/types/address.rs index 1a6611a2f5d..d587d202804 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use thiserror::Error; -use crate::ibc::signer::Signer; +use crate::ibc::Signer; use crate::types::ethereum_events::EthAddress; use crate::types::key; use crate::types::key::PublicKeyHash; @@ -75,8 +75,6 @@ mod internal { "ano::Protocol Parameters "; pub const GOVERNANCE: &str = "ano::Governance "; - pub const SLASH_FUND: &str = - "ano::Slash Fund "; pub const IBC: &str = "ibc::Inter-Blockchain Communication "; pub const ETH_BRIDGE: &str = @@ -87,6 +85,8 @@ mod internal { "ano::Replay Protection "; pub const MULTITOKEN: &str = "ano::Multitoken "; + pub const PGF: &str = + "ano::Pgf "; } /// Fixed-length address strings prefix for established addresses. @@ -219,9 +219,6 @@ impl Address { InternalAddress::Governance => { internal::GOVERNANCE.to_string() } - InternalAddress::SlashFund => { - internal::SLASH_FUND.to_string() - } InternalAddress::Ibc => internal::IBC.to_string(), InternalAddress::IbcToken(hash) => { format!("{}::{}", PREFIX_IBC, hash) @@ -243,6 +240,7 @@ impl Address { InternalAddress::Multitoken => { internal::MULTITOKEN.to_string() } + InternalAddress::Pgf => internal::PGF.to_string(), }; debug_assert_eq!(string.len(), FIXED_LEN_STRING_BYTES); string @@ -304,9 +302,6 @@ impl Address { internal::GOVERNANCE => { Ok(Address::Internal(InternalAddress::Governance)) } - internal::SLASH_FUND => { - Ok(Address::Internal(InternalAddress::SlashFund)) - } internal::ETH_BRIDGE => { Ok(Address::Internal(InternalAddress::EthBridge)) } @@ -319,6 +314,7 @@ impl Address { internal::MULTITOKEN => { Ok(Address::Internal(InternalAddress::Multitoken)) } + internal::PGF => Ok(Address::Internal(InternalAddress::Pgf)), _ => Err(Error::new( ErrorKind::InvalidData, "Invalid internal address", @@ -541,8 +537,6 @@ pub enum InternalAddress { IbcToken(String), /// Governance address Governance, - /// SlashFund address for governance - SlashFund, /// Bridge to Ethereum EthBridge, /// The pool of transactions to be relayed to Ethereum @@ -553,6 +547,8 @@ pub enum InternalAddress { ReplayProtection, /// Multitoken Multitoken, + /// Pgf + Pgf, } impl Display for InternalAddress { @@ -565,7 +561,6 @@ impl Display for InternalAddress { Self::PosSlashPool => "PosSlashPool".to_string(), Self::Parameters => "Parameters".to_string(), Self::Governance => "Governance".to_string(), - Self::SlashFund => "SlashFund".to_string(), Self::Ibc => "IBC".to_string(), Self::IbcToken(hash) => format!("IbcToken: {}", hash), Self::EthBridge => "EthBridge".to_string(), @@ -573,6 +568,7 @@ impl Display for InternalAddress { Self::Erc20(eth_addr) => format!("Erc20: {}", eth_addr), Self::ReplayProtection => "ReplayProtection".to_string(), Self::Multitoken => "Multitoken".to_string(), + Self::Pgf => "PublicGoodFundings".to_string(), } ) } @@ -859,7 +855,6 @@ pub mod testing { InternalAddress::PoS => {} InternalAddress::PosSlashPool => {} InternalAddress::Governance => {} - InternalAddress::SlashFund => {} InternalAddress::Parameters => {} InternalAddress::Ibc => {} InternalAddress::IbcToken(_) => {} @@ -867,6 +862,7 @@ pub mod testing { InternalAddress::EthBridgePool => {} InternalAddress::Erc20(_) => {} InternalAddress::ReplayProtection => {} + InternalAddress::Pgf => {} InternalAddress::Multitoken => {} /* Add new addresses in the * `prop_oneof` below. */ }; @@ -877,12 +873,12 @@ pub mod testing { Just(InternalAddress::Parameters), arb_ibc_token(), Just(InternalAddress::Governance), - Just(InternalAddress::SlashFund), Just(InternalAddress::EthBridge), Just(InternalAddress::EthBridgePool), Just(arb_erc20()), Just(InternalAddress::ReplayProtection), Just(InternalAddress::Multitoken), + Just(InternalAddress::Pgf), ] } diff --git a/core/src/types/dec.rs b/core/src/types/dec.rs index fdff5dc6201..48589a1c32a 100644 --- a/core/src/types/dec.rs +++ b/core/src/types/dec.rs @@ -410,7 +410,8 @@ impl Display for Dec { str_pre.push_str(string.as_str()); string = str_pre; }; - let stripped_string = string.trim_end_matches(['.', '0']); + let stripped_string = string.trim_end_matches('0'); + let stripped_string = stripped_string.trim_end_matches('.'); if stripped_string.is_empty() { f.write_str("0") } else if is_neg { @@ -620,4 +621,11 @@ mod test_dec { let larger = Dec::from_str("32418116583.390243854642").unwrap(); assert!(smaller < larger); } + + #[test] + fn test_dec_display() { + let num = Dec::from_str("14000.0000").unwrap(); + let s = format!("{}", num); + assert_eq!(s, String::from("14000")); + } } diff --git a/core/src/types/governance.rs b/core/src/types/governance.rs deleted file mode 100644 index d3450dccd1c..00000000000 --- a/core/src/types/governance.rs +++ /dev/null @@ -1,384 +0,0 @@ -//! Files defyining the types used in governance. - -use std::collections::{BTreeMap, HashSet}; -use std::fmt::{self, Display}; - -use borsh::{BorshDeserialize, BorshSerialize}; -use serde::{Deserialize, Serialize}; -use thiserror::Error; - -use crate::types::address::Address; -use crate::types::hash::Hash; -use crate::types::key::common::{self, Signature}; -use crate::types::key::SigScheme; -use crate::types::storage::Epoch; -use crate::types::token::{ - Amount, DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES, -}; -use crate::types::uint::Uint; - -/// Type alias for vote power -pub type VotePower = Uint; - -/// A PGF cocuncil composed of the address and spending cap -pub type Council = (Address, Amount); - -/// The type of a governance vote with the optional associated Memo -#[derive( - Debug, - Clone, - PartialEq, - BorshSerialize, - BorshDeserialize, - Serialize, - Deserialize, - Eq, -)] -pub enum VoteType { - /// A default vote without Memo - Default, - /// A vote for the PGF council - PGFCouncil(HashSet), - /// A vote for ETH bridge carrying the signature over the proposed message - ETHBridge(Signature), -} - -#[derive( - Debug, - Clone, - PartialEq, - BorshSerialize, - BorshDeserialize, - Serialize, - Deserialize, - Eq, -)] -/// The vote for a proposal -pub enum ProposalVote { - /// Yes - Yay(VoteType), - /// No - Nay, -} - -impl ProposalVote { - /// Check if a vote is yay - pub fn is_yay(&self) -> bool { - matches!(self, ProposalVote::Yay(_)) - } - - /// Check if vote is of type default - pub fn is_default_vote(&self) -> bool { - matches!( - self, - ProposalVote::Yay(VoteType::Default) | ProposalVote::Nay - ) - } -} - -impl Display for ProposalVote { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - ProposalVote::Yay(vote_type) => match vote_type { - VoteType::Default => write!(f, "yay"), - VoteType::PGFCouncil(councils) => { - writeln!(f, "yay with councils:")?; - for (address, spending_cap) in councils { - writeln!( - f, - "Council: {}, spending cap: {}", - address, - spending_cap.to_string_native() - )? - } - - Ok(()) - } - VoteType::ETHBridge(sig) => { - write!(f, "yay with signature: {:#?}", sig) - } - }, - - ProposalVote::Nay => write!(f, "nay"), - } - } -} - -#[allow(missing_docs)] -#[derive(Debug, Error)] -pub enum ProposalVoteParseError { - #[error("Invalid vote. Vote shall be yay or nay.")] - InvalidVote, -} - -/// The type of the tally -#[derive(Clone, Debug)] -pub enum Tally { - /// Default proposal - Default, - /// PGF proposal - PGFCouncil(Council), - /// ETH Bridge proposal - ETHBridge, -} - -/// The result of a proposal -#[derive(Clone, Debug)] -pub enum TallyResult { - /// Proposal was accepted with the associated value - Passed(Tally), - /// Proposal was rejected - Rejected, -} - -/// The result with votes of a proposal -pub struct ProposalResult { - /// The result of a proposal - pub result: TallyResult, - /// The total voting power during the proposal tally - pub total_voting_power: VotePower, - /// The total voting power from yay votes - pub total_yay_power: VotePower, - /// The total voting power from nay votes (unused at the moment) - pub total_nay_power: VotePower, -} - -impl Display for ProposalResult { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let percentage = DenominatedAmount { - amount: Amount::from_uint( - self.total_yay_power - .fixed_precision_div(&self.total_voting_power, 4) - .unwrap_or_default(), - 0, - ) - .unwrap(), - denom: 2.into(), - }; - - write!( - f, - "{} with {} yay votes over {} ({}%)", - self.result, - DenominatedAmount { - amount: Amount::from_uint(self.total_yay_power, 0).unwrap(), - denom: NATIVE_MAX_DECIMAL_PLACES.into() - }, - DenominatedAmount { - amount: Amount::from_uint(self.total_voting_power, 0).unwrap(), - denom: NATIVE_MAX_DECIMAL_PLACES.into() - }, - percentage - ) - } -} - -impl Display for TallyResult { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - TallyResult::Passed(vote) => match vote { - Tally::Default | Tally::ETHBridge => write!(f, "passed"), - Tally::PGFCouncil((council, cap)) => write!( - f, - "passed with PGF council address: {}, spending cap: {}", - council, - cap.to_string_native() - ), - }, - TallyResult::Rejected => write!(f, "rejected"), - } - } -} - -/// The type of a governance proposal -#[derive( - Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, -)] -pub enum ProposalType { - /// A default proposal with the optional path to wasm code - Default(Option), - /// A PGF council proposal - PGFCouncil, - /// An ETH bridge proposal - ETHBridge, -} - -#[derive( - Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, -)] -/// The proposal structure -pub struct Proposal { - /// The proposal id - pub id: Option, - /// The proposal content - pub content: BTreeMap, - /// The proposal author address - pub author: Address, - /// The proposal type - pub r#type: ProposalType, - /// The epoch from which voting is allowed - pub voting_start_epoch: Epoch, - /// The epoch from which voting is stopped - pub voting_end_epoch: Epoch, - /// The epoch from which this changes are executed - pub grace_epoch: Epoch, -} - -impl Display for Proposal { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "id: {:?}, author: {:?}", self.id, self.author) - } -} - -#[allow(missing_docs)] -#[derive(Debug, Error)] -pub enum ProposalError { - #[error("Invalid proposal data.")] - InvalidProposalData, -} - -#[derive( - Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, -)] -/// The offline proposal structure -pub struct OfflineProposal { - /// The proposal content - pub content: BTreeMap, - /// The proposal author address - pub author: Address, - /// The epoch from which this changes are executed - pub tally_epoch: Epoch, - /// The signature over proposal data - pub signature: Signature, - /// The address corresponding to the signature pk - pub address: Address, -} - -impl OfflineProposal { - /// Create an offline proposal with a signature - pub fn new( - proposal: Proposal, - address: Address, - signing_key: &common::SecretKey, - ) -> Self { - let content_serialized = serde_json::to_vec(&proposal.content) - .expect("Conversion to bytes shouldn't fail."); - let author_serialized = serde_json::to_vec(&proposal.author) - .expect("Conversion to bytes shouldn't fail."); - let tally_epoch_serialized = serde_json::to_vec(&proposal.grace_epoch) - .expect("Conversion to bytes shouldn't fail."); - let proposal_serialized = &[ - content_serialized, - author_serialized, - tally_epoch_serialized, - ] - .concat(); - let proposal_data_hash = Hash::sha256(proposal_serialized); - let signature = - common::SigScheme::sign(signing_key, proposal_data_hash); - Self { - content: proposal.content, - author: proposal.author, - tally_epoch: proposal.grace_epoch, - signature, - address, - } - } - - /// Check whether the signature is valid or not - pub fn check_signature(&self, public_key: &common::PublicKey) -> bool { - let proposal_data_hash = self.compute_hash(); - common::SigScheme::verify_signature( - public_key, - &proposal_data_hash, - &self.signature, - ) - .is_ok() - } - - /// Compute the hash of the proposal - pub fn compute_hash(&self) -> Hash { - let content_serialized = serde_json::to_vec(&self.content) - .expect("Conversion to bytes shouldn't fail."); - let author_serialized = serde_json::to_vec(&self.author) - .expect("Conversion to bytes shouldn't fail."); - let tally_epoch_serialized = serde_json::to_vec(&self.tally_epoch) - .expect("Conversion to bytes shouldn't fail."); - let proposal_serialized = &[ - content_serialized, - author_serialized, - tally_epoch_serialized, - ] - .concat(); - Hash::sha256(proposal_serialized) - } -} - -#[derive( - Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, -)] -/// The offline proposal structure -pub struct OfflineVote { - /// The proposal data hash - pub proposal_hash: Hash, - /// The proposal vote - pub vote: ProposalVote, - /// The signature over proposal data - pub signature: Signature, - /// The address corresponding to the signature pk - pub address: Address, -} - -impl OfflineVote { - /// Create an offline vote for a proposal - pub fn new( - proposal: &OfflineProposal, - vote: ProposalVote, - address: Address, - signing_key: &common::SecretKey, - ) -> Self { - let proposal_hash = proposal.compute_hash(); - let proposal_hash_data = proposal_hash - .try_to_vec() - .expect("Conversion to bytes shouldn't fail."); - let proposal_vote_data = vote - .try_to_vec() - .expect("Conversion to bytes shouldn't fail."); - let vote_serialized = - &[proposal_hash_data, proposal_vote_data].concat(); - let signature = common::SigScheme::sign(signing_key, vote_serialized); - Self { - proposal_hash, - vote, - signature, - address, - } - } - - /// compute the hash of a proposal - pub fn compute_hash(&self) -> Hash { - let proposal_hash_data = self - .proposal_hash - .try_to_vec() - .expect("Conversion to bytes shouldn't fail."); - let proposal_vote_data = self - .vote - .try_to_vec() - .expect("Conversion to bytes shouldn't fail."); - let vote_serialized = - &[proposal_hash_data, proposal_vote_data].concat(); - - Hash::sha256(vote_serialized) - } - - /// Check whether the signature is valid or not - pub fn check_signature(&self, public_key: &common::PublicKey) -> bool { - let vote_data_hash = self.compute_hash(); - common::SigScheme::verify_signature( - public_key, - &vote_data_hash, - &self.signature, - ) - .is_ok() - } -} diff --git a/core/src/types/ibc.rs b/core/src/types/ibc.rs index 5e7514aea3d..7a412ecb054 100644 --- a/core/src/types/ibc.rs +++ b/core/src/types/ibc.rs @@ -52,7 +52,9 @@ mod ibc_rs_conversion { use thiserror::Error; use super::IbcEvent; - use crate::ibc::events::{Error as IbcEventError, IbcEvent as RawIbcEvent}; + use crate::ibc::core::events::{ + Error as IbcEventError, IbcEvent as RawIbcEvent, + }; use crate::tendermint_proto::abci::Event as AbciEvent; #[allow(missing_docs)] @@ -69,7 +71,7 @@ mod ibc_rs_conversion { type Error = Error; fn try_from(e: RawIbcEvent) -> Result { - let event_type = e.event_type().as_str().to_string(); + let event_type = e.event_type().to_string(); let abci_event = AbciEvent::try_from(e).map_err(Error::IbcEvent)?; let attributes: HashMap<_, _> = abci_event .attributes diff --git a/core/src/types/key/mod.rs b/core/src/types/key/mod.rs index 8c59262f72e..685e3464f7d 100644 --- a/core/src/types/key/mod.rs +++ b/core/src/types/key/mod.rs @@ -12,6 +12,8 @@ use std::str::FromStr; use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; use data_encoding::HEXUPPER; +use lazy_map::LazyMap; +use namada_macros::StorageKeys; #[cfg(feature = "rand")] use rand::{CryptoRng, RngCore}; use serde::Serialize; @@ -19,25 +21,45 @@ use sha2::{Digest, Sha256}; use thiserror::Error; use super::address::Address; -use super::storage::{self, DbKeySeg, Key, KeySeg}; +use super::storage::{self, DbKeySeg, Key}; use crate::ledger::storage::{Sha256Hasher, StorageHasher}; +use crate::ledger::storage_api::collections::{lazy_map, LazyCollection}; use crate::types::address; -const PK_STORAGE_KEY: &str = "public_key"; -const PROTOCOL_PK_STORAGE_KEY: &str = "protocol_public_key"; +/// Storage keys for account. +#[derive(StorageKeys)] +struct Keys { + public_keys: &'static str, + threshold: &'static str, + protocol_public_keys: &'static str, +} /// Obtain a storage key for user's public key. -pub fn pk_key(owner: &Address) -> storage::Key { - Key::from(owner.to_db_key()) - .push(&PK_STORAGE_KEY.to_owned()) - .expect("Cannot obtain a storage key") +pub fn pks_key_prefix(owner: &Address) -> storage::Key { + Key { + segments: vec![ + DbKeySeg::AddressSeg(owner.to_owned()), + DbKeySeg::StringSeg(Keys::VALUES.public_keys.to_string()), + ], + } +} + +/// Object that LazyMap handler for the user's public key subspace +pub fn pks_handle(owner: &Address) -> LazyMap { + LazyMap::open(pks_key_prefix(owner)) } /// Check if the given storage key is a public key. If it is, returns the owner. -pub fn is_pk_key(key: &Key) -> Option<&Address> { +pub fn is_pks_key(key: &Key) -> Option<&Address> { match &key.segments[..] { - [DbKeySeg::AddressSeg(owner), DbKeySeg::StringSeg(key)] - if key == PK_STORAGE_KEY => + [ + DbKeySeg::AddressSeg(owner), + DbKeySeg::StringSeg(prefix), + DbKeySeg::StringSeg(data), + DbKeySeg::StringSeg(index), + ] if prefix.as_str() == Keys::VALUES.public_keys + && data.as_str() == lazy_map::DATA_SUBKEY + && index.parse::().is_ok() => { Some(owner) } @@ -45,18 +67,43 @@ pub fn is_pk_key(key: &Key) -> Option<&Address> { } } +/// Check if the given storage key is a threshol key. +pub fn is_threshold_key(key: &Key) -> Option<&Address> { + match &key.segments[..] { + [DbKeySeg::AddressSeg(owner), DbKeySeg::StringSeg(prefix)] + if prefix.as_str() == Keys::VALUES.threshold => + { + Some(owner) + } + _ => None, + } +} + +/// Obtain the storage key for a user threshold +pub fn threshold_key(owner: &Address) -> storage::Key { + Key { + segments: vec![ + DbKeySeg::AddressSeg(owner.to_owned()), + DbKeySeg::StringSeg(Keys::VALUES.threshold.to_string()), + ], + } +} + /// Obtain a storage key for user's protocol public key. pub fn protocol_pk_key(owner: &Address) -> storage::Key { - Key::from(owner.to_db_key()) - .push(&PROTOCOL_PK_STORAGE_KEY.to_owned()) - .expect("Cannot obtain a storage key") + Key { + segments: vec![ + DbKeySeg::AddressSeg(owner.to_owned()), + DbKeySeg::StringSeg(Keys::VALUES.protocol_public_keys.to_string()), + ], + } } /// Check if the given storage key is a public key. If it is, returns the owner. pub fn is_protocol_pk_key(key: &Key) -> Option<&Address> { match &key.segments[..] { [DbKeySeg::AddressSeg(owner), DbKeySeg::StringSeg(key)] - if key == PROTOCOL_PK_STORAGE_KEY => + if key.as_str() == Keys::VALUES.protocol_public_keys => { Some(owner) } diff --git a/core/src/types/mod.rs b/core/src/types/mod.rs index c35b3142969..8aee038d9b1 100644 --- a/core/src/types/mod.rs +++ b/core/src/types/mod.rs @@ -1,5 +1,6 @@ //! Types definitions. +pub mod account; pub mod address; pub mod chain; pub mod dec; @@ -7,7 +8,6 @@ pub mod eth_abi; pub mod eth_bridge_pool; pub mod ethereum_events; pub mod ethereum_structs; -pub mod governance; pub mod hash; pub mod ibc; pub mod internal; diff --git a/core/src/types/token.rs b/core/src/types/token.rs index bf4e23cbe3c..6056495cd1c 100644 --- a/core/src/types/token.rs +++ b/core/src/types/token.rs @@ -76,6 +76,11 @@ impl Amount { self.raw = self.raw.checked_sub(amount.raw).unwrap(); } + /// Check if there are enough funds. + pub fn can_spend(&self, amount: &Amount) -> bool { + self.raw >= amount.raw + } + /// Receive a given amount. /// Panics on overflow and when [`uint::MAX_SIGNED_VALUE`] is exceeded. pub fn receive(&mut self, amount: &Amount) { @@ -154,6 +159,20 @@ impl Amount { Self { raw: change.abs() } } + /// Checked division. Returns `None` on underflow. + pub fn checked_div(&self, amount: Amount) -> Option { + self.raw + .checked_div(amount.raw) + .map(|result| Self { raw: result }) + } + + /// Checked division. Returns `None` on overflow. + pub fn checked_mul(&self, amount: Amount) -> Option { + self.raw + .checked_mul(amount.raw) + .map(|result| Self { raw: result }) + } + /// Given a string and a denomination, parse an amount from string. pub fn from_str( string: impl AsRef, diff --git a/core/src/types/transaction/account.rs b/core/src/types/transaction/account.rs new file mode 100644 index 00000000000..f2eaafe7ef9 --- /dev/null +++ b/core/src/types/transaction/account.rs @@ -0,0 +1,52 @@ +use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; +use serde::{Deserialize, Serialize}; + +use crate::types::address::Address; +use crate::types::hash::Hash; +use crate::types::key::common; + +/// A tx data type to initialize a new established account +#[derive( + Debug, + Clone, + PartialEq, + BorshSerialize, + BorshDeserialize, + BorshSchema, + Serialize, + Deserialize, +)] +pub struct InitAccount { + /// Public keys to be written into the account's storage. This can be used + /// for signature verification of transactions for the newly created + /// account. + pub public_keys: Vec, + /// The VP code hash + pub vp_code_hash: Hash, + /// The account signature threshold + pub threshold: u8, +} + +/// A tx data type to update an account's validity predicate +#[derive( + Debug, + Clone, + PartialEq, + BorshSerialize, + BorshDeserialize, + BorshSchema, + Serialize, + Deserialize, +)] +pub struct UpdateAccount { + /// An address of the account + pub addr: Address, + /// The new VP code hash + pub vp_code_hash: Option, + /// Public keys to be written into the account's storage. This can be used + /// for signature verification of transactions for the newly created + /// account. + pub public_keys: Vec, + /// The account signature threshold + pub threshold: Option, +} diff --git a/core/src/types/transaction/governance.rs b/core/src/types/transaction/governance.rs index bfc17eeaefd..0d653c44cf0 100644 --- a/core/src/types/transaction/governance.rs +++ b/core/src/types/transaction/governance.rs @@ -1,86 +1,25 @@ -use std::fmt::Display; +use std::collections::HashSet; use borsh::{BorshDeserialize, BorshSerialize}; use serde::{Deserialize, Serialize}; +use thiserror::Error; -use crate::types::address::Address; -use crate::types::governance::{ - self, Proposal, ProposalError, ProposalVote, VoteType, +use crate::ledger::governance::cli::onchain::{ + DefaultProposal, PgfFundingProposal, PgfStewardProposal, +}; +use crate::ledger::governance::storage::proposal::{ + AddRemove, PGFAction, ProposalType, }; +use crate::ledger::governance::storage::vote::StorageProposalVote; +use crate::types::address::Address; use crate::types::hash::Hash; use crate::types::storage::Epoch; -/// The type of a Proposal -#[derive( - Debug, - Clone, - PartialEq, - BorshSerialize, - BorshDeserialize, - Serialize, - Deserialize, -)] -pub enum ProposalType { - /// Default governance proposal with the optional wasm code - Default(Option), - /// PGF council proposal - PGFCouncil, - /// ETH proposal - ETHBridge, -} - -impl Display for ProposalType { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - match self { - ProposalType::Default(_) => write!(f, "Default"), - ProposalType::PGFCouncil => write!(f, "PGF Council"), - ProposalType::ETHBridge => write!(f, "ETH Bridge"), - } - } -} - -impl PartialEq for ProposalType { - fn eq(&self, other: &VoteType) -> bool { - match self { - Self::Default(_) => { - matches!(other, VoteType::Default) - } - Self::PGFCouncil => { - matches!(other, VoteType::PGFCouncil(..)) - } - Self::ETHBridge => { - matches!(other, VoteType::ETHBridge(_)) - } - } - } -} - -impl TryFrom for (ProposalType, Option>) { - type Error = ProposalError; - - fn try_from(value: governance::ProposalType) -> Result { - match value { - governance::ProposalType::Default(path) => { - if let Some(p) = path { - match std::fs::read(p) { - Ok(code) => Ok(( - ProposalType::Default(Some(Hash::default())), - Some(code), - )), - Err(_) => Err(Self::Error::InvalidProposalData), - } - } else { - Ok((ProposalType::Default(None), None)) - } - } - governance::ProposalType::PGFCouncil => { - Ok((ProposalType::PGFCouncil, None)) - } - governance::ProposalType::ETHBridge => { - Ok((ProposalType::ETHBridge, None)) - } - } - } +#[allow(missing_docs)] +#[derive(Debug, Error)] +pub enum ProposalError { + #[error("Invalid proposal data.")] + InvalidProposalData, } /// A tx data type to hold proposal data @@ -110,6 +49,16 @@ pub struct InitProposalData { pub grace_epoch: Epoch, } +impl InitProposalData { + /// Get the hash of the corresponding extra data section + pub fn get_section_code_hash(&self) -> Option { + match self.r#type { + ProposalType::Default(hash) => hash, + _ => None, + } + } +} + /// A tx data type to hold vote proposal data #[derive( Debug, @@ -124,30 +73,82 @@ pub struct VoteProposalData { /// The proposal id pub id: u64, /// The proposal vote - pub vote: ProposalVote, + pub vote: StorageProposalVote, /// The proposal author address pub voter: Address, /// Delegator addreses pub delegations: Vec
, } -impl TryFrom for (InitProposalData, Vec, Option>) { +impl TryFrom for InitProposalData { + type Error = ProposalError; + + fn try_from(value: DefaultProposal) -> Result { + Ok(InitProposalData { + id: value.proposal.id, + content: Hash::default(), + author: value.proposal.author, + r#type: ProposalType::Default(None), + voting_start_epoch: value.proposal.voting_start_epoch, + voting_end_epoch: value.proposal.voting_end_epoch, + grace_epoch: value.proposal.grace_epoch, + }) + } +} + +impl TryFrom for InitProposalData { type Error = ProposalError; - fn try_from(proposal: Proposal) -> Result { - let (r#type, code) = proposal.r#type.try_into()?; - Ok(( - InitProposalData { - id: proposal.id, - content: Hash::default(), - author: proposal.author, - r#type, - voting_start_epoch: proposal.voting_start_epoch, - voting_end_epoch: proposal.voting_end_epoch, - grace_epoch: proposal.grace_epoch, - }, - proposal.content.try_to_vec().unwrap(), - code, - )) + fn try_from(value: PgfStewardProposal) -> Result { + let extra_data = value + .data + .iter() + .cloned() + .map(|steward| AddRemove::
::try_from(steward).unwrap()) + .collect::>>(); + + Ok(InitProposalData { + id: value.proposal.id, + content: Hash::default(), + author: value.proposal.author, + r#type: ProposalType::PGFSteward(extra_data), + voting_start_epoch: value.proposal.voting_start_epoch, + voting_end_epoch: value.proposal.voting_end_epoch, + grace_epoch: value.proposal.grace_epoch, + }) + } +} + +impl TryFrom for InitProposalData { + type Error = ProposalError; + + fn try_from(value: PgfFundingProposal) -> Result { + let continous_fundings = value + .data + .continous + .iter() + .cloned() + .map(|funding| PGFAction::try_from(funding).unwrap()) + .collect::>(); + + let retro_fundings = value + .data + .retro + .iter() + .cloned() + .map(|funding| PGFAction::try_from(funding).unwrap()) + .collect::>(); + + let extra_data = [continous_fundings, retro_fundings].concat(); + + Ok(InitProposalData { + id: value.proposal.id, + content: Hash::default(), + author: value.proposal.author, + r#type: ProposalType::PGFPayment(extra_data), + voting_start_epoch: value.proposal.voting_start_epoch, + voting_end_epoch: value.proposal.voting_end_epoch, + grace_epoch: value.proposal.grace_epoch, + }) } } diff --git a/core/src/types/transaction/mod.rs b/core/src/types/transaction/mod.rs index c6cc23dffa6..112bc5de4b7 100644 --- a/core/src/types/transaction/mod.rs +++ b/core/src/types/transaction/mod.rs @@ -1,5 +1,7 @@ //! Types that are used in transactions. +/// txs to manage accounts +pub mod account; /// txs that contain decrypted payloads or assertions of /// non-decryptability pub mod decrypted; @@ -7,6 +9,7 @@ pub mod decrypted; pub mod encrypted; /// txs to manage governance pub mod governance; +/// txs to manage pos pub mod pos; /// transaction protocols made by validators pub mod protocol; @@ -27,10 +30,8 @@ pub use wrapper::*; use crate::ledger::gas::VpsGas; use crate::types::address::Address; -use crate::types::dec::Dec; use crate::types::hash::Hash; use crate::types::ibc::IbcEvent; -use crate::types::key::*; use crate::types::storage; #[cfg(feature = "ferveo-tpke")] use crate::types::transaction::protocol::ProtocolTx; @@ -131,80 +132,6 @@ fn iterable_to_string( } } -/// A tx data type to update an account's validity predicate -#[derive( - Debug, - Clone, - PartialEq, - BorshSerialize, - BorshDeserialize, - BorshSchema, - Serialize, - Deserialize, -)] -pub struct UpdateVp { - /// An address of the account - pub addr: Address, - /// The new VP code hash - pub vp_code_hash: Hash, -} - -/// A tx data type to initialize a new established account -#[derive( - Debug, - Clone, - PartialEq, - BorshSerialize, - BorshDeserialize, - BorshSchema, - Serialize, - Deserialize, -)] -pub struct InitAccount { - /// Public key to be written into the account's storage. This can be used - /// for signature verification of transactions for the newly created - /// account. - pub public_key: common::PublicKey, - /// The VP code hash - pub vp_code_hash: Hash, -} - -/// A tx data type to initialize a new validator account. -#[derive( - Debug, - Clone, - PartialEq, - BorshSerialize, - BorshDeserialize, - BorshSchema, - Serialize, - Deserialize, -)] -pub struct InitValidator { - /// Public key to be written into the account's storage. This can be used - /// for signature verification of transactions for the newly created - /// account. - pub account_key: common::PublicKey, - /// A key to be used for signing blocks and votes on blocks. - pub consensus_key: common::PublicKey, - /// An Eth bridge governance public key - pub eth_cold_key: secp256k1::PublicKey, - /// An Eth bridge hot signing public key used for validator set updates and - /// cross-chain transactions - pub eth_hot_key: secp256k1::PublicKey, - /// Public key used to sign protocol transactions - pub protocol_key: common::PublicKey, - /// Serialization of the public session key used in the DKG - pub dkg_key: crate::types::key::dkg_session_keys::DkgPublicKey, - /// The initial commission rate charged for delegation rewards - pub commission_rate: Dec, - /// The maximum change allowed per epoch to the commission rate. This is - /// immutable once set here. - pub max_commission_rate_change: Dec, - /// The VP code for validator account - pub validator_vp_code_hash: Hash, -} - /// Struct that classifies that kind of Tx /// based on the contents of its data. #[derive( @@ -241,6 +168,7 @@ mod test_process_tx { use super::*; use crate::proto::{Code, Data, Section, Signature, Tx, TxError}; use crate::types::address::nam; + use crate::types::key::*; use crate::types::storage::Epoch; use crate::types::token::Amount; @@ -256,7 +184,7 @@ mod test_process_tx { /// data and returns an identical copy #[test] fn test_process_tx_raw_tx_no_data() { - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); let code_sec = outer_tx .set_code(Code::new("wasm code".as_bytes().to_owned())) .clone(); @@ -274,7 +202,7 @@ mod test_process_tx { /// of the inner data #[test] fn test_process_tx_raw_tx_some_data() { - let mut tx = Tx::new(TxType::Raw); + let mut tx = Tx::from_type(TxType::Raw); let code_sec = tx .set_code(Code::new("wasm code".as_bytes().to_owned())) .clone(); @@ -296,7 +224,7 @@ mod test_process_tx { /// signed data and returns an identical copy of the inner data #[test] fn test_process_tx_raw_tx_some_signed_data() { - let mut tx = Tx::new(TxType::Raw); + let mut tx = Tx::from_type(TxType::Raw); let code_sec = tx .set_code(Code::new("wasm code".as_bytes().to_owned())) .clone(); @@ -324,7 +252,7 @@ mod test_process_tx { fn test_process_tx_wrapper_tx() { let keypair = gen_keypair(); // the signed tx - let mut tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + let mut tx = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: Amount::from_uint(10, 0).expect("Test failed"), token: nam(), @@ -359,7 +287,7 @@ mod test_process_tx { fn test_process_tx_wrapper_tx_unsigned() { let keypair = gen_keypair(); // the signed tx - let mut tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + let mut tx = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: Amount::from_uint(10, 0).expect("Test failed"), token: nam(), @@ -382,7 +310,7 @@ mod test_process_tx { #[test] fn test_process_tx_decrypted_unsigned() { use crate::proto::{Code, Data, Tx}; - let mut tx = Tx::new(TxType::Decrypted(DecryptedTx::Decrypted { + let mut tx = Tx::from_type(TxType::Decrypted(DecryptedTx::Decrypted { #[cfg(not(feature = "mainnet"))] has_valid_pow: false, })); @@ -411,6 +339,8 @@ fn test_process_tx_decrypted_unsigned() { #[test] fn test_process_tx_decrypted_signed() { use crate::proto::{Code, Data, Section, Signature, Tx}; + use crate::types::key::*; + fn gen_keypair() -> common::SecretKey { use rand::prelude::ThreadRng; use rand::thread_rng; @@ -420,10 +350,11 @@ fn test_process_tx_decrypted_signed() { } use crate::types::key::Signature as S; - let mut decrypted = Tx::new(TxType::Decrypted(DecryptedTx::Decrypted { - #[cfg(not(feature = "mainnet"))] - has_valid_pow: false, - })); + let mut decrypted = + Tx::from_type(TxType::Decrypted(DecryptedTx::Decrypted { + #[cfg(not(feature = "mainnet"))] + has_valid_pow: false, + })); // Invalid signed data let ed_sig = ed25519::Signature::try_from_slice([0u8; 64].as_ref()).unwrap(); diff --git a/core/src/types/transaction/pos.rs b/core/src/types/transaction/pos.rs index d334047ffe5..fa0e3d08915 100644 --- a/core/src/types/transaction/pos.rs +++ b/core/src/types/transaction/pos.rs @@ -5,8 +5,48 @@ use serde::{Deserialize, Serialize}; use crate::types::address::Address; use crate::types::dec::Dec; +use crate::types::hash::Hash; +use crate::types::key::{common, secp256k1}; use crate::types::token; +/// A tx data type to initialize a new validator account. +#[derive( + Debug, + Clone, + PartialEq, + BorshSerialize, + BorshDeserialize, + BorshSchema, + Serialize, + Deserialize, +)] +pub struct InitValidator { + /// Public key to be written into the account's storage. This can be used + /// for signature verification of transactions for the newly created + /// account. + pub account_keys: Vec, + /// The minimum number of signatures needed + pub threshold: u8, + /// A key to be used for signing blocks and votes on blocks. + pub consensus_key: common::PublicKey, + /// An Eth bridge governance public key + pub eth_cold_key: secp256k1::PublicKey, + /// An Eth bridge hot signing public key used for validator set updates and + /// cross-chain transactions + pub eth_hot_key: secp256k1::PublicKey, + /// Public key used to sign protocol transactions + pub protocol_key: common::PublicKey, + /// Serialization of the public session key used in the DKG + pub dkg_key: crate::types::key::dkg_session_keys::DkgPublicKey, + /// The initial commission rate charged for delegation rewards + pub commission_rate: Dec, + /// The maximum change allowed per epoch to the commission rate. This is + /// immutable once set here. + pub max_commission_rate_change: Dec, + /// The VP code for validator account + pub validator_vp_code_hash: Hash, +} + /// A bond is a validator's self-bond or a delegation from non-validator to a /// validator. #[derive( diff --git a/core/src/types/transaction/protocol.rs b/core/src/types/transaction/protocol.rs index d546168bf45..aa9abe8cec8 100644 --- a/core/src/types/transaction/protocol.rs +++ b/core/src/types/transaction/protocol.rs @@ -193,7 +193,7 @@ mod protocol_txs { ) -> Tx { let (tx_data, tx_type) = self.serialize(); let mut outer_tx = - Tx::new(TxType::Protocol(Box::new(ProtocolTx { + Tx::from_type(TxType::Protocol(Box::new(ProtocolTx { pk: signing_key.ref_to(), tx: tx_type, }))); @@ -323,7 +323,7 @@ mod protocol_txs { TX_NEW_DKG_KP_WASM, ); let mut outer_tx = - Tx::new(TxType::Protocol(Box::new(ProtocolTx { + Tx::from_type(TxType::Protocol(Box::new(ProtocolTx { pk: signing_key.ref_to(), tx: Self::NewDkgKeypair, }))); diff --git a/core/src/types/transaction/wrapper.rs b/core/src/types/transaction/wrapper.rs index 403641a0b63..321435687b8 100644 --- a/core/src/types/transaction/wrapper.rs +++ b/core/src/types/transaction/wrapper.rs @@ -13,6 +13,7 @@ pub mod wrapper_tx { use sha2::{Digest, Sha256}; use thiserror::Error; + use crate::ledger::testnet_pow; use crate::types::address::Address; use crate::types::key::*; use crate::types::storage::Epoch; @@ -240,7 +241,7 @@ pub mod wrapper_tx { epoch: Epoch, gas_limit: GasLimit, #[cfg(not(feature = "mainnet"))] pow_solution: Option< - crate::ledger::testnet_pow::Solution, + testnet_pow::Solution, >, ) -> WrapperTx { Self { @@ -255,7 +256,7 @@ pub mod wrapper_tx { /// Get the address of the implicit account associated /// with the public key - pub fn fee_payer(&self) -> Address { + pub fn gas_payer(&self) -> Address { Address::from(&self.pk) } @@ -370,7 +371,7 @@ pub mod wrapper_tx { fn test_encryption_round_trip() { let keypair = gen_keypair(); let mut wrapper = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: Amount::from_uint(10, 0).expect("Test failed"), token: nam(), @@ -403,7 +404,7 @@ pub mod wrapper_tx { fn test_decryption_invalid_hash() { let keypair = gen_keypair(); let mut wrapper = - Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { amount: Amount::from_uint(10, 0).expect("Test failed"), token: nam(), @@ -438,17 +439,18 @@ pub mod wrapper_tx { fn test_malleability_attack_detection() { let keypair = gen_keypair(); // the signed tx - let mut tx = Tx::new(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: Amount::from_uint(10, 0).expect("Test failed"), - token: nam(), - }, - keypair.ref_to(), - Epoch(0), - Default::default(), - #[cfg(not(feature = "mainnet"))] - None, - )))); + let mut tx = + Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( + Fee { + amount: Amount::from_uint(10, 0).expect("Test failed"), + token: nam(), + }, + keypair.ref_to(), + Epoch(0), + Default::default(), + #[cfg(not(feature = "mainnet"))] + None, + )))); tx.set_code(Code::new("wasm code".as_bytes().to_owned())); tx.set_data(Data::new("transaction data".as_bytes().to_owned())); diff --git a/documentation/dev/src/explore/design/ledger/governance.md b/documentation/dev/src/explore/design/ledger/governance.md index d9e578eed5f..a7215c79b20 100644 --- a/documentation/dev/src/explore/design/ledger/governance.md +++ b/documentation/dev/src/explore/design/ledger/governance.md @@ -13,7 +13,7 @@ Also, it introduces some protocol parameters: - `min_proposal_fund` - `max_proposal_code_size` -- `min_proposal_period` +- `min_proposal_voting_period` - `max_proposal_period` - `max_proposal_content_size` - `min_proposal_grace_epochs` @@ -26,7 +26,7 @@ On-chain proposals are created under the `governance_address` storage space and, /$GovernanceAddress/counter: u64 /$GovernanceAddress/min_proposal_fund: u64 /$GovernanceAddress/max_proposal_code_size: u64 -/$GovernanceAddress/min_proposal_period: u64 +/$GovernanceAddress/min_proposal_voting_period: u64 /$GovernanceAddress/max_proposal_period: u64 /$GovernanceAddress/max_proposal_content_size: u64 /$GovernanceAddress/min_proposal_grace_epochs: u64 @@ -50,11 +50,11 @@ and follow these rules: - `$id` must be equal to `counter + 1`. - `startEpoch` must: - be greater than `currentEpoch`, where current epoch is the epoch in which the transaction is executed and included in a block - - be a multiple of `min_proposal_period`. + - be a multiple of `min_proposal_voting_period`. - `endEpoch` must: - - be at least `min_proposal_period` epochs greater than `startEpoch` + - be at least `min_proposal_voting_period` epochs greater than `startEpoch` - be at most `max_proposal_period` epochs greater than `startEpoch` - - be a multiple of `min_proposal_period` + - be a multiple of `min_proposal_voting_period` - `graceEpoch` must: - be at least `min_grace_epoch` epochs greater than `endEpoch` - `proposalCode` can be empty and must be a valid transaction with size less than `max_proposal_code_size` kibibytes. diff --git a/documentation/dev/src/specs/ledger/default-transactions.md b/documentation/dev/src/specs/ledger/default-transactions.md index fb254f0cd3b..d1e36b923aa 100644 --- a/documentation/dev/src/specs/ledger/default-transactions.md +++ b/documentation/dev/src/specs/ledger/default-transactions.md @@ -28,7 +28,7 @@ Transparently transfer `amount` of fungible `token` from the `source` to the `ta Attach [Transfer](../encoding.md#transfer) to the `data`. -### tx_update_vp +### tx_update_account Update a validity predicate of an established account. diff --git a/encoding_spec/src/main.rs b/encoding_spec/src/main.rs index b9e2b034ef4..5889b03b8dc 100644 --- a/encoding_spec/src/main.rs +++ b/encoding_spec/src/main.rs @@ -70,10 +70,13 @@ fn main() -> Result<(), Box> { let public_key_schema = PublicKey::schema_container(); // TODO update after let signature_schema = Signature::schema_container(); - let init_account_schema = transaction::InitAccount::schema_container(); - let init_validator_schema = transaction::InitValidator::schema_container(); + let init_account_schema = + transaction::account::InitAccount::schema_container(); + let init_validator_schema = + transaction::pos::InitValidator::schema_container(); let token_transfer_schema = token::Transfer::schema_container(); - let update_vp_schema = transaction::UpdateVp::schema_container(); + let update_account = + transaction::account::UpdateAccount::schema_container(); let pos_bond_schema = pos::Bond::schema_container(); let pos_withdraw_schema = pos::Withdraw::schema_container(); let wrapper_tx_schema = transaction::WrapperTx::schema_container(); @@ -98,7 +101,7 @@ fn main() -> Result<(), Box> { definitions.extend(init_account_schema.definitions); definitions.extend(init_validator_schema.definitions); definitions.extend(token_transfer_schema.definitions); - definitions.extend(update_vp_schema.definitions); + definitions.extend(update_account.definitions); definitions.extend(pos_bond_schema.definitions); definitions.extend(pos_withdraw_schema.definitions); definitions.extend(wrapper_tx_schema.definitions); @@ -179,11 +182,11 @@ fn main() -> Result<(), Box> { ).with_rust_doc_link("https://dev.namada.net/master/rustdoc/namada/types/token/struct.Transfer.html"); tables.push(token_transfer_table); - let update_vp_definition = - definitions.remove(&update_vp_schema.declaration).unwrap(); - let update_vp_table = - definition_to_table(update_vp_schema.declaration, update_vp_definition).with_rust_doc_link("https://dev.namada.net/master/rustdoc/namada/types/transaction/struct.UpdateVp.html"); - tables.push(update_vp_table); + let update_account_definition = + definitions.remove(&update_account.declaration).unwrap(); + let update_accoun_table = + definition_to_table(update_account.declaration, update_account_definition).with_rust_doc_link("https://dev.namada.net/master/rustdoc/namada/types/transaction/struct.UpdateVp.html"); + tables.push(update_accoun_table); let pos_bond_definition = definitions.remove(&pos_bond_schema.declaration).unwrap(); diff --git a/genesis/dev.toml b/genesis/dev.toml index 19985a3b9ee..9121bc1a102 100644 --- a/genesis/dev.toml +++ b/genesis/dev.toml @@ -1,148 +1,203 @@ -# Example genesis with dev settings. -genesis_time = "2021-09-30:10:00.00Z" +# Developer network +genesis_time = "2021-12-20T15:00:00.00Z" native_token = "NAM" - -# A genesis validator with alias "validator". -[validator.validator] -# Validator's public key for consensus. -consensus_public_key = "5e704c4e46265e1ccc87505149f79b9d2e414d01a4e3806dfc65f0a73901c1d0" -# Public key of the validator's Namada account. -account_public_key = "5e704c4e46265e1ccc87505149f79b9d2e414d01a4e3806dfc65f0a73901c1d0" -# Address of the validator. -address = "a1qq5qqqqqgfqnsd6pxse5zdj9g5crzsf5x4zyzv6yxerr2d2rxpryzwp5g5m5zvfjxv6ygsekjmraj0" -# Validator's token balance at genesis. -tokens = 200000 -# Amount of the validator's genesis token balance which is not staked. -non_staked_balance = 100000 -# VP for the validator account -validator_vp = "vp_validator" -# Commission rate for rewards -commission_rate = "0.05" -# Maximum change per epoch in the commission rate -max_commission_rate_change = "0.01" -# Public IP:port address -net_address = "127.0.0.1:26656" +faucet_pow_difficulty = 0 +faucet_withdrawal_limit = "1000" # Some tokens present at genesis. [token.NAM] address = "atest1v4ehgw36x3prswzxggunzv6pxqmnvdj9xvcyzvpsggeyvs3cg9qnywf589qnwvfsg5erg3fkl09rg5" -denom = 8 +denom = 6 +vp = "vp_token" [token.NAM.balances] -# In token balances, we can use: -# 1. An address any account -a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000 -atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000 -atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000 -# 2. An alias of any account +Albert = "1000000" +"Albert.public_key" = "100" Bertha = "1000000" -# 3. A public key of a validator or an established account from which the -# address of the implicit account is derived) -"bertha.public_key" = 100 -"validator.public_key" = 100 +"Bertha.public_key" = "2000" +Christel = "1000000" +"Christel.public_key" = "100" +Daewon = "1000000" +Ester = "1000000" +faucet = "922337203685400000000" +"faucet.public_key" = "100" +[token.NAM.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.BTC] address = "atest1v4ehgw36xdzryve5gsc52veeg5cnsv2yx5eygvp38qcrvd29xy6rys6p8yc5xvp4xfpy2v694wgwcp" denom = 8 +vp = "vp_token" [token.BTC.balances] -atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000 -atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000 -atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000 -a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000 +Albert = "1000000" +Bertha = "1000000" +Christel = "1000000" +Daewon = "1000000" +Ester = "1000000" +faucet = "9223372036854" +[token.BTC.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.ETH] address = "atest1v4ehgw36xqmr2d3nx3ryvd2xxgmrq33j8qcns33sxezrgv6zxdzrydjrxveygd2yxumrsdpsf9jc2p" denom = 18 +vp = "vp_token" [token.ETH.balances] -atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000 -atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000 -atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000 -a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000 +Albert = "1000000" +Bertha = "1000000" +Christel = "1000000" +Daewon = "1000000" +Ester = "1000000" +faucet = "9223372036854" +[token.ETH.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.DOT] address = "atest1v4ehgw36gg6nvs2zgfpyxsfjgc65yv6pxy6nwwfsxgungdzrggeyzv35gveyxsjyxymyz335hur2jn" denom = 10 +vp = "vp_token" [token.DOT.balances] -atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000 -atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000 -atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000 -a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000 +Albert = "1000000" +Bertha = "1000000" +Christel = "1000000" +Daewon = "1000000" +Ester = "1000000" +faucet = "9223372036854" +[token.DOT.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" -[token.schnitzel] +[token.Schnitzel] address = "atest1v4ehgw36xue5xvf5xvuyzvpjx5un2v3k8qeyvd3cxdqns32p89rrxd6xx9zngvpegccnzs699rdnnt" denom = 6 -[token.schnitzel.balances] -atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000 -atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000 -atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000 -a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000 +vp = "vp_token" +[token.Schnitzel.balances] +Albert = "1000000" +Bertha = "1000000" +Christel = "1000000" +Daewon = "1000000" +Ester = "1000000" +faucet = "9223372036854" +[token.Schnitzel.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" -[token.apfel] +[token.Apfel] address = "atest1v4ehgw36gfryydj9g3p5zv3kg9znyd358ycnzsfcggc5gvecgc6ygs2rxv6ry3zpg4zrwdfeumqcz9" denom = 6 -[token.apfel.balances] -atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000 -atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000 -atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000 -a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000 +vp = "vp_token" +[token.Apfel.balances] +Albert = "1000000" +Bertha = "1000000" +Christel = "1000000" +Daewon = "1000000" +Ester = "1000000" +faucet = "9223372036854" +[token.Apfel.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" -[token.kartoffel] +[token.Kartoffel] address = "atest1v4ehgw36gep5ysecxq6nyv3jg3zygv3e89qn2vp48pryxsf4xpznvve5gvmy23fs89pryvf5a6ht90" -denom = 6 public_key = "" -[token.kartoffel.balances] -atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000 -atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000 -atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000 -a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000 +denom = 6 +vp = "vp_token" +[token.Kartoffel.balances] +Albert = "1000000" +Bertha = "1000000" +Christel = "1000000" +Daewon = "1000000" +Ester = "1000000" +faucet = "9223372036854" +[token.Kartoffel.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" # Some established accounts present at genesis. +[established.faucet] +vp = "vp_testnet_faucet" -[established.albert] -address = "atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4" -public_key = "a57281e1dd9fd39ec3e8a162a1643ca7c836c0f2dae3bef1412a3a61a2fde1a7" +[established.Albert] vp = "vp_user" -[established.bertha] -address = "atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw" -public_key = "572512a95b190d615b1987f7072572a64951ad50f4f97ef9dbb83545c46ae600" +[established.Bertha] vp = "vp_user" -[established.christel] -address = "atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p" -public_key = "d06f8d4f897f329a50fd23ba5d2503bbe22fab2f14d5f625e07a65f617eb2778" +[established.Christel] vp = "vp_user" -# An implicit account present at genesis. +[established.masp] +address = "atest1v4ehgw36xaryysfsx5unvve4g5my2vjz89p52sjxxgenzd348yuyyv3hg3pnjs35g5unvde4ca36y5" +vp = "vp_masp" + +[implicit.Daewon] -# Daewon (a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz) -[implicit.daewon] -public_key = "2b5b8fda66fb6fc4ef0d86f84b21f250034077effc459fc2403a77a35aa95e3f" +[implicit.Ester] # Wasm VP definitions -# Default user VP +# Wasm VP definitions + +# Implicit VP +[wasm.vp_implicit] +filename = "vp_implicit.wasm" + +# Default user VP in established accounts [wasm.vp_user] -# filename (relative to wasm path used by the node) filename = "vp_user.wasm" -# SHA-256 hash of the wasm file -sha256 = "dc7b97f0448f2369bd2401c3c1d8898f53cac8c464a8c1b1f7f81415a658625d" # Default validator VP [wasm.vp_validator] # filename (relative to wasm path used by the node) filename = "vp_validator.wasm" +# Faucet VP +[wasm.vp_testnet_faucet] +filename = "vp_testnet_faucet.wasm" + +# MASP VP +[wasm.vp_masp] +filename = "vp_masp.wasm" + # General protocol parameters. [parameters] # Minimum number of blocks in an epoch. -min_num_of_blocks = 10 +min_num_of_blocks = 4 # Maximum expected time per block (in seconds). max_expected_time_per_block = 30 -# Expected epochs per year (also sets the minimum duration of an epoch in seconds) -epochs_per_year = 525_600 # Max payload size, in bytes, for a tx batch proposal. max_proposal_bytes = 22020096 +# vp whitelist +vp_whitelist = [] +# tx whitelist +tx_whitelist = [] +# Implicit VP WASM name +implicit_vp = "vp_implicit" +# Expected number of epochs per year (also sets the min duration of an epoch in seconds) +epochs_per_year = 105_120 # 5 minute epochs +# The P gain factor in the Proof of Stake rewards controller +pos_gain_p = "0.1" +# The D gain factor in the Proof of Stake rewards controller +pos_gain_d = "0.1" +# The maximum number of signatures allowed per transaction +max_signatures_per_transaction = 15 # Proof of stake parameters. [pos_params] @@ -153,9 +208,9 @@ max_validator_slots = 128 pipeline_len = 2 # Unbonding length (in epochs). Validators may have their stake slashed # for a fault in epoch 'n' up through epoch 'n + unbonding_len'. -unbonding_len = 21 +unbonding_len = 3 # Votes per fundamental staking token (namnam) -tm_votes_per_token = "1" +tm_votes_per_token = "0.1" # Reward for proposing a block. block_proposer_reward = "0.125" # Reward for voting on a block. @@ -173,18 +228,29 @@ light_client_attack_min_slash_rate = "0.001" # Number of epochs above and below (separately) the current epoch to # consider when doing cubic slashing cubic_slashing_window_length = 1 +# The minimum amount of bonded tokens that a validator needs to be in +# either the `consensus` or `below_capacity` validator sets +validator_stake_threshold = "1" # Governance parameters. [gov_params] -# minimum amount of NAM token to lock +# minimum amount of nam token to lock min_proposal_fund = 500 # proposal code size in bytes -max_proposal_code_size = 300000 -# min proposal period length in epochs -min_proposal_period = 3 +max_proposal_code_size = 500000 +# min proposal voting period length in epochs +min_proposal_voting_period = 3 # max proposal period length in epochs max_proposal_period = 27 # maximum number of characters in the proposal content -max_proposal_content_size = 5000 +max_proposal_content_size = 10000 # minimum epochs between end and grace epoch min_proposal_grace_epochs = 6 + +[pgf_params] +# list of steward address at genezis +stewards = [] +# inflation rate for pgf fundings +pgf_inflation_rate = "0.1" +# inflation rate for pgf stewards +stewards_inflation_rate = "0.01" \ No newline at end of file diff --git a/genesis/e2e-tests-single-node.toml b/genesis/e2e-tests-single-node.toml index 83f02b3c8e2..45df21e09a2 100644 --- a/genesis/e2e-tests-single-node.toml +++ b/genesis/e2e-tests-single-node.toml @@ -4,7 +4,7 @@ genesis_time = "2021-09-30T10:00:00Z" native_token = "NAM" -faucet_pow_difficulty = 1 +faucet_pow_difficulty = 0 faucet_withdrawal_limit = "1000" [validator.validator-0] @@ -174,6 +174,8 @@ epochs_per_year = 31_536_000 pos_gain_p = "0.1" # The D gain factor in the Proof of Stake rewards controller pos_gain_d = "0.1" +# The maximum number of signatures allowed per transaction +max_signatures_per_transaction = 15 # Proof of stake parameters. [pos_params] @@ -215,10 +217,18 @@ min_proposal_fund = 500 # proposal code size in bytes max_proposal_code_size = 1000000 # min proposal period length in epochs -min_proposal_period = 3 +min_proposal_voting_period = 3 # max proposal period length in epochs max_proposal_period = 27 # maximum number of characters in the proposal content max_proposal_content_size = 10000 # minimum epochs between end and grace epoch min_proposal_grace_epochs = 6 + +[pgf_params] +# list of steward address at genezis +stewards = [] +# inflation rate for pgf fundings +pgf_inflation_rate = "0.1" +# inflation rate for pgf stewards +stewards_inflation_rate = "0.01" \ No newline at end of file diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 4c087dbbd63..c18a6262682 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -869,7 +869,7 @@ pub fn is_validator( address: &Address, ) -> storage_api::Result where - S: StorageRead + StorageWrite, + S: StorageRead, { let rate = read_validator_max_commission_rate_change(storage, address)?; Ok(rate.is_some()) @@ -3927,11 +3927,8 @@ where // Check that the validator is jailed up to the pipeline epoch for epoch in current_epoch.iter_range(params.pipeline_len + 1) { - let state = validator_state_handle(validator).get( - storage, - current_epoch, - ¶ms, - )?; + let state = + validator_state_handle(validator).get(storage, epoch, ¶ms)?; if let Some(state) = state { if state != ValidatorState::Jailed { return Err(UnjailValidatorError::NotJailed( diff --git a/proof_of_stake/src/tests.rs b/proof_of_stake/src/tests.rs index 64768274171..b7463c8ea58 100644 --- a/proof_of_stake/src/tests.rs +++ b/proof_of_stake/src/tests.rs @@ -51,9 +51,10 @@ use crate::{ staking_token_address, store_total_consensus_stake, total_deltas_handle, unbond_handle, unbond_tokens, unjail_validator, update_validator_deltas, update_validator_set, validator_consensus_key_handle, - validator_set_update_tendermint, validator_slashes_handle, - validator_state_handle, withdraw_tokens, write_validator_address_raw_hash, - BecomeValidator, STORE_VALIDATOR_SETS_LEN, + validator_set_positions_handle, validator_set_update_tendermint, + validator_slashes_handle, validator_state_handle, withdraw_tokens, + write_validator_address_raw_hash, BecomeValidator, + STORE_VALIDATOR_SETS_LEN, }; proptest! { @@ -124,6 +125,22 @@ proptest! { } } +proptest! { + // Generate arb valid input for `test_unjail_validator_aux` + #![proptest_config(Config { + cases: 5, + .. Config::default() + })] + #[test] + fn test_unjail_validator( + (pos_params, genesis_validators) + in arb_params_and_genesis_validators(Some(4),6..9) + ) { + test_unjail_validator_aux(pos_params, + genesis_validators) + } +} + fn arb_params_and_genesis_validators( num_max_validator_slots: Option, val_size: Range, @@ -2112,3 +2129,127 @@ fn arb_genesis_validators( }, ) } + +fn test_unjail_validator_aux( + params: PosParams, + mut validators: Vec, +) { + println!("\nTest inputs: {params:?}, genesis validators: {validators:#?}"); + let mut s = TestWlStorage::default(); + + // Find the validator with the most stake and 100x his stake to keep the + // cubic slash rate small + let num_vals = validators.len(); + validators.sort_by_key(|a| a.tokens); + validators[num_vals - 1].tokens = 100 * validators[num_vals - 1].tokens; + + // Get second highest stake validator tomisbehave + let val_addr = &validators[num_vals - 2].address; + let val_tokens = validators[num_vals - 2].tokens; + println!( + "Validator that will misbehave addr {val_addr}, tokens {}", + val_tokens.to_string_native() + ); + + // Genesis + let mut current_epoch = s.storage.block.epoch; + init_genesis( + &mut s, + ¶ms, + validators.clone().into_iter(), + current_epoch, + ) + .unwrap(); + s.commit_block().unwrap(); + + current_epoch = advance_epoch(&mut s, ¶ms); + super::process_slashes(&mut s, current_epoch).unwrap(); + + // Discover first slash + let slash_0_evidence_epoch = current_epoch; + let evidence_block_height = BlockHeight(0); // doesn't matter for slashing logic + let slash_0_type = SlashType::DuplicateVote; + slash( + &mut s, + ¶ms, + current_epoch, + slash_0_evidence_epoch, + evidence_block_height, + slash_0_type, + val_addr, + current_epoch.next(), + ) + .unwrap(); + + assert_eq!( + validator_state_handle(val_addr) + .get(&s, current_epoch, ¶ms) + .unwrap(), + Some(ValidatorState::Consensus) + ); + + for epoch in Epoch::iter_bounds_inclusive( + current_epoch.next(), + current_epoch + params.pipeline_len, + ) { + // Check the validator state + assert_eq!( + validator_state_handle(val_addr) + .get(&s, epoch, ¶ms) + .unwrap(), + Some(ValidatorState::Jailed) + ); + // Check the validator set positions + assert!( + validator_set_positions_handle() + .at(&epoch) + .get(&s, val_addr) + .unwrap() + .is_none(), + ); + } + + // Advance past an epoch in which we can unbond + let unfreeze_epoch = + slash_0_evidence_epoch + params.slash_processing_epoch_offset(); + while current_epoch < unfreeze_epoch + 4u64 { + current_epoch = advance_epoch(&mut s, ¶ms); + super::process_slashes(&mut s, current_epoch).unwrap(); + } + + // Unjail the validator + unjail_validator(&mut s, val_addr, current_epoch).unwrap(); + + // Check the validator state + for epoch in + Epoch::iter_bounds_inclusive(current_epoch, current_epoch.next()) + { + assert_eq!( + validator_state_handle(val_addr) + .get(&s, epoch, ¶ms) + .unwrap(), + Some(ValidatorState::Jailed) + ); + } + + assert_eq!( + validator_state_handle(val_addr) + .get(&s, current_epoch + params.pipeline_len, ¶ms) + .unwrap(), + Some(ValidatorState::Consensus) + ); + assert!( + validator_set_positions_handle() + .at(&(current_epoch + params.pipeline_len)) + .get(&s, val_addr) + .unwrap() + .is_some(), + ); + + // Advance another epoch + current_epoch = advance_epoch(&mut s, ¶ms); + super::process_slashes(&mut s, current_epoch).unwrap(); + + let second_att = unjail_validator(&mut s, val_addr, current_epoch); + assert!(second_att.is_err()); +} diff --git a/scripts/generator.sh b/scripts/generator.sh index 701f8fbabe9..3fe1792a494 100755 --- a/scripts/generator.sh +++ b/scripts/generator.sh @@ -212,79 +212,79 @@ elif [ "$1" = "client" ]; then # proposal_submission - cargo run --bin namadac --features std -- --mode full bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full change-commission-rate --validator Bertha --commission-rate 0.02 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.02 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 - PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- --mode full init-proposal --force --data-path proposal_submission_valid_proposal.json --node 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') + PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- init-proposal --force --data-path proposal_submission_valid_proposal.json --node 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') - cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada --mode validator vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --signer validator-0 --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --address validator-0 --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote nay --signer Bertha --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote nay --address Bertha --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --signer Albert --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --address Albert --node 127.0.0.1:27657 # proposal_offline - cargo run --bin namadac --features std -- --mode full bond --validator validator-0 --source Albert --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- bond --validator validator-0 --source Albert --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full change-commission-rate --validator Albert --commission-rate 0.05 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Albert --commission-rate 0.05 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full init-proposal --force --data-path proposal_offline_valid_proposal.json --offline --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- init-proposal --force --data-path proposal_offline_valid_proposal.json --offline --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full vote-proposal --data-path proposal_offline_proposal --vote yay --signer Albert --offline --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --data-path proposal_offline_proposal --vote yay --address Albert --offline --node 127.0.0.1:27657 # eth_governance_proposal - cargo run --bin namadac --features std -- --mode full bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full change-commission-rate --validator Bertha --commission-rate 0.07 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.07 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 - PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- --mode full init-proposal --force --data-path eth_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') + PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- init-proposal --force --data-path eth_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') - cargo run --bin namadac --features std -- --mode full vote-proposal --force --proposal-id 0 --vote yay --eth '011586062748ba53bc53155e817ec1ea708de75878dcb9a5713bf6986d87fe14e7 fd34672ab5' --signer Bertha --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --force --proposal-id 0 --vote yay --eth '011586062748ba53bc53155e817ec1ea708de75878dcb9a5713bf6986d87fe14e7 fd34672ab5' --address Bertha --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada --mode validator vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --eth '011586062748ba53bc53155e817ec1ea708de75878dcb9a5713bf6986d87fe14e7 fd34672ab5' --signer validator-0 --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --eth '011586062748ba53bc53155e817ec1ea708de75878dcb9a5713bf6986d87fe14e7 fd34672ab5' --address validator-0 --ledger-address 127.0.0.1:27657 # pgf_governance_proposal - cargo run --bin namadac --features std -- --mode full bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full change-commission-rate --validator Bertha --commission-rate 0.09 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.09 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 - PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- --mode full init-proposal --force --data-path pgf_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') + PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- init-proposal --force --data-path pgf_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') - PROPOSAL_ID_1=$(cargo run --bin namadac --features std -- --mode full init-proposal --force --data-path pgf_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') + PROPOSAL_ID_1=$(cargo run --bin namadac --features std -- init-proposal --force --data-path pgf_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') - cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada --mode validator vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --pgf "$ALBERT_ADDRESS 1000" --signer validator-0 --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --pgf "$ALBERT_ADDRESS 1000" --address validator-0 --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --pgf "$ALBERT_ADDRESS 900" --signer Bertha --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --pgf "$ALBERT_ADDRESS 900" --address Bertha --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full vote-proposal --force --proposal-id $PROPOSAL_ID_1 --vote yay --pgf "$ALBERT_ADDRESS 900" --signer Bertha --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --force --proposal-id $PROPOSAL_ID_1 --vote yay --pgf "$ALBERT_ADDRESS 900" --address Bertha --ledger-address 127.0.0.1:27657 # non-proposal tests - cargo run --bin namadac --features std -- transfer --source bertha --target christel --token btc --amount 23 --force --signing-key bertha-key --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- transfer --source bertha --target christel --token btc --amount 23 --force --signing-keys bertha-key --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- bond --validator bertha --amount 25 --signing-key bertha-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- bond --validator bertha --amount 25 --signing-keys bertha-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- --mode full change-commission-rate --validator Bertha --commission-rate 0.11 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.11 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- reveal-pk --public-key albert-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- reveal-pk --public-key albert-key --gas-payer albert-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- update --code-path vp_user.wasm --address bertha --signing-key bertha-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- update-account --code-path vp_user.wasm --address bertha --signing-keys bertha-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- init-validator --alias bertha-validator --source bertha --commission-rate 0.05 --max-commission-rate-change 0.01 --signing-key bertha-key --unsafe-dont-encrypt --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- init-validator --alias bertha-validator --account-keys bertha --commission-rate 0.05 --max-commission-rate-change 0.01 --signing-keys bertha-key --unsafe-dont-encrypt --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- unbond --validator christel --amount 5 --signing-key christel-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- unbond --validator christel --amount 5 --signing-keys christel-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- withdraw --validator albert --signing-key albert-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- withdraw --validator albert --signing-keys albert-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- init-account --alias albert-account --source albert --public-key albert-key --signing-key albert-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- init-account --alias albert-account --public-keys albert-key --signing-keys albert-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- tx --code-path $NAMADA_DIR/wasm_for_tests/tx_no_op.wasm --data-path README.md --signing-key albert-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- tx --code-path $NAMADA_DIR/wasm_for_tests/tx_no_op.wasm --data-path README.md --signing-keys albert-key --owner albert --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- ibc-transfer --source bertha --receiver christel --token btc --amount 24 --channel-id channel-141 --signing-key bertha-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- ibc-transfer --source bertha --receiver christel --token btc --amount 24 --channel-id channel-141 --signing-keys bertha-key --force --ledger-address 127.0.0.1:27657 cargo run --bin namadaw -- masp add --alias a_spending_key --value xsktest1qqqqqqqqqqqqqq9v0sls5r5de7njx8ehu49pqgmqr9ygelg87l5x8y4s9r0pjlvu69au6gn3su5ewneas486hdccyayx32hxvt64p3d0hfuprpgcgv2q9gdx3jvxrn02f0nnp3jtdd6f5vwscfuyum083cvfv4jun75ak5sdgrm2pthzj3sflxc0jx0edrakx3vdcngrfjmru8ywkguru8mxss2uuqxdlglaz6undx5h8w7g70t2es850g48xzdkqay5qs0yw06rtxcvedhsv --unsafe-dont-encrypt diff --git a/scripts/get_hermes.sh b/scripts/get_hermes.sh new file mode 100755 index 00000000000..cd63f48f864 --- /dev/null +++ b/scripts/get_hermes.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -Eo pipefail + +HERMES_MAJORMINOR="1.6" +HERMES_PATCH="0" +HERMES_SUFFIX="-namada-beta1" + +HERMES_REPO="https://github.com/heliaxdev/hermes" + +HERMES_VERSION="${HERMES_MAJORMINOR}.${HERMES_PATCH}${HERMES_SUFFIX}" + +TARGET_PATH="/usr/local/bin" +TMP_PATH="/tmp" + +error_exit() +{ + echo "Error: $1" >&2 + exit 1 +} + +read -r SYSTEM MACHINE <<< "$(uname -s -m)" + +if [[ $SYSTEM = "Darwin" ]]; then + SYSTEM="apple-darwin" +else + SYSTEM="unknown-linux-gnu" +fi + +ARCH="x86_64" +if [[ $MACHINE = "aarch64" ]] || [[ $MACHINE = "arm64" ]]; then + ARCH="aarch64" +fi + +RELEASE_URL=${HERMES_REPO}/releases/download/v${HERMES_VERSION}/hermes-v${HERMES_VERSION}-${ARCH}-${SYSTEM}.tar.gz +echo "$RELEASE_URL" + +curl -LsSfo "$TMP_PATH"/hermes.tar.gz "$RELEASE_URL" || error_exit "hermes release download failed" + +cd $TARGET_PATH +sudo tar -xvzf $TMP_PATH/hermes.tar.gz hermes || error_exit "hermes release extraction failed" diff --git a/shared/src/ledger/args.rs b/shared/src/ledger/args.rs index 029c77ff0e7..2d426d55103 100644 --- a/shared/src/ledger/args.rs +++ b/shared/src/ledger/args.rs @@ -99,9 +99,13 @@ pub struct TxCustom { /// Common tx arguments pub tx: Tx, /// Path to the tx WASM code file - pub code_path: C::Data, + pub code_path: Option, /// Path to the data file pub data_path: Option, + /// Path to the serialized transaction + pub serialized_tx: Option, + /// The address that correspond to the signatures/signing-keys + pub owner: C::Address, } /// Transfer transaction arguments @@ -155,6 +159,46 @@ pub struct TxIbcTransfer { pub timeout_height: Option, /// Timeout timestamp offset pub timeout_sec_offset: Option, + /// Memo + pub memo: Option, + /// Path to the TX WASM code file + pub tx_code_path: PathBuf, +} + +/// Transaction to initialize create a new proposal +#[derive(Clone, Debug)] +pub struct InitProposal { + /// Common tx arguments + pub tx: Tx, + /// The proposal data + pub proposal_data: C::Data, + /// Native token address + pub native_token: C::NativeAddress, + /// Flag if proposal should be run offline + pub is_offline: bool, + /// Flag if proposal is of type Pgf stewards + pub is_pgf_stewards: bool, + /// Flag if proposal is of type Pgf funding + pub is_pgf_funding: bool, + /// Path to the tx WASM file + pub tx_code_path: PathBuf, +} + +/// Transaction to vote on a proposal +#[derive(Clone, Debug)] +pub struct VoteProposal { + /// Common tx arguments + pub tx: Tx, + /// Proposal id + pub proposal_id: Option, + /// The vote + pub vote: String, + /// The address of the voter + pub voter: C::Address, + /// Flag if proposal vote should be run offline + pub is_offline: bool, + /// The proposal file path + pub proposal_data: Option, /// Path to the TX WASM code file pub tx_code_path: PathBuf, } @@ -164,14 +208,14 @@ pub struct TxIbcTransfer { pub struct TxInitAccount { /// Common tx arguments pub tx: Tx, - /// Address of the source account - pub source: C::Address, /// Path to the VP WASM code file for the new account pub vp_code_path: PathBuf, /// Path to the TX WASM code file pub tx_code_path: PathBuf, /// Public key for the new account - pub public_key: C::PublicKey, + pub public_keys: Vec, + /// The account multisignature threshold + pub threshold: Option, } /// Transaction to initialize a new account @@ -179,12 +223,12 @@ pub struct TxInitAccount { pub struct TxInitValidator { /// Common tx arguments pub tx: Tx, - /// Source - pub source: C::Address, /// Signature scheme pub scheme: SchemeType, - /// Account key - pub account_key: Option, + /// Account keys + pub account_keys: Vec, + /// The account multisignature threshold + pub threshold: Option, /// Consensus key pub consensus_key: Option, /// Ethereum cold key @@ -207,15 +251,19 @@ pub struct TxInitValidator { /// Transaction to update a VP arguments #[derive(Clone, Debug)] -pub struct TxUpdateVp { +pub struct TxUpdateAccount { /// Common tx arguments pub tx: Tx, /// Path to the VP WASM code file - pub vp_code_path: PathBuf, + pub vp_code_path: Option, /// Path to the TX WASM code file pub tx_code_path: PathBuf, /// Address of the account whose VP is to be updated pub addr: C::Address, + /// Public keys + pub public_keys: Vec, + /// The account threshold + pub threshold: Option, } /// Bond arguments @@ -277,6 +325,13 @@ pub struct QueryProtocolParameters { pub query: Query, } +/// Query pgf data +#[derive(Clone, Debug)] +pub struct QueryPgf { + /// Common query args + pub query: Query, +} + /// Withdraw arguments #[derive(Clone, Debug)] pub struct Withdraw { @@ -302,6 +357,15 @@ pub struct QueryConversions { pub epoch: Option, } +/// Query token balance(s) +#[derive(Clone, Debug)] +pub struct QueryAccount { + /// Common query args + pub query: Query, + /// Address of an owner + pub owner: C::Address, +} + /// Query token balance(s) #[derive(Clone, Debug)] pub struct QueryBalance { @@ -383,6 +447,17 @@ pub struct TxUnjailValidator { pub tx_code_path: PathBuf, } +#[derive(Clone, Debug)] +/// Sign a transaction offline +pub struct SignTx { + /// Common tx arguments + pub tx: Tx, + /// Transaction data + pub tx_data: C::Data, + /// The account address + pub owner: C::Address, +} + /// Query PoS commission rate #[derive(Clone, Debug)] pub struct QueryCommissionRate { @@ -435,8 +510,10 @@ pub struct QueryRawBytes { pub struct Tx { /// Simulate applying the transaction pub dry_run: bool, - /// Dump the transaction bytes + /// Dump the transaction bytes to file pub dump_tx: bool, + /// The output directory path to where serialize the data + pub output_folder: Option, /// Submit the transaction even if it doesn't pass client checks pub force: bool, /// Do not wait for the transaction to be added to the blockchain @@ -449,10 +526,12 @@ pub struct Tx { /// Whether to force overwrite the above alias, if it is provided, in the /// wallet. pub wallet_alias_force: bool, + /// The fee payer signing key + pub gas_payer: Option, /// The amount being payed to include the transaction - pub fee_amount: InputAmount, + pub gas_amount: InputAmount, /// The token in which the fee is being paid - pub fee_token: C::Address, + pub gas_token: C::Address, /// The max amount of gas used to process tx pub gas_limit: GasLimit, /// The optional expiration of the transaction @@ -460,9 +539,9 @@ pub struct Tx { /// The chain id for which the transaction is intended pub chain_id: Option, /// Sign the tx with the key for the given alias from your wallet - pub signing_key: Option, - /// Sign the tx with the keypair of the public key of the given address - pub signer: Option, + pub signing_keys: Vec, + /// List of signatures to attach to the transaction + pub signatures: Vec, /// Path to the TX WASM code file to reveal PK pub tx_reveal_code_path: PathBuf, /// Sign the tx with the public key for the given alias from your wallet @@ -633,11 +712,11 @@ pub struct EthereumBridgePool { /// The amount to be transferred pub amount: InputAmount, /// The amount of fees (in NAM) - pub gas_amount: token::Amount, + pub fee_amount: token::Amount, /// The account of fee payer. - pub gas_payer: C::Address, + pub fee_payer: C::Address, /// Path to the tx WASM code file - pub code_path: C::Data, + pub code_path: PathBuf, } /// Bridge pool proof arguments. diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index 235941eb6a9..b63eac52a89 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -17,11 +17,9 @@ use crate::eth_bridge::ethers::abi::AbiDecode; use crate::eth_bridge::structs::RelayProof; use crate::ledger::args; use crate::ledger::queries::{Client, RPC}; -use crate::ledger::rpc::validate_amount; -use crate::ledger::signing::TxSigningKey; +use crate::ledger::rpc::{query_wasm_code_hash, validate_amount}; use crate::ledger::tx::{prepare_tx, Error}; -use crate::ledger::wallet::{Wallet, WalletUtils}; -use crate::proto::{Code, Data, Tx}; +use crate::proto::Tx; use crate::types::address::Address; use crate::types::control_flow::time::{Duration, Instant}; use crate::types::control_flow::{ @@ -31,69 +29,70 @@ use crate::types::eth_abi::Encode; use crate::types::eth_bridge_pool::{ GasFee, PendingTransfer, TransferToEthereum, }; +use crate::types::io::Io; use crate::types::keccak::KeccakHash; use crate::types::token::{Amount, DenominatedAmount}; -use crate::types::transaction::TxType; use crate::types::voting_power::FractionalVotingPower; +use crate::{display, display_line}; /// Craft a transaction that adds a transfer to the Ethereum bridge pool. pub async fn build_bridge_pool_tx< C: crate::ledger::queries::Client + Sync, - U: WalletUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, - args: args::EthereumBridgePool, -) -> Result<(Tx, Option
, common::PublicKey), Error> { - let args::EthereumBridgePool { - ref tx, + args::EthereumBridgePool { + tx: tx_args, asset, recipient, sender, amount, - gas_amount, - gas_payer, - code_path: wasm_code, - } = args; - let DenominatedAmount { amount, .. } = - validate_amount::<_, IO>(client, amount, &BRIDGE_ADDRESS, tx.force) - .await - .expect("Failed to validate amount"); + fee_amount, + fee_payer, + code_path, + }: args::EthereumBridgePool, + gas_payer: common::PublicKey, +) -> Result { + let DenominatedAmount { amount, .. } = validate_amount::<_, IO>( + client, + amount, + &BRIDGE_ADDRESS, + tx_args.force, + ) + .await + .expect("Failed to validate amount"); + let transfer = PendingTransfer { transfer: TransferToEthereum { asset, recipient, - sender, + sender: sender.clone(), amount, }, gas_fee: GasFee { - amount: gas_amount, - payer: gas_payer, + amount: fee_amount, + payer: fee_payer, }, }; - let mut transfer_tx = Tx::new(TxType::Raw); - transfer_tx.header.chain_id = tx.chain_id.clone().unwrap(); - transfer_tx.header.expiration = tx.expiration; - transfer_tx.set_data(Data::new( - transfer - .try_to_vec() - .expect("Serializing tx should not fail"), - )); - // TODO: change the wasm code to a hash - transfer_tx.set_code(Code::new(wasm_code)); - - prepare_tx::( + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, code_path.to_str().unwrap()) + .await + .unwrap(); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + tx.add_code_from_hash(tx_code_hash).add_data(transfer); + + prepare_tx::( client, - wallet, - tx, - transfer_tx, - TxSigningKey::None, + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + Ok(tx) } /// A json serializable representation of the Ethereum @@ -875,6 +874,3 @@ mod recommendations { } pub use recommendations::recommend_batch; - -use crate::types::io::Io; -use crate::{display, display_line}; diff --git a/shared/src/ledger/events.rs b/shared/src/ledger/events.rs index 03e68417e28..0b5aa0253bc 100644 --- a/shared/src/ledger/events.rs +++ b/shared/src/ledger/events.rs @@ -10,7 +10,7 @@ use std::str::FromStr; use borsh::{BorshDeserialize, BorshSerialize}; use thiserror::Error; -use crate::ledger::native_vp::governance::utils::ProposalEvent; +use crate::ledger::governance::utils::ProposalEvent; use crate::tendermint_proto::abci::EventAttribute; use crate::types::ibc::IbcEvent; #[cfg(feature = "ferveo-tpke")] @@ -50,6 +50,8 @@ pub enum EventType { Ibc(String), /// The proposal that has been executed Proposal, + /// The pgf payment + PgfPayment, } impl Display for EventType { @@ -59,6 +61,7 @@ impl Display for EventType { EventType::Applied => write!(f, "applied"), EventType::Ibc(t) => write!(f, "{}", t), EventType::Proposal => write!(f, "proposal"), + EventType::PgfPayment => write!(f, "pgf_payment"), }?; Ok(()) } @@ -72,6 +75,7 @@ impl FromStr for EventType { "accepted" => Ok(EventType::Accepted), "applied" => Ok(EventType::Applied), "proposal" => Ok(EventType::Proposal), + "pgf_payments" => Ok(EventType::PgfPayment), // IBC "update_client" => Ok(EventType::Ibc("update_client".to_string())), "send_packet" => Ok(EventType::Ibc("send_packet".to_string())), diff --git a/shared/src/ledger/events/log/dumb_queries.rs b/shared/src/ledger/events/log/dumb_queries.rs index 08dad37cd05..5ff7c8d54f4 100644 --- a/shared/src/ledger/events/log/dumb_queries.rs +++ b/shared/src/ledger/events/log/dumb_queries.rs @@ -67,7 +67,6 @@ impl QueryMatcher { use crate::ibc::core::ics02_client::events::{ CLIENT_ID_ATTRIBUTE_KEY, CONSENSUS_HEIGHTS_ATTRIBUTE_KEY, }; - use crate::ibc::events::IbcEventType; let mut attributes = HashMap::new(); attributes @@ -79,9 +78,7 @@ impl QueryMatcher { .to_string(), ); Self { - event_type: EventType::Ibc( - IbcEventType::UpdateClient.as_str().to_string(), - ), + event_type: EventType::Ibc("update_client".to_string()), attributes, } } diff --git a/shared/src/ledger/native_vp/governance/mod.rs b/shared/src/ledger/governance/mod.rs similarity index 50% rename from shared/src/ledger/native_vp/governance/mod.rs rename to shared/src/ledger/governance/mod.rs index d41242a4776..595df35cf39 100644 --- a/shared/src/ledger/native_vp/governance/mod.rs +++ b/shared/src/ledger/governance/mod.rs @@ -4,19 +4,25 @@ pub mod utils; use std::collections::BTreeSet; -use namada_core::ledger::governance::storage as gov_storage; -use namada_core::ledger::storage; +use borsh::BorshDeserialize; +use namada_core::ledger::governance::storage::keys as gov_storage; +use namada_core::ledger::governance::storage::proposal::{ + AddRemove, ProposalType, +}; +use namada_core::ledger::governance::storage::vote::StorageProposalVote; +use namada_core::ledger::governance::utils::is_valid_validator_voting_period; +use namada_core::ledger::storage_api::governance::is_proposal_accepted; use namada_core::ledger::vp_env::VpEnv; -use namada_core::types::governance::{ProposalVote, VoteType}; -use namada_core::types::transaction::governance::ProposalType; +use namada_core::ledger::{pgf, storage}; +use namada_core::proto::Tx; +use namada_proof_of_stake::is_validator; use thiserror::Error; -use utils::is_valid_validator_voting_period; +use self::utils::ReadType; use crate::ledger::native_vp::{Ctx, NativeVp}; use crate::ledger::storage_api::StorageRead; use crate::ledger::{native_vp, pos}; -use crate::proto::Tx; -use crate::types::address::Address; +use crate::types::address::{Address, InternalAddress}; use crate::types::storage::{Epoch, Key}; use crate::types::token; use crate::vm::WasmCacheAccess; @@ -24,11 +30,23 @@ use crate::vm::WasmCacheAccess; /// for handling Governance NativeVP errors pub type Result = std::result::Result; +/// The governance internal address +pub const ADDRESS: Address = Address::Internal(InternalAddress::Governance); + +/// The maximum number of item in a pgf proposal +pub const MAX_PGF_ACTIONS: usize = 20; + #[allow(missing_docs)] #[derive(Error, Debug)] pub enum Error { #[error("Native VP error: {0}")] NativeVpError(#[from] native_vp::Error), + #[error("Proposal field should not be empty: {0}")] + EmptyProposalField(String), + #[error("Vote key is not valid: {0}")] + InvalidVoteKey(String), + #[error("Vote type is not compatible with proposal type.")] + InvalidVoteType, } /// Governance VP @@ -99,13 +117,7 @@ where (KeyType::PROPOSAL_COMMIT, _) => { self.is_valid_proposal_commit() } - (KeyType::PARAMETER, _) => self.is_valid_parameter( - if let Some(data) = &tx_data.data() { - data - } else { - return false; - }, - ), + (KeyType::PARAMETER, _) => self.is_valid_parameter(tx_data), (KeyType::BALANCE, _) => self.is_valid_balance(&native_token), (KeyType::UNKNOWN_GOVERNANCE, _) => Ok(false), (KeyType::UNKNOWN, _) => Ok(true), @@ -126,10 +138,9 @@ where { fn is_valid_key_set(&self, keys: &BTreeSet) -> Result<(bool, u64)> { let counter_key = gov_storage::get_counter_key(); - let pre_counter: u64 = - self.ctx.pre().read(&counter_key)?.unwrap_or_default(); + let pre_counter: u64 = self.force_read(&counter_key, ReadType::Pre)?; let post_counter: u64 = - self.ctx.post().read(&counter_key)?.unwrap_or_default(); + self.force_read(&counter_key, ReadType::Post)?; if post_counter < pre_counter { return Ok((false, 0)); @@ -150,7 +161,7 @@ where gov_storage::get_grace_epoch_key(counter), ]); - // Check that expected set is a subset the actual one + // Check that expected set is a subset of the actual one if !keys.is_superset(&mandatory_keys) { return Ok((false, 0)); } @@ -170,122 +181,80 @@ where gov_storage::get_voting_start_epoch_key(proposal_id); let voting_end_epoch_key = gov_storage::get_voting_end_epoch_key(proposal_id); + let proposal_type_key = gov_storage::get_proposal_type_key(proposal_id); - let current_epoch = self.ctx.get_block_epoch().ok(); + let current_epoch = self.ctx.get_block_epoch()?; - let pre_counter: Option = self.ctx.pre().read(&counter_key)?; - let pre_voting_start_epoch: Option = - self.ctx.pre().read(&voting_start_epoch_key)?; - let pre_voting_end_epoch: Option = - self.ctx.pre().read(&voting_end_epoch_key)?; + let pre_counter: u64 = self.force_read(&counter_key, ReadType::Pre)?; + let pre_voting_start_epoch: Epoch = + self.force_read(&voting_start_epoch_key, ReadType::Pre)?; + let pre_voting_end_epoch: Epoch = + self.force_read(&voting_end_epoch_key, ReadType::Pre)?; + let proposal_type: ProposalType = + self.force_read(&proposal_type_key, ReadType::Pre)?; let voter = gov_storage::get_voter_address(key); let delegation_address = gov_storage::get_vote_delegation_address(key); - let vote: Option = self.ctx.read_post(key)?; - let proposal_type_key = gov_storage::get_proposal_type_key(proposal_id); - let proposal_type: Option = - self.ctx.read_pre(&proposal_type_key)?; - - match ( - pre_counter, - proposal_type, - vote, - voter, - delegation_address, + let vote: StorageProposalVote = self.force_read(key, ReadType::Post)?; + + let (voter_address, delegation_address) = + match (voter, delegation_address) { + (Some(voter_address), Some(delegator_address)) => { + (voter_address, delegator_address) + } + _ => return Err(Error::InvalidVoteKey(key.to_string())), + }; + + // Invalid proposal id + if pre_counter <= proposal_id { + return Ok(false); + } + + // Voted outside of voting window. We dont check for validator because + // if the proposal type is validator, we need to let + // them vote for the entire voting window. + if !self.is_valid_voting_window( current_epoch, pre_voting_start_epoch, pre_voting_end_epoch, + false, ) { - ( - Some(pre_counter), - Some(proposal_type), - Some(vote), - Some(voter_address), - Some(delegation_address), - Some(current_epoch), - Some(pre_voting_start_epoch), - Some(pre_voting_end_epoch), - ) => { - if pre_counter <= proposal_id { - // Invalid proposal id - return Ok(false); - } - if current_epoch < pre_voting_start_epoch - || current_epoch > pre_voting_end_epoch - { - // Voted outside of voting window - return Ok(false); - } - - if let ProposalVote::Yay(vote_type) = vote { - if proposal_type != vote_type { - return Ok(false); - } + return Ok(false); + } - // Vote type specific checks - if let VoteType::PGFCouncil(set) = vote_type { - // Check that all the addresses are established - for (address, _) in set { - match address { - Address::Established(_) => { - // Check that established address exists in - // storage - let vp_key = - Key::validity_predicate(&address); - if !self.ctx.has_key_pre(&vp_key)? { - return Ok(false); - } - } - _ => return Ok(false), - } - } - } else if let VoteType::ETHBridge(_sig) = vote_type { - // TODO: Check the validity of the signature with the - // governance ETH key in storage for the given validator - // - } - } + if !vote.is_compatible(&proposal_type) { + return Err(Error::InvalidVoteType); + } - match proposal_type { - ProposalType::Default(_) | ProposalType::PGFCouncil => { - if self - .is_validator( - pre_voting_start_epoch, - verifiers, - voter_address, - delegation_address, - ) - .unwrap_or(false) - { - Ok(is_valid_validator_voting_period( - current_epoch, - pre_voting_start_epoch, - pre_voting_end_epoch, - )) - } else { - Ok(self - .is_delegator( - pre_voting_start_epoch, - verifiers, - voter_address, - delegation_address, - ) - .unwrap_or(false)) - } - } - ProposalType::ETHBridge => Ok(self - .is_validator( - pre_voting_start_epoch, - verifiers, - voter_address, - delegation_address, - ) - .unwrap_or(false)), - } - } - _ => Ok(false), + // first check if validator, then check if delegator + let is_validator = self + .is_validator( + pre_voting_start_epoch, + verifiers, + voter_address, + delegation_address, + ) + .unwrap_or(false); + + if is_validator { + let valid_voting_period = is_valid_validator_voting_period( + current_epoch, + pre_voting_start_epoch, + pre_voting_end_epoch, + ); + return Ok(valid_voting_period); } + + let is_delegator = self + .is_delegator( + pre_voting_start_epoch, + verifiers, + voter_address, + delegation_address, + ) + .unwrap_or(false); + Ok(is_delegator) } /// Validate a content key @@ -299,39 +268,78 @@ where return Ok(false); } - let max_content_length: Option = - self.ctx.pre().read(&max_content_length_parameter_key)?; - let post_content: Option> = - self.ctx.read_bytes_post(&content_key)?; + let max_content_length: usize = + self.force_read(&max_content_length_parameter_key, ReadType::Pre)?; + let post_content = + self.ctx.read_bytes_post(&content_key)?.unwrap_or_default(); - match (post_content, max_content_length) { - (Some(post_content), Some(max_content_length)) => { - Ok(post_content.len() < max_content_length) - } - _ => Ok(false), - } + Ok(post_content.len() < max_content_length) } /// Validate the proposal type pub fn is_valid_proposal_type(&self, proposal_id: u64) -> Result { let proposal_type_key = gov_storage::get_proposal_type_key(proposal_id); - Ok(self - .ctx - .read_post::(&proposal_type_key)? - .is_some()) + let proposal_type: ProposalType = + self.force_read(&proposal_type_key, ReadType::Post)?; + + match proposal_type { + ProposalType::PGFSteward(stewards) => { + let steward_added = stewards + .iter() + .filter_map(|steward| match steward { + AddRemove::Add(address) => Some(address), + AddRemove::Remove(_) => None, + }) + .cloned() + .collect::>(); + + if steward_added.len() > 1 { + Ok(false) + } else if steward_added.is_empty() { + return Ok(stewards.len() < MAX_PGF_ACTIONS); + } else { + match steward_added.get(0) { + Some(address) => { + let author_key = + gov_storage::get_author_key(proposal_id); + let author = + self.force_read(&author_key, ReadType::Post)?; + return Ok(stewards.len() < MAX_PGF_ACTIONS + && address.eq(&author)); + } + None => return Ok(false), + } + } + } + ProposalType::PGFPayment(payments) => { + if payments.len() < MAX_PGF_ACTIONS { + return Ok(true); + } + let stewards_key = pgf::storage::keys::get_stewards_key(); + let author_key = gov_storage::get_author_key(proposal_id); + + let author: Option
= + self.ctx.pre().read(&author_key)?; + let stewards: BTreeSet
= + self.force_read(&stewards_key, ReadType::Pre)?; + + match author { + Some(address) => Ok(stewards.contains(&address)), + None => Ok(false), + } + } + _ => Ok(true), // default proposal + } } /// Validate a proposal code pub fn is_valid_proposal_code(&self, proposal_id: u64) -> Result { - let proposal_type_key: Key = - gov_storage::get_proposal_type_key(proposal_id); - let proposal_type: Option = - self.ctx.read_post(&proposal_type_key)?; + let proposal_type_key = gov_storage::get_proposal_type_key(proposal_id); + let proposal_type: ProposalType = + self.force_read(&proposal_type_key, ReadType::Post)?; - // Check that the proposal type admits wasm code - match proposal_type { - Some(ProposalType::Default(_)) => (), - _ => return Ok(false), + if !proposal_type.is_default() { + return Ok(false); } let code_key = gov_storage::get_proposal_code_key(proposal_id); @@ -343,22 +351,21 @@ where return Ok(false); } - let max_proposal_length: Option = - self.ctx.pre().read(&max_code_size_parameter_key)?; - let post_code: Option> = self.ctx.read_bytes_post(&code_key)?; + let max_proposal_length: usize = + self.force_read(&max_code_size_parameter_key, ReadType::Pre)?; + let post_code: Vec = + self.ctx.read_bytes_post(&code_key)?.unwrap_or_default(); - match (post_code, max_proposal_length) { - (Some(post_code), Some(max_content_length)) => { - Ok(post_code.len() < max_content_length) - } - _ => Ok(false), - } + Ok(post_code.len() <= max_proposal_length) } /// Validate a grace_epoch key pub fn is_valid_grace_epoch(&self, proposal_id: u64) -> Result { + let start_epoch_key = + gov_storage::get_voting_start_epoch_key(proposal_id); let end_epoch_key = gov_storage::get_voting_end_epoch_key(proposal_id); let grace_epoch_key = gov_storage::get_grace_epoch_key(proposal_id); + let max_proposal_period = gov_storage::get_max_proposal_period_key(); let min_grace_epoch_key = gov_storage::get_min_proposal_grace_epoch_key(); @@ -367,27 +374,32 @@ where return Ok(false); } - let end_epoch: Option = self.ctx.post().read(&end_epoch_key)?; - let grace_epoch: Option = - self.ctx.post().read(&grace_epoch_key)?; - let min_grace_epoch: Option = - self.ctx.pre().read(&min_grace_epoch_key)?; - match (min_grace_epoch, grace_epoch, end_epoch) { - (Some(min_grace_epoch), Some(grace_epoch), Some(end_epoch)) => { - let committing_epoch_key = - gov_storage::get_committing_proposals_key( - proposal_id, - grace_epoch, - ); - let has_post_committing_epoch = - self.ctx.has_key_post(&committing_epoch_key)?; - - Ok(has_post_committing_epoch - && end_epoch < grace_epoch - && grace_epoch - end_epoch >= min_grace_epoch) - } - _ => Ok(false), - } + let start_epoch: Epoch = + self.force_read(&start_epoch_key, ReadType::Post)?; + let end_epoch: Epoch = + self.force_read(&end_epoch_key, ReadType::Post)?; + let grace_epoch: Epoch = + self.force_read(&grace_epoch_key, ReadType::Post)?; + let min_grace_epoch: u64 = + self.force_read(&min_grace_epoch_key, ReadType::Pre)?; + let max_proposal_period: u64 = + self.force_read(&max_proposal_period, ReadType::Pre)?; + + let committing_epoch_key = gov_storage::get_committing_proposals_key( + proposal_id, + grace_epoch.into(), + ); + let has_post_committing_epoch = + self.ctx.has_key_post(&committing_epoch_key)?; + + let is_valid_grace_epoch = end_epoch < grace_epoch + && (grace_epoch - end_epoch).0 >= min_grace_epoch; + let is_valid_max_proposal_perido = start_epoch < grace_epoch + && grace_epoch.0 - start_epoch.0 <= max_proposal_period; + + Ok(has_post_committing_epoch + && is_valid_grace_epoch + && is_valid_max_proposal_perido) } /// Validate a start_epoch key @@ -396,9 +408,9 @@ where gov_storage::get_voting_start_epoch_key(proposal_id); let end_epoch_key = gov_storage::get_voting_end_epoch_key(proposal_id); let min_period_parameter_key = - gov_storage::get_min_proposal_period_key(); + gov_storage::get_min_proposal_voting_period_key(); - let current_epoch = self.ctx.get_block_epoch().ok(); + let current_epoch = self.ctx.get_block_epoch()?; let has_pre_start_epoch = self.ctx.has_key_pre(&start_epoch_key)?; let has_pre_end_epoch = self.ctx.has_key_pre(&end_epoch_key)?; @@ -407,27 +419,19 @@ where return Ok(false); } - let start_epoch: Option = - self.ctx.post().read(&start_epoch_key)?; - let end_epoch: Option = self.ctx.post().read(&end_epoch_key)?; - let min_period: Option = - self.ctx.pre().read(&min_period_parameter_key)?; - - match (min_period, start_epoch, end_epoch, current_epoch) { - ( - Some(min_period), - Some(start_epoch), - Some(end_epoch), - Some(current_epoch), - ) => { - if end_epoch <= start_epoch || start_epoch <= current_epoch { - return Ok(false); - } - Ok((end_epoch - start_epoch) % min_period == 0 - && (end_epoch - start_epoch).0 >= min_period) - } - _ => Ok(false), + let start_epoch: Epoch = + self.force_read(&start_epoch_key, ReadType::Post)?; + let end_epoch: Epoch = + self.force_read(&end_epoch_key, ReadType::Post)?; + let min_period: u64 = + self.force_read(&min_period_parameter_key, ReadType::Pre)?; + + if end_epoch <= start_epoch || start_epoch <= current_epoch { + return Ok(false); } + + Ok((end_epoch - start_epoch) % min_period == 0 + && (end_epoch - start_epoch).0 >= min_period) } /// Validate a end_epoch key @@ -436,11 +440,11 @@ where gov_storage::get_voting_start_epoch_key(proposal_id); let end_epoch_key = gov_storage::get_voting_end_epoch_key(proposal_id); let min_period_parameter_key = - gov_storage::get_min_proposal_period_key(); + gov_storage::get_min_proposal_voting_period_key(); let max_period_parameter_key = gov_storage::get_max_proposal_period_key(); - let current_epoch = self.ctx.get_block_epoch().ok(); + let current_epoch = self.ctx.get_block_epoch()?; let has_pre_start_epoch = self.ctx.has_key_pre(&start_epoch_key)?; let has_pre_end_epoch = self.ctx.has_key_pre(&end_epoch_key)?; @@ -449,36 +453,21 @@ where return Ok(false); } - let start_epoch: Option = - self.ctx.post().read(&start_epoch_key)?; - let end_epoch: Option = self.ctx.post().read(&end_epoch_key)?; - let min_period: Option = - self.ctx.pre().read(&min_period_parameter_key)?; - let max_period: Option = - self.ctx.pre().read(&max_period_parameter_key)?; - match ( - min_period, - max_period, - start_epoch, - end_epoch, - current_epoch, - ) { - ( - Some(min_period), - Some(max_period), - Some(start_epoch), - Some(end_epoch), - Some(current_epoch), - ) => { - if end_epoch <= start_epoch || start_epoch <= current_epoch { - return Ok(false); - } - Ok((end_epoch - start_epoch) % min_period == 0 - && (end_epoch - start_epoch).0 >= min_period - && (end_epoch - start_epoch).0 <= max_period) - } - _ => Ok(false), + let start_epoch: Epoch = + self.force_read(&start_epoch_key, ReadType::Post)?; + let end_epoch: Epoch = + self.force_read(&end_epoch_key, ReadType::Post)?; + let min_period: u64 = + self.force_read(&min_period_parameter_key, ReadType::Pre)?; + let max_period: u64 = + self.force_read(&max_period_parameter_key, ReadType::Pre)?; + + if end_epoch <= start_epoch || start_epoch <= current_epoch { + return Ok(false); } + Ok((end_epoch - start_epoch) % min_period == 0 + && (end_epoch - start_epoch).0 >= min_period + && (end_epoch - start_epoch).0 <= max_period) } /// Validate a funds key @@ -492,33 +481,20 @@ where token::balance_key(native_token_address, self.ctx.address); let min_funds_parameter_key = gov_storage::get_min_proposal_fund_key(); - let min_funds_parameter: Option = - self.ctx.pre().read(&min_funds_parameter_key)?; + let min_funds_parameter: token::Amount = + self.force_read(&min_funds_parameter_key, ReadType::Pre)?; let pre_balance: Option = self.ctx.pre().read(&balance_key)?; - let post_balance: Option = - self.ctx.post().read(&balance_key)?; - let post_funds: Option = - self.ctx.post().read(&funds_key)?; - - match (min_funds_parameter, pre_balance, post_balance, post_funds) { - ( - Some(min_funds_parameter), - Some(pre_balance), - Some(post_balance), - Some(post_funds), - ) => Ok(post_funds >= min_funds_parameter - && post_balance - pre_balance == post_funds), - ( - Some(min_funds_parameter), - None, - Some(post_balance), - Some(post_funds), - ) => { - Ok(post_funds >= min_funds_parameter - && post_balance == post_funds) - } - _ => Ok(false), + let post_balance: token::Amount = + self.force_read(&balance_key, ReadType::Post)?; + let post_funds: token::Amount = + self.force_read(&funds_key, ReadType::Post)?; + + if let Some(pre_balance) = pre_balance { + Ok(post_funds >= min_funds_parameter + && post_balance - pre_balance == post_funds) + } else { + Ok(post_funds >= min_funds_parameter && post_balance == post_funds) } } @@ -528,24 +504,19 @@ where token::balance_key(native_token_address, self.ctx.address); let min_funds_parameter_key = gov_storage::get_min_proposal_fund_key(); - let min_funds_parameter: Option = - self.ctx.pre().read(&min_funds_parameter_key)?; let pre_balance: Option = self.ctx.pre().read(&balance_key)?; - let post_balance: Option = - self.ctx.post().read(&balance_key)?; - - match (min_funds_parameter, pre_balance, post_balance) { - ( - Some(min_funds_parameter), - Some(pre_balance), - Some(post_balance), - ) => Ok(post_balance > pre_balance - && post_balance - pre_balance >= min_funds_parameter), - (Some(min_funds_parameter), None, Some(post_balance)) => { - Ok(post_balance >= min_funds_parameter) - } - _ => Ok(false), + + let min_funds_parameter: token::Amount = + self.force_read(&min_funds_parameter_key, ReadType::Pre)?; + let post_balance: token::Amount = + self.force_read(&balance_key, ReadType::Post)?; + + if let Some(pre_balance) = pre_balance { + Ok(post_balance > pre_balance + && post_balance - pre_balance >= min_funds_parameter) + } else { + Ok(post_balance >= min_funds_parameter) } } @@ -558,70 +529,61 @@ where let author_key = gov_storage::get_author_key(proposal_id); let has_pre_author = self.ctx.has_key_pre(&author_key)?; - if has_pre_author { return Ok(false); } - let author = self.ctx.post().read(&author_key)?; + let author = self.force_read(&author_key, ReadType::Post)?; match author { - Some(author) => match author { - Address::Established(_) => { - let address_exist_key = Key::validity_predicate(&author); - let address_exist = - self.ctx.has_key_post(&address_exist_key)?; + Address::Established(_) => { + let address_exist_key = Key::validity_predicate(&author); + let address_exist = + self.ctx.has_key_post(&address_exist_key)?; - Ok(address_exist && verifiers.contains(&author)) - } - Address::Implicit(_) => Ok(verifiers.contains(&author)), - Address::Internal(_) => Ok(false), - }, - _ => Ok(false), + Ok(address_exist && verifiers.contains(&author)) + } + Address::Implicit(_) => Ok(verifiers.contains(&author)), + Address::Internal(_) => Ok(false), } } /// Validate a counter key pub fn is_valid_counter(&self, set_count: u64) -> Result { let counter_key = gov_storage::get_counter_key(); - let pre_counter: Option = self.ctx.pre().read(&counter_key)?; - let post_counter: Option = self.ctx.post().read(&counter_key)?; + let pre_counter: u64 = self.force_read(&counter_key, ReadType::Pre)?; + let post_counter: u64 = + self.force_read(&counter_key, ReadType::Post)?; - match (pre_counter, post_counter) { - (Some(pre_counter), Some(post_counter)) => { - Ok(pre_counter + set_count == post_counter) - } - _ => Ok(false), - } + Ok(pre_counter + set_count == post_counter) } /// Validate a commit key pub fn is_valid_proposal_commit(&self) -> Result { let counter_key = gov_storage::get_counter_key(); - let pre_counter: Option = self.ctx.pre().read(&counter_key)?; - let post_counter: Option = self.ctx.post().read(&counter_key)?; - - match (pre_counter, post_counter) { - (Some(pre_counter), Some(post_counter)) => { - // NOTE: can't do pre_counter + set_count == post_counter here - // because someone may update an empty proposal that just - // register a committing key causing a bug - Ok(pre_counter < post_counter) - } - _ => Ok(false), - } + let pre_counter: u64 = self.force_read(&counter_key, ReadType::Pre)?; + let post_counter: u64 = + self.force_read(&counter_key, ReadType::Post)?; + + // NOTE: can't do pre_counter + set_count == post_counter here + // because someone may update an empty proposal that just + // register a committing key causing a bug + Ok(pre_counter < post_counter) } /// Validate a governance parameter - pub fn is_valid_parameter(&self, tx_data: &[u8]) -> Result { - utils::is_proposal_accepted(&self.ctx.pre(), tx_data) - .map_err(Error::NativeVpError) + pub fn is_valid_parameter(&self, tx: &Tx) -> Result { + match tx.data() { + Some(data) => is_proposal_accepted(&self.ctx.pre(), data.as_ref()) + .map_err(Error::NativeVpError), + None => Ok(true), + } } /// Check if a vote is from a validator pub fn is_validator( &self, - epoch: Epoch, + _epoch: Epoch, verifiers: &BTreeSet
, address: &Address, delegation_address: &Address, @@ -631,23 +593,47 @@ where H: 'static + storage::StorageHasher, CA: 'static + WasmCacheAccess, { - let all_validators = - pos::namada_proof_of_stake::read_all_validator_addresses( - &self.ctx.pre(), - epoch, - )?; - if !all_validators.is_empty() { - let is_voter_validator = all_validators - .into_iter() - .any(|validator| validator.eq(address)); - let is_signer_validator = verifiers.contains(address); - let is_delegation_address = delegation_address.eq(address); - - Ok(is_voter_validator - && is_signer_validator - && is_delegation_address) + if !address.eq(delegation_address) { + return Ok(false); + } + + let is_validator = is_validator(&self.ctx.pre(), address)?; + + Ok(is_validator && verifiers.contains(address)) + } + + /// Private method to read from storage data that are 100% in storage. + fn force_read(&self, key: &Key, read_type: ReadType) -> Result + where + T: BorshDeserialize, + { + let res = match read_type { + ReadType::Pre => self.ctx.pre().read::(key), + ReadType::Post => self.ctx.post().read::(key), + }?; + + if let Some(data) = res { + Ok(data) } else { - Ok(false) + Err(Error::EmptyProposalField(key.to_string())) + } + } + + fn is_valid_voting_window( + &self, + current_epoch: Epoch, + start_epoch: Epoch, + end_epoch: Epoch, + is_validator: bool, + ) -> bool { + if is_validator { + is_valid_validator_voting_period( + current_epoch, + start_epoch, + end_epoch, + ) + } else { + current_epoch >= start_epoch && current_epoch <= end_epoch } } @@ -659,10 +645,6 @@ where address: &Address, delegation_address: &Address, ) -> Result { - // let bond_key = pos::bond_key(&BondId { - // source: address.clone(), - // validator: delegation_address.clone(), - // }); let bond_handle = pos::namada_proof_of_stake::bond_handle( address, delegation_address, @@ -670,7 +652,6 @@ where let params = pos::namada_proof_of_stake::read_pos_params(&self.ctx.pre())?; let bond = bond_handle.get_sum(&self.ctx.pre(), epoch, ¶ms)?; - // let bonds: Option = self.ctx.pre().read(&bond_key)?; if bond.is_some() && verifiers.contains(address) { Ok(true) @@ -681,7 +662,7 @@ where } #[allow(clippy::upper_case_acronyms)] -#[derive(Clone, Debug)] +#[derive(Debug)] enum KeyType { #[allow(non_camel_case_types)] COUNTER, diff --git a/shared/src/ledger/governance/utils.rs b/shared/src/ledger/governance/utils.rs new file mode 100644 index 00000000000..d4b4d1316c4 --- /dev/null +++ b/shared/src/ledger/governance/utils.rs @@ -0,0 +1,122 @@ +//! Governance utility functions + +use std::collections::HashMap; + +use namada_core::ledger::governance::utils::TallyResult; +use thiserror::Error; + +use crate::ledger::events::EventType; + +pub(super) enum ReadType { + Pre, + Post, +} + +/// Proposal errors +#[derive(Error, Debug)] +pub enum Error { + /// Invalid validator set deserialization + #[error("Invalid validator set")] + InvalidValidatorSet, + /// Invalid proposal field deserialization + #[error("Invalid proposal {0}")] + InvalidProposal(u64), + /// Error during tally + #[error("Error while tallying proposal: {0}")] + Tally(String), +} + +/// Proposal event definition +pub struct ProposalEvent { + /// Proposal event type + pub event_type: String, + /// Proposal event attributes + pub attributes: HashMap, +} + +impl ProposalEvent { + /// Create a proposal event + pub fn new( + event_type: String, + tally: TallyResult, + id: u64, + has_proposal_code: bool, + proposal_code_exit_status: bool, + ) -> Self { + let attributes = HashMap::from([ + ("tally_result".to_string(), tally.to_string()), + ("proposal_id".to_string(), id.to_string()), + ( + "has_proposal_code".to_string(), + (!has_proposal_code as u64).to_string(), + ), + ( + "proposal_code_exit_status".to_string(), + (!proposal_code_exit_status as u64).to_string(), + ), + ]); + Self { + event_type, + attributes, + } + } + + /// Create a new proposal event for rejected proposal + pub fn rejected_proposal_event(proposal_id: u64) -> Self { + ProposalEvent::new( + EventType::Proposal.to_string(), + TallyResult::Rejected, + proposal_id, + false, + false, + ) + } + + /// Create a new proposal event for default proposal + pub fn default_proposal_event( + proposal_id: u64, + has_code: bool, + execution_status: bool, + ) -> Self { + ProposalEvent::new( + EventType::Proposal.to_string(), + TallyResult::Passed, + proposal_id, + has_code, + execution_status, + ) + } + + /// Create a new proposal event for pgf stewards proposal + pub fn pgf_steward_proposal_event(proposal_id: u64, result: bool) -> Self { + ProposalEvent::new( + EventType::Proposal.to_string(), + TallyResult::Passed, + proposal_id, + false, + result, + ) + } + + /// Create a new proposal event for pgf payments proposal + pub fn pgf_payments_proposal_event(proposal_id: u64, result: bool) -> Self { + ProposalEvent::new( + EventType::Proposal.to_string(), + TallyResult::Passed, + proposal_id, + false, + result, + ) + } + + /// Create a new proposal event for eth proposal + pub fn eth_proposal_event(proposal_id: u64, result: bool) -> Self { + ProposalEvent::new( + EventType::Proposal.to_string(), + TallyResult::Passed, + proposal_id, + false, + result, + ) + } +} diff --git a/shared/src/ledger/ibc/vp/mod.rs b/shared/src/ledger/ibc/vp/mod.rs index bab039212a6..ec106880667 100644 --- a/shared/src/ledger/ibc/vp/mod.rs +++ b/shared/src/ledger/ibc/vp/mod.rs @@ -298,25 +298,30 @@ mod tests { use super::super::storage::{ ack_key, calc_hash, channel_counter_key, channel_key, client_connections_key, client_counter_key, client_state_key, - client_type_key, client_update_height_key, client_update_timestamp_key, - commitment_key, connection_counter_key, connection_key, - consensus_state_key, ibc_denom_key, next_sequence_ack_key, - next_sequence_recv_key, next_sequence_send_key, receipt_key, + client_update_height_key, client_update_timestamp_key, commitment_key, + connection_counter_key, connection_key, consensus_state_key, + ibc_denom_key, next_sequence_ack_key, next_sequence_recv_key, + next_sequence_send_key, receipt_key, }; use super::{get_dummy_header, *}; use crate::core::ledger::storage::testing::TestWlStorage; - use crate::core::types::address::testing::established_address_1; + use crate::core::types::address::testing::{ + established_address_1, established_address_2, + }; use crate::core::types::address::{nam, InternalAddress}; use crate::core::types::storage::Epoch; use crate::ibc::applications::transfer::acknowledgement::TokenTransferAcknowledgement; use crate::ibc::applications::transfer::coin::PrefixedCoin; use crate::ibc::applications::transfer::denom::TracePrefix; use crate::ibc::applications::transfer::events::{ - AckEvent, DenomTraceEvent, TimeoutEvent, TransferEvent, + AckEvent, DenomTraceEvent, RecvEvent, TimeoutEvent, TransferEvent, }; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc::applications::transfer::packet::PacketData; use crate::ibc::applications::transfer::VERSION; + use crate::ibc::core::events::{ + IbcEvent as RawIbcEvent, MessageEvent, ModuleEvent, + }; use crate::ibc::core::ics02_client::client_state::ClientState; use crate::ibc::core::ics02_client::events::{CreateClient, UpdateClient}; use crate::ibc::core::ics02_client::msgs::create_client::MsgCreateClient; @@ -345,36 +350,30 @@ mod tests { OpenTry as ChanOpenTry, ReceivePacket, SendPacket, TimeoutPacket, WriteAcknowledgement, }; - use crate::ibc::core::ics04_channel::msgs::acknowledgement::{ - Acknowledgement, MsgAcknowledgement, + use crate::ibc::core::ics04_channel::msgs::{ + MsgAcknowledgement, MsgChannelOpenAck, MsgChannelOpenConfirm, + MsgChannelOpenInit, MsgChannelOpenTry, MsgRecvPacket, MsgTimeout, + MsgTimeoutOnClose, + }; + use crate::ibc::core::ics04_channel::packet::{ + Acknowledgement, Packet, Sequence, }; - use crate::ibc::core::ics04_channel::msgs::chan_open_ack::MsgChannelOpenAck; - use crate::ibc::core::ics04_channel::msgs::chan_open_confirm::MsgChannelOpenConfirm; - use crate::ibc::core::ics04_channel::msgs::chan_open_init::MsgChannelOpenInit; - use crate::ibc::core::ics04_channel::msgs::chan_open_try::MsgChannelOpenTry; - use crate::ibc::core::ics04_channel::msgs::recv_packet::MsgRecvPacket; - use crate::ibc::core::ics04_channel::msgs::timeout::MsgTimeout; - use crate::ibc::core::ics04_channel::msgs::timeout_on_close::MsgTimeoutOnClose; - use crate::ibc::core::ics04_channel::packet::{Packet, Sequence}; use crate::ibc::core::ics04_channel::timeout::TimeoutHeight; use crate::ibc::core::ics04_channel::Version as ChanVersion; use crate::ibc::core::ics23_commitment::commitment::{ CommitmentPrefix, CommitmentProofBytes, }; use crate::ibc::core::ics24_host::identifier::{ - ChannelId, ClientId, ConnectionId, PortChannelId, PortId, + ChannelId, ClientId, ConnectionId, PortId, }; - use crate::ibc::events::{IbcEvent as RawIbcEvent, ModuleEvent}; + use crate::ibc::core::timestamp::Timestamp; + use crate::ibc::core::Msg; use crate::ibc::mock::client_state::{ client_type, MockClientState, MOCK_CLIENT_TYPE, }; use crate::ibc::mock::consensus_state::MockConsensusState; use crate::ibc::mock::header::MockHeader; - use crate::ibc::signer::Signer; - use crate::ibc::timestamp::Timestamp; - use crate::ibc::tx_msg::Msg; use crate::ibc::Height; - use crate::ibc_proto::cosmos::base::v1beta1::Coin; use crate::ibc_proto::google::protobuf::Any; use crate::ibc_proto::ibc::core::connection::v1::MsgConnectionOpenTry as RawMsgConnectionOpenTry; use crate::ibc_proto::protobuf::Protobuf; @@ -447,12 +446,6 @@ mod tests { fn insert_init_client(wl_storage: &mut TestWlStorage) { // insert a mock client type let client_id = get_client_id(); - let client_type_key = client_type_key(&client_id); - let client_type = client_type().as_str().as_bytes().to_vec(); - wl_storage - .write_log - .write(&client_type_key, client_type) - .expect("write failed"); // insert a mock client state let client_state_key = client_state_key(&get_client_id()); let height = Height::new(0, 1).unwrap(); @@ -461,8 +454,7 @@ mod tests { timestamp: Timestamp::now(), }; let client_state = MockClientState::new(header); - let bytes = Protobuf::::encode_vec(&client_state) - .expect("encoding failed"); + let bytes = Protobuf::::encode_vec(&client_state); wl_storage .write_log .write(&client_state_key, bytes) @@ -470,8 +462,7 @@ mod tests { // insert a mock consensus state let consensus_key = consensus_state_key(&client_id, height); let consensus_state = MockConsensusState::new(header); - let bytes = Protobuf::::encode_vec(&consensus_state) - .expect("encoding failed"); + let bytes = Protobuf::::encode_vec(&consensus_state); wl_storage .write_log .write(&consensus_key, bytes) @@ -499,10 +490,7 @@ mod tests { Height::new(0, host_height.0).expect("invalid height"); wl_storage .write_log - .write( - &client_update_height_key, - host_height.encode_vec().expect("encoding failed"), - ) + .write(&client_update_height_key, host_height.encode_vec()) .expect("write failed"); wl_storage.write_log.commit_tx(); } @@ -511,13 +499,6 @@ mod tests { ConnectionId::new(0) } - fn get_port_channel_id() -> PortChannelId { - PortChannelId { - port_id: get_port_id(), - channel_id: get_channel_id(), - } - } - fn get_port_id() -> PortId { PortId::transfer() } @@ -534,6 +515,7 @@ mod tests { vec![ConnVersion::default()], Duration::new(0, 0), ) + .unwrap() } fn get_conn_counterparty() -> ConnCounterparty { @@ -557,6 +539,7 @@ mod tests { vec![get_connection_id()], ChanVersion::new(VERSION.to_string()), ) + .unwrap() } fn get_channel_counterparty() -> ChanCounterparty { @@ -603,14 +586,7 @@ mod tests { sequence: Sequence, counterparty: &ChanCounterparty, ) -> Packet { - let coin: PrefixedCoin = - msg.token.clone().try_into().expect("invalid token"); - let packet_data = PacketData { - token: coin, - sender: msg.sender.clone(), - receiver: msg.receiver.clone(), - }; - let data = serde_json::to_vec(&packet_data) + let data = serde_json::to_vec(&msg.packet_data) .expect("Encoding PacketData failed"); Packet { @@ -660,27 +636,17 @@ mod tests { timestamp: Timestamp::now(), }; let client_id = get_client_id(); - // client type - let client_type_key = client_type_key(&client_id); - let client_type = client_type(); - let bytes = client_type.as_str().as_bytes().to_vec(); - wl_storage - .write_log - .write(&client_type_key, bytes) - .expect("write failed"); - keys_changed.insert(client_type_key); // message let client_state = MockClientState::new(header); let consensus_state = MockConsensusState::new(header); let msg = MsgCreateClient { client_state: client_state.into(), consensus_state: consensus_state.clone().into(), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // client state let client_state_key = client_state_key(&get_client_id()); - let bytes = Protobuf::::encode_vec(&client_state) - .expect("encoding failed"); + let bytes = Protobuf::::encode_vec(&client_state); wl_storage .write_log .write(&client_state_key, bytes) @@ -688,8 +654,7 @@ mod tests { keys_changed.insert(client_state_key); // client consensus let consensus_key = consensus_state_key(&client_id, height); - let bytes = Protobuf::::encode_vec(&consensus_state) - .expect("encoding failed"); + let bytes = Protobuf::::encode_vec(&consensus_state); wl_storage .write_log .write(&consensus_key, bytes) @@ -720,10 +685,7 @@ mod tests { Height::new(0, host_height.0).expect("invalid height"); wl_storage .write_log - .write( - &client_update_height_key, - host_height.encode_vec().expect("encoding failed"), - ) + .write(&client_update_height_key, host_height.encode_vec()) .expect("write failed"); keys_changed.insert(client_update_height_key); // client counter @@ -733,10 +695,10 @@ mod tests { let event = RawIbcEvent::CreateClient(CreateClient::new( client_id, - client_type, + client_type(), client_state.latest_height(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Client); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -753,7 +715,7 @@ mod tests { wasm::compilation_cache::common::testing::cache(); let verifiers = BTreeSet::new(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = wl_storage.storage.chain_id.clone(); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new(tx_data)); @@ -803,23 +765,22 @@ mod tests { height, timestamp: Timestamp::now(), }; - let client_id = get_client_id(); - // insert only client type - let client_type_key = client_type_key(&client_id); - let client_type = client_type(); - let bytes = client_type.as_str().as_bytes().to_vec(); + // insert only client state + let client_state = MockClientState::new(header); + let client_state_key = client_state_key(&get_client_id()); + let bytes = Protobuf::::encode_vec(&client_state); wl_storage .write_log - .write(&client_type_key, bytes) + .write(&client_state_key, bytes) .expect("write failed"); - keys_changed.insert(client_type_key); + keys_changed.insert(client_state_key); let client_state = MockClientState::new(header); let consensus_state = MockConsensusState::new(header); // make a correct message let msg = MsgCreateClient { client_state: client_state.into(), consensus_state: consensus_state.into(), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; let tx_index = TxIndex::default(); @@ -827,14 +788,10 @@ mod tests { let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = @@ -891,12 +848,11 @@ mod tests { let msg = MsgUpdateClient { client_id: client_id.clone(), header: header.into(), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // client state let client_state = MockClientState::new(header); - let bytes = Protobuf::::encode_vec(&client_state) - .expect("encoding failed"); + let bytes = Protobuf::::encode_vec(&client_state); wl_storage .write_log .write(&client_state_key, bytes) @@ -905,8 +861,7 @@ mod tests { // consensus state let consensus_key = consensus_state_key(&client_id, height); let consensus_state = MockConsensusState::new(header); - let bytes = Protobuf::::encode_vec(&consensus_state) - .expect("encoding failed"); + let bytes = Protobuf::::encode_vec(&consensus_state); wl_storage .write_log .write(&consensus_key, bytes) @@ -937,10 +892,7 @@ mod tests { Height::new(0, host_height.0).expect("invalid height"); wl_storage .write_log - .write( - &client_update_height_key, - host_height.encode_vec().expect("encoding failed"), - ) + .write(&client_update_height_key, host_height.encode_vec()) .expect("write failed"); keys_changed.insert(client_update_height_key); // event @@ -952,7 +904,7 @@ mod tests { vec![consensus_height], header.into(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Client); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -965,14 +917,10 @@ mod tests { let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = @@ -1023,7 +971,7 @@ mod tests { counterparty, version: Some(ConnVersion::default()), delay_period: Duration::new(100, 0), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // insert an INIT connection @@ -1035,8 +983,9 @@ mod tests { msg.counterparty.clone(), vec![msg.version.clone().unwrap()], msg.delay_period, - ); - let bytes = conn.encode_vec().expect("encoding failed"); + ) + .expect("invalid connection"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1061,7 +1010,7 @@ mod tests { msg.client_id_on_a.clone(), msg.counterparty.client_id().clone(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Connection); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -1073,7 +1022,7 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = wl_storage.storage.chain_id.clone(); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new(tx_data)); @@ -1130,7 +1079,7 @@ mod tests { counterparty, version: Some(ConnVersion::default()), delay_period: Duration::new(100, 0), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // insert an Init connection @@ -1142,8 +1091,9 @@ mod tests { msg.counterparty.clone(), vec![msg.version.clone().unwrap()], msg.delay_period, - ); - let bytes = conn.encode_vec().expect("encoding failed"); + ) + .expect("invalid connection"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1169,14 +1119,10 @@ mod tests { let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = @@ -1258,8 +1204,9 @@ mod tests { msg.counterparty.clone(), msg.versions_on_a.clone(), msg.delay_period, - ); - let bytes = conn.encode_vec().expect("encoding failed"); + ) + .expect("invalid connection"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1285,7 +1232,7 @@ mod tests { msg.counterparty.connection_id().cloned().unwrap(), msg.counterparty.client_id().clone(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Connection); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -1297,14 +1244,12 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); + let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = wasm::compilation_cache::common::testing::cache(); @@ -1338,7 +1283,7 @@ mod tests { // insert an Init connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Init); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1357,7 +1302,7 @@ mod tests { // update the connection to Open let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1384,7 +1329,7 @@ mod tests { proofs_height_on_b: proof_height, consensus_height_of_a_on_b: client_state.latest_height(), version: ConnVersion::default(), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // event let event = RawIbcEvent::OpenAckConnection(ConnOpenAck::new( @@ -1393,7 +1338,7 @@ mod tests { msg.conn_id_on_b.clone(), counterparty.client_id().clone(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Connection); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -1405,7 +1350,7 @@ mod tests { let tx_index = TxIndex::default(); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = wl_storage.storage.chain_id.clone(); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new(tx_data)); @@ -1445,7 +1390,7 @@ mod tests { // insert a TryOpen connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::TryOpen); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1455,7 +1400,7 @@ mod tests { // update the connection to Open let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1468,7 +1413,7 @@ mod tests { conn_id_on_b: get_connection_id(), proof_conn_end_on_a: dummy_proof(), proof_height_on_a: proof_height, - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // event let counterparty = get_conn_counterparty(); @@ -1478,7 +1423,7 @@ mod tests { counterparty.connection_id().cloned().unwrap(), counterparty.client_id().clone(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Connection); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -1490,7 +1435,7 @@ mod tests { let tx_index = TxIndex::default(); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = wl_storage.storage.chain_id.clone(); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new(tx_data)); @@ -1531,7 +1476,7 @@ mod tests { let conn_id = get_connection_id(); let conn_key = connection_key(&conn_id); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1554,12 +1499,12 @@ mod tests { connection_hops_on_a: vec![conn_id.clone()], port_id_on_b: get_port_id(), ordering: Order::Unordered, - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), version_proposal: ChanVersion::new(VERSION.to_string()), }; // insert an Init channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let mut counterparty = get_channel_counterparty(); counterparty.channel_id = None; let channel = ChannelEnd::new( @@ -1568,8 +1513,9 @@ mod tests { counterparty.clone(), msg.connection_hops_on_a.clone(), msg.version_proposal.clone(), - ); - let bytes = channel.encode_vec().expect("encoding failed"); + ) + .unwrap(); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -1580,15 +1526,15 @@ mod tests { increment_counter(&mut wl_storage, &chan_counter_key); keys_changed.insert(chan_counter_key); // sequences - let port_channel_id = - PortChannelId::new(get_channel_id(), msg.port_id_on_a.clone()); - let send_key = next_sequence_send_key(&port_channel_id); + let channel_id = get_channel_id(); + let port_id = msg.port_id_on_a.clone(); + let send_key = next_sequence_send_key(&port_id, &channel_id); increment_counter(&mut wl_storage, &send_key); keys_changed.insert(send_key); - let recv_key = next_sequence_recv_key(&port_channel_id); + let recv_key = next_sequence_recv_key(&port_id, &channel_id); increment_counter(&mut wl_storage, &recv_key); keys_changed.insert(recv_key); - let ack_key = next_sequence_ack_key(&port_channel_id); + let ack_key = next_sequence_ack_key(&port_id, &channel_id); increment_counter(&mut wl_storage, &ack_key); keys_changed.insert(ack_key); // event @@ -1599,7 +1545,7 @@ mod tests { conn_id, msg.version_proposal.clone(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -1611,7 +1557,7 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = wl_storage.storage.chain_id.clone(); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new(tx_data)); @@ -1651,7 +1597,7 @@ mod tests { // insert an open connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) @@ -1682,15 +1628,14 @@ mod tests { proof_chan_end_on_a: dummy_proof(), proof_height_on_a: proof_height, ordering: Order::Unordered, - signer: Signer::from_str("account0").expect("invalid signer"), - previous_channel_id: ChannelId::default().to_string(), + signer: "account0".to_string().into(), version_proposal: ChanVersion::default(), }; // insert a TryOpen channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let channel = get_channel(ChanState::TryOpen, Order::Unordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -1701,15 +1646,15 @@ mod tests { increment_counter(&mut wl_storage, &chan_counter_key); keys_changed.insert(chan_counter_key); // sequences - let port_channel_id = - PortChannelId::new(get_channel_id(), msg.port_id_on_a.clone()); - let send_key = next_sequence_send_key(&port_channel_id); + let channel_id = get_channel_id(); + let port_id = msg.port_id_on_a.clone(); + let send_key = next_sequence_send_key(&port_id, &channel_id); increment_counter(&mut wl_storage, &send_key); keys_changed.insert(send_key); - let recv_key = next_sequence_recv_key(&port_channel_id); + let recv_key = next_sequence_recv_key(&port_id, &channel_id); increment_counter(&mut wl_storage, &recv_key); keys_changed.insert(recv_key); - let ack_key = next_sequence_ack_key(&port_channel_id); + let ack_key = next_sequence_ack_key(&port_id, &channel_id); increment_counter(&mut wl_storage, &ack_key); keys_changed.insert(ack_key); // event @@ -1721,7 +1666,7 @@ mod tests { conn_id, msg.version_supported_on_a.clone(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -1733,7 +1678,7 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = wl_storage.storage.chain_id.clone(); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new(tx_data)); @@ -1773,15 +1718,15 @@ mod tests { // insert an open connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) .expect("write failed"); // insert an Init channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let channel = get_channel(ChanState::Init, Order::Unordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -1808,12 +1753,12 @@ mod tests { version_on_b: ChanVersion::new(VERSION.to_string()), proof_chan_end_on_b: dummy_proof(), proof_height_on_b: proof_height, - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // update the channel to Open let channel = get_channel(ChanState::Open, Order::Unordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -1827,7 +1772,7 @@ mod tests { counterparty.channel_id().cloned().unwrap(), get_connection_id(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -1839,7 +1784,7 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = wl_storage.storage.chain_id.clone(); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new(tx_data)); @@ -1879,15 +1824,15 @@ mod tests { // insert an open connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) .expect("write failed"); // insert a TryOpen channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let channel = get_channel(ChanState::TryOpen, Order::Ordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -1911,12 +1856,12 @@ mod tests { chan_id_on_b: get_channel_id(), proof_chan_end_on_a: dummy_proof(), proof_height_on_a: proof_height, - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // update the channel to Open let channel = get_channel(ChanState::Open, Order::Ordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -1931,7 +1876,7 @@ mod tests { counterparty.channel_id().cloned().unwrap(), get_connection_id(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -1943,14 +1888,12 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); + let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = wasm::compilation_cache::common::testing::cache(); @@ -1986,15 +1929,15 @@ mod tests { // insert an open connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) .expect("write failed"); // insert an Open channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let channel = get_channel(ChanState::Open, Order::Unordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -2023,19 +1966,21 @@ mod tests { let msg = MsgTransfer { port_id_on_a: get_port_id(), chan_id_on_a: get_channel_id(), - token: Coin { - denom: nam().to_string(), - amount: 100u64.to_string(), + packet_data: PacketData { + token: PrefixedCoin { + denom: nam().to_string().parse().unwrap(), + amount: 100u64.into(), + }, + sender: sender.to_string().into(), + receiver: "receiver".to_string().into(), + memo: "memo".to_string().into(), }, - sender: Signer::from_str(&sender.to_string()) - .expect("invalid signer"), - receiver: Signer::from_str("receiver").expect("invalid signer"), - timeout_height_on_b: TimeoutHeight::Never, + timeout_height_on_b: TimeoutHeight::At(Height::new(0, 10).unwrap()), timeout_timestamp_on_b: Timestamp::none(), }; // the sequence send - let seq_key = next_sequence_send_key(&get_port_channel_id()); + let seq_key = next_sequence_send_key(&get_port_id(), &get_channel_id()); let sequence = get_next_seq(&wl_storage, &seq_key); wl_storage .write_log @@ -2056,10 +2001,13 @@ mod tests { keys_changed.insert(commitment_key); // event let transfer_event = TransferEvent { - sender: msg.sender.clone(), - receiver: msg.receiver.clone(), + sender: msg.packet_data.sender.clone(), + receiver: msg.packet_data.receiver.clone(), + amount: msg.packet_data.token.amount, + denom: msg.packet_data.token.denom.clone(), + memo: msg.packet_data.memo.clone(), }; - let event = RawIbcEvent::AppModule(ModuleEvent::from(transfer_event)); + let event = RawIbcEvent::Module(ModuleEvent::from(transfer_event)); wl_storage .write_log .emit_ibc_event(event.try_into().unwrap()); @@ -2068,7 +2016,7 @@ mod tests { Order::Unordered, get_connection_id(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -2080,14 +2028,12 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); + let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = wasm::compilation_cache::common::testing::cache(); @@ -2120,15 +2066,15 @@ mod tests { // insert an open connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) .expect("write failed"); // insert an open channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let channel = get_channel(ChanState::Open, Order::Unordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -2146,18 +2092,21 @@ mod tests { .unwrap(); // prepare data - let receiver = established_address_1(); + let sender = established_address_1(); + let receiver = established_address_2(); let transfer_msg = MsgTransfer { port_id_on_a: get_port_id(), chan_id_on_a: get_channel_id(), - token: Coin { - denom: nam().to_string(), - amount: 100u64.to_string(), + packet_data: PacketData { + token: PrefixedCoin { + denom: nam().to_string().parse().unwrap(), + amount: 100u64.into(), + }, + sender: sender.to_string().into(), + receiver: receiver.to_string().into(), + memo: "memo".to_string().into(), }, - sender: Signer::from_str("sender").expect("invalid signer"), - receiver: Signer::from_str(&receiver.to_string()) - .expect("invalid signer"), - timeout_height_on_b: TimeoutHeight::Never, + timeout_height_on_b: TimeoutHeight::At(Height::new(0, 10).unwrap()), timeout_timestamp_on_b: Timestamp::none(), }; let counterparty = get_channel_counterparty(); @@ -2171,7 +2120,7 @@ mod tests { packet: packet.clone(), proof_commitment_on_a: dummy_proof(), proof_height_on_a: Height::new(0, 1).unwrap(), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // the sequence send @@ -2201,8 +2150,7 @@ mod tests { .expect("write failed"); keys_changed.insert(ack_key); // denom - let mut coin: PrefixedCoin = - transfer_msg.token.try_into().expect("invalid token"); + let mut coin = transfer_msg.packet_data.token; coin.denom.add_trace_prefix(TracePrefix::new( packet.port_id_on_b.clone(), packet.chan_id_on_b.clone(), @@ -2216,12 +2164,23 @@ mod tests { .expect("write failed"); keys_changed.insert(denom_key); // event + let recv_event = RecvEvent { + sender: sender.to_string().into(), + receiver: receiver.to_string().into(), + denom: nam().to_string().parse().unwrap(), + amount: 100u64.into(), + memo: "memo".to_string().into(), + success: true, + }; + let event = RawIbcEvent::Module(ModuleEvent::from(recv_event)); + wl_storage + .write_log + .emit_ibc_event(event.try_into().unwrap()); let denom_trace_event = DenomTraceEvent { trace_hash: Some(trace_hash), denom: coin.denom, }; - let event = - RawIbcEvent::AppModule(ModuleEvent::from(denom_trace_event)); + let event = RawIbcEvent::Module(ModuleEvent::from(denom_trace_event)); wl_storage .write_log .emit_ibc_event(event.try_into().unwrap()); @@ -2230,7 +2189,7 @@ mod tests { Order::Unordered, get_connection_id(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -2243,7 +2202,7 @@ mod tests { acknowledgement, get_connection_id(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -2255,14 +2214,12 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); + let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = wasm::compilation_cache::common::testing::cache(); @@ -2295,15 +2252,15 @@ mod tests { // insert an open connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) .expect("write failed"); // insert an Open channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let channel = get_channel(ChanState::Open, Order::Unordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -2313,14 +2270,16 @@ mod tests { let transfer_msg = MsgTransfer { port_id_on_a: get_port_id(), chan_id_on_a: get_channel_id(), - token: Coin { - denom: nam().to_string(), - amount: 100u64.to_string(), + packet_data: PacketData { + token: PrefixedCoin { + denom: nam().to_string().parse().unwrap(), + amount: 100u64.into(), + }, + sender: sender.to_string().into(), + receiver: "receiver".to_string().into(), + memo: "memo".to_string().into(), }, - sender: Signer::from_str(&sender.to_string()) - .expect("invalid signer"), - receiver: Signer::from_str("receiver").expect("invalid signer"), - timeout_height_on_b: TimeoutHeight::Never, + timeout_height_on_b: TimeoutHeight::At(Height::new(0, 10).unwrap()), timeout_timestamp_on_b: Timestamp::none(), }; let sequence = 1.into(); @@ -2354,13 +2313,12 @@ mod tests { // prepare data let transfer_ack = TokenTransferAcknowledgement::success(); - let acknowledgement = Acknowledgement::from(transfer_ack.clone()); let msg = MsgAcknowledgement { packet: packet.clone(), - acknowledgement, + acknowledgement: transfer_ack.clone().into(), proof_acked_on_b: dummy_proof(), proof_height_on_b: Height::new(0, 1).unwrap(), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // delete the commitment @@ -2373,12 +2331,14 @@ mod tests { let data = serde_json::from_slice::(&packet.data) .expect("decoding packet data failed"); let ack_event = AckEvent { + sender: data.sender, receiver: data.receiver, denom: data.token.denom, amount: data.token.amount, + memo: data.memo, acknowledgement: transfer_ack, }; - let event = RawIbcEvent::AppModule(ModuleEvent::from(ack_event)); + let event = RawIbcEvent::Module(ModuleEvent::from(ack_event)); wl_storage .write_log .emit_ibc_event(event.try_into().unwrap()); @@ -2387,7 +2347,7 @@ mod tests { Order::Unordered, get_connection_id(), )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -2399,14 +2359,12 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); + let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = wasm::compilation_cache::common::testing::cache(); @@ -2439,15 +2397,15 @@ mod tests { // insert an open connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) .expect("write failed"); // insert an Open channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let channel = get_channel(ChanState::Open, Order::Unordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -2461,17 +2419,18 @@ mod tests { .write(&balance_key, amount.try_to_vec().unwrap()) .expect("write failed"); // commitment - let sender = established_address_1(); let transfer_msg = MsgTransfer { port_id_on_a: get_port_id(), chan_id_on_a: get_channel_id(), - token: Coin { - denom: nam().to_string(), - amount: 100u64.to_string(), + packet_data: PacketData { + token: PrefixedCoin { + denom: nam().to_string().parse().unwrap(), + amount: 100u64.into(), + }, + sender: established_address_1().to_string().into(), + receiver: "receiver".to_string().into(), + memo: "memo".to_string().into(), }, - sender: Signer::from_str(&sender.to_string()) - .expect("invalid signer"), - receiver: Signer::from_str("receiver").expect("invalid signer"), timeout_height_on_b: TimeoutHeight::Never, timeout_timestamp_on_b: (Timestamp::now() - Duration::new(10, 0)) .unwrap(), @@ -2511,7 +2470,7 @@ mod tests { next_seq_recv_on_b: sequence, proof_unreceived_on_b: dummy_proof(), proof_height_on_b: Height::new(0, 1).unwrap(), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // delete the commitment @@ -2527,8 +2486,9 @@ mod tests { refund_receiver: data.sender, refund_denom: data.token.denom, refund_amount: data.token.amount, + memo: data.memo, }; - let event = RawIbcEvent::AppModule(ModuleEvent::from(timeout_event)); + let event = RawIbcEvent::Module(ModuleEvent::from(timeout_event)); wl_storage .write_log .emit_ibc_event(event.try_into().unwrap()); @@ -2536,7 +2496,7 @@ mod tests { packet, Order::Unordered, )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -2548,14 +2508,12 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); + let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = wasm::compilation_cache::common::testing::cache(); @@ -2588,15 +2546,15 @@ mod tests { // insert an open connection let conn_key = connection_key(&get_connection_id()); let conn = get_connection(ConnState::Open); - let bytes = conn.encode_vec().expect("encoding failed"); + let bytes = conn.encode_vec(); wl_storage .write_log .write(&conn_key, bytes) .expect("write failed"); // insert an Open channel - let channel_key = channel_key(&get_port_channel_id()); + let channel_key = channel_key(&get_port_id(), &get_channel_id()); let channel = get_channel(ChanState::Open, Order::Unordered); - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); wl_storage .write_log .write(&channel_key, bytes) @@ -2614,14 +2572,16 @@ mod tests { let transfer_msg = MsgTransfer { port_id_on_a: get_port_id(), chan_id_on_a: get_channel_id(), - token: Coin { - denom: nam().to_string(), - amount: 100u64.to_string(), + packet_data: PacketData { + token: PrefixedCoin { + denom: nam().to_string().parse().unwrap(), + amount: 100u64.into(), + }, + sender: sender.to_string().into(), + receiver: "receiver".to_string().into(), + memo: "memo".to_string().into(), }, - sender: Signer::from_str(&sender.to_string()) - .expect("invalid signer"), - receiver: Signer::from_str("receiver").expect("invalid signer"), - timeout_height_on_b: TimeoutHeight::Never, + timeout_height_on_b: TimeoutHeight::At(Height::new(0, 10).unwrap()), timeout_timestamp_on_b: Timestamp::none(), }; let sequence = 1.into(); @@ -2660,7 +2620,7 @@ mod tests { proof_unreceived_on_b: dummy_proof(), proof_close_on_b: dummy_proof(), proof_height_on_b: Height::new(0, 1).unwrap(), - signer: Signer::from_str("account0").expect("invalid signer"), + signer: "account0".to_string().into(), }; // delete the commitment @@ -2676,8 +2636,9 @@ mod tests { refund_receiver: data.sender, refund_denom: data.token.denom, refund_amount: data.token.amount, + memo: data.memo, }; - let event = RawIbcEvent::AppModule(ModuleEvent::from(timeout_event)); + let event = RawIbcEvent::Module(ModuleEvent::from(timeout_event)); wl_storage .write_log .emit_ibc_event(event.try_into().unwrap()); @@ -2685,7 +2646,7 @@ mod tests { packet, Order::Unordered, )); - let message_event = RawIbcEvent::Message(event.event_type()); + let message_event = RawIbcEvent::Message(MessageEvent::Channel); wl_storage .write_log .emit_ibc_event(message_event.try_into().unwrap()); @@ -2697,14 +2658,12 @@ mod tests { let tx_code = vec![]; let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = wl_storage.storage.chain_id.clone(); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair_1(), - ))); + + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(keypair_1()); + let gas_meter = VpGasMeter::new(0); let (vp_wasm_cache, _vp_cache_dir) = wasm::compilation_cache::common::testing::cache(); diff --git a/shared/src/ledger/masp.rs b/shared/src/ledger/masp.rs index 8596ceca844..484fb348602 100644 --- a/shared/src/ledger/masp.rs +++ b/shared/src/ledger/masp.rs @@ -1,7 +1,6 @@ //! MASP verification wrappers. -use std::collections::hash_map::Entry; -use std::collections::{BTreeMap, HashMap, HashSet}; +use std::collections::{btree_map, BTreeMap, BTreeSet, HashMap, HashSet}; use std::env; use std::fmt::Debug; #[cfg(feature = "masp-tx-gen")] @@ -81,6 +80,17 @@ use crate::{display_line, edisplay_line}; /// the default OS specific path is used. pub const ENV_VAR_MASP_PARAMS_DIR: &str = "NAMADA_MASP_PARAMS_DIR"; +/// Env var to either "save" proofs into files or to "load" them from +/// files. +pub const ENV_VAR_MASP_TEST_PROOFS: &str = "NAMADA_MASP_TEST_PROOFS"; + +/// Randomness seed for MASP integration tests to build proofs with +/// deterministic rng. +pub const ENV_VAR_MASP_TEST_SEED: &str = "NAMADA_MASP_TEST_SEED"; + +/// A directory to save serialized proofs for tests. +pub const MASP_TEST_PROOFS_DIR: &str = "test_fixtures/masp_proofs"; + /// The network to use for MASP #[cfg(feature = "mainnet")] const NETWORK: MainNetwork = MainNetwork; @@ -95,6 +105,26 @@ pub const OUTPUT_NAME: &str = "masp-output.params"; /// Convert circuit name pub const CONVERT_NAME: &str = "masp-convert.params"; +/// Shielded transfer +#[derive(Clone, Debug, BorshSerialize, BorshDeserialize)] +pub struct ShieldedTransfer { + /// Shielded transfer builder + pub builder: Builder<(), (), ExtendedFullViewingKey, ()>, + /// MASP transaction + pub masp_tx: Transaction, + /// Metadata + pub metadata: SaplingMetadata, + /// Epoch in which the transaction was created + pub epoch: Epoch, +} + +#[derive(Clone, Copy, Debug)] +enum LoadOrSaveProofs { + Load, + Save, + Neither, +} + fn load_pvks() -> ( PreparedVerifyingKey, PreparedVerifyingKey, @@ -513,7 +543,7 @@ impl From for Amount { /// Represents the amount used of different conversions pub type Conversions = - HashMap, i128)>; + BTreeMap, i128)>; /// Represents the changes that were made to a list of transparent accounts pub type TransferDelta = HashMap; @@ -533,7 +563,7 @@ pub struct ShieldedContext { /// The commitment tree produced by scanning all transactions up to tx_pos pub tree: CommitmentTree, /// Maps viewing keys to applicable note positions - pub pos_map: HashMap>, + pub pos_map: HashMap>, /// Maps a nullifier to the note position to which it applies pub nf_map: HashMap, /// Maps note positions to their corresponding notes @@ -659,7 +689,7 @@ impl ShieldedContext { ..Default::default() }; for vk in unknown_keys { - tx_ctx.pos_map.entry(vk).or_insert_with(HashSet::new); + tx_ctx.pos_map.entry(vk).or_insert_with(BTreeSet::new); } // Update this unknown shielded context until it is level with self while tx_ctx.last_txidx != self.last_txidx { @@ -933,7 +963,9 @@ impl ShieldedContext { asset_type: AssetType, conversions: &'a mut Conversions, ) { - if let Entry::Vacant(conv_entry) = conversions.entry(asset_type) { + if let btree_map::Entry::Vacant(conv_entry) = + conversions.entry(asset_type) + { // Query for the ID of the last accepted transaction if let Some((addr, denom, ep, conv, path)) = query_conversion(client, asset_type).await @@ -964,7 +996,7 @@ impl ShieldedContext { client, balance, target_epoch, - HashMap::new(), + BTreeMap::new(), ) .await .0; @@ -1147,7 +1179,7 @@ impl ShieldedContext { Conversions, ) { // Establish connection with which to do exchange rate queries - let mut conversions = HashMap::new(); + let mut conversions = BTreeMap::new(); let mut val_acc = Amount::zero(); let mut notes = Vec::new(); // Retrieve the notes that can be spent by this key @@ -1295,7 +1327,7 @@ impl ShieldedContext { client, amount, ep, - HashMap::new(), + BTreeMap::new(), ) .await .0; @@ -1367,16 +1399,17 @@ impl ShieldedContext { args: &args::TxTransfer, shielded_gas: bool, ) -> Result< - Option<( - Builder<(), (), ExtendedFullViewingKey, ()>, - Transaction, - SaplingMetadata, - Epoch, - )>, + Option, builder::Error, > { // No shielded components are needed when neither source nor destination // are shielded + + use std::str::FromStr; + + use rand::rngs::StdRng; + use rand_core::SeedableRng; + let spending_key = args.source.spending_key(); let payment_address = args.target.payment_address(); // No shielded components are needed when neither source nor @@ -1398,8 +1431,27 @@ impl ShieldedContext { // possesion let memo = MemoBytes::empty(); + // Try to get a seed from env var, if any. + let rng = if let Ok(seed) = + env::var(ENV_VAR_MASP_TEST_SEED).map(|seed| { + let exp_str = + format!("Env var {ENV_VAR_MASP_TEST_SEED} must be a u64."); + let parsed_seed: u64 = + FromStr::from_str(&seed).expect(&exp_str); + parsed_seed + }) { + tracing::warn!( + "UNSAFE: Using a seed from {ENV_VAR_MASP_TEST_SEED} env var \ + to build proofs." + ); + StdRng::seed_from_u64(seed) + } else { + StdRng::from_rng(OsRng).unwrap() + }; + // Now we build up the transaction within this object - let mut builder = Builder::::new(NETWORK, 1.into()); + let mut builder = + Builder::::new_with_rng(NETWORK, 1.into(), rng); // break up a transfer into a number of transfers with suitable // denominations @@ -1413,13 +1465,13 @@ impl ShieldedContext { let tx_fee = // If there are shielded inputs if let Some(sk) = spending_key { - let InputAmount::Validated(fee) = args.tx.fee_amount else { + let InputAmount::Validated(fee) = args.tx.gas_amount else { unreachable!("The function `gen_shielded_transfer` is only called by `submit_tx` which validates amounts.") }; // Transaction fees need to match the amount in the wrapper Transfer // when MASP source is used let (_, shielded_fee) = - convert_amount(epoch, &args.tx.fee_token, fee.amount); + convert_amount(epoch, &args.tx.gas_token, fee.amount); let required_amt = if shielded_gas { amount + shielded_fee.clone() } else { @@ -1558,16 +1610,81 @@ impl ShieldedContext { } } - // Build and return the constructed transaction - builder - .clone() - .build( + // To speed up integration tests, we can save and load proofs + let load_or_save = if let Ok(masp_proofs) = + env::var(ENV_VAR_MASP_TEST_PROOFS) + { + let parsed = match masp_proofs.to_ascii_lowercase().as_str() { + "load" => LoadOrSaveProofs::Load, + "save" => LoadOrSaveProofs::Save, + env_var => panic!( + "Unexpected value for {ENV_VAR_MASP_TEST_PROOFS} env var. \ + Expecting \"save\" or \"load\", but got \"{env_var}\"." + ), + }; + if env::var(ENV_VAR_MASP_TEST_SEED).is_err() { + panic!( + "Ensure to set a seed with {ENV_VAR_MASP_TEST_SEED} env \ + var when using {ENV_VAR_MASP_TEST_PROOFS} for \ + deterministic proofs." + ); + } + parsed + } else { + LoadOrSaveProofs::Neither + }; + + let builder_clone = builder.clone().map_builder(WalletMap); + let builder_bytes = BorshSerialize::try_to_vec(&builder_clone).unwrap(); + let builder_hash = + namada_core::types::hash::Hash::sha256(&builder_bytes); + let saved_filepath = env::current_dir() + .unwrap() + // One up from "tests" dir to the root dir + .parent() + .unwrap() + .join(MASP_TEST_PROOFS_DIR) + .join(format!("{builder_hash}.bin")); + + if let LoadOrSaveProofs::Load = load_or_save { + let recommendation = format!( + "Re-run the tests with {ENV_VAR_MASP_TEST_PROOFS}=save to \ + re-generate proofs." + ); + let exp_str = format!( + "Read saved MASP proofs from {}. {recommendation}", + saved_filepath.to_string_lossy() + ); + let loaded_bytes = + tokio::fs::read(&saved_filepath).await.expect(&exp_str); + let exp_str = format!( + "Valid `ShieldedTransfer` bytes in {}. {recommendation}", + saved_filepath.to_string_lossy() + ); + let loaded: ShieldedTransfer = + BorshDeserialize::try_from_slice(&loaded_bytes) + .expect(&exp_str); + Ok(Some(loaded)) + } else { + // Build and return the constructed transaction + let (masp_tx, metadata) = builder.build( &self.utils.local_tx_prover(), &FeeRule::non_standard(tx_fee), - ) - .map(|(tx, metadata)| { - Some((builder.map_builder(WalletMap), tx, metadata, epoch)) - }) + )?; + let built = ShieldedTransfer { + builder: builder_clone, + masp_tx, + metadata, + epoch, + }; + if let LoadOrSaveProofs::Save = load_or_save { + let built_bytes = BorshSerialize::try_to_vec(&built).unwrap(); + tokio::fs::write(&saved_filepath, built_bytes) + .await + .unwrap(); + } + Ok(Some(built)) + } } /// Obtain the known effects of all accepted shielded and transparent diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index 399f75f800b..a5b2a06819e 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -3,10 +3,12 @@ pub mod args; pub mod eth_bridge; pub mod events; +pub mod governance; pub mod ibc; pub mod inflation; pub mod masp; pub mod native_vp; +pub mod pgf; pub mod pos; #[cfg(all(feature = "wasm-runtime", feature = "ferveo-tpke"))] pub mod protocol; @@ -20,5 +22,5 @@ pub mod vp_host_fns; pub mod wallet; pub use namada_core::ledger::{ - gas, governance, parameters, replay_protection, storage_api, tx_env, vp_env, + gas, parameters, replay_protection, storage_api, tx_env, vp_env, }; diff --git a/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs b/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs index a63b2529558..323633b563f 100644 --- a/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs @@ -355,7 +355,6 @@ mod test_bridge_pool_vp { use crate::ledger::storage::write_log::WriteLog; use crate::ledger::storage::{Storage, WlStorage}; use crate::ledger::storage_api::StorageWrite; - use crate::proto::Data; use crate::types::address::{nam, wnam}; use crate::types::chain::ChainId; use crate::types::eth_bridge_pool::{GasFee, TransferToEthereum}; @@ -566,7 +565,7 @@ mod test_bridge_pool_vp { { // setup let mut wl_storage = setup_storage(); - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); // the transfer to be added to the pool let transfer = PendingTransfer { @@ -622,8 +621,8 @@ mod test_bridge_pool_vp { ), }; - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(transfer.try_to_vec().expect("Test failed"))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_data(transfer); let res = vp.validate_tx(&tx, &keys_changed, &verifiers); match expect { @@ -905,7 +904,7 @@ mod test_bridge_pool_vp { fn test_adding_transfer_twice_fails() { // setup let mut wl_storage = setup_storage(); - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); // the transfer to be added to the pool let transfer = initial_pool(); @@ -960,8 +959,8 @@ mod test_bridge_pool_vp { ), }; - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(transfer.try_to_vec().expect("Test failed"))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_data(transfer); let res = vp.validate_tx(&tx, &keys_changed, &verifiers); assert!(!res.expect("Test failed")); @@ -973,7 +972,7 @@ mod test_bridge_pool_vp { fn test_zero_gas_fees_rejected() { // setup let mut wl_storage = setup_storage(); - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); // the transfer to be added to the pool let transfer = PendingTransfer { @@ -1022,8 +1021,8 @@ mod test_bridge_pool_vp { ), }; - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(transfer.try_to_vec().expect("Test failed"))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_data(transfer); let res = vp .validate_tx(&tx, &keys_changed, &verifiers) @@ -1039,7 +1038,7 @@ mod test_bridge_pool_vp { let mut wl_storage = setup_storage(); let eb_account_key = balance_key(&nam(), &Address::Internal(InternalAddress::EthBridge)); - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); // the transfer to be added to the pool let transfer = PendingTransfer { @@ -1108,8 +1107,8 @@ mod test_bridge_pool_vp { ), }; - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(transfer.try_to_vec().expect("Test failed"))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_data(transfer); let res = vp .validate_tx(&tx, &keys_changed, &verifiers) @@ -1124,7 +1123,7 @@ mod test_bridge_pool_vp { fn test_reject_mint_wnam() { // setup let mut wl_storage = setup_storage(); - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); let eb_account_key = balance_key(&nam(), &Address::Internal(InternalAddress::EthBridge)); @@ -1195,8 +1194,8 @@ mod test_bridge_pool_vp { ), }; - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(transfer.try_to_vec().expect("Test failed"))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_data(transfer); let res = vp .validate_tx(&tx, &keys_changed, &verifiers) @@ -1232,7 +1231,7 @@ mod test_bridge_pool_vp { ) .expect("Test failed"); wl_storage.write_log.commit_tx(); - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); // the transfer to be added to the pool let transfer = PendingTransfer { @@ -1309,8 +1308,8 @@ mod test_bridge_pool_vp { ), }; - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(transfer.try_to_vec().expect("Test failed"))); + let mut tx = Tx::new(wl_storage.storage.chain_id.clone(), None); + tx.add_data(transfer); let res = vp .validate_tx(&tx, &keys_changed, &verifiers) diff --git a/shared/src/ledger/native_vp/ethereum_bridge/vp.rs b/shared/src/ledger/native_vp/ethereum_bridge/vp.rs index 33a828938ae..5fd7aa6cd18 100644 --- a/shared/src/ledger/native_vp/ethereum_bridge/vp.rs +++ b/shared/src/ledger/native_vp/ethereum_bridge/vp.rs @@ -588,7 +588,7 @@ mod tests { let verifiers = BTreeSet::from([BRIDGE_POOL_ADDRESS]); // set up the VP - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); let vp = EthBridge { ctx: setup_ctx( &tx, @@ -638,7 +638,7 @@ mod tests { let verifiers = BTreeSet::from([BRIDGE_POOL_ADDRESS]); // set up the VP - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); let vp = EthBridge { ctx: setup_ctx( &tx, @@ -691,7 +691,7 @@ mod tests { let verifiers = BTreeSet::from([]); // set up the VP - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); let vp = EthBridge { ctx: setup_ctx( &tx, diff --git a/shared/src/ledger/native_vp/governance/utils.rs b/shared/src/ledger/native_vp/governance/utils.rs deleted file mode 100644 index c00f57b5d9a..00000000000 --- a/shared/src/ledger/native_vp/governance/utils.rs +++ /dev/null @@ -1,484 +0,0 @@ -//! Governance utility functions - -use std::collections::HashMap; - -use borsh::BorshDeserialize; -use namada_core::types::governance::ProposalResult; -use namada_core::types::transaction::governance::ProposalType; -use namada_proof_of_stake::{ - bond_amount, read_all_validator_addresses, read_pos_params, - read_validator_stake, -}; -use thiserror::Error; - -use crate::ledger::governance::storage as gov_storage; -use crate::ledger::pos::BondId; -use crate::ledger::storage_api; -use crate::types::address::Address; -use crate::types::governance::{ - ProposalVote, Tally, TallyResult, VotePower, VoteType, -}; -use crate::types::storage::Epoch; - -/// Proposal structure holding votes information necessary to compute the -/// outcome -pub struct Votes { - /// Map from validators who votes yay to their total stake amount - pub yay_validators: HashMap, - /// Map from delegation votes to their bond amount - pub delegators: - HashMap>, -} - -/// Proposal errors -#[derive(Error, Debug)] -pub enum Error { - /// Invalid validator set deserialization - #[error("Invalid validator set")] - InvalidValidatorSet, - /// Invalid proposal field deserialization - #[error("Invalid proposal {0}")] - InvalidProposal(u64), - /// Error during tally - #[error("Error while tallying proposal: {0}")] - Tally(String), -} - -/// Proposal event definition -pub struct ProposalEvent { - /// Proposal event type - pub event_type: String, - /// Proposal event attributes - pub attributes: HashMap, -} - -impl ProposalEvent { - /// Create a proposal event - pub fn new( - event_type: String, - tally: TallyResult, - id: u64, - has_proposal_code: bool, - proposal_code_exit_status: bool, - ) -> Self { - let attributes = HashMap::from([ - ("tally_result".to_string(), tally.to_string()), - ("proposal_id".to_string(), id.to_string()), - ( - "has_proposal_code".to_string(), - (!has_proposal_code as u64).to_string(), - ), - ( - "proposal_code_exit_status".to_string(), - (!proposal_code_exit_status as u64).to_string(), - ), - ]); - Self { - event_type, - attributes, - } - } -} - -/// Return a proposal result -pub fn compute_tally( - votes: Votes, - total_stake: VotePower, - proposal_type: &ProposalType, -) -> Result { - let Votes { - yay_validators, - delegators, - } = votes; - - match proposal_type { - ProposalType::Default(_) | ProposalType::ETHBridge => { - let mut total_yay_staked_tokens = VotePower::default(); - - for (_, (amount, validator_vote)) in yay_validators.iter() { - if let ProposalVote::Yay(vote_type) = validator_vote { - if proposal_type == vote_type { - total_yay_staked_tokens += *amount; - } else { - // Log the error and continue - tracing::error!( - "Unexpected vote type. Expected: {}, Found: {}", - proposal_type, - validator_vote - ); - continue; - } - } else { - // Log the error and continue - tracing::error!( - "Unexpected vote type. Expected: {}, Found: {}", - proposal_type, - validator_vote - ); - continue; - } - } - - // This loop is taken only for Default proposals - for (_, vote_map) in delegators.iter() { - for (validator_address, (vote_power, delegator_vote)) in - vote_map.iter() - { - match delegator_vote { - ProposalVote::Yay(VoteType::Default) => { - if !yay_validators.contains_key(validator_address) { - // YAY: Add delegator amount whose validator - // didn't vote / voted nay - total_yay_staked_tokens += *vote_power; - } - } - ProposalVote::Nay => { - // NAY: Remove delegator amount whose validator - // validator vote yay - - if yay_validators.contains_key(validator_address) { - total_yay_staked_tokens -= *vote_power; - } - } - - _ => { - // Log the error and continue - tracing::error!( - "Unexpected vote type. Expected: {}, Found: {}", - proposal_type, - delegator_vote - ); - continue; - } - } - } - } - - // Proposal passes if 2/3 of total voting power voted Yay - if total_yay_staked_tokens >= (total_stake / 3) * 2 { - let tally_result = match proposal_type { - ProposalType::Default(_) => { - TallyResult::Passed(Tally::Default) - } - ProposalType::ETHBridge => { - TallyResult::Passed(Tally::ETHBridge) - } - _ => { - return Err(Error::Tally(format!( - "Unexpected proposal type: {}", - proposal_type - ))); - } - }; - - Ok(ProposalResult { - result: tally_result, - total_voting_power: total_stake, - total_yay_power: total_yay_staked_tokens, - total_nay_power: 0.into(), - }) - } else { - Ok(ProposalResult { - result: TallyResult::Rejected, - total_voting_power: total_stake, - total_yay_power: total_yay_staked_tokens, - total_nay_power: 0.into(), - }) - } - } - ProposalType::PGFCouncil => { - let mut total_yay_staked_tokens = HashMap::new(); - for (_, (amount, validator_vote)) in yay_validators.iter() { - if let ProposalVote::Yay(VoteType::PGFCouncil(votes)) = - validator_vote - { - for v in votes { - *total_yay_staked_tokens - .entry(v) - .or_insert(VotePower::zero()) += *amount; - } - } else { - // Log the error and continue - tracing::error!( - "Unexpected vote type. Expected: PGFCouncil, Found: {}", - validator_vote - ); - continue; - } - } - - // YAY: Add delegator amount whose validator didn't vote / voted nay - // or adjust voting power if delegator voted yay with a - // different memo - for (_, vote_map) in delegators.iter() { - for (validator_address, (vote_power, delegator_vote)) in - vote_map.iter() - { - match delegator_vote { - ProposalVote::Yay(VoteType::PGFCouncil( - delegator_votes, - )) => { - match yay_validators.get(validator_address) { - Some((_, validator_vote)) => { - if let ProposalVote::Yay( - VoteType::PGFCouncil(validator_votes), - ) = validator_vote - { - for vote in validator_votes - .symmetric_difference( - delegator_votes, - ) - { - if validator_votes.contains(vote) { - // Delegator didn't vote for - // this, reduce voting power - if let Some(power) = - total_yay_staked_tokens - .get_mut(vote) - { - *power -= *vote_power; - } else { - return Err(Error::Tally( - format!( - "Expected PGF \ - vote {:?} was \ - not in tally", - vote - ), - )); - } - } else { - // Validator didn't vote for - // this, add voting power - *total_yay_staked_tokens - .entry(vote) - .or_insert( - VotePower::zero(), - ) += *vote_power; - } - } - } else { - // Log the error and continue - tracing::error!( - "Unexpected vote type. Expected: \ - PGFCouncil, Found: {}", - validator_vote - ); - continue; - } - } - None => { - // Validator didn't vote or voted nay, add - // delegator vote - - for vote in delegator_votes { - *total_yay_staked_tokens - .entry(vote) - .or_insert(VotePower::zero()) += - *vote_power; - } - } - } - } - ProposalVote::Nay => { - for ( - validator_address, - (vote_power, _delegator_vote), - ) in vote_map.iter() - { - if let Some((_, validator_vote)) = - yay_validators.get(validator_address) - { - if let ProposalVote::Yay( - VoteType::PGFCouncil(votes), - ) = validator_vote - { - for vote in votes { - if let Some(power) = - total_yay_staked_tokens - .get_mut(vote) - { - *power -= *vote_power; - } else { - return Err(Error::Tally( - format!( - "Expected PGF vote \ - {:?} was not in tally", - vote - ), - )); - } - } - } else { - // Log the error and continue - tracing::error!( - "Unexpected vote type. Expected: \ - PGFCouncil, Found: {}", - validator_vote - ); - continue; - } - } - } - } - _ => { - // Log the error and continue - tracing::error!( - "Unexpected vote type. Expected: PGFCouncil, \ - Found: {}", - delegator_vote - ); - continue; - } - } - } - } - - // At least 1/3 of the total voting power must vote Yay - let total_yay_voted_power = total_yay_staked_tokens - .iter() - .fold(VotePower::zero(), |acc, (_, vote_power)| { - acc + *vote_power - }); - - match total_yay_voted_power.checked_mul(3.into()) { - Some(v) if v < total_stake => Ok(ProposalResult { - result: TallyResult::Rejected, - total_voting_power: total_stake, - total_yay_power: total_yay_voted_power, - total_nay_power: VotePower::zero(), - }), - _ => { - // Select the winner council based on approval voting - // (majority) - let council = total_yay_staked_tokens - .into_iter() - .max_by(|a, b| a.1.cmp(&b.1)) - .map(|(vote, _)| vote.to_owned()) - .ok_or_else(|| { - Error::Tally( - "Missing expected elected council".to_string(), - ) - })?; - - Ok(ProposalResult { - result: TallyResult::Passed(Tally::PGFCouncil(council)), - total_voting_power: total_stake, - total_yay_power: total_yay_voted_power, - total_nay_power: VotePower::zero(), - }) - } - } - } - } -} - -/// Prepare Votes structure to compute proposal tally -pub fn get_proposal_votes( - storage: &S, - epoch: Epoch, - proposal_id: u64, -) -> storage_api::Result -where - S: storage_api::StorageRead, -{ - let params = read_pos_params(storage)?; - let validators = read_all_validator_addresses(storage, epoch)?; - - let vote_prefix_key = - gov_storage::get_proposal_vote_prefix_key(proposal_id); - let vote_iter = - storage_api::iter_prefix::(storage, &vote_prefix_key)?; - - let mut yay_validators = HashMap::new(); - let mut delegators: HashMap< - Address, - HashMap, - > = HashMap::new(); - - for next_vote in vote_iter { - let (vote_key, vote) = next_vote?; - let voter_address = gov_storage::get_voter_address(&vote_key); - match voter_address { - Some(voter_address) => { - if vote.is_yay() && validators.contains(voter_address) { - let amount: VotePower = read_validator_stake( - storage, - ¶ms, - voter_address, - epoch, - )? - .unwrap_or_default() - .try_into() - .expect("Amount out of bounds"); - - yay_validators - .insert(voter_address.clone(), (amount, vote)); - } else if !validators.contains(voter_address) { - let validator_address = - gov_storage::get_vote_delegation_address(&vote_key); - match validator_address { - Some(validator) => { - let bond_id = BondId { - source: voter_address.clone(), - validator: validator.clone(), - }; - let amount = - bond_amount(storage, &bond_id, epoch)?.1; - - if !amount.is_zero() { - let entry = delegators - .entry(voter_address.to_owned()) - .or_default(); - entry.insert( - validator.to_owned(), - ( - VotePower::try_from(amount).unwrap(), - vote, - ), - ); - } - } - None => continue, - } - } - } - None => continue, - } - } - - Ok(Votes { - yay_validators, - delegators, - }) -} - -/// Calculate the valid voting window for validator given a proposal epoch -/// details -pub fn is_valid_validator_voting_period( - current_epoch: Epoch, - voting_start_epoch: Epoch, - voting_end_epoch: Epoch, -) -> bool { - voting_start_epoch < voting_end_epoch - && current_epoch * 3 <= voting_start_epoch + voting_end_epoch * 2 -} - -/// Check if an accepted proposal is being executed -pub fn is_proposal_accepted( - storage: &S, - tx_data: &[u8], -) -> storage_api::Result -where - S: storage_api::StorageRead, -{ - let proposal_id = u64::try_from_slice(tx_data).ok(); - match proposal_id { - Some(id) => { - let proposal_execution_key = - gov_storage::get_proposal_execution_key(id); - storage.has_key(&proposal_execution_key) - } - None => Ok(false), - } -} diff --git a/shared/src/ledger/native_vp/mod.rs b/shared/src/ledger/native_vp/mod.rs index ed34545f167..02a3435397d 100644 --- a/shared/src/ledger/native_vp/mod.rs +++ b/shared/src/ledger/native_vp/mod.rs @@ -2,11 +2,9 @@ //! as the PoS and IBC modules. pub mod ethereum_bridge; -pub mod governance; pub mod multitoken; pub mod parameters; pub mod replay_protection; -pub mod slash_fund; use std::cell::RefCell; use std::collections::BTreeSet; diff --git a/shared/src/ledger/native_vp/multitoken.rs b/shared/src/ledger/native_vp/multitoken.rs index 5b88c0f152e..3a15da97aaa 100644 --- a/shared/src/ledger/native_vp/multitoken.rs +++ b/shared/src/ledger/native_vp/multitoken.rs @@ -164,7 +164,7 @@ mod tests { fn dummy_tx(wl_storage: &TestWlStorage) -> Tx { let tx_code = vec![]; let tx_data = vec![]; - let mut tx = Tx::new(TxType::Raw); + let mut tx = Tx::from_type(TxType::Raw); tx.header.chain_id = wl_storage.storage.chain_id.clone(); tx.set_code(Code::new(tx_code)); tx.set_data(Data::new(tx_data)); diff --git a/shared/src/ledger/native_vp/parameters.rs b/shared/src/ledger/native_vp/parameters.rs index bb1db0ab307..a2559ad0ab7 100644 --- a/shared/src/ledger/native_vp/parameters.rs +++ b/shared/src/ledger/native_vp/parameters.rs @@ -8,7 +8,7 @@ use namada_core::types::address::Address; use namada_core::types::storage::Key; use thiserror::Error; -use super::governance; +use crate::core::ledger::storage_api::governance; use crate::ledger::native_vp::{self, Ctx, NativeVp}; use crate::vm::WasmCacheAccess; @@ -55,11 +55,10 @@ where return false; }; match key_type { - KeyType::PARAMETER => governance::utils::is_proposal_accepted( - &self.ctx.pre(), - &data, - ) - .unwrap_or(false), + KeyType::PARAMETER => { + governance::is_proposal_accepted(&self.ctx.pre(), &data) + .unwrap_or(false) + } KeyType::UNKNOWN_PARAMETER => false, KeyType::UNKNOWN => true, } diff --git a/shared/src/ledger/pgf/mod.rs b/shared/src/ledger/pgf/mod.rs new file mode 100644 index 00000000000..f402b0f97be --- /dev/null +++ b/shared/src/ledger/pgf/mod.rs @@ -0,0 +1,126 @@ +//! Pgf VP + +/// Pgf utility functions and structures +pub mod utils; + +use std::collections::BTreeSet; + +use namada_core::ledger::pgf::storage::keys as pgf_storage; +use namada_core::ledger::storage; +use namada_core::ledger::storage_api::governance::is_proposal_accepted; +use namada_core::proto::Tx; +use thiserror::Error; + +use crate::ledger::native_vp; +use crate::ledger::native_vp::{Ctx, NativeVp}; +use crate::types::address::{Address, InternalAddress}; +use crate::types::storage::Key; +use crate::vm::WasmCacheAccess; + +/// for handling Pgf NativeVP errors +pub type Result = std::result::Result; + +/// The PGF internal address +pub const ADDRESS: Address = Address::Internal(InternalAddress::Pgf); + +#[allow(missing_docs)] +#[derive(Error, Debug)] +pub enum Error { + #[error("Native VP error: {0}")] + NativeVpError(#[from] native_vp::Error), +} + +/// Pgf VP +pub struct PgfVp<'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>, +} + +impl<'a, DB, H, CA> NativeVp for PgfVp<'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 result = keys_changed.iter().all(|key| { + let key_type = KeyType::from(key); + + let result = match key_type { + KeyType::STEWARDS => Ok(false), + KeyType::PAYMENTS => Ok(false), + KeyType::PGF_INFLATION_RATE + | KeyType::STEWARD_INFLATION_RATE => { + self.is_valid_parameter_change(tx_data) + } + KeyType::UNKNOWN_PGF => Ok(false), + KeyType::UNKNOWN => Ok(true), + }; + result.unwrap_or(false) + }); + Ok(result) + } +} + +impl<'a, DB, H, CA> PgfVp<'a, DB, H, CA> +where + DB: 'static + storage::DB + for<'iter> storage::DBIter<'iter>, + H: 'static + storage::StorageHasher, + CA: 'static + WasmCacheAccess, +{ + /// Validate a governance parameter + pub fn is_valid_parameter_change(&self, tx: &Tx) -> Result { + match tx.data() { + Some(data) => is_proposal_accepted(&self.ctx.pre(), data.as_ref()) + .map_err(Error::NativeVpError), + None => Ok(true), + } + } +} + +#[allow(clippy::upper_case_acronyms)] +#[derive(Debug)] +enum KeyType { + #[allow(non_camel_case_types)] + STEWARDS, + #[allow(non_camel_case_types)] + PAYMENTS, + #[allow(non_camel_case_types)] + PGF_INFLATION_RATE, + #[allow(non_camel_case_types)] + STEWARD_INFLATION_RATE, + #[allow(non_camel_case_types)] + UNKNOWN_PGF, + #[allow(non_camel_case_types)] + UNKNOWN, +} + +impl From<&Key> for KeyType { + fn from(key: &Key) -> Self { + if pgf_storage::is_stewards_key(key) { + Self::STEWARDS + } else if pgf_storage::is_payments_key(key) { + KeyType::PAYMENTS + } else if pgf_storage::is_pgf_inflation_rate_key(key) { + Self::PGF_INFLATION_RATE + } else if pgf_storage::is_steward_inflation_rate_key(key) { + Self::STEWARD_INFLATION_RATE + } else if pgf_storage::is_pgf_key(key) { + KeyType::UNKNOWN_PGF + } else { + KeyType::UNKNOWN + } + } +} diff --git a/shared/src/ledger/pgf/utils.rs b/shared/src/ledger/pgf/utils.rs new file mode 100644 index 00000000000..e1bec701baa --- /dev/null +++ b/shared/src/ledger/pgf/utils.rs @@ -0,0 +1,66 @@ +use std::collections::HashMap; + +use namada_core::types::address::Address; +use namada_core::types::token; + +use crate::ledger::events::EventType; + +/// Proposal event definition +pub struct ProposalEvent { + /// Proposal event type + pub event_type: String, + /// Proposal event attributes + pub attributes: HashMap, +} + +impl ProposalEvent { + /// Create a proposal event + pub fn new( + event_type: String, + target: Address, + amount: token::Amount, + is_steward: bool, + success: bool, + ) -> Self { + let attributes = HashMap::from([ + ("target".to_string(), target.to_string()), + ("amount".to_string(), amount.to_string_native()), + ("is_steward".to_string(), is_steward.to_string()), + ("successed".to_string(), success.to_string()), + ]); + Self { + event_type, + attributes, + } + } + + /// Create a new proposal event for pgf continous funding + pub fn pgf_funding_payment( + target: Address, + amount: token::Amount, + success: bool, + ) -> Self { + ProposalEvent::new( + EventType::PgfPayment.to_string(), + target, + amount, + false, + success, + ) + } + + /// Create a new proposal event for steward payments + pub fn pgf_steward_payment( + target: Address, + amount: token::Amount, + success: bool, + ) -> Self { + ProposalEvent::new( + EventType::PgfPayment.to_string(), + target, + amount, + true, + success, + ) + } +} diff --git a/shared/src/ledger/pos/vp.rs b/shared/src/ledger/pos/vp.rs index 18085c5c537..76607c3199c 100644 --- a/shared/src/ledger/pos/vp.rs +++ b/shared/src/ledger/pos/vp.rs @@ -3,6 +3,7 @@ use std::collections::BTreeSet; use std::panic::{RefUnwindSafe, UnwindSafe}; +use namada_core::ledger::storage_api::governance; // use borsh::BorshDeserialize; pub use namada_proof_of_stake; pub use namada_proof_of_stake::parameters::PosParams; @@ -12,7 +13,7 @@ pub use namada_proof_of_stake::types; use thiserror::Error; use super::is_params_key; -use crate::ledger::native_vp::{self, governance, Ctx, NativeVp}; +use crate::ledger::native_vp::{self, Ctx, NativeVp}; // use crate::ledger::pos::{ // is_validator_address_raw_hash_key, // is_validator_max_commission_rate_change_key, @@ -106,18 +107,14 @@ where tracing::debug!("\nValidating PoS Tx\n"); for key in keys_changed { - // println!("KEY: {}\n", key); if is_params_key(key) { let data = if let Some(data) = tx_data.data() { data } else { return Ok(false); }; - if !governance::utils::is_proposal_accepted( - &self.ctx.pre(), - &data, - ) - .map_err(Error::NativeVpError)? + if !governance::is_proposal_accepted(&self.ctx.pre(), &data) + .map_err(Error::NativeVpError)? { return Ok(false); } diff --git a/shared/src/ledger/protocol/mod.rs b/shared/src/ledger/protocol/mod.rs index 6cab156d7a8..7a0244932a0 100644 --- a/shared/src/ledger/protocol/mod.rs +++ b/shared/src/ledger/protocol/mod.rs @@ -8,15 +8,15 @@ use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use thiserror::Error; use crate::ledger::gas::{self, BlockGasMeter, VpGasMeter}; +use crate::ledger::governance::GovernanceVp; use crate::ledger::ibc::vp::Ibc; use crate::ledger::native_vp::ethereum_bridge::bridge_pool_vp::BridgePoolVp; use crate::ledger::native_vp::ethereum_bridge::vp::EthBridge; -use crate::ledger::native_vp::governance::GovernanceVp; use crate::ledger::native_vp::multitoken::MultitokenVp; use crate::ledger::native_vp::parameters::{self, ParametersVp}; use crate::ledger::native_vp::replay_protection::ReplayProtectionVp; -use crate::ledger::native_vp::slash_fund::SlashFundVp; use crate::ledger::native_vp::{self, NativeVp}; +use crate::ledger::pgf::PgfVp; use crate::ledger::pos::{self, PosVP}; use crate::ledger::storage::write_log::WriteLog; use crate::ledger::storage::{DBIter, Storage, StorageHasher, WlStorage, DB}; @@ -61,9 +61,9 @@ pub enum Error { #[error("IBC Token native VP: {0}")] MultitokenNativeVpError(crate::ledger::native_vp::multitoken::Error), #[error("Governance native VP error: {0}")] - GovernanceNativeVpError(crate::ledger::native_vp::governance::Error), - #[error("SlashFund native VP error: {0}")] - SlashFundNativeVpError(crate::ledger::native_vp::slash_fund::Error), + GovernanceNativeVpError(crate::ledger::governance::Error), + #[error("Pgf native VP error: {0}")] + PgfNativeVpError(crate::ledger::pgf::Error), #[error("Ethereum bridge native VP error: {0}")] EthBridgeNativeVpError(native_vp::ethereum_bridge::vp::Error), #[error("Ethereum bridge pool native VP error: {0}")] @@ -543,14 +543,6 @@ where gas_meter = governance.ctx.gas_meter.into_inner(); result } - InternalAddress::SlashFund => { - let slash_fund = SlashFundVp { ctx }; - let result = slash_fund - .validate_tx(tx, &keys_changed, &verifiers) - .map_err(Error::SlashFundNativeVpError); - gas_meter = slash_fund.ctx.gas_meter.into_inner(); - result - } InternalAddress::Multitoken => { let multitoken = MultitokenVp { ctx }; let result = multitoken @@ -585,6 +577,14 @@ where replay_protection_vp.ctx.gas_meter.into_inner(); result } + InternalAddress::Pgf => { + let pgf_vp = PgfVp { ctx }; + let result = pgf_vp + .validate_tx(tx, &keys_changed, &verifiers) + .map_err(Error::PgfNativeVpError); + gas_meter = pgf_vp.ctx.gas_meter.into_inner(); + result + } InternalAddress::IbcToken(_) | InternalAddress::Erc20(_) => { // The address should be a part of a multitoken key diff --git a/shared/src/ledger/queries/shell.rs b/shared/src/ledger/queries/shell.rs index 3eb95c8e8c9..94412f1a154 100644 --- a/shared/src/ledger/queries/shell.rs +++ b/shared/src/ledger/queries/shell.rs @@ -5,6 +5,7 @@ use masp_primitives::asset_type::AssetType; use masp_primitives::merkle_tree::MerklePath; use masp_primitives::sapling::Node; use namada_core::ledger::storage::LastBlock; +use namada_core::types::account::{Account, AccountPublicKeysMap}; use namada_core::types::address::Address; use namada_core::types::hash::Hash; use namada_core::types::storage::{BlockHeight, BlockResults, KeySeg}; @@ -75,6 +76,12 @@ router! {SHELL, // was the transaction applied? ( "applied" / [tx_hash: Hash] ) -> Option = applied, + // Query account subspace + ( "account" / [owner: Address] ) -> Option = account, + + // Query public key revealad + ( "revealed" / [owner: Address] ) -> bool = revealed, + // IBC UpdateClient event ( "ibc_client_update" / [client_id: ClientId] / [consensus_height: BlockHeight] ) -> Option = ibc_client_update, @@ -438,6 +445,46 @@ where .cloned()) } +fn account( + ctx: RequestCtx<'_, D, H>, + owner: Address, +) -> storage_api::Result> +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + let account_exists = storage_api::account::exists(ctx.wl_storage, &owner)?; + + if account_exists { + let public_keys = + storage_api::account::public_keys(ctx.wl_storage, &owner)?; + let threshold = + storage_api::account::threshold(ctx.wl_storage, &owner)?; + + Ok(Some(Account { + public_keys_map: AccountPublicKeysMap::from_iter(public_keys), + address: owner, + threshold: threshold.unwrap_or(1), + })) + } else { + Ok(None) + } +} + +fn revealed( + ctx: RequestCtx<'_, D, H>, + owner: Address, +) -> storage_api::Result +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + let public_keys = + storage_api::account::public_keys(ctx.wl_storage, &owner)?; + + Ok(!public_keys.is_empty()) +} + #[cfg(test)] mod test { @@ -492,7 +539,8 @@ mod test { assert_eq!(current_epoch, read_epoch); // Request dry run tx - let mut outer_tx = Tx::new(TxType::Decrypted(DecryptedTx::Decrypted { + let mut outer_tx = + Tx::from_type(TxType::Decrypted(DecryptedTx::Decrypted { #[cfg(not(feature = "mainnet"))] // To be able to dry-run testnet faucet withdrawal, pretend // that we got a valid PoW diff --git a/shared/src/ledger/queries/vp/governance.rs b/shared/src/ledger/queries/vp/governance.rs new file mode 100644 index 00000000000..230612cbb86 --- /dev/null +++ b/shared/src/ledger/queries/vp/governance.rs @@ -0,0 +1,38 @@ +// cd shared && cargo expand ledger::queries::vp::governance + +use namada_core::ledger::governance::storage::proposal::StorageProposal; +use namada_core::ledger::governance::utils::Vote; + +use crate::ledger::queries::types::RequestCtx; +use crate::ledger::storage::{DBIter, StorageHasher, DB}; +use crate::ledger::storage_api; + +// Governance queries +router! {GOV, + ( "proposal" / [id: u64 ] ) -> Option = proposal_id, + ( "proposal" / [id: u64 ] / "votes" ) -> Vec = proposal_id_votes, +} + +/// Find if the given address belongs to a validator account. +fn proposal_id( + ctx: RequestCtx<'_, D, H>, + id: u64, +) -> storage_api::Result> +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + storage_api::governance::get_proposal_by_id(ctx.wl_storage, id) +} + +/// Find if the given address belongs to a validator account. +fn proposal_id_votes( + ctx: RequestCtx<'_, D, H>, + id: u64, +) -> storage_api::Result> +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + storage_api::governance::get_proposal_votes(ctx.wl_storage, id) +} diff --git a/shared/src/ledger/queries/vp/mod.rs b/shared/src/ledger/queries/vp/mod.rs index ad05a2b88b1..c53386b2f8f 100644 --- a/shared/src/ledger/queries/vp/mod.rs +++ b/shared/src/ledger/queries/vp/mod.rs @@ -1,10 +1,16 @@ //! Queries router and handlers for validity predicates // Re-export to show in rustdoc! +pub use governance::Gov; +use governance::GOV; pub use pos::Pos; use pos::POS; pub use token::Token; use token::TOKEN; +mod governance; +pub use pgf::Pgf; +use pgf::PGF; +mod pgf; pub mod pos; mod token; @@ -13,6 +19,8 @@ mod token; router! {VP, ( "pos" ) = (sub POS), ( "token" ) = (sub TOKEN), + ( "governance" ) = (sub GOV), + ( "pgf" ) = (sub PGF), } /// Client-only methods for the router type are composed from router functions. diff --git a/shared/src/ledger/queries/vp/pgf.rs b/shared/src/ledger/queries/vp/pgf.rs new file mode 100644 index 00000000000..932d898068d --- /dev/null +++ b/shared/src/ledger/queries/vp/pgf.rs @@ -0,0 +1,36 @@ +use std::collections::BTreeSet; + +use namada_core::ledger::governance::storage::proposal::PGFTarget; +use namada_core::types::address::Address; + +use crate::ledger::queries::types::RequestCtx; +use crate::ledger::storage::{DBIter, StorageHasher, DB}; +use crate::ledger::storage_api; + +// PoS validity predicate queries +router! {PGF, + ( "stewards" ) -> BTreeSet
= stewards, + ( "fundings" ) -> BTreeSet = funding, +} + +/// Query the currect pgf steward set +fn stewards( + ctx: RequestCtx<'_, D, H>, +) -> storage_api::Result> +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + storage_api::pgf::get_stewards(ctx.wl_storage) +} + +/// Query the continous pgf fundings +fn funding( + ctx: RequestCtx<'_, D, H>, +) -> storage_api::Result> +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + storage_api::pgf::get_payments(ctx.wl_storage) +} diff --git a/shared/src/ledger/queries/vp/pos.rs b/shared/src/ledger/queries/vp/pos.rs index 075b936e252..aff5181a19b 100644 --- a/shared/src/ledger/queries/vp/pos.rs +++ b/shared/src/ledger/queries/vp/pos.rs @@ -69,6 +69,9 @@ router! {POS, ( "delegations" / [owner: Address] ) -> HashSet
= delegation_validators, + ( "delegations_at" / [owner: Address] / [epoch: opt Epoch] ) + -> HashMap = delegations, + ( "bond_deltas" / [source: Address] / [validator: Address] ) -> HashMap = bond_deltas, @@ -463,7 +466,6 @@ where /// Find all the validator addresses to whom the given `owner` address has /// some delegation in any epoch -#[allow(dead_code)] fn delegations( ctx: RequestCtx<'_, D, H>, owner: Address, diff --git a/shared/src/ledger/rpc.rs b/shared/src/ledger/rpc.rs index 1bd42018c51..73189d7aa7e 100644 --- a/shared/src/ledger/rpc.rs +++ b/shared/src/ledger/rpc.rs @@ -8,8 +8,13 @@ use borsh::BorshDeserialize; use masp_primitives::asset_type::AssetType; use masp_primitives::merkle_tree::MerklePath; use masp_primitives::sapling::Node; +use namada_core::ledger::governance::parameters::GovernanceParameters; +use namada_core::ledger::governance::storage::proposal::StorageProposal; +use namada_core::ledger::governance::utils::Vote; use namada_core::ledger::storage::LastBlock; +#[cfg(not(feature = "mainnet"))] use namada_core::ledger::testnet_pow; +use namada_core::types::account::Account; use namada_core::types::address::Address; use namada_core::types::storage::Key; use namada_core::types::token::{ @@ -21,11 +26,9 @@ use namada_proof_of_stake::types::{ }; use serde::Serialize; +use crate::core::ledger::governance::storage::keys as gov_storage; use crate::ledger::args::InputAmount; use crate::ledger::events::Event; -use crate::ledger::governance::parameters::GovParams; -use crate::ledger::governance::storage as gov_storage; -use crate::ledger::native_vp::governance::utils::Votes; use crate::ledger::queries::vp::pos::EnrichedBondsAndUnbondsDetails; use crate::ledger::queries::RPC; use crate::proto::Tx; @@ -35,10 +38,9 @@ use crate::tendermint_rpc::error::Error as TError; use crate::tendermint_rpc::query::Query; use crate::tendermint_rpc::Order; use crate::types::control_flow::{time, Halt, TryHalt}; -use crate::types::governance::{ProposalVote, VotePower}; use crate::types::hash::Hash; use crate::types::io::Io; -use crate::types::key::*; +use crate::types::key::common; use crate::types::storage::{BlockHeight, BlockResults, Epoch, PrefixValue}; use crate::types::{storage, token}; use crate::{display_line, edisplay_line}; @@ -127,8 +129,8 @@ pub async fn query_block( fn unwrap_client_response( response: Result, ) -> T { - response.unwrap_or_else(|_err| { - panic!("Error in the query"); + response.unwrap_or_else(|err| { + panic!("Error in the query: {:?}", err.to_string()); }) } @@ -150,15 +152,6 @@ pub async fn get_token_balance( ) } -/// Get account's public key stored in its storage sub-space -pub async fn get_public_key( - client: &C, - address: &Address, -) -> Option { - let key = pk_key(address); - query_storage_value(client, &key).await -} - /// Check if the given address is a known validator. pub async fn is_validator( client: &C, @@ -650,73 +643,6 @@ pub async fn query_tx_response( Ok(result) } -/// Get the votes for a given proposal id -pub async fn get_proposal_votes< - C: crate::ledger::queries::Client + Sync, - IO: Io, ->( - client: &C, - epoch: Epoch, - proposal_id: u64, -) -> Votes { - let validators = get_all_validators(client, epoch).await; - - let vote_prefix_key = - gov_storage::get_proposal_vote_prefix_key(proposal_id); - let vote_iter = - query_storage_prefix::(client, &vote_prefix_key) - .await; - - let mut yay_validators: HashMap = - HashMap::new(); - let mut delegators: HashMap< - Address, - HashMap, - > = HashMap::new(); - - if let Some(vote_iter) = vote_iter { - for (key, vote) in vote_iter { - let voter_address = gov_storage::get_voter_address(&key) - .expect("Vote key should contain the voting address.") - .clone(); - if vote.is_yay() && validators.contains(&voter_address) { - let amount: VotePower = - get_validator_stake(client, epoch, &voter_address) - .await - .try_into() - .expect("Amount of bonds"); - yay_validators.insert(voter_address, (amount, vote)); - } else if !validators.contains(&voter_address) { - let validator_address = - gov_storage::get_vote_delegation_address(&key) - .expect( - "Vote key should contain the delegation address.", - ) - .clone(); - let delegator_token_amount = get_bond_amount_at( - client, - &voter_address, - &validator_address, - epoch, - ) - .await; - if let Some(amount) = delegator_token_amount { - let entry = delegators.entry(voter_address).or_default(); - entry.insert( - validator_address, - (VotePower::from(amount), vote), - ); - } - } - } - } - - Votes { - yay_validators, - delegators, - } -} - /// Get the PoS parameters pub async fn get_pos_params( client: &C, @@ -790,6 +716,32 @@ pub async fn get_delegators_delegation< ) } +/// Get the delegator's delegation at some epoh +pub async fn get_delegators_delegation_at< + C: crate::ledger::queries::Client + Sync, +>( + client: &C, + address: &Address, + epoch: Epoch, +) -> HashMap { + unwrap_client_response::( + RPC.vp() + .pos() + .delegations(client, address, &Some(epoch)) + .await, + ) +} + +/// Query proposal by Id +pub async fn query_proposal_by_id( + client: &C, + proposal_id: u64, +) -> Option { + unwrap_client_response::( + RPC.vp().gov().proposal_id(client, &proposal_id).await, + ) +} + /// Query and return validator's commission rate and max commission rate change /// per epoch pub async fn query_commission_rate( @@ -817,6 +769,42 @@ pub async fn query_bond( ) } +/// Query the accunt substorage space of an address +pub async fn get_account_info( + client: &C, + owner: &Address, +) -> Option { + unwrap_client_response::>( + RPC.shell().account(client, owner).await, + ) +} + +/// Query if the public_key is revealed +pub async fn is_public_key_revealed< + C: crate::ledger::queries::Client + Sync, +>( + client: &C, + owner: &Address, +) -> bool { + unwrap_client_response::(RPC.shell().revealed(client, owner).await) +} + +/// Query an account substorage at a specific index +pub async fn get_public_key_at( + client: &C, + owner: &Address, + index: u8, +) -> Option { + let account = unwrap_client_response::>( + RPC.shell().account(client, owner).await, + ); + if let Some(account) = account { + account.get_public_key_from_index(index) + } else { + None + } +} + /// Query a validator's unbonds for a given epoch pub async fn query_and_print_unbonds< C: crate::ledger::queries::Client + Sync, @@ -893,11 +881,11 @@ pub async fn query_unbond_with_slashing< } /// Get the givernance parameters -pub async fn get_governance_parameters< +pub async fn query_governance_parameters< C: crate::ledger::queries::Client + Sync, >( client: &C, -) -> GovParams { +) -> GovernanceParameters { let key = gov_storage::get_max_proposal_code_size_key(); let max_proposal_code_size = query_storage_value::(client, &key) .await @@ -918,27 +906,37 @@ pub async fn get_governance_parameters< .await .expect("Parameter should be definied."); - let key = gov_storage::get_min_proposal_period_key(); - let min_proposal_period = query_storage_value::(client, &key) - .await - .expect("Parameter should be definied."); + let key = gov_storage::get_min_proposal_voting_period_key(); + let min_proposal_voting_period = + query_storage_value::(client, &key) + .await + .expect("Parameter should be definied."); let key = gov_storage::get_max_proposal_period_key(); let max_proposal_period = query_storage_value::(client, &key) .await .expect("Parameter should be definied."); - GovParams { - min_proposal_fund: u128::try_from(min_proposal_fund) - .expect("Amount out of bounds") as u64, + GovernanceParameters { + min_proposal_fund, max_proposal_code_size, - min_proposal_period, + min_proposal_voting_period, max_proposal_period, max_proposal_content_size, min_proposal_grace_epochs, } } +/// Get the givernance parameters +pub async fn query_proposal_votes( + client: &C, + proposal_id: u64, +) -> Vec { + unwrap_client_response::>( + RPC.vp().gov().proposal_id_votes(client, &proposal_id).await, + ) +} + /// Get the bond amount at the given epoch pub async fn get_bond_amount_at( client: &C, diff --git a/shared/src/ledger/signing.rs b/shared/src/ledger/signing.rs index 31e2256c3a2..b25084055d4 100644 --- a/shared/src/ledger/signing.rs +++ b/shared/src/ledger/signing.rs @@ -1,12 +1,6 @@ //! Functions to sign transactions use std::collections::HashMap; -#[cfg(feature = "std")] -use std::env; -#[cfg(feature = "std")] -use std::fs::File; use std::io::ErrorKind; -#[cfg(feature = "std")] -use std::io::Write; use borsh::{BorshDeserialize, BorshSerialize}; use data_encoding::HEXLOWER; @@ -15,46 +9,45 @@ use masp_primitives::asset_type::AssetType; use masp_primitives::transaction::components::sapling::fees::{ InputView, OutputView, }; +use namada_core::proto::SignatureIndex; +use namada_core::types::account::AccountPublicKeysMap; use namada_core::types::address::{ masp, masp_tx_key, Address, ImplicitAddress, }; +// use namada_core::types::storage::Key; use namada_core::types::token::{self, Amount, DenominatedAmount, MaspDenom}; -use namada_core::types::transaction::{pos, MIN_FEE}; +use namada_core::types::transaction::pos; use prost::Message; use serde::{Deserialize, Serialize}; use zeroize::Zeroizing; -use crate::ibc::applications::transfer::msgs::transfer::{ - MsgTransfer, TYPE_URL as MSG_TRANSFER_TYPE_URL, -}; +use crate::display_line; +use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc_proto::google::protobuf::Any; use crate::ledger::masp::make_asset_type; use crate::ledger::parameters::storage as parameter_storage; -use crate::ledger::rpc::{ - format_denominated_amount, query_wasm_code_hash, TxBroadcastData, -}; +use crate::ledger::rpc::{format_denominated_amount, query_wasm_code_hash}; use crate::ledger::tx::{ Error, TX_BOND_WASM, TX_CHANGE_COMMISSION_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, - TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UPDATE_VP_WASM, + TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, VP_USER_WASM, }; pub use crate::ledger::wallet::store::AddressVpType; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::ledger::{args, rpc}; -use crate::proto::{MaspBuilder, Section, Signature, Tx}; -use crate::types::io::Io; +use crate::proto::{MaspBuilder, Section, Tx}; +use crate::types::io::*; use crate::types::key::*; use crate::types::masp::{ExtendedViewingKey, PaymentAddress}; use crate::types::storage::Epoch; use crate::types::token::Transfer; +use crate::types::transaction::account::{InitAccount, UpdateAccount}; use crate::types::transaction::governance::{ InitProposalData, VoteProposalData, }; -use crate::types::transaction::{ - Fee, InitAccount, InitValidator, TxType, UpdateVp, WrapperTx, -}; -use crate::{display_line, edisplay_line}; +use crate::types::transaction::pos::InitValidator; +use crate::types::transaction::{Fee, TxType}; #[cfg(feature = "std")] /// Env. var specifying where to store signing test vectors @@ -63,6 +56,19 @@ const ENV_VAR_LEDGER_LOG_PATH: &str = "NAMADA_LEDGER_LOG_PATH"; /// Env. var specifying where to store transaction debug outputs const ENV_VAR_TX_LOG_PATH: &str = "NAMADA_TX_LOG_PATH"; +/// A struture holding the signing data to craft a transaction +#[derive(Clone)] +pub struct SigningTxData { + /// The public keys associated to an account + pub public_keys: Vec, + /// The threshold associated to an account + pub threshold: u8, + /// The public keys to index map associated to an account + pub account_public_keys_map: Option, + /// The public keys of the fee payer + pub gas_payer: common::PublicKey, +} + /// Find the public key for the given address and try to load the keypair /// for it from the wallet. If the keypair is encrypted but a password is not /// supplied, then it is interactively prompted. Errors if the key cannot be @@ -84,12 +90,12 @@ pub async fn find_pk< "Looking-up public key of {} from the ledger...", addr.encode() ); - rpc::get_public_key(client, addr).await.ok_or(Error::Other( - format!( + rpc::get_public_key_at(client, addr, 0) + .await + .ok_or(Error::Other(format!( "No public key found for the address {}", addr.encode() - ), - )) + ))) } Address::Implicit(ImplicitAddress(pkh)) => Ok(wallet .find_key_by_pkh(pkh, password) @@ -115,48 +121,30 @@ pub async fn find_pk< pub fn find_key_by_pk( wallet: &mut Wallet, args: &args::Tx, - keypair: &common::PublicKey, + public_key: &common::PublicKey, ) -> Result { - if *keypair == masp_tx_key().ref_to() { + if *public_key == masp_tx_key().ref_to() { // We already know the secret key corresponding to the MASP sentinal key Ok(masp_tx_key()) - } else if args - .signing_key - .as_ref() - .map(|x| x.ref_to() == *keypair) - .unwrap_or(false) - { - // We can lookup the secret key from the CLI arguments in this case - Ok(args.signing_key.clone().unwrap()) } else { // Otherwise we need to search the wallet for the secret key wallet - .find_key_by_pk(keypair, args.password.clone()) + .find_key_by_pk(public_key, args.password.clone()) .map_err(|err| { Error::Other(format!( "Unable to load the keypair from the wallet for public \ key {}. Failed with: {}", - keypair, err + public_key, err )) }) } } -/// Carries types that can be directly/indirectly used to sign a transaction. -#[allow(clippy::large_enum_variant)] -#[derive(Clone)] -pub enum TxSigningKey { - /// Do not sign any transaction - None, - /// Obtain the keypair corresponding to given address from wallet and sign - WalletAddress(Address), -} - /// Given CLI arguments and some defaults, determine the rightful transaction /// signer. Return the given signing key or public key of the given signer if /// possible. If no explicit signer given, use the `default`. If no `default` /// is given, an `Error` is returned. -pub async fn tx_signer< +pub async fn tx_signers< C: crate::ledger::queries::Client + Sync, U: WalletUtils, IO: Io, @@ -164,34 +152,27 @@ pub async fn tx_signer< client: &C, wallet: &mut Wallet, args: &args::Tx, - default: TxSigningKey, -) -> Result<(Option
, common::PublicKey), Error> { - let signer = if args.dry_run { - // We cannot override the signer if we're doing a dry run - default - } else if let Some(signing_key) = &args.signing_key { - // Otherwise use the signing key override provided by user - return Ok((None, signing_key.ref_to())); + default: Option
, +) -> Result, Error> { + let signer = if !&args.signing_keys.is_empty() { + let public_keys = + args.signing_keys.iter().map(|key| key.ref_to()).collect(); + return Ok(public_keys); } else if let Some(verification_key) = &args.verification_key { - return Ok((None, verification_key.clone())); - } else if let Some(signer) = &args.signer { - // Otherwise use the signer address provided by user - TxSigningKey::WalletAddress(signer.clone()) + return Ok(vec![verification_key.clone()]); } else { // Otherwise use the signer determined by the caller default }; + // Now actually fetch the signing key and apply it match signer { - TxSigningKey::WalletAddress(signer) if signer == masp() => { - Ok((None, masp_tx_key().ref_to())) - } - TxSigningKey::WalletAddress(signer) => Ok(( - Some(signer.clone()), + Some(signer) if signer == masp() => Ok(vec![masp_tx_key().ref_to()]), + Some(signer) => Ok(vec![ find_pk::(client, wallet, &signer, args.password.clone()) .await?, - )), - TxSigningKey::None => other_err( + ]), + None => other_err( "All transactions must be signed; please either specify the key \ or the address from which to look up the signing key." .to_string(), @@ -207,26 +188,90 @@ pub async fn tx_signer< /// hashes needed for monitoring the tx on chain. /// /// If it is a dry run, it is not put in a wrapper, but returned as is. -pub async fn sign_tx( +pub fn sign_tx( wallet: &mut Wallet, + args: &args::Tx, tx: &mut Tx, + signing_data: SigningTxData, +) { + if !args.signatures.is_empty() { + let signatures = args + .signatures + .iter() + .map(|bytes| SignatureIndex::deserialize(bytes).unwrap()) + .collect(); + tx.add_signatures(signatures); + } else if let Some(account_public_keys_map) = + signing_data.account_public_keys_map + { + let signing_tx_keypairs = signing_data + .public_keys + .iter() + .filter_map(|public_key| { + match find_key_by_pk(wallet, args, public_key) { + Ok(secret_key) => Some(secret_key), + Err(_) => None, + } + }) + .collect::>(); + tx.sign_raw(signing_tx_keypairs, account_public_keys_map); + } + + let fee_payer_keypair = + find_key_by_pk(wallet, args, &signing_data.gas_payer).expect(""); + tx.sign_wrapper(fee_payer_keypair); +} + +/// Return the necessary data regarding an account to be able to generate a +/// multisignature section +pub async fn aux_signing_data< + C: crate::ledger::queries::Client + Sync, + U: WalletUtils, + IO: Io, +>( + client: &C, + wallet: &mut Wallet, args: &args::Tx, - keypair: &common::PublicKey, -) -> Result<(), Error> { - let keypair = find_key_by_pk(wallet, args, keypair)?; - // Sign over the transacttion data - tx.add_section(Section::Signature(Signature::new( - vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, - ))); - // Remove all the sensitive sections - tx.protocol_filter(); - // Then sign over the bound wrapper - tx.add_section(Section::Signature(Signature::new( - tx.sechashes(), - &keypair, - ))); - Ok(()) + owner: &Option
, + default_signer: Option
, +) -> Result { + let public_keys = if owner.is_some() || args.gas_payer.is_none() { + tx_signers::(client, wallet, args, default_signer.clone()) + .await? + } else { + vec![] + }; + + let (account_public_keys_map, threshold) = match owner { + Some(owner @ Address::Established(_)) => { + let account = rpc::get_account_info::(client, owner).await; + if let Some(account) = account { + (Some(account.public_keys_map), account.threshold) + } else { + return Err(Error::InvalidAccount(owner.encode())); + } + } + Some(Address::Implicit(_)) => ( + Some(AccountPublicKeysMap::from_iter(public_keys.clone())), + 1u8, + ), + Some(owner @ Address::Internal(_)) => { + return Err(Error::InvalidAccount(owner.encode())); + } + None => (None, 0u8), + }; + + let gas_payer = match &args.gas_payer { + Some(keypair) => keypair.ref_to(), + None => public_keys.get(0).ok_or(Error::InvalidFeePayer)?.clone(), + }; + + Ok(SigningTxData { + public_keys, + threshold, + account_public_keys_map, + gas_payer, + }) } #[cfg(not(feature = "mainnet"))] @@ -242,26 +287,26 @@ pub async fn solve_pow_challenge< requires_pow: bool, ) -> (Option, Fee) { let wrapper_tx_fees_key = parameter_storage::get_wrapper_tx_fees_key(); - let fee_amount = rpc::query_storage_value::( + let gas_amount = rpc::query_storage_value::( client, &wrapper_tx_fees_key, ) .await .unwrap_or_default(); - let fee_token = &args.fee_token; + let gas_token = &args.gas_token; let source = Address::from(keypair); - let balance_key = token::balance_key(fee_token, &source); + let balance_key = token::balance_key(gas_token, &source); let balance = rpc::query_storage_value::(client, &balance_key) .await .unwrap_or_default(); - let is_bal_sufficient = fee_amount <= balance; + let is_bal_sufficient = gas_amount <= balance; if !is_bal_sufficient { - let token_addr = args.fee_token.clone(); + let token_addr = args.gas_token.clone(); let err_msg = format!( "The wrapper transaction source doesn't have enough balance to \ pay fee {}, got {}.", - format_denominated_amount::<_, IO>(client, &token_addr, fee_amount) + format_denominated_amount::<_, IO>(client, &token_addr, gas_amount) .await, format_denominated_amount::<_, IO>(client, &token_addr, balance) .await, @@ -271,13 +316,13 @@ pub async fn solve_pow_challenge< } } let fee = Fee { - amount: fee_amount, - token: fee_token.clone(), + amount: gas_amount, + token: gas_token.clone(), }; // A PoW solution can be used to allow zero-fee testnet transactions // If the address derived from the keypair doesn't have enough balance // to pay for the fee, allow to find a PoW solution instead. - if requires_pow || !is_bal_sufficient { + if (requires_pow || !is_bal_sufficient) && !args.dump_tx { display_line!( IO, "The transaction requires the completion of a PoW challenge." @@ -317,215 +362,27 @@ pub async fn update_pow_challenge< /// Create a wrapper tx from a normal tx. Get the hash of the /// wrapper and its payload which is needed for monitoring its /// progress on chain. -pub async fn wrap_tx< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, - IO: Io, ->( +pub async fn wrap_tx( client: &C, - #[allow(unused_variables)] wallet: &mut Wallet, + tx: &mut Tx, args: &args::Tx, epoch: Epoch, - mut tx: Tx, - keypair: &common::PublicKey, + gas_payer: common::PublicKey, #[cfg(not(feature = "mainnet"))] requires_pow: bool, -) -> Tx { +) { #[cfg(not(feature = "mainnet"))] let (pow_solution, fee) = - solve_pow_challenge::<_, IO>(client, args, keypair, requires_pow).await; - // This object governs how the payload will be processed - tx.update_header(TxType::Wrapper(Box::new(WrapperTx::new( - fee, - keypair.clone(), - epoch, - args.gas_limit.clone(), - #[cfg(not(feature = "mainnet"))] - pow_solution, - )))); - tx.header.chain_id = args.chain_id.clone().unwrap(); - tx.header.expiration = args.expiration; - - #[cfg(feature = "std")] - // Attempt to decode the construction - if let Ok(path) = env::var(ENV_VAR_LEDGER_LOG_PATH) { - let mut tx = tx.clone(); - // Contract the large data blobs in the transaction - tx.wallet_filter(); - // Convert the transaction to Ledger format - let decoding = to_ledger_vector::<_, _, IO>(client, wallet, &tx) - .await - .expect("unable to decode transaction"); - let output = serde_json::to_string(&decoding) - .expect("failed to serialize decoding"); - // Record the transaction at the identified path - let mut f = File::options() - .append(true) - .create(true) - .open(path) - .expect("failed to open test vector file"); - writeln!(f, "{},", output) - .expect("unable to write test vector to file"); - } - #[cfg(feature = "std")] - // Attempt to decode the construction - if let Ok(path) = env::var(ENV_VAR_TX_LOG_PATH) { - let mut tx = tx.clone(); - // Contract the large data blobs in the transaction - tx.wallet_filter(); - // Record the transaction at the identified path - let mut f = File::options() - .append(true) - .create(true) - .open(path) - .expect("failed to open test vector file"); - writeln!(f, "{:x?},", tx).expect("unable to write test vector to file"); - } - - tx -} - -/// Create a wrapper tx from a normal tx. Get the hash of the -/// wrapper and its payload which is needed for monitoring its -/// progress on chain. -pub async fn sign_wrapper< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, - IO: Io, ->( - client: &C, - #[allow(unused_variables)] wallet: &mut Wallet, - args: &args::Tx, - epoch: Epoch, - mut tx: Tx, - keypair: &common::SecretKey, - #[cfg(not(feature = "mainnet"))] requires_pow: bool, -) -> TxBroadcastData { - let fee_amount = if cfg!(feature = "mainnet") { - Amount::native_whole(MIN_FEE) - } else { - let wrapper_tx_fees_key = parameter_storage::get_wrapper_tx_fees_key(); - rpc::query_storage_value::( - client, - &wrapper_tx_fees_key, - ) - .await - .unwrap_or_default() - }; - let fee_token = &args.fee_token; - let source = Address::from(&keypair.ref_to()); - let balance_key = token::balance_key(fee_token, &source); - let balance = - rpc::query_storage_value::(client, &balance_key) - .await - .unwrap_or_default(); - let is_bal_sufficient = fee_amount <= balance; - if !is_bal_sufficient { - let token_addr = args.fee_token.clone(); - let err_msg = format!( - "The wrapper transaction source doesn't have enough balance to \ - pay fee {}, got {}.", - format_denominated_amount::<_, IO>(client, &token_addr, fee_amount) - .await, - format_denominated_amount::<_, IO>(client, &token_addr, balance) - .await, - ); - edisplay_line!(IO, "{}", err_msg); - if !args.force && cfg!(feature = "mainnet") { - panic!("{}", err_msg); - } - } - - #[cfg(not(feature = "mainnet"))] - // A PoW solution can be used to allow zero-fee testnet transactions - let pow_solution: Option = { - // If the address derived from the keypair doesn't have enough balance - // to pay for the fee, allow to find a PoW solution instead. - if requires_pow || !is_bal_sufficient { - display_line!( - IO, - "The transaction requires the completion of a PoW challenge." - ); - // Obtain a PoW challenge for faucet withdrawal - let challenge = - rpc::get_testnet_pow_challenge(client, source).await; - - // Solve the solution, this blocks until a solution is found - let solution = challenge.solve(); - Some(solution) - } else { - None - } - }; + solve_pow_challenge::<_, IO>(client, args, &gas_payer, requires_pow) + .await; - // This object governs how the payload will be processed - tx.update_header(TxType::Wrapper(Box::new(WrapperTx::new( - Fee { - amount: fee_amount, - token: fee_token.clone(), - }, - keypair.ref_to(), + tx.add_wrapper( + fee, + gas_payer, epoch, args.gas_limit.clone(), #[cfg(not(feature = "mainnet"))] pow_solution, - )))); - tx.header.chain_id = args.chain_id.clone().unwrap(); - tx.header.expiration = args.expiration; - - #[cfg(feature = "std")] - // Attempt to decode the construction - if let Ok(path) = env::var(ENV_VAR_LEDGER_LOG_PATH) { - let mut tx = tx.clone(); - // Contract the large data blobs in the transaction - tx.wallet_filter(); - // Convert the transaction to Ledger format - let decoding = to_ledger_vector::<_, _, IO>(client, wallet, &tx) - .await - .expect("unable to decode transaction"); - let output = serde_json::to_string(&decoding) - .expect("failed to serialize decoding"); - // Record the transaction at the identified path - let mut f = File::options() - .append(true) - .create(true) - .open(path) - .expect("failed to open test vector file"); - writeln!(f, "{},", output) - .expect("unable to write test vector to file"); - } - #[cfg(feature = "std")] - // Attempt to decode the construction - if let Ok(path) = env::var(ENV_VAR_TX_LOG_PATH) { - let mut tx = tx.clone(); - // Contract the large data blobs in the transaction - tx.wallet_filter(); - // Record the transaction at the identified path - let mut f = File::options() - .append(true) - .create(true) - .open(path) - .expect("failed to open test vector file"); - writeln!(f, "{:x?},", tx).expect("unable to write test vector to file"); - } - - // Remove all the sensitive sections - tx.protocol_filter(); - // Then sign over the bound wrapper committing to all other sections - tx.add_section(Section::Signature(Signature::new(tx.sechashes(), keypair))); - // We use this to determine when the wrapper tx makes it on-chain - let wrapper_hash = tx.header_hash().to_string(); - // We use this to determine when the decrypted inner tx makes it - // on-chain - let decrypted_hash = tx - .clone() - .update_header(TxType::Raw) - .header_hash() - .to_string(); - TxBroadcastData::Wrapper { - tx, - wrapper_hash, - decrypted_hash, - } + ); } #[allow(clippy::result_large_err)] @@ -740,6 +597,56 @@ pub async fn make_ledger_masp_endpoints< } } +/// Internal method used to generate transaction test vectors +#[cfg(feature = "std")] +pub async fn generate_test_vector< + C: crate::ledger::queries::Client + Sync, + U: WalletUtils, + IO: Io, +>( + client: &C, + wallet: &mut Wallet, + tx: &Tx, +) { + use std::env; + use std::fs::File; + use std::io::Write; + + if let Ok(path) = env::var(ENV_VAR_LEDGER_LOG_PATH) { + let mut tx = tx.clone(); + // Contract the large data blobs in the transaction + tx.wallet_filter(); + // Convert the transaction to Ledger format + let decoding = to_ledger_vector::<_, _, IO>(client, wallet, &tx) + .await + .expect("unable to decode transaction"); + let output = serde_json::to_string(&decoding) + .expect("failed to serialize decoding"); + // Record the transaction at the identified path + let mut f = File::options() + .append(true) + .create(true) + .open(path) + .expect("failed to open test vector file"); + writeln!(f, "{},", output) + .expect("unable to write test vector to file"); + } + + // Attempt to decode the construction + if let Ok(path) = env::var(ENV_VAR_TX_LOG_PATH) { + let mut tx = tx.clone(); + // Contract the large data blobs in the transaction + tx.wallet_filter(); + // Record the transaction at the identified path + let mut f = File::options() + .append(true) + .create(true) + .open(path) + .expect("failed to open test vector file"); + writeln!(f, "{:x?},", tx).expect("unable to write test vector to file"); + } +} + /// Converts the given transaction to the form that is displayed on the Ledger /// device pub async fn to_ledger_vector< @@ -770,8 +677,8 @@ pub async fn to_ledger_vector< let reveal_pk_hash = query_wasm_code_hash::<_, IO>(client, TX_REVEAL_PK) .await .unwrap(); - let update_vp_hash = - query_wasm_code_hash::<_, IO>(client, TX_UPDATE_VP_WASM) + let update_account_hash = + query_wasm_code_hash::<_, IO>(client, TX_UPDATE_ACCOUNT_WASM) .await .unwrap(); let transfer_hash = query_wasm_code_hash::<_, IO>(client, TX_TRANSFER_WASM) @@ -851,12 +758,12 @@ pub async fn to_ledger_vector< tv.output.extend(vec![ format!("Type : Init Account"), - format!("Public key : {}", init_account.public_key), + format!("Public key : {:?}", init_account.public_keys), format!("VP type : {}", vp_code), ]); tv.output_expert.extend(vec![ - format!("Public key : {}", init_account.public_key), + format!("Public key : {:?}", init_account.public_keys), format!("VP type : {}", HEXLOWER.encode(&extra.0)), ]); } else if code_hash == init_validator_hash { @@ -881,7 +788,7 @@ pub async fn to_ledger_vector< tv.output.extend(vec![ format!("Type : Init Validator"), - format!("Account key : {}", init_validator.account_key), + format!("Account key : {:?}", init_validator.account_keys), format!("Consensus key : {}", init_validator.consensus_key), format!("Protocol key : {}", init_validator.protocol_key), format!("DKG key : {}", init_validator.dkg_key), @@ -894,7 +801,7 @@ pub async fn to_ledger_vector< ]); tv.output_expert.extend(vec![ - format!("Account key : {}", init_validator.account_key), + format!("Account key : {:?}", init_validator.account_keys), format!("Consensus key : {}", init_validator.consensus_key), format!("Protocol key : {}", init_validator.protocol_key), format!("DKG key : {}", init_validator.dkg_key), @@ -992,36 +899,40 @@ pub async fn to_ledger_vector< tv.output_expert .extend(vec![format!("Public key : {}", public_key)]); - } else if code_hash == update_vp_hash { + } else if code_hash == update_account_hash { let transfer = - UpdateVp::try_from_slice(&tx.data().ok_or_else(|| { + UpdateAccount::try_from_slice(&tx.data().ok_or_else(|| { std::io::Error::from(ErrorKind::InvalidData) })?)?; tv.name = "Update VP 0".to_string(); - let extra = tx - .get_section(&transfer.vp_code_hash) - .and_then(|x| Section::extra_data_sec(x.as_ref())) - .expect("unable to load vp code") - .code - .hash(); - let vp_code = if extra == user_hash { - "User".to_string() - } else { - HEXLOWER.encode(&extra.0) - }; - - tv.output.extend(vec![ - format!("Type : Update VP"), - format!("Address : {}", transfer.addr), - format!("VP type : {}", vp_code), - ]); + match &transfer.vp_code_hash { + Some(hash) => { + let extra = tx + .get_section(hash) + .and_then(|x| Section::extra_data_sec(x.as_ref())) + .expect("unable to load vp code") + .code + .hash(); + let vp_code = if extra == user_hash { + "User".to_string() + } else { + HEXLOWER.encode(&extra.0) + }; + tv.output.extend(vec![ + format!("Type : Update VP"), + format!("Address : {}", transfer.addr), + format!("VP type : {}", vp_code), + ]); - tv.output_expert.extend(vec![ - format!("Address : {}", transfer.addr), - format!("VP type : {}", HEXLOWER.encode(&extra.0)), - ]); + tv.output_expert.extend(vec![ + format!("Address : {}", transfer.addr), + format!("VP type : {}", HEXLOWER.encode(&extra.0)), + ]); + } + None => (), + }; } else if code_hash == transfer_hash { let transfer = Transfer::try_from_slice(&tx.data().ok_or_else(|| { @@ -1070,7 +981,7 @@ pub async fn to_ledger_vector< ) .await; } else if code_hash == ibc_hash { - let msg = Any::decode( + let any_msg = Any::decode( tx.data() .ok_or_else(|| std::io::Error::from(ErrorKind::InvalidData))? .as_ref(), @@ -1080,21 +991,19 @@ pub async fn to_ledger_vector< tv.name = "IBC 0".to_string(); tv.output.push("Type : IBC".to_string()); - match msg.type_url.as_str() { - MSG_TRANSFER_TYPE_URL => { - let transfer = MsgTransfer::try_from(msg).map_err(|_| { - std::io::Error::from(ErrorKind::InvalidData) - })?; + match MsgTransfer::try_from(any_msg.clone()) { + Ok(transfer) => { let transfer_token = format!( "{} {}", - transfer.token.amount, transfer.token.denom + transfer.packet_data.token.amount, + transfer.packet_data.token.denom ); tv.output.extend(vec![ format!("Source port : {}", transfer.port_id_on_a), format!("Source channel : {}", transfer.chan_id_on_a), format!("Token : {}", transfer_token), - format!("Sender : {}", transfer.sender), - format!("Receiver : {}", transfer.receiver), + format!("Sender : {}", transfer.packet_data.sender), + format!("Receiver : {}", transfer.packet_data.receiver), format!( "Timeout height : {}", transfer.timeout_height_on_b @@ -1108,8 +1017,8 @@ pub async fn to_ledger_vector< format!("Source port : {}", transfer.port_id_on_a), format!("Source channel : {}", transfer.chan_id_on_a), format!("Token : {}", transfer_token), - format!("Sender : {}", transfer.sender), - format!("Receiver : {}", transfer.receiver), + format!("Sender : {}", transfer.packet_data.sender), + format!("Receiver : {}", transfer.packet_data.receiver), format!( "Timeout height : {}", transfer.timeout_height_on_b @@ -1121,7 +1030,7 @@ pub async fn to_ledger_vector< ]); } _ => { - for line in format!("{:#?}", msg).split('\n') { + for line in format!("{:#?}", any_msg).split('\n') { let stripped = line.trim_start(); tv.output.push(format!("Part : {}", stripped)); tv.output_expert.push(format!("Part : {}", stripped)); diff --git a/shared/src/ledger/tx.rs b/shared/src/ledger/tx.rs index fabc4e6f403..7ee04652de8 100644 --- a/shared/src/ledger/tx.rs +++ b/shared/src/ledger/tx.rs @@ -1,7 +1,7 @@ //! SDK functions to construct different types of transactions use std::borrow::Cow; use std::collections::{BTreeMap, HashMap, HashSet}; -use std::str::FromStr; +use std::fs::File; use std::time::Duration; use borsh::BorshSerialize; @@ -15,32 +15,40 @@ use masp_primitives::transaction::components::transparent::fees::{ InputView as TransparentInputView, OutputView as TransparentOutputView, }; use masp_primitives::transaction::components::Amount; -use namada_core::types::address::{masp, masp_tx_key, Address}; +use namada_core::ledger::governance::cli::onchain::{ + DefaultProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, +}; +use namada_core::ledger::governance::storage::proposal::ProposalType; +use namada_core::ledger::governance::storage::vote::StorageProposalVote; +use namada_core::types::address::{masp, Address, InternalAddress}; use namada_core::types::dec::Dec; use namada_core::types::token::MaspDenom; +use namada_core::types::transaction::governance::{ + InitProposalData, VoteProposalData, +}; use namada_proof_of_stake::parameters::PosParams; use namada_proof_of_stake::types::{CommissionPair, ValidatorState}; use prost::EncodeError; use thiserror::Error; use super::rpc::query_wasm_code_hash; +use super::signing; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; +use crate::ibc::applications::transfer::packet::PacketData; +use crate::ibc::applications::transfer::PrefixedCoin; use crate::ibc::core::ics04_channel::timeout::TimeoutHeight; -use crate::ibc::signer::Signer; -use crate::ibc::timestamp::Timestamp as IbcTimestamp; -use crate::ibc::tx_msg::Msg; +use crate::ibc::core::timestamp::Timestamp as IbcTimestamp; +use crate::ibc::core::Msg; use crate::ibc::Height as IbcHeight; -use crate::ibc_proto::cosmos::base::v1beta1::Coin; use crate::ledger::args::{self, InputAmount}; -use crate::ledger::governance::storage as gov_storage; -use crate::ledger::masp::{ShieldedContext, ShieldedUtils}; +use crate::ledger::ibc::storage::ibc_denom_key; +use crate::ledger::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; use crate::ledger::rpc::{ self, format_denominated_amount, validate_amount, TxBroadcastData, TxResponse, }; -use crate::ledger::signing::{tx_signer, wrap_tx, TxSigningKey}; use crate::ledger::wallet::{Wallet, WalletUtils}; -use crate::proto::{Code, Data, MaspBuilder, Section, Tx}; +use crate::proto::{MaspBuilder, Tx}; use crate::tendermint_rpc::endpoint::broadcast::tx_sync::Response; use crate::tendermint_rpc::error::Error as RpcError; use crate::types::control_flow::{time, ProceedOrElse}; @@ -49,7 +57,8 @@ use crate::types::key::*; use crate::types::masp::TransferTarget; use crate::types::storage::Epoch; use crate::types::time::DateTimeUtc; -use crate::types::transaction::{pos, InitAccount, TxType, UpdateVp}; +use crate::types::transaction::account::{InitAccount, UpdateAccount}; +use crate::types::transaction::{pos, TxType}; use crate::types::{storage, token}; use crate::vm::WasmValidationError; use crate::{display_line, edisplay_line, vm}; @@ -65,7 +74,7 @@ pub const TX_VOTE_PROPOSAL: &str = "tx_vote_proposal.wasm"; /// Reveal public key transaction WASM path pub const TX_REVEAL_PK: &str = "tx_reveal_pk.wasm"; /// Update validity predicate WASM path -pub const TX_UPDATE_VP_WASM: &str = "tx_update_vp.wasm"; +pub const TX_UPDATE_ACCOUNT_WASM: &str = "tx_update_account.wasm"; /// Transfer transaction WASM path pub const TX_TRANSFER_WASM: &str = "tx_transfer.wasm"; /// IBC transaction WASM path @@ -198,6 +207,21 @@ pub enum Error { /// Like EncodeTxFailure but for the encode error type #[error("Encoding tx data, {0}, shouldn't fail")] EncodeFailure(EncodeError), + /// Failed to deserialize the proposal data from json + #[error("Failed to deserialize the proposal data: {0}")] + FailedGovernaneProposalDeserialize(String), + /// The proposal data are invalid + #[error("Proposal data are invalid: {0}")] + InvalidProposal(String), + /// The proposal vote is not valid + #[error("Proposal vote is invalid")] + InvalidProposalVote, + /// The proposal can't be voted + #[error("Proposal {0} can't be voted")] + InvalidProposalVotingPeriod(u64), + /// The proposal can't be found + #[error("Proposal {0} can't be found")] + ProposalDoesNotExist(u64), /// Encoding public key failure #[error("Encoding a public key, {0}, shouldn't fail")] EncodeKeyFailure(std::io::Error), @@ -221,6 +245,18 @@ pub enum Error { /// Epoch not in storage #[error("Proposal end epoch is not in the storage.")] EpochNotInStorage, + /// Couldn't understand who the fee payer is + #[error("Either --signing-keys or --gas-payer must be available.")] + InvalidFeePayer, + /// Account threshold is not set + #[error("Account threshold must be set.")] + MissingAccountThreshold, + /// Not enough signature + #[error("Account threshold is {0} but the valid signatures are {1}.")] + MissingSigningKeys(u8, u8), + /// Invalid owner account + #[error("The source account {0} is not valid or doesn't exist.")] + InvalidAccount(String), /// Other Errors that may show up when using the interface #[error("{0}")] Other(String), @@ -234,6 +270,8 @@ pub enum ProcessTxResponse { Broadcast(Response), /// Result of dry running transaction DryRun, + /// Dump transaction to disk + Dump, } impl ProcessTxResponse { @@ -246,42 +284,42 @@ impl ProcessTxResponse { } } +/// Build and dump a transaction either to file or to screen +pub fn dump_tx(args: &args::Tx, tx: Tx) { + let tx_id = tx.header_hash(); + let serialized_tx = tx.serialize(); + match args.output_folder.to_owned() { + Some(path) => { + let tx_filename = format!("{}.tx", tx_id); + let out = File::create(path.join(tx_filename)).unwrap(); + serde_json::to_writer_pretty(out, &serialized_tx) + .expect("Should be able to write to file.") + } + None => display_line!(IO, "{}", serialized_tx), + } +} + /// Prepare a transaction for signing and submission by adding a wrapper header /// to it. -pub async fn prepare_tx< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, - IO: Io, ->( +pub async fn prepare_tx( client: &C, - wallet: &mut Wallet, args: &args::Tx, - tx: Tx, - default_signer: TxSigningKey, + tx: &mut Tx, + gas_payer: common::PublicKey, #[cfg(not(feature = "mainnet"))] requires_pow: bool, -) -> Result<(Tx, Option
, common::PublicKey), Error> { - let (signer_addr, signer_pk) = - tx_signer::(client, wallet, args, default_signer.clone()) - .await?; - if args.dry_run { - Ok((tx, signer_addr, signer_pk)) - } else { +) { + if !args.dry_run { let epoch = rpc::query_epoch(client).await; - Ok(( - wrap_tx::<_, _, IO>( - client, - wallet, - args, - epoch, - tx.clone(), - &signer_pk, - #[cfg(not(feature = "mainnet"))] - requires_pow, - ) - .await, - signer_addr, - signer_pk, - )) + signing::wrap_tx::<_, IO>( + client, + tx, + args, + epoch, + gas_payer, + #[cfg(not(feature = "mainnet"))] + requires_pow, + ) + .await } } @@ -295,10 +333,8 @@ pub async fn process_tx< client: &C, wallet: &mut Wallet, args: &args::Tx, - mut tx: Tx, + tx: Tx, ) -> Result { - // Remove all the sensitive sections - tx.protocol_filter(); // NOTE: use this to print the request JSON body: // let request = @@ -349,77 +385,42 @@ pub async fn process_tx< } } -/// Submit transaction to reveal public key -pub async fn build_reveal_pk< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, - IO: Io, ->( - client: &C, - wallet: &mut Wallet, - args: args::RevealPk, -) -> Result, common::PublicKey)>, Error> { - let args::RevealPk { - tx: args, - public_key, - } = args; - let public_key = public_key; - if !is_reveal_pk_needed::(client, &public_key, &args).await? { - let addr: Address = (&public_key).into(); - display_line!(IO, "PK for {addr} is already revealed, nothing to do."); - Ok(None) - } else { - // If not, submit it - Ok(Some( - build_reveal_pk_aux::(client, wallet, &public_key, &args) - .await?, - )) - } -} - -/// Submit transaction to rveeal public key if needed -pub async fn is_reveal_pk_needed< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, ->( +/// Check if a reveal public key transaction is needed +pub async fn is_reveal_pk_needed( client: &C, - public_key: &common::PublicKey, - args: &args::Tx, + address: &Address, + force: bool, ) -> Result where C: crate::ledger::queries::Client + Sync, - U: WalletUtils, { - let addr: Address = public_key.into(); // Check if PK revealed - Ok(args.force || !has_revealed_pk(client, &addr).await) + Ok(force || !has_revealed_pk(client, address).await) } /// Check if the public key for the given address has been revealed pub async fn has_revealed_pk( client: &C, - addr: &Address, + address: &Address, ) -> bool { - rpc::get_public_key(client, addr).await.is_some() + rpc::is_public_key_revealed(client, address).await } /// Submit transaction to reveal the given public key pub async fn build_reveal_pk_aux< C: crate::ledger::queries::Client + Sync, - U: WalletUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, - public_key: &common::PublicKey, args: &args::Tx, -) -> Result<(Tx, Option
, common::PublicKey), Error> { - let addr: Address = public_key.into(); + address: &Address, + public_key: &common::PublicKey, + gas_payer: &common::PublicKey, +) -> Result { display_line!( IO, - "Submitting a tx to reveal the public key for address {addr}..." + "Submitting a tx to reveal the public key for address {address}..." ); - let tx_data = public_key.try_to_vec().map_err(Error::EncodeKeyFailure)?; let tx_code_hash = query_wasm_code_hash::<_, IO>( client, @@ -428,22 +429,21 @@ pub async fn build_reveal_pk_aux< .await .unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.chain_id.clone().expect("value should be there"); - tx.header.expiration = args.expiration; - tx.set_data(Data::new(tx_data)); - tx.set_code(Code::from_hash(tx_code_hash)); + let chain_id = args.chain_id.clone().unwrap(); + + let mut tx = Tx::new(chain_id, args.expiration); + tx.add_code_from_hash(tx_code_hash).add_data(public_key); - prepare_tx::( + prepare_tx::( client, - wallet, args, - tx, - TxSigningKey::WalletAddress(addr), + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + Ok(tx) } /// Broadcast a transaction to be included in the blockchain and checks that @@ -661,33 +661,35 @@ pub async fn save_initialized_accounts( /// Submit validator comission rate change pub async fn build_validator_commission_change< C: crate::ledger::queries::Client + Sync, - U: WalletUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, - args: args::CommissionRateChange, -) -> Result<(Tx, Option
, common::PublicKey), Error> { + args::CommissionRateChange { + tx: tx_args, + validator, + rate, + tx_code_path, + }: args::CommissionRateChange, + gas_payer: &common::PublicKey, +) -> Result { let epoch = rpc::query_epoch(client).await; - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); let params: PosParams = rpc::get_pos_params(client).await; - let validator = args.validator.clone(); + let validator = validator.clone(); if rpc::is_validator(client, &validator).await { - if args.rate < Dec::zero() || args.rate > Dec::one() { + if rate < Dec::zero() || rate > Dec::one() { edisplay_line!( IO, "Invalid new commission rate, received {}", - args.rate + rate ); - return Err(Error::InvalidCommissionRate(args.rate)); + return Err(Error::InvalidCommissionRate(rate)); } let pipeline_epoch_minus_one = epoch + params.pipeline_len - 1; @@ -703,7 +705,7 @@ pub async fn build_validator_commission_change< commission_rate, max_commission_change_per_epoch, }) => { - if args.rate.abs_diff(&commission_rate) + if rate.abs_diff(&commission_rate) > max_commission_change_per_epoch { edisplay_line!( @@ -712,121 +714,67 @@ pub async fn build_validator_commission_change< the predecessor epoch in which the rate will take \ effect." ); - if !args.tx.force { - return Err(Error::InvalidCommissionRate(args.rate)); + if !tx_args.force { + return Err(Error::InvalidCommissionRate(rate)); } } } None => { edisplay_line!(IO, "Error retrieving from storage"); - if !args.tx.force { + if !tx_args.force { return Err(Error::Retrieval); } } } } else { edisplay_line!(IO, "The given address {validator} is not a validator."); - if !args.tx.force { + if !tx_args.force { return Err(Error::InvalidValidatorAddress(validator)); } } let data = pos::CommissionChange { - validator: args.validator.clone(), - new_rate: args.rate, + validator: validator.clone(), + new_rate: rate, }; - let data = data.try_to_vec().map_err(Error::EncodeTxFailure)?; - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + tx.add_code_from_hash(tx_code_hash).add_data(data); - let default_signer = args.validator.clone(); - prepare_tx::( + prepare_tx::( client, - wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(default_signer), + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + Ok(tx) } /// Submit transaction to unjail a jailed validator pub async fn build_unjail_validator< C: crate::ledger::queries::Client + Sync, - U: WalletUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, - args: args::TxUnjailValidator, -) -> Result<(Tx, Option
, common::PublicKey), Error> { - if !rpc::is_validator(client, &args.validator).await { - edisplay_line!( - IO, - "The given address {} is not a validator.", - &args.validator - ); - if !args.tx.force { - return Err(Error::InvalidValidatorAddress(args.validator.clone())); - } - } - - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); - - let data = args - .validator - .clone() - .try_to_vec() - .map_err(Error::EncodeTxFailure)?; - - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); - - let default_signer = args.validator; - prepare_tx::<_, _, IO>( - client, - wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(default_signer), - #[cfg(not(feature = "mainnet"))] - false, - ) - .await -} - -/// Submit transaction to unjail a jailed validator -pub async fn submit_unjail_validator< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, - IO: Io, ->( - client: &C, - wallet: &mut Wallet, - args: args::TxUnjailValidator, -) -> Result<(), Error> { - if !rpc::is_validator(client, &args.validator).await { + args::TxUnjailValidator { + tx: tx_args, + validator, + tx_code_path, + }: args::TxUnjailValidator, + gas_payer: &common::PublicKey, +) -> Result { + if !rpc::is_validator(client, &validator).await { edisplay_line!( IO, "The given address {} is not a validator.", - &args.validator + &validator ); - if !args.tx.force { - return Err(Error::InvalidValidatorAddress(args.validator.clone())); + if !tx_args.force { + return Err(Error::InvalidValidatorAddress(validator.clone())); } } @@ -835,7 +783,7 @@ pub async fn submit_unjail_validator< let pipeline_epoch = current_epoch + params.pipeline_len; let validator_state_at_pipeline = - rpc::get_validator_state(client, &args.validator, Some(pipeline_epoch)) + rpc::get_validator_state(client, &validator, Some(pipeline_epoch)) .await .expect("Validator state should be defined."); if validator_state_at_pipeline != ValidatorState::Jailed { @@ -843,17 +791,15 @@ pub async fn submit_unjail_validator< IO, "The given validator address {} is not jailed at the pipeline \ epoch when it would be restored to one of the validator sets.", - &args.validator + &validator ); - if !args.tx.force { - return Err(Error::ValidatorNotCurrentlyJailed( - args.validator.clone(), - )); + if !tx_args.force { + return Err(Error::ValidatorNotCurrentlyJailed(validator.clone())); } } let last_slash_epoch_key = - crate::ledger::pos::validator_last_slash_key(&args.validator); + crate::ledger::pos::validator_last_slash_key(&validator); let last_slash_epoch = rpc::query_storage_value::(client, &last_slash_epoch_key) .await; @@ -865,76 +811,72 @@ pub async fn submit_unjail_validator< IO, "The given validator address {} is currently frozen and not \ yet eligible to be unjailed.", - &args.validator + &validator ); - if !args.tx.force { + if !tx_args.force { return Err(Error::ValidatorNotCurrentlyJailed( - args.validator.clone(), + validator.clone(), )); } } } - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); - let data = args - .validator + let _data = validator .clone() .try_to_vec() .map_err(Error::EncodeTxFailure)?; - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + tx.add_code_from_hash(tx_code_hash) + .add_data(validator.clone()); - let default_signer = args.validator; - prepare_tx::<_, _, IO>( + prepare_tx::<_, IO>( client, - wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(default_signer), + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await?; - Ok(()) + .await; + Ok(tx) } /// Submit transaction to withdraw an unbond pub async fn build_withdraw< C: crate::ledger::queries::Client + Sync, - U: WalletUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, - args: args::Withdraw, -) -> Result<(Tx, Option
, common::PublicKey), Error> { + args::Withdraw { + tx: tx_args, + validator, + source, + tx_code_path, + }: args::Withdraw, + gas_payer: &common::PublicKey, +) -> Result { let epoch = rpc::query_epoch(client).await; let validator = known_validator_or_err::<_, IO>( - args.validator.clone(), - args.tx.force, + validator.clone(), + tx_args.force, client, ) .await?; - let source = args.source.clone(); + let source = source.clone(); - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); // Check the source's current unbond amount let bond_source = source.clone().unwrap_or_else(|| validator.clone()); @@ -945,6 +887,7 @@ pub async fn build_withdraw< Some(epoch), ) .await; + if tokens.is_zero() { edisplay_line!( IO, @@ -954,7 +897,7 @@ pub async fn build_withdraw< ); rpc::query_and_print_unbonds::<_, IO>(client, &bond_source, &validator) .await; - if !args.tx.force { + if !tx_args.force { return Err(Error::NoUnbondReady(epoch)); } } else { @@ -967,25 +910,21 @@ pub async fn build_withdraw< } let data = pos::Withdraw { validator, source }; - let data = data.try_to_vec().map_err(Error::EncodeTxFailure)?; - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + tx.add_code_from_hash(tx_code_hash).add_data(data); - let default_signer = args.source.unwrap_or(args.validator); - prepare_tx::( + prepare_tx::( client, - wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(default_signer), + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + Ok(tx) } /// Submit a transaction to unbond @@ -995,58 +934,55 @@ pub async fn build_unbond< IO: Io, >( client: &C, - wallet: &mut Wallet, - args: args::Unbond, -) -> Result< - ( - Tx, - Option
, - common::PublicKey, - Option<(Epoch, token::Amount)>, - ), - Error, -> { - let source = args.source.clone(); + _wallet: &mut Wallet, + args::Unbond { + tx: tx_args, + validator, + amount, + source, + tx_code_path, + }: args::Unbond, + gas_payer: &common::PublicKey, +) -> Result<(Tx, Option<(Epoch, token::Amount)>), Error> { + let source = source.clone(); // Check the source's current bond amount - let bond_source = source.clone().unwrap_or_else(|| args.validator.clone()); + let bond_source = source.clone().unwrap_or_else(|| validator.clone()); - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); - if !args.tx.force { + if !tx_args.force { known_validator_or_err::<_, IO>( - args.validator.clone(), - args.tx.force, + validator.clone(), + tx_args.force, client, ) .await?; let bond_amount = - rpc::query_bond(client, &bond_source, &args.validator, None).await; + rpc::query_bond(client, &bond_source, &validator, None).await; display_line!( IO, "Bond amount available for unbonding: {} NAM", bond_amount.to_string_native() ); - if args.amount > bond_amount { + if amount > bond_amount { edisplay_line!( IO, "The total bonds of the source {} is lower than the amount to \ be unbonded. Amount to unbond is {} and the total bonds is \ {}.", bond_source, - args.amount.to_string_native(), + amount.to_string_native(), bond_amount.to_string_native() ); - if !args.tx.force { + if !tx_args.force { return Err(Error::LowerBondThanUnbond( bond_source, - args.amount.to_string_native(), + amount.to_string_native(), bond_amount.to_string_native(), )); } @@ -1055,8 +991,7 @@ pub async fn build_unbond< // Query the unbonds before submitting the tx let unbonds = - rpc::query_unbond_with_slashing(client, &bond_source, &args.validator) - .await; + rpc::query_unbond_with_slashing(client, &bond_source, &validator).await; let mut withdrawable = BTreeMap::::new(); for ((_start_epoch, withdraw_epoch), amount) in unbonds.into_iter() { let to_withdraw = withdrawable.entry(withdraw_epoch).or_default(); @@ -1065,31 +1000,26 @@ pub async fn build_unbond< let latest_withdrawal_pre = withdrawable.into_iter().last(); let data = pos::Unbond { - validator: args.validator.clone(), - amount: args.amount, - source, + validator: validator.clone(), + amount, + source: source.clone(), }; - let data = data.try_to_vec().map_err(Error::EncodeTxFailure)?; - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + tx.add_code_from_hash(tx_code_hash).add_data(data); - let default_signer = args.source.unwrap_or_else(|| args.validator.clone()); - let (tx, signer_addr, default_signer) = prepare_tx::( + prepare_tx::( client, - wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(default_signer), + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await?; + .await; - Ok((tx, signer_addr, default_signer, latest_withdrawal_pre)) + Ok((tx, latest_withdrawal_pre)) } /// Query the unbonds post-tx @@ -1159,27 +1089,30 @@ pub async fn query_unbonds( } /// Submit a transaction to bond -pub async fn build_bond< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, - IO: Io, ->( +pub async fn build_bond( client: &C, - wallet: &mut Wallet, - args: args::Bond, -) -> Result<(Tx, Option
, common::PublicKey), Error> { + args::Bond { + tx: tx_args, + validator, + amount, + source, + native_token, + tx_code_path, + }: args::Bond, + gas_payer: &common::PublicKey, +) -> Result { let validator = known_validator_or_err::<_, IO>( - args.validator.clone(), - args.tx.force, + validator.clone(), + tx_args.force, client, ) .await?; // Check that the source address exists on chain - let source = args.source.clone(); - let source = match args.source.clone() { + let source = source.clone(); + let source = match source.clone() { Some(source) => { - source_exists_or_err::<_, IO>(source, args.tx.force, client) + source_exists_or_err::<_, IO>(source, tx_args.force, client) .await .map(Some) } @@ -1188,137 +1121,362 @@ pub async fn build_bond< // Check bond's source (source for delegation or validator for self-bonds) // balance let bond_source = source.as_ref().unwrap_or(&validator); - let balance_key = token::balance_key(&args.native_token, bond_source); + let balance_key = token::balance_key(&native_token, bond_source); // TODO Should we state the same error message for the native token? check_balance_too_low_err::<_, IO>( - &args.native_token, + &native_token, bond_source, - args.amount, + amount, balance_key, - args.tx.force, + tx_args.force, client, ) .await?; - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); - let bond = pos::Bond { + let data = pos::Bond { validator, - amount: args.amount, + amount, source, }; - let data = bond.try_to_vec().map_err(Error::EncodeTxFailure)?; - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + tx.add_code_from_hash(tx_code_hash).add_data(data); - let default_signer = args.source.unwrap_or(args.validator); - prepare_tx::( + prepare_tx::( client, - wallet, - &args.tx, + &tx_args, + &mut tx, + gas_payer.clone(), + #[cfg(not(feature = "mainnet"))] + false, + ) + .await; + Ok(tx) +} + +/// Build a default proposal governance +pub async fn build_default_proposal< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( + client: &C, + args::InitProposal { tx, - TxSigningKey::WalletAddress(default_signer), + proposal_data: _, + native_token: _, + is_offline: _, + is_pgf_stewards: _, + is_pgf_funding: _, + tx_code_path, + }: args::InitProposal, + proposal: DefaultProposal, + gas_payer: &common::PublicKey, +) -> Result { + let mut init_proposal_data = + InitProposalData::try_from(proposal.clone()) + .map_err(|e| Error::InvalidProposal(e.to_string()))?; + + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); + + let chain_id = tx.chain_id.clone().unwrap(); + + let mut tx_builder = Tx::new(chain_id, tx.expiration); + + let (_, extra_section_hash) = tx_builder + .add_extra_section(proposal.proposal.content.try_to_vec().unwrap()); + init_proposal_data.content = extra_section_hash; + + if let Some(init_proposal_code) = proposal.data { + let (_, extra_section_hash) = + tx_builder.add_extra_section(init_proposal_code); + init_proposal_data.r#type = + ProposalType::Default(Some(extra_section_hash)); + }; + + tx_builder + .add_code_from_hash(tx_code_hash) + .add_data(init_proposal_data); + + prepare_tx::( + client, + &tx, + &mut tx_builder, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + + Ok(tx_builder) } -/// Check if current epoch is in the last third of the voting period of the -/// proposal. This ensures that it is safe to optimize the vote writing to -/// storage. -pub async fn is_safe_voting_window( +/// Build a proposal vote +pub async fn build_vote_proposal< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( client: &C, - proposal_id: u64, - proposal_start_epoch: Epoch, -) -> Result { - let current_epoch = rpc::query_epoch(client).await; + args::VoteProposal { + tx, + proposal_id, + vote, + voter, + is_offline: _, + proposal_data: _, + tx_code_path, + }: args::VoteProposal, + epoch: Epoch, + gas_payer: &common::PublicKey, +) -> Result { + let proposal_vote = + ProposalVote::try_from(vote).map_err(|_| Error::InvalidProposalVote)?; + + let proposal_id = proposal_id.expect("Proposal id must be defined."); + let proposal = if let Some(proposal) = + rpc::query_proposal_by_id(client, proposal_id).await + { + proposal + } else { + return Err(Error::ProposalDoesNotExist(proposal_id)); + }; - let proposal_end_epoch_key = - gov_storage::get_voting_end_epoch_key(proposal_id); - let proposal_end_epoch = - rpc::query_storage_value::(client, &proposal_end_epoch_key) - .await; + let storage_vote = + StorageProposalVote::build(&proposal_vote, &proposal.r#type) + .expect("Should be able to build the proposal vote"); - match proposal_end_epoch { - Some(proposal_end_epoch) => { - Ok(!crate::ledger::native_vp::governance::utils::is_valid_validator_voting_period( - current_epoch, - proposal_start_epoch, - proposal_end_epoch, - )) - } - None => { - Err(Error::EpochNotInStorage) - } + let is_validator = rpc::is_validator(client, &voter).await; + + if !proposal.can_be_voted(epoch, is_validator) { + return Err(Error::InvalidProposalVotingPeriod(proposal_id)); } + + let delegations = rpc::get_delegators_delegation_at( + client, + &voter, + proposal.voting_start_epoch, + ) + .await + .keys() + .cloned() + .collect::>(); + + let data = VoteProposalData { + id: proposal_id, + vote: storage_vote, + voter: voter.clone(), + delegations, + }; + + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); + + let chain_id = tx.chain_id.clone().unwrap(); + + let mut tx_builder = Tx::new(chain_id, tx.expiration); + tx_builder.add_code_from_hash(tx_code_hash).add_data(data); + + prepare_tx::( + client, + &tx, + &mut tx_builder, + gas_payer.clone(), + #[cfg(not(feature = "mainnet"))] + false, + ) + .await; + + Ok(tx_builder) +} + +/// Build a pgf funding proposal governance +pub async fn build_pgf_funding_proposal< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( + client: &C, + args::InitProposal { + tx, + proposal_data: _, + native_token: _, + is_offline: _, + is_pgf_stewards: _, + is_pgf_funding: _, + tx_code_path, + }: args::InitProposal, + proposal: PgfFundingProposal, + gas_payer: &common::PublicKey, +) -> Result { + let mut init_proposal_data = + InitProposalData::try_from(proposal.clone()) + .map_err(|e| Error::InvalidProposal(e.to_string()))?; + + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); + + let chain_id = tx.chain_id.clone().unwrap(); + + let mut tx_builder = Tx::new(chain_id, tx.expiration); + + let (_, extra_section_hash) = tx_builder + .add_extra_section(proposal.proposal.content.try_to_vec().unwrap()); + init_proposal_data.content = extra_section_hash; + + tx_builder + .add_code_from_hash(tx_code_hash) + .add_data(init_proposal_data); + + prepare_tx::( + client, + &tx, + &mut tx_builder, + gas_payer.clone(), + #[cfg(not(feature = "mainnet"))] + false, + ) + .await; + + Ok(tx_builder) +} + +/// Build a pgf funding proposal governance +pub async fn build_pgf_stewards_proposal< + C: crate::ledger::queries::Client + Sync, + IO: Io, +>( + client: &C, + args::InitProposal { + tx, + proposal_data: _, + native_token: _, + is_offline: _, + is_pgf_stewards: _, + is_pgf_funding: _, + tx_code_path, + }: args::InitProposal, + proposal: PgfStewardProposal, + gas_payer: &common::PublicKey, +) -> Result { + let mut init_proposal_data = + InitProposalData::try_from(proposal.clone()) + .map_err(|e| Error::InvalidProposal(e.to_string()))?; + + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); + + let chain_id = tx.chain_id.clone().unwrap(); + + let mut tx_builder = Tx::new(chain_id, tx.expiration); + + let (_, extra_section_hash) = tx_builder + .add_extra_section(proposal.proposal.content.try_to_vec().unwrap()); + init_proposal_data.content = extra_section_hash; + + tx_builder + .add_code_from_hash(tx_code_hash) + .add_data(init_proposal_data); + + prepare_tx::( + client, + &tx, + &mut tx_builder, + gas_payer.clone(), + #[cfg(not(feature = "mainnet"))] + false, + ) + .await; + + Ok(tx_builder) } /// Submit an IBC transfer pub async fn build_ibc_transfer< C: crate::ledger::queries::Client + Sync, - U: WalletUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, - args: args::TxIbcTransfer, -) -> Result<(Tx, Option
, common::PublicKey), Error> { + args::TxIbcTransfer { + tx: tx_args, + source, + receiver, + token, + amount, + port_id, + channel_id, + timeout_height, + timeout_sec_offset, + memo, + tx_code_path, + }: args::TxIbcTransfer, + gas_payer: &common::PublicKey, +) -> Result { // Check that the source address exists on chain - let source = source_exists_or_err::<_, IO>( - args.source.clone(), - args.tx.force, - client, - ) - .await?; + let source = + source_exists_or_err::<_, IO>(source.clone(), tx_args.force, client) + .await?; // We cannot check the receiver - let token = args.token; - // Check source balance let balance_key = token::balance_key(&token, &source); check_balance_too_low_err::<_, IO>( &token, &source, - args.amount, + amount, balance_key, - args.tx.force, + tx_args.force, client, ) .await?; - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); - let amount = args - .amount + let ibc_denom = match &token { + Address::Internal(InternalAddress::IbcToken(hash)) => { + let ibc_denom_key = ibc_denom_key(hash); + rpc::query_storage_value::(client, &ibc_denom_key) + .await + .ok_or_else(|| Error::TokenDoesNotExist(token.clone()))? + } + _ => token.to_string(), + }; + let amount = amount .to_string_native() .split('.') .next() .expect("invalid amount") .to_string(); - let token = Coin { - denom: token.to_string(), - amount, + let token = PrefixedCoin { + denom: ibc_denom.parse().expect("Invalid IBC denom"), + amount: amount.parse().expect("Invalid amount"), + }; + let packet_data = PacketData { + token, + sender: source.to_string().into(), + receiver: receiver.into(), + memo: memo.unwrap_or_default().into(), }; // this height should be that of the destination chain, not this chain - let timeout_height = match args.timeout_height { + let timeout_height = match timeout_height { Some(h) => { TimeoutHeight::At(IbcHeight::new(0, h).expect("invalid height")) } @@ -1327,7 +1485,7 @@ pub async fn build_ibc_transfer< let now: crate::tendermint::Time = DateTimeUtc::now().try_into().unwrap(); let now: IbcTimestamp = now.into(); - let timeout_timestamp = if let Some(offset) = args.timeout_sec_offset { + let timeout_timestamp = if let Some(offset) = timeout_sec_offset { (now + Duration::new(offset, 0)).unwrap() } else if timeout_height == TimeoutHeight::Never { // we cannot set 0 to both the height and the timestamp @@ -1337,36 +1495,33 @@ pub async fn build_ibc_transfer< }; let msg = MsgTransfer { - port_id_on_a: args.port_id, - chan_id_on_a: args.channel_id, - token, - sender: Signer::from_str(&source.to_string()).expect("invalid signer"), - receiver: Signer::from_str(&args.receiver).expect("invalid signer"), + port_id_on_a: port_id, + chan_id_on_a: channel_id, + packet_data, timeout_height_on_b: timeout_height, timeout_timestamp_on_b: timeout_timestamp, }; - tracing::debug!("IBC transfer message {:?}", msg); + let any_msg = msg.to_any(); let mut data = vec![]; prost::Message::encode(&any_msg, &mut data) .map_err(Error::EncodeFailure)?; - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + tx.add_code_from_hash(tx_code_hash) + .add_serialized_data(data); - prepare_tx::( + prepare_tx::( client, - wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(args.source), + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + Ok(tx) } /// Try to decode the given asset type and add its decoding to the supplied set. @@ -1445,16 +1600,14 @@ async fn used_asset_types< /// Submit an ordinary transfer pub async fn build_transfer< C: crate::ledger::queries::Client + Sync, - V: WalletUtils, U: ShieldedUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, shielded: &mut ShieldedContext, mut args: args::TxTransfer, -) -> Result<(Tx, Option
, common::PublicKey, Option, bool), Error> -{ + gas_payer: &common::PublicKey, +) -> Result<(Tx, Option), Error> { let source = args.source.effective_address(); let target = args.target.effective_address(); let token = args.token.clone(); @@ -1475,16 +1628,15 @@ pub async fn build_transfer< .expect("expected to validate amount"); let validate_fee = validate_amount::<_, IO>( client, - args.tx.fee_amount, - &args.tx.fee_token, + args.tx.gas_amount, + &args.tx.gas_token, args.tx.force, ) .await .expect("expected to be able to validate fee"); args.amount = InputAmount::Validated(validated_amount); - args.tx.fee_amount = InputAmount::Validated(validate_fee); - + args.tx.gas_amount = InputAmount::Validated(validate_fee); check_balance_too_low_err::( &token, &source, @@ -1500,21 +1652,14 @@ pub async fn build_transfer< // signer. Also, if the transaction is shielded, redact the amount and token // types by setting the transparent value to 0 and token type to a constant. // This has no side-effect because transaction is to self. - let (_amount, token) = if source == masp_addr && target == masp_addr { - // TODO Refactor me, we shouldn't rely on any specific token here. - (token::Amount::default(), args.native_token.clone()) - } else { - (validated_amount.amount, token) - }; - let default_signer = - TxSigningKey::WalletAddress(args.source.effective_address()); - // If our chosen signer is the MASP sentinel key, then our shielded inputs - // will need to cover the gas fees. - let chosen_signer = - tx_signer::(client, wallet, &args.tx, default_signer.clone()) - .await? - .1; - let shielded_gas = masp_tx_key().ref_to() == chosen_signer; + let (_amount, token, shielded_gas) = + if source == masp_addr && target == masp_addr { + // TODO Refactor me, we shouldn't rely on any specific token here. + (token::Amount::default(), args.native_token.clone(), true) + } else { + (validated_amount.amount, token, false) + }; + // Determine whether to pin this transaction to a storage key let key = match &args.target { TransferTarget::PaymentAddress(pa) if pa.is_pinned() => Some(pa.hash()), @@ -1523,6 +1668,8 @@ pub async fn build_transfer< #[cfg(not(feature = "mainnet"))] let is_source_faucet = rpc::is_faucet_account(client, &source).await; + #[cfg(feature = "mainnet")] + let is_source_faucet = false; let tx_code_hash = query_wasm_code_hash::<_, IO>( client, @@ -1544,40 +1691,44 @@ pub async fn build_transfer< validated_amount.amount.to_string_native(), Box::new(token.clone()), validate_fee.amount.to_string_native(), - Box::new(args.tx.fee_token.clone()), + Box::new(args.tx.gas_token.clone()), )) } Err(err) => Err(Error::MaspError(err)), }?; - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; + let chain_id = args.tx.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, args.tx.expiration); + // Add the MASP Transaction and its Builder to facilitate validation - let (masp_hash, shielded_tx_epoch) = if let Some(shielded_parts) = - shielded_parts + let (masp_hash, shielded_tx_epoch) = if let Some(ShieldedTransfer { + builder, + masp_tx, + metadata, + epoch, + }) = shielded_parts { - // Add a MASP Transaction section to the Tx - let masp_tx = tx.add_section(Section::MaspTx(shielded_parts.1)); - // Get the hash of the MASP Transaction section - let masp_hash = masp_tx.get_hash(); + // Add a MASP Transaction section to the Tx and get the tx hash + let masp_tx_hash = tx.add_masp_tx_section(masp_tx).1; + // Get the decoded asset types used in the transaction to give // offline wallet users more information - let asset_types = used_asset_types(shielded, client, &shielded_parts.0) + let asset_types = used_asset_types(shielded, client, &builder) .await .unwrap_or_default(); - // Add the MASP Transaction's Builder to the Tx - tx.add_section(Section::MaspBuilder(MaspBuilder { + + tx.add_masp_builder(MaspBuilder { asset_types, // Store how the Info objects map to Descriptors/Outputs - metadata: shielded_parts.2, + metadata, // Store the data that was used to construct the Transaction - builder: shielded_parts.0, + builder, // Link the Builder to the Transaction by hash code - target: masp_hash, - })); + target: masp_tx_hash, + }); + // The MASP Transaction section hash will be used in Transfer - (Some(masp_hash), Some(shielded_parts.3)) + (Some(masp_tx_hash), Some(epoch)) } else { (None, None) }; @@ -1591,209 +1742,192 @@ pub async fn build_transfer< // Link the Transfer to the MASP Transaction by hash code shielded: masp_hash, }; + tracing::debug!("Transfer data {:?}", transfer); - // Encode the Transfer and store it beside the MASP transaction - let data = transfer - .try_to_vec() - .expect("Encoding tx data shouldn't fail"); - tx.set_data(Data::new(data)); - // Finally store the Traansfer WASM code in the Tx - tx.set_code(Code::from_hash(tx_code_hash)); + + tx.add_code_from_hash(tx_code_hash).add_data(transfer); // Dry-run/broadcast/submit the transaction - let (tx, signer_addr, def_key) = prepare_tx::( + prepare_tx::( client, - wallet, &args.tx, - tx, - default_signer.clone(), + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] is_source_faucet, ) - .await?; - Ok(( - tx, - signer_addr, - def_key, - shielded_tx_epoch, - is_source_faucet, - )) + .await; + + Ok((tx, shielded_tx_epoch)) } /// Submit a transaction to initialize an account pub async fn build_init_account< C: crate::ledger::queries::Client + Sync, - U: WalletUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, - args: args::TxInitAccount, -) -> Result<(Tx, Option
, common::PublicKey), Error> { - let public_key = args.public_key; + args::TxInitAccount { + tx: tx_args, + vp_code_path, + tx_code_path, + public_keys, + threshold, + }: args::TxInitAccount, + gas_payer: &common::PublicKey, +) -> Result { + let vp_code_hash = + query_wasm_code_hash::<_, IO>(client, vp_code_path.to_str().unwrap()) + .await + .unwrap(); - let vp_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.vp_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let threshold = match threshold { + Some(threshold) => threshold, + None => { + if public_keys.len() == 1 { + 1u8 + } else { + return Err(Error::MissingAccountThreshold); + } + } + }; - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - let extra = - tx.add_section(Section::ExtraData(Code::from_hash(vp_code_hash))); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + let extra_section_hash = tx.add_extra_section_from_hash(vp_code_hash); let data = InitAccount { - public_key, - vp_code_hash: extra.get_hash(), + public_keys, + vp_code_hash: extra_section_hash, + threshold, }; - let data = data.try_to_vec().map_err(Error::EncodeTxFailure)?; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); + tx.add_code_from_hash(tx_code_hash).add_data(data); - prepare_tx::( + prepare_tx::( client, - wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(args.source), + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + Ok(tx) } /// Submit a transaction to update a VP -pub async fn build_update_vp< +pub async fn build_update_account< C: crate::ledger::queries::Client + Sync, - U: WalletUtils, IO: Io, >( client: &C, - wallet: &mut Wallet, - args: args::TxUpdateVp, -) -> Result<(Tx, Option
, common::PublicKey), Error> { - let addr = args.addr.clone(); - - // Check that the address is established and exists on chain - match &addr { - Address::Established(_) => { - let exists = rpc::known_address::(client, &addr).await; - if !exists { - if args.tx.force { - edisplay_line!( - IO, - "The address {} doesn't exist on chain.", - addr - ); - Ok(()) - } else { - Err(Error::LocationDoesNotExist(addr.clone())) - } - } else { - Ok(()) - } - } - Address::Implicit(_) => { - if args.tx.force { - edisplay_line!( - IO, - "A validity predicate of an implicit address cannot be \ - directly updated. You can use an established address for \ - this purpose." - ); - Ok(()) - } else { - Err(Error::ImplicitUpdate) - } - } - Address::Internal(_) => { - if args.tx.force { - edisplay_line!( - IO, - "A validity predicate of an internal address cannot be \ - directly updated." - ); - Ok(()) - } else { - Err(Error::ImplicitInternalError) - } + args::TxUpdateAccount { + tx: tx_args, + vp_code_path, + tx_code_path, + addr, + public_keys, + threshold, + }: args::TxUpdateAccount, + gas_payer: &common::PublicKey, +) -> Result { + let addr = if let Some(account) = rpc::get_account_info(client, &addr).await + { + account.address + } else if tx_args.force { + addr + } else { + return Err(Error::LocationDoesNotExist(addr)); + }; + + let vp_code_hash = match vp_code_path { + Some(code_path) => { + let vp_hash = query_wasm_code_hash::<_, IO>( + client, + code_path.to_str().unwrap(), + ) + .await + .unwrap(); + Some(vp_hash) } - }?; + None => None, + }; - let vp_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.vp_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let tx_code_hash = + query_wasm_code_hash::<_, IO>(client, tx_code_path.to_str().unwrap()) + .await + .unwrap(); - let tx_code_hash = query_wasm_code_hash::<_, IO>( - client, - args.tx_code_path.to_str().unwrap(), - ) - .await - .unwrap(); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + let extra_section_hash = vp_code_hash + .map(|vp_code_hash| tx.add_extra_section_from_hash(vp_code_hash)); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - let extra = - tx.add_section(Section::ExtraData(Code::from_hash(vp_code_hash))); - let data = UpdateVp { + let data = UpdateAccount { addr, - vp_code_hash: extra.get_hash(), + vp_code_hash: extra_section_hash, + public_keys, + threshold, }; - let data = data.try_to_vec().map_err(Error::EncodeTxFailure)?; - tx.set_data(Data::new(data)); - tx.set_code(Code::from_hash(tx_code_hash)); - prepare_tx::( + tx.add_code_from_hash(tx_code_hash).add_data(data); + + prepare_tx::( client, - wallet, - &args.tx, - tx, - TxSigningKey::WalletAddress(args.addr), + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + Ok(tx) } /// Submit a custom transaction -pub async fn build_custom< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, - IO: Io, ->( +pub async fn build_custom( client: &C, - wallet: &mut Wallet, - args: args::TxCustom, -) -> Result<(Tx, Option
, common::PublicKey), Error> { - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = args.tx.chain_id.clone().unwrap(); - tx.header.expiration = args.tx.expiration; - args.data_path.map(|data| tx.set_data(Data::new(data))); - tx.set_code(Code::new(args.code_path)); - - prepare_tx::( + args::TxCustom { + tx: tx_args, + code_path, + data_path, + serialized_tx, + owner: _, + }: args::TxCustom, + gas_payer: &common::PublicKey, +) -> Result { + let mut tx = if let Some(serialized_tx) = serialized_tx { + Tx::deserialize(serialized_tx.as_ref()).map_err(|_| { + Error::Other("Invalid tx deserialization.".to_string()) + })? + } else { + let tx_code_hash = query_wasm_code_hash::<_, IO>( + client, + code_path.unwrap().to_str().unwrap(), + ) + .await + .unwrap(); + let chain_id = tx_args.chain_id.clone().unwrap(); + let mut tx = Tx::new(chain_id, tx_args.expiration); + tx.add_code_from_hash(tx_code_hash); + data_path.map(|data| tx.add_serialized_data(data)); + tx + }; + + prepare_tx::( client, - wallet, - &args.tx, - tx, - TxSigningKey::None, + &tx_args, + &mut tx, + gas_payer.clone(), #[cfg(not(feature = "mainnet"))] false, ) - .await + .await; + Ok(tx) } async fn expect_dry_broadcast< diff --git a/shared/src/types/mod.rs b/shared/src/types/mod.rs index e0b51e5ef12..83e58f0fa84 100644 --- a/shared/src/types/mod.rs +++ b/shared/src/types/mod.rs @@ -6,7 +6,7 @@ pub mod io; pub mod key; pub use namada_core::types::{ - address, chain, dec, eth_abi, eth_bridge_pool, ethereum_events, governance, - hash, internal, keccak, masp, storage, time, token, transaction, uint, + address, chain, dec, eth_abi, eth_bridge_pool, ethereum_events, hash, + internal, keccak, masp, storage, time, token, transaction, uint, validity_predicate, vote_extensions, voting_power, }; diff --git a/shared/src/vm/wasm/run.rs b/shared/src/vm/wasm/run.rs index 9ac4852eede..95cf2afc38c 100644 --- a/shared/src/vm/wasm/run.rs +++ b/shared/src/vm/wasm/run.rs @@ -551,7 +551,7 @@ mod tests { wasm::compilation_cache::common::testing::cache(); let (mut tx_cache, _) = wasm::compilation_cache::common::testing::cache(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.set_code(Code::new(tx_code.clone())); outer_tx.set_data(Data::new(tx_data)); let result = tx( @@ -568,7 +568,7 @@ mod tests { // Allocating `2^24` (16 MiB) should be above the memory limit and // should fail let tx_data = 2_usize.pow(24).try_to_vec().unwrap(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.set_code(Code::new(tx_code)); outer_tx.set_data(Data::new(tx_data)); let error = tx( @@ -617,18 +617,18 @@ mod tests { // Allocating `2^23` (8 MiB) should be below the memory limit and // shouldn't fail let input = 2_usize.pow(23).try_to_vec().unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(input)); + + let mut tx = Tx::new(storage.chain_id.clone(), None); + tx.add_code(vec![]).add_serialized_data(input); + let eval_vp = EvalVp { vp_code_hash: limit_code_hash, input: tx, }; - let tx_data = eval_vp.try_to_vec().unwrap(); - let mut outer_tx = Tx::new(TxType::Raw); - outer_tx.header.chain_id = storage.chain_id.clone(); - outer_tx.set_code(Code::new(vec![])); - outer_tx.set_data(Data::new(tx_data)); + + let mut outer_tx = Tx::new(storage.chain_id.clone(), None); + outer_tx.add_code(vec![]).add_data(eval_vp); + let (vp_cache, _) = wasm::compilation_cache::common::testing::cache(); // When the `eval`ed VP doesn't run out of memory, it should return // `true` @@ -652,18 +652,17 @@ mod tests { // Allocating `2^24` (16 MiB) should be above the memory limit and // should fail let input = 2_usize.pow(24).try_to_vec().unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(input)); + let mut tx = Tx::new(storage.chain_id.clone(), None); + tx.add_code(vec![]).add_data(input); + let eval_vp = EvalVp { vp_code_hash: limit_code_hash, input: tx, }; - let tx_data = eval_vp.try_to_vec().unwrap(); - let mut outer_tx = Tx::new(TxType::Raw); - outer_tx.header.chain_id = storage.chain_id.clone(); - outer_tx.set_data(Data::new(tx_data)); - outer_tx.set_code(Code::new(vec![])); + + let mut outer_tx = Tx::new(storage.chain_id.clone(), None); + outer_tx.add_code(vec![]).add_data(eval_vp); + // When the `eval`ed VP runs out of memory, its result should be // `false`, hence we should also get back `false` from the VP that // called `eval`. @@ -711,7 +710,7 @@ mod tests { // Allocating `2^23` (8 MiB) should be below the memory limit and // shouldn't fail let tx_data = 2_usize.pow(23).try_to_vec().unwrap(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = storage.chain_id.clone(); outer_tx.set_data(Data::new(tx_data)); outer_tx.set_code(Code::new(vec![])); @@ -735,7 +734,7 @@ mod tests { // Allocating `2^24` (16 MiB) should be above the memory limit and // should fail let tx_data = 2_usize.pow(24).try_to_vec().unwrap(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = storage.chain_id.clone(); outer_tx.set_data(Data::new(tx_data)); let error = vp( @@ -783,7 +782,7 @@ mod tests { wasm::compilation_cache::common::testing::cache(); let (mut tx_cache, _) = wasm::compilation_cache::common::testing::cache(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.set_code(Code::new(tx_no_op)); outer_tx.set_data(Data::new(tx_data)); let result = tx( @@ -839,7 +838,7 @@ mod tests { // limit and should fail let len = 2_usize.pow(24); let tx_data: Vec = vec![6_u8; len]; - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = storage.chain_id.clone(); outer_tx.set_data(Data::new(tx_data)); outer_tx.set_code(Code::new(vec![])); @@ -911,7 +910,7 @@ mod tests { wasm::compilation_cache::common::testing::cache(); let (mut tx_cache, _) = wasm::compilation_cache::common::testing::cache(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.set_code(Code::new(tx_read_key)); outer_tx.set_data(Data::new(tx_data)); let error = tx( @@ -959,7 +958,7 @@ mod tests { // Borsh. storage.write(&key, value.try_to_vec().unwrap()).unwrap(); let tx_data = key.try_to_vec().unwrap(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.header.chain_id = storage.chain_id.clone(); outer_tx.set_data(Data::new(tx_data)); outer_tx.set_code(Code::new(vec![])); @@ -1022,18 +1021,18 @@ mod tests { // Borsh. storage.write(&key, value.try_to_vec().unwrap()).unwrap(); let input = 2_usize.pow(23).try_to_vec().unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(input)); - tx.set_code(Code::new(vec![])); + + let mut tx = Tx::new(storage.chain_id.clone(), None); + tx.add_code(vec![]).add_serialized_data(input); + let eval_vp = EvalVp { vp_code_hash: read_code_hash, input: tx, }; - let tx_data = eval_vp.try_to_vec().unwrap(); - let mut outer_tx = Tx::new(TxType::Raw); - outer_tx.header.chain_id = storage.chain_id.clone(); - outer_tx.set_data(Data::new(tx_data)); - outer_tx.set_code(Code::new(vec![])); + + let mut outer_tx = Tx::new(storage.chain_id.clone(), None); + outer_tx.add_code(vec![]).add_data(eval_vp); + let (vp_cache, _) = wasm::compilation_cache::common::testing::cache(); let passed = vp( &code_hash, @@ -1103,7 +1102,7 @@ mod tests { let key = Key::wasm_code(&code_hash); write_log.write(&key, tx_code).unwrap(); - let mut outer_tx = Tx::new(TxType::Raw); + let mut outer_tx = Tx::from_type(TxType::Raw); outer_tx.set_code(Code::from_hash(code_hash)); outer_tx.set_data(Data::new(tx_data)); @@ -1147,7 +1146,7 @@ mod tests { ) .expect("unexpected error converting wat2wasm").into_owned(); - let outer_tx = Tx::new(TxType::Raw); + let outer_tx = Tx::from_type(TxType::Raw); let tx_index = TxIndex::default(); let mut storage = TestStorage::default(); let addr = storage.address_gen.generate_address("rng seed"); diff --git a/test_fixtures/masp_proofs/0DAF8BDF2318129AC828A7149AC83E76506147445D4DC22D57CBC9869BCDDA80.bin b/test_fixtures/masp_proofs/0DAF8BDF2318129AC828A7149AC83E76506147445D4DC22D57CBC9869BCDDA80.bin new file mode 100644 index 0000000000000000000000000000000000000000..f20cf90f1a573ad377dd0de7a9925cdaee8e6ce2 GIT binary patch literal 9649 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/1362F1CF9B836CF8B05D8189EA9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin b/test_fixtures/masp_proofs/1362F1CF9B836CF8B05D8189EA9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin new file mode 100644 index 0000000000000000000000000000000000000000..db2cb751aab73b21904e6bf7cdbb2318337809fa GIT binary patch literal 7448 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/5B99F3D7E0CE75AB1F4B737EC88B269A5436CD72AA758686960F409B04841707.bin b/test_fixtures/masp_proofs/5B99F3D7E0CE75AB1F4B737EC88B269A5436CD72AA758686960F409B04841707.bin new file mode 100644 index 0000000000000000000000000000000000000000..30b0e399a357823df00588f75d8cb3fe88b633f1 GIT binary patch literal 9208 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 N{~tXR6wse9{|2EzDjEO) literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/889C046FA76727BC97433503BB79BAC90BA1F01653EBCFDCF7CC8AAA1BBEE462.bin b/test_fixtures/masp_proofs/889C046FA76727BC97433503BB79BAC90BA1F01653EBCFDCF7CC8AAA1BBEE462.bin new file mode 100644 index 0000000000000000000000000000000000000000..525e1e63ee265df1384210ff91e0ac248d049253 GIT binary patch literal 25031 zcmeI*1yEgE)*xWq-JOfOySrN;IKd%UaCdii_aMPNxH|-Q4H{g7+r0GusQRaCYBF7~ zYNp>byXxLW!MU8fq3UCub@pBW0|5b{|MB=Wfd6<@zS~GALX0bm(9gDO0ed-T+MzGY zC$%t^s4j)SZQgYON?>#Tb!>qh#j^qrGF-KtA_6J56Rjd6QUmaZ#~Ze6Jk++2x{zX@ z*2kC$S5y{{8RvCH(j|C%jg0`mPVlds$v}V<`ceDj{-S%7*^~+K1;Yha{I_!tktYEO5K)c-ZjXkeK2*uqouX}89NT_gbq6p~wpK<;Lm<$4 ziF6!E_fAe@VKt4`n@zbt&p2k>(iG5kh-n78-7qv zsT*?C(~N?B74`YS9qK9we&(UyXjULYF1ysqqd3S#RkSiSpsEjGvp$-?2U;{^U+r}N zQQF4HX(;eus}FMiIxQ8Au48SmDtw|!rQ9oAOVS=isZ-0x<*jr#STNIZ-2nEdL1*p0 zBHdzhBP}>+eE@0URr<9-(ZVSf9j#+HNCC*9d2%IT;sAwFPF$m_?AC0x!l_d-v@Yu< zzb~dRQ<3U`^z1#O_E7c!>K2 z+qZDU*|_$5KfKi)jXva1VB0Z-B)lgQKp};nA4+9*mC|{)vJpOumCmyh@rTl z5j`OE$%v=p`UijvWV7Umv@0+0`k`SQww6)+<=C-O z{aDeuohvayl9vQPNaAWHaZYr!T zJk)hG3=W`khN?>o`zqFbMQ9i#)&E%~fZAFf45mUZB~aOrgH!_$>Of*jV;Qab_(SWi zx9A3uZM}%oN=4p76~~~MttbB@K&pG;^m4zmAP?Ac$E|L&i~fN2%zzTbn_L}H;Y+0| z3BYRJq&?%~lBcy-vm%!5;*!3Y9{JZxqzxSwjWVI5I6c5B0%SO2Ife^FOlbuZ?srr; z>NHSzc;mry>LX^O<3JujD6586sXo+Q&F;P9%*IsUp{pyNjuR4F*f#@n8B7o&Koh6y zP@{yU1(#AhuYZnPf5jp2b!#%NiQtkG+Go!%>Hu!@K64?dy`eT=?5$GkA{W>t>n=Hc z>|Tsq9NezX26%vEtXE08EVP{2k#aJao{cluEk_V z<*uTwp;Z31{$rH@2^84Cl^+@y&&;+hfOcv_(@F_f;nrb*oN%NV*4a`T3$$Z0#h!Q>J*=;w%s zG1F5b8eZqJ>J3`WCIf($8k#aMNJ$*^N5BSs47SLl7HCV_hWaNUI>SU8W)nyN^cG`W zh$PiPetk0p5NXGv^-XyklUOMpQ(M6NSHQ9aV6wU+GX%|b{4#xZ`KhkYV)o9Wfa&3s z?PwJ?L+~4{D4-n;mO2O{*|{Aw4$)|mXf3ZfkS2FrcVMCxdciolP8V?Tp3BZT15CKq zttR~N_^iE%@XR(d`Nx5IUIiV8a4ZY}?K?H0z>(gKfi(d2S-p>a)!t{|)4Qg)8sKpD z!}S4Ouve;HO$JS}5T~XP5(5Hk;6|STds*=>MLi<8Kom_>zozw< z6;5N`C^U@NbEM2aW8`(qIBJ%keLhnmd|H812<{uy@YjVbl?J}XM$f$ zBJ1s!N>ano<9ZfJ4)mt*o5F7j{|76qhaJnUR*N)CWSsb|m(eWlXZ$8ei(XMM?nc(< z?7>f3;II0=#=numvkQm7rAR3X2Pm!SCJ9rJp614LxcpP59V8d}8IB33uT%QV3abJe zv{0TgAfe~49C5CEezbqDMHLR~!vX2FV!cTNxK}U5W$qf%Bt9YvwsYn%_5^{G5y0=Z@kO&6Yt-d&Xo z@Xmq8f8eg5D^!>VoPeIv>cnLZ{ML|V14(BUyaB{c5b~9(*Z4P57{-BcY}Y#~Je5=e zLv1F1B~^8{6qK(B$z~qm!ynhcvaeJ6%L+%z>ugMfi{vkWsdYeqPjq95qf!5nB>tV6 zjB3Oqb!%-hA!NPEDtmh2`mA=7u+T+=AvBd1@uGYm%BEp)SMaSO@m7&|t4RFYRwUSQ zQd_NQZJInS#j1HVrE`2-`_@G_u90()`ZLB&dzk?kcuLSXk~-r>k>ICM*awa@O@x~s zfmDM#BRtxCUFf8M6E}WNn{`Oo+=QA4#wt`M^cC)`A~?WxA6uxRu-Z8mVDW-wWn7ku zTX-9%y?TPBki#EAqu*rgy>ihHf?1$;A*ffXUgN*J!g|ctNb}QQy;fKA%C?@)^SarX z`O0=kq=5Q|O?rHwOG!;~vrW|1vZliQUMmu5hXTCi!38L*FLc^VP{+&Joc12vaZ6BV zls;yFQXGt!mfYr%cc2ueB#3cyG7kH4^}hN7ejxg}rkXUvKz+y{zf;&xDJg)Y)KrHJ z62zJMLpQz)C-H^Jq{K9j!W8*4Dj39DF8r1YzvaUJuDS4ESNI*xO6aT(@tKlidy|s- z32QEj(3)h*Z3 z@)Wb$xO>9P*!J^M16A-L(*cI}C}qwiI?9i&b#z8fTR%R1(5UnVnO^Y+v`%_1?UosM ztJ8dje^dBP;Wvfq1@Q`i61p|Di7Q0 zuoxu{M-C4{!M#%T8vjNL?7w_NzGBJoy{`1@8QeycDf zVP%eBBvWwGSUd85RkBbw8!7>GDwiT}u|-W)ihwLYpW$q|=!lugZ$UgUvC6Ge6!i?* zMts!ULz-r<`DL6J;gzb__%~8m*n}*7)r5jjaIA)myi=jvIHAI+bem zbxMC(VY^XS*^`vjgMu6bLu5AX@&q#keWZ#7(By--Np8PJX^ZPlO{m^c!2;%#hnX~bR9#THiT4Sv`2FzU@1&R_N@g9<2 z)B4K_|E?}9k>bJ<_M_ML#|l@pZgq^f_`y}{d0f8MG#>W#(dOITxwrMgZ|jBspRE@T zASpPJZJwf;lzp!3Q5OWa8W_DiaO3J+l!lx}x}Kp2aE(WzrjF&b)X*}$5KPMKQjggD z&_ykQRO`-kY7!~n2ek3)X|1Aw&=#MhUXz}rG5(avj?K3wOJLWS@*c55HUN}^gdZOW zc!l&i`H6+s>{lwH+*e_+n)ohHm@(6*p^yN?xuk1|q8ZiW>S?-X*G$_h71hxmJvEI% zAN$5n!b_=;{?zx^x?vDLLIBRwSVoqkodpdnLpP#!GycmgPpzM5+8S(VO=oh(%l|wU zw`EpZbe~^_f=xsoyo84JveYb~0R+B>lfG6bYf%M8e}41Va2VS}Jf`(+*Zi&-w(9$2 zu$%2jqpD_-zJRBF9OBV+hmFyH-7I{oqrTNq|0CXllqpj#Xe%y#O^wLx9Iu?B3Lo zENA6TgtM@RK&C?_S?GBKop2O8RZ?qW9|C~K%X(l-&-YJlE@yU^x6;G8fkuMm^HDsN zVM_%83qN%M^RyP0b3Ks#PxeUI36h0@^b9yRb`2G|H^mk%`zS8q&{M`-xe-`d{+wlHbIO(xD6n43^F=$w? zZB1~u8qk7Zj8*nb#WJU0>418$!p?E?f4q}7;ogLM6YhT{9K!wu#l)9O?WS*g8Uulj zinF@Le4I))q_CF`5FN_xhJX)i3wNeS6VszAFIM z#eu-BGgliC8B-G$@XZZP^MG9}bxlK7mW<`lBj!K>u)3e7y6_yx0#!yPiLwdTE{J)@ z4JCPpvES9W3?X<31L|uZKR6Y3e=`a+wPZfFPdvw6@FqEVj#jRn#`8@?u>>TBMqccO zL}^MNd#y)W14-mRt?-hN+u2^y$*J&i0RaP2tz_FK-z{;_^+MqiO&wzrS$d46?P{Aj z%k|t_=z#$PIOq4>?CE>%#rhLWay8Z;~x5E8O-2VIc zSH=3>rmKGzQ6ycwRVCK1=&KedS=9zbPj2%nPiDX5<)k~gSdf|<#hY+%J5~RqcdGt2 zhx_Zop=pY^O+KKle`ZWn+G47}Qur~+1~jlgwAQC?_d;)F3=m_3hiikB5ixI)VLav^Wbiz+2oeA^ny2oIXl3%N~qO}knv==bFcESRf zTg{Swn<>_#Z(xWu(S&CA*wc%3eAfGGko*-p>$4Sh$}H_EHDVN0zzlz!NP36kJBM&ThEi!_D>u{rnuVFy|oJMuI3zy?H*7D zv|3kM5PQ{64<<4xsXfjrSPNscF!RwpX$O^C-VME~&sGwe$vapZ+HHYV1{E%z>gqEM zSv=wOJ$x*h$TE{*4$VI=5v)E}<*(Ts(UNK^A?H8?KviPr+8NNOP1;4JW(TmW5)v^4 z0&{$vze9^8Z+s(4YVp^OHX0P;mM|U~h%Q;2L>Tf9Qg;?Ww+s`+Xk5sNG(dQ+uQg^a z+5x%(2SCHbr0qQ285)p`j?DPei|GO1MD>Wx6U;4-c!eLv4SRNzY0zcf)PIHW11+&~ zNhG`B$ecsh`t}Vda|-$35Tf ze<*Nh2a*!!F&fw#t7^76VQVF?#BMJ;^TI)wGU%h9L#Qv!xfHCfqTyrQEN4w6%e1p< z5jRF!Nd^UrW?>x>Z2U8;D^s2%xY($c~Dxh8qBr?3_yP#t2H!# zr`6yzkLzFBBC?wBsDEXGBN}}V7tmnjBO+lYX%;qQom#FF5(HF~>ueXxa@ZiuIu$>3 z?UBYwP__zOci{w27}9jF!XHvx&nJS52Ex%s5Yq!d1v6~`@ z85#|~yh62&op$P~Gu{%%c5qY8+ST~WR|TC7+Xu0eg1iSz&NXlQ5ZC5zr2BeFD;(n_ zebo5EQpH+XgoH(AAnH)yUO66ph>!IQlGGFg1TMHvu2&7=Yf9ib>5d}$e6DBSw_aQD zxIPLj%Jzi~xug~whTntfzq0N+F-jVrk=RqMzeu$px1)Xdc^(A1<4{UQg>=KtN=}+4 zkUh0>>!!qMV})%bzh1%nF(<+`Hsds9bFaVkS>)I$ORc(A7kO78RwHJrIKT4zY{%|M zcq~#mMl1NxF9T=3Ta_;en|*ivy8!-kHZA$6B7{$To$=ZP(VL ztf{jCu?3`w^Z#(+q-6|~rpx4pt??|kfp;G$UP%5i|FiM}V0)bnI$RWOgI7nk>EUlqLf&+ImG*Lj#-RqNHw{Leo4# zue)C7Xx-y|>zH}z6Da{jymT(Ivf24*)m}|KTb=AQ7g8J#hRNh z9J6=})e>H*lo3RUmXdEvCSaCb4APqyho7~CPT`&G$5=V#$0T_((_6DFa1AJR{SAn! zeAhe~BuN@RP{loGfg6$9MvNB4DaI9x*f5EVgAcongt$6fr`9ip*JI?sp}O%{8CA)M z@gp#1T4YYe@A72g_uf$!byD5zEx=9`)HJe2C4DWk%bv1I!Q8mE8q-$zm>&oQu|(}^ zw+OWfS?_Hn$k|9tix0>JTj?n+AL%LWFTEwdmqdRikaca!jyy~u}rOiQr-kqHv!dA7R zEpD<<7txp7^{3A_Z`D4t= zjIDD+e6kC$*3q}F%PGOffhPJ=@w4}wdk}r&;$V4WmR6BvWnuYiN}G{T+SF;n1$4pM zF21OTT$k+j6A$1_KY93;pm52oh1zNq;%dPj=gImJEYRu9Lsk}%~@kxYet&KGBP z-aL}Z_1tL_Pwhu-rS;1-WBC@s>ZYM!92z!cEMhFC?|mR8GS~q=54f(ZGv{vZoMH== zF12gxS6G*^gxF^LG^87)J5XQtR9LR^1hRATyb;bNX1p@$me7NSn;Ac>W-kC7d{U~1 z#{ux&6q;xa(5Lqpcj*_aj#?1Rn(3B0%QPV5utE{g7L=4m)<0Y=x#wApR{uV)f-JW* zB|6i>gUB?FlifhEM-I@g3OCOH45Uk3en25mJEoGu1vNSy4Z|OH<}l z3B(1$L`b?=5~P2w8Ul36m2q%wk9aC)Jtwr4V@%+Rk7^rs*PJaU*>}lmX5G5^sQM=ejJ&vXV$!0W;qe|Cv@iUl^A3~hKk|aCnI?wZ{%GQdR_hUNpbQkVtzE&u zpQ~-t7^2r&Y1Af42%t~kf`?hRM6(9Yar<&6mfIg0P9i_jyk<+l)fJ0QC`RY&G7}6+ zNfAc#$>=f=6aR{~_@+?V*oO|<7ZPKxJD{rnOt98hMv#JcM}1#v>UMlGb)k~usX{1& z2!W)9((iK@F;(V%uVSL94C#`uQZJ)b@4GxmV085llKbvmU<;5Rs>H%k6hgN^#PxjU zJ4ONy9ThMra=SV_ZnP~a*27Y(ML0aww=E)^O$1{V=}w3)Lg6zj4PsgW?pP$ioji8! z7t*jC$~yxn0%dlmK{_Jv_FdS^7TVbE6XRc8$zXrBUbADU&y=)j`h^nzALo&;Y4`8C zUjD9mWyMz{+8Iz892RY3HigYvG`p31V{6JZah$+=78f|HVSSJ+I>sPW)fMN}%u7Yb zPXDH+@R+`4?6mEbQrbX7Y*UFR$tLC&mb02k9JAnbcJ=b&Kmx<*~7mQVoOp}c0kOA+a?`;i_*DZfRFHk-?6SmO_Cq5uxGRn=z7 z=A~r6?;{wzb>OQ65d0A)KFoZJ>eaMsIowT^%f$2J<>%rB?O8yNM~9j5H&P15DLOZj|Y58M;n&-;vRXq&*SD_```K6mbJ$4e)ed3%3+k8g!-9HQ%R$MDI+O zSvu-o{Mk_kP7^@{o)wX~W$W>-)V-i_46~XJv}<4Cp)3EK_IEpn+6o!ogUZY|M;gp8 zzUtN*-&xD_8wq9dKiwgkSGtdcv}k>)J|d#mJ6C5{|66Ts}F9X{vZ`{3dg zjhT0Ym9qpJ-PvY0p!scK0Gb%Q4G%K6^f8mrU8*oQsXWYB9DDg=Gmt%79ZLuY?_NYF zo9RS7R^U*h6j~A#N(N9I==<+uUKXY8lT~nx=&-n7M>~*aZAFRTI+@Vh+W0wi-4*6G zj%z8!;amZI!6&|q9eJn#vmG)Qig})JWc90!B=;{}-sMsl=XEHHkQkL=8>YOyT7#Ej*i-wMm`Q;vqKXEPva{s2fXV!DuEN_ zrTXMqL4%cG#C^g+H+(&Axqf#(?x}FoTCavR#0jVJZ50kKm!)0K314C2TvbXMx4T!X z?g~jB1{6*|n|y8p)bcZoK#(LR8icd?2vigtqbOKiNUx8{HsMyN3U#eIEcEziTvmA4 z^Fy42>E&_tsElhyHm&vO!YHPnHikpkf55QT3?sx+O5Bt(Lfo?20Tts2pKz$3* z)y*8YlrWYDZI zoD~Zu|L1~h=nR-yd1)F3bAnb%bLsaLogz;LyLCAAKudJ63tuGC6;k&gzG$@=xXYcs z(+#B|D;4q*lQ}Sv?kr^MfWs`F$Gg!-gpAfA?%NN`Ya152Y%b{hrrx;%pz&Md?8@_=@^Rx?t?eA#?Tr3gwZBQ_As?B2NCF2r;4;sfMs6UBa zv7I4TNJ1JZGtj5_1d~&1e?^#$(S+S(Qa-J=D|;5h!zyzSx;+h^hB$5}uOC9GS;-EL zr_gjw6}E7#aN>xNAQS8-vJEm#(8Sqxs>V9l_HasoVXc9@O!Nys1*xo2{A#*?g2-8Z z8OM)brACL{xfpxp=IJX%P^v@!fE@RbQm3yA;VEsUNe=Fux z{YT5<0q?x3K$vc$d`1YqyB#+QP!4IKq7k0Bp-cZTN&0U{EM=hnG(UjzIa}bru?fZ+ z;943biiQg6?-Ft^=+mFgv2aAr2*~eQznkBIq~1XMer?93sBo0luoEz|?2B!6m$1~xm9 ziHf_vICibGAMa2gnDcN!;<>PCYgfMr zQj9}1pgbFuq}hQhjszrz2okQIS#tjCIzNi7M~Onhbkhmu_Dl{0AS)fjZPg8It2Atl zW60Nu=V5UT^h3Y-%6|WzK3Y7bTz^E2Oz;MWT)(s}O#HwXl>~8X4BWWePJX4e(U*Jb zYtbfea0Y7&f5k9Qb&nDq6nG(91DG`O?A}RZ*O>e=ZfRPK@ z!QuEx{{U9*_Vw=@a?Ecp)RDp+N_v=5c>zB#(M#YyQY)t)=r|v9h2gxorzZPh!e7d9 z8&%f?$ekBf(L=&F#KA*4_8hxyzSE}k?^}V@PiBoql-q9->-&O(sq(ZM2}(a;i4e@~ zzbB=?*ePRO$6dsaJQ@>Jfyi7|{{_>iK3kGP0RQPH+zZ_!yv>i63@fJ2xP_tv*_83J z0sf)p5Gei?s-G8lliDq6BDWoAi!CO%6;>Cb9A1*N#&blNz7`hOd4gEbn*v_9m*Kd| zf}&T(g*Ra)_fv<Iy=M~h zlaUC6Zi{RPe=1A4Z&5LyGp%?Zo-S7FgA(5c`;8)VA>Wcj;tHD<5U=cWppJd(GkzUs zepTTdv{ol&USai8!+VvTBTd9P6S$R~(DhPo)?r@evL`FvJW{c2DVKIGv-7=>-I%e9 ztAMc)}gC0fFEbq^U_tf|J^9}*?V73V?_sw;_gMO?*nP$6F! zf=zfgVV|KF3nXdTYbI4Lr`$Aq4g5v^g-zV4VM|WO5YD`$S z2gRj7RccjyYbqpUZn0QN1QwG;1XyT>|DgG_!iFklWFb^tic&^vj6MP- zDkinmcr&7eG*5OR)0`!jSu8_rM;B;STuDs~G@gM`#lNW!MXt%4)9B9pn2>u3jSbk6 zNDpypFWF`Vlc80;TXEPO9fv90o3+W!7wg#jxBC0eSG&NJtL&#fRCmUCE* zn-}ep{Y2zJe&Hy}@SaOh!y}5&B6%H=0P*L=;A_*V*Y%&TtpNXdwbbj{f?szsevQ}0t-p?YeeLVl{&Bz`Pp_|ejlVws I+Fs><0Lca^(EtDd literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin b/test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin new file mode 100644 index 0000000000000000000000000000000000000000..77f5568490073f7a005b95c12fe8efe977a06dc5 GIT binary patch literal 7448 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/A9FA2730222946FA51E9D587544FDED28D5E7D3C6B52DCF38A5978CEA70D6FD3.bin b/test_fixtures/masp_proofs/A9FA2730222946FA51E9D587544FDED28D5E7D3C6B52DCF38A5978CEA70D6FD3.bin new file mode 100644 index 0000000000000000000000000000000000000000..634d326dcdc00719d8f0f737b56dd64af89d3350 GIT binary patch literal 9649 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 L{pUOWZyWyx8{+`r literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/AC308C08512AF5DAA364B845D146763B3CE0BACFB7799C6744E50B9E7F43E961.bin b/test_fixtures/masp_proofs/AC308C08512AF5DAA364B845D146763B3CE0BACFB7799C6744E50B9E7F43E961.bin new file mode 100644 index 0000000000000000000000000000000000000000..b67b3c8cd080323210873fd902f72c278f1f4854 GIT binary patch literal 17018 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 JdIku{{{f9vBg+5) literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/BE57BA4D8FB068F5A933E78DEF2989556FD771D368849D034E22923FD350EEEC.bin b/test_fixtures/masp_proofs/BE57BA4D8FB068F5A933E78DEF2989556FD771D368849D034E22923FD350EEEC.bin new file mode 100644 index 0000000000000000000000000000000000000000..c05883cbab75dd3e0b4adb8f5e9f8896b780939f GIT binary patch literal 19947 zcmeI41#DeSmgmjP%zkEOikTT=h?$w09Wyht9WygCGsMiy3^7v-+v(}-&W?8VY1OmR z&UTJ;Z#|Xj)qSV*e?Qf&bE<%WfPm2dcKtSB4GN<*qh1k1tgW}scUcwhg9@ zpv+@N2*GK5;D59PuFdLmcER;_qvax19BwAFMQW$8+KO%=UInJ;9L1pVFRud>3E z9|j?6s+fe3<3I|DL=Rgc@(uFw*f73^aueGtbEZ=j9R)T<78Z}I0j@WHGSR`@p|5c~ zPs3aU0j|547$vDti0Sn4Vje-Fx4hX)-sTyAHS+)j8#+ji%Q5)bTUp>Cr)oD*FFOM< zE;~7 zTgJA}>;*{~rZH-p_&W5P^|9UKeM>9}={89;R{Gl5@SddGY{}Vl-TWuV6(9`*kY6s9 ztsNVUEo3BD`b{aZNLs^)2E@HKtDZ|#JC%5Fpwn(@YSn7wH!Z+8@!dWG0m^mkic+jN zSksB(sOTwf$Kv!r_TKQoPfnhi53p;Wk*!RZouG^E4I z?RlSzXqvJ7NMQFkPZNxNXIBPdnmSF*G01!hlLnC@X*qae|_vL*<@cwQV zUfL2ZRib!YKSLiGr=>bmuwN4kAo@X$wjFe#TAf*>PN}^AM7F*a9Xxr*5i}8Au5Q5% z2T&-6FBdVVXvYlJ)kNVfpV#N@>i$@s`X)MA(_Yxy3Jl;@{E5sgi3}@h66)n%YROs4cR6!F6GVxyme+6kF9Bxa65US*f?3d<={??knAlE5EQ?k zPg)c?=@WzIUMs{&oR{6pXkfb)gjGyVvTN(I1~d}y(C_4yiDc|LA-CT>bw0y{`&rtH z+=RuwFuI6*!38Wwbj*p^iT%Kk*<keO>=XYj<&fMMcbX<_w!Y2$Yq%lE=0Ii?gM_a_LEjbkvcmi@fhN{kh zA39QSO$An6&utc%e7=XTS1<>#u-rgFKbMw1$T5-70Y zdw(=A?)iOt0PXCKhK(Zb=O?FOa>DTvSXX~VTN2AhR<=pN8LG7m3xKbf#Od8k&LX;T zJ{5w6C@MF3tUmd5W6O*wi8=LlUm4&Y&5Ds^g8X8lN`Q0#8$k=xt>lAIJxn$^e|}i! zjz$XbwW!VS2@{pWP}RDeB;fjSNv$79rh}Eo%HRCnV(D!Skc(EImf;sMKUoM2cn#uQ z3y!>D`7ET0g0uJp-!y7R2aqwDEN%1`{?SEmFtf@9S`hhj((DHj4UcO@?GCL*s{ue$ z73~WTNLf6!31Ejl7F+mL6SO^jN6iX|&M?W2*%T7MRe)nwHrTjBrf-EO_fraJJF?*E zP{$-!9NtrWm>LZcz>bsFVM}Y*>SZlj%cCKcP*v0xa%22HF7Y{tcake0{{B_Ux>mLdvDiyeQeCU6$d1eKtp4u{l3uU zq^7yqrfRBLvl0G4V*Mn)T>7Ue937^%u~w3SF23?(8mZnJ-KN9x4o7w@aM9Cpy(GM+ zN39%}xp!29_?#%j!Ii_Di*6ZH1h*uWT2a7->kUW<^bdvqQ1}mp|I1Ps_1p0)ce$)0 z`68^rP(u^G3XX9H@K5fj>kUzhJh>A^Kt0o-S+!^gzYK4z^b7_xvoy4jqfJR@LRn8P z&AmaNIza2j$BSoIJ8=!HV;N?0ZhOSJLAaP~dh;ueg$YX%l05t`O#RKk{&s=z5(04E zCNr~~9V}^J8Tt^l+weaYxa<8z(l=ql>UvT#KmKPsc;otJV&bs;05Kk{@#>RKcf(oF zv<=3`7aXy2_$C5p^!Kj+$L-`!6zJ75hqZ(ZIMAm>B~Rs{1}c~n<8FxxdnNb7akyvx z-&RrnQ0ou1{!r_GMXj!c+DY)_YDiTPtGQS@^jU$_ zj`<293tmzB0<V*@P|O9w2-X)l$<*GL^uXw2BQ{ zl#LDWf+rhZq`ai{#+nTbn1?!_Da!sM;Vg-P1D#Nc{CRu)8rp!uz14%kso?w19G>SSjbaTo zLw%z(|Nd+K5bh7*{t)heMYtrlNWA?1`+5{*xJ-Q)`NHHK-ns^*h2nbB+2T z1dSRLC#ydVvx#;{K~d9Jojiw(=fkn^wr5F3z#B2Zo3OlV^f?L77wd84uBgqo?qa9Q!N5HwoXKR3OK#7g4e-+u=70p5 zkoe3n|4nfIn#8Sv8+=CHm+GAl<%uv>iy7c2VA9asvX3mqAV#Ny1)JeG`SuW#5{!Sw z8~-_jbs7|Kv&KPzHwsB>Ca-9iN`35l#Dj+f`BGAj;?^~}R9VRe_>pC3|LHE`{qqes zjws!lW7|Me2)^4^23-yhX8yY-MD;(Q1@c!5e*ckJ|EF^@OA8=gbJ*8(xO##`6u2)- zvBr;JxS+r$^JxD{zO&&_feIX1wRwdry$7#)BgpXLNivBw&O+NTz>3Ph%x!jR(go&l6uvC=oaf>(F|8x0!? zhKL^L{?kEtgN(OgE}^{fjA`fXNl#$olMH|iRuH^U%>w{A)Ft~qGhs;>@mhF$P7SJ3L~HI8koDn zXMc2n8?kY=N4aT{3M?cTQ|iIs25AAPfsA>z6q`%{%9D;}p1o_?! zGIA$3^P5Z1v?LCYg|rS-7UMEFSnjGW4q4em;gewXURU_Xp9>HPfIO0~$pBtCz;#(Sh_c zexAyZLX?dUI_*`ci?!@ej-Fict58>zzUF{(9E`tu4oH-o&dzj%aQ-rwYB%(Dk_SUP zjoMMN*fup8)wpNc-sZzU9Q;%KYmUHwrl@yWh|pu5EK=u}9B9=)MQ74GHa9LfCnWIh zoW1$oC;I*#;eT4xD!>NqlvfN$==tmCpVkXr9hEexB4B+vAidXZcWD4Ge?Hh5^bEg?-a`=Wk(!(m=l8+Dw-4;KuK&E_1Ki9-Lhs2#q;%3P*yoEGL7 z7$UQ2S0UM!LolFk|+$5jE)_!vpx)bLc z83H(S_0+QP@y*P`+a?jvBVyffkw-6_aNZt_)wg`_nfNa%X@SpD zoV>#}y`4UXEBOkysDLfoTlpLoTyK^y4V!jjvJdYDBQ(`+aMyU=@C~S4cQL(HgI;ks ze1}XX2dqFMa?H&+l+YrwoMjdIQsNFpoV<+SHkwhGMOA!aRKlgN{ifmbAWuxj>w5wq zT5YR6+c>Q-?Qm|Rjt{|U7*#RlY*tlYgxAQ-&c<8-3t99eRP7#Ib8mumt}a(3A9{o- zEBPMe@t;LvjQEk@tcJ93gyK#=Zj<3#UGBJi3UiAOY;D*!95$6ffN7M^{W5!)bzfP`-=ZdJh;Rcf<%hl!O;z9ylwNir3N;@JW|) zL1%G^f(<|62i4?72zOx!lw$czggc7}%T}1WA5&r2Sa$2}61qPb`czR6&un(#r^u}f zp_Pi+PP#aFR4Y=tkL<#3zaHU$q`rF+8J^rGdXAv<8f#3j+6un5($pZ!NuXp=56Kupf^Hu{@AP?( zYF|qvS7Y|lox|qd`df&`Eh(v(-J$`6{@4U!x6=~{5tVUZlkEDi*(JXI{-&v7)c z-IGNNlpaLB44?cTElXp_*6r>#F(q9SK3@;GP06Y3_4oqM@en;Hw{vQ)MKr|GTm7GV zzYA~MUk*r(7@T>MiSMXc-ag(5utdfP$#gp7YN10Bg;qjCXo3B@z zd&`fY_WU&PGjaEyQ6NJRBUtYxe4h&9AEox+!F5Fi7QJ&}wC`^Rs=kUDAOU`*YLjGn zO&67u*bY)q$2k?Ua&6n4<9aDTW+$QQqrqjewn%GoA;H~IYK~NVjgpr?ihk!J=3?#S zB@gpMy<$?vQadMwgho+P-83S$KF@$5FajDmef%%fe}>rR7wJaubxM(osJU2I z3w+M)P6;wwFAVBtn1_EDAiDFSNBq{G(cy^04%ZxF5`!rWr#&nxGK`sw^y01%3__X8 z=8-ag7J{<)<+0iUi8=9{vS3zi8x-S6rF&~qObsGPUO$vRe8izJ7GxVTCvWuz^fU%j z1+}qyOHaVdb!twJrjZ@n(x;dwst$KAV*op>l$a*LlqP&iPl>Ybkh9!yHucL$Y=u&4 zQaqNe0SGqlVSC;#W`OMi{^`GWVOJ~(@5(Ih~iLKDC&SBXtfkY^upjd zje_E|5ZSSj1xFBBMC)8c+hf7Qik@5@ib6Gg+5pNW+%E0U(Vte}k!*~mK-;n=FeRP3Vw_TSL@|tN@r^Wn3!7$L)e358uU;C)ps#~dml5Su z&VKiG8;wc52g%+9vF?-^Wba+nJSQHyPYWL6GJ{enx^EvDs6U0X-d~70NpJ;m<FLoLb;fLO}UQ9Xuk|GOtl=RD*Ui) zfc-{z({B*ieL)X6>xpWS8XAIypi26wa8!3a zsQA+c^rO){*hJb$^P4WNE#Bc%@t)8K44;xKsujX4{(^A5rvjD9D z4xwXIY$HKf2a5j1AJD37OPp-Sp%Or-R-Vwe0#{;hORO#HWe|mOfDqcv|FjyXhfBKb z(&;xpb3m+TOkS4g85!kcm45~n;h@M#t(TTslVKx9 z?0Z9}nWdnwSAUt=IGM)9Q>~Nrbdy{6=4yN#u)xp2d5rc!L6eX)tb4jU$4;hNFHOX0 zRC)`{K&a;0d31}7#y3Jbc2m3G|Jnm;08~x2J5_!A7D$&dPr}_{wXMVU;oyPRa0Vvi znnrI#;kD%6jpu7V)VgmH(8bKySOv8(+Yi-)dI0LlVD-?_=1Z6;lfG~^6msNMj4k{l zI2?M+G-zEIdsPnkk?#$)u2yw=piAS0OjDCncnFF=hjZwT$Xv|wGS#^V^rUt|E(~5T z<;us&0z2n__ z+nUirft>Qq!*%}79DKzc?^-kDMl1tI3BJBKQ)r!EyU>$Fy8OCiARKDH_rzAoxBFx_kI|G=L zhE>rpSl5YD5_Y$I`OM+X^Gt=4zX}Tuo`Il~PKaI3T2J{yg5kKW1;R0K&3Qqe#L!p= zj({PEd;j%o)8UvIi;O4)X{h0xuEyiuF4!(N|E2};{M2yBcU8htk^UK?5`V#$xD^0a=wAs04D748c2h29_z zn;E?X>yH{1L8X;h(KQI(s{#jcB`gjBNi0ekQdp2bMK@!9x*I&%QWLIA30q5g&h$ zwq^hM$SD1>8sVz5KWws^_#LZ!CW*mAsCIc3O<#I0A_T$@<|fU{>M?6_MV8shMwYF0 zKf3PgLUp_NQ1#N?d(wh-Um$&>{@FmYb-Kup0b^p5SZEyzwTC1jU*Sl)tz#W9d2B0V zM1vwNw8QkP)%l&b!+}RiqLW#|?a41LJ5ETj7d}_R^!|b8nWfY-rW0o#4lnJ;c$f7X zjTzZJI9c%)LQrQ07Jckpz-xs)RG%ZToMx<5ub3vr-$1$I+3g#kC6^9LleSkh(2$zn z@gY#+2ZXsybPjq)l0abI`Dat6^C%kp;^ng_7VS2M-Oc2gBq$!28^5r+et}Nt!HOyI z9m=zK$i=)R$)t`Q=e&8_X2zkVNg_THbPJevKeCpV$zrdGS#cT&6S zTpbDpR*j+-@h5y&Ru%UlA7*F|VhX8J90V1Z&r)kXmJ(u4l$s$~B6#+W(@!8juZ@K3 z%bSPW*FWjYL*13Dp2%L*4v~{z5DqIzS)Bw!8Ccv4-HwSlnSd~|1CsAOG~{L0_Oagu za4N;C4a*XpOunY#j1>kj9*bk#2S!5g%9rt~);Ab)K3!4bg%*(K2b9CR2#T_R|6o-* zazZN}VJzkLj*`}VBBYPm6+G?_g58!ocTR+~qYNuqLJ6d*ZwFpitvZg=l+M{?YLiUP zS=}fHDiqX8GnH-7;XaMEKS4_Tx_SJm&PWysd2T7)5@{+PSq&bzp@`q!HqFAE*0`+T z>ob~CIy>x=fw4juPcE!OJZkl9+&cJ}u$S z+g`~k(0pm#0W#@$)EROY|9+1x&008+K4Gclmzgl{-Ty|FX9s?`p%;X(>$HU6ohnh9 zZitPk#=W4z8U|HjGjlH*A(|JEBJ2mIon#InPr7YKf^$q>@qO#Lt=AA9k}a@hp6T^t zvpkf6mV+&-YYpzpAvfdmp0URSbO_?<_P|j<$ z#Am zo!%=7^<6YVjs<6ArD-Wq&ge3N=hG`|3sj~XYJ#d098$L&p;VmcQKKkp zL*jYe1&1_ph9O~~MIIN$jM@HXT~DP|(`0B(+#N0;7&8-N?Eb-jws3%qvV%W1sCy6$5r}i-)oD4d9)$-at(@CQG9m z4auNlZxkd`#t`G(N!fJ6ZyO=kkGSBq9ge3jb_UJA?oNc+qU03OPmlrYDGLj)2`OWw z7MP62)Nt9*Q^$N1?%%OO`jL3c6MzX@M6n!lQ zY}4{lHl^l1e;Na;MfsrSy}Nx@^AYwY_cu3YJ~vK4@|6hhYd&gRgzb_>BZ3`Tjb1Z$n|@*&K}TTos#iahhr3tG@>SR(2D|veK+43>|nD^ z!%HjltyHZ|j{~|RXwwm1B0xl8j8w_<^bW-Vv>!+N-RuEzc}xqXS{w62DXP}2ys>3U z#7G|xQ|E`2nKs+DmY^$u_f+aY-eZUzJ#rva>>A9GQ#|z;kQ~5DcpcPRPAgC;-NwC^ zr6teWeoNEZxiR;XAAJGs9`PW&*V<~`Y$ZdRSV;MCc{-Ore^`LJ39Gh4 z`%dx{pS`)758)0Rh^(D|&7cE9@hIyEk$<1?I3FI^p3A0N9v+fG*V{lNArMY4V!hBq z1l5y@%1}xK{g?^1XT1%}!*F*9ITDy1B*X{#6acFGV?@mHs?i^8|0F1`1z2YPc_v^a ziGWSI!mzyQLNfN58B^8DXY`8s+x_>JJ7w*OizxeJjOe5IhJq)V znf&Ln0PX`|=YZf1=n&!52_*UYQdezd!U3jPM}x<`EN?gY73$^*7Ujib0ZPWU?11gkjvvR#eyBvZ*A9Kza z^@idPM>6td5dcR-OW~c5<7Vh}4KUR(6XWtWemywUx;q%!gE(?sd){rXItjH0Io|Nf zz|pqp_-s2?K*pI$twwanl|vU7dfne0lW{!q~n~5O}-%Y_4*7Wj?nXV zapBbG-l{&&2l>Nb(Tnx&vTz=~2X7FSn!Pjw!^02};D5v*winMc*D=PylrkEAtay&I z=g|;u*(~Wh$LY$%Cjy^>(*_vP6o*3i9CTV%rj{J5XXp9UW5V;*l1>*Q_=)(BtV0-6=u>=<@x1J6+kiZ)`r2C$wrsLSJWG^hL|c0{Gj0n*D<>?=LZW zvr&|qqiBUSD_ti=BlP@xdCo*cUu)k{mP=t(I9O z{l+B)2eiPmO`qKsgYcqX5IilYvU-*qlBz|BqMVbcDYSFn!BKE;gB&MVMF^ewSa6rb zNSzfR90L*HkJjO`Kh$Y`an8Y}jX82{loxpx+>2qSwFoIY=o(sF2TqmY1M+b~%+-nQ zz68&W_nB;9-)*7q!q=jxI$jhT|8fXDHZ+~P`A3Nt*{7Bb&{(r(P61{H9N9M`(Pge_ zHqy3j651rSKn8N0_kg#)tn~d^ME!Fi614$d{tulxMS@8?q_|C(ATYL^_zsGJ=hIx! zGG6xuHNzjofRZIG*28R0kmFvB6Ybc!%K$6q*a1y%chr(EU#3xG6f8Os6>$|5FM0`! zwZ*p7o?CcXPUC81wL%iG% zTUKn=xGOtMRX-MCvt&GY`({|&R2#mh6%J{=ia@FHd_;-yzxD`^O@U$*193{51DCW#GCQjcE6Ju+(Mnu0rI-ogriW|V1S z*2tW&rI_YHfzTi?Z>jp6*~AG^Yu3soTJ^=@tJ#l`sADAFHS5TMJlA-W|ir@$}LkhsHBBxlCXDeg)S7$1evr>%_A5-TWD+rC170fnenxE>j3TgN^+b zKN9I*sWFw1tI; zlh0qj3Z}XFxr%5IeX~SMMxrPn!OHT{PInY{nIcc^xZUtXbz=^p)UU>{A?cfzKyN6& zho1nZS%66{V+guJ)|ne(u-BUDYxa;%e7E%7<9LFX(!%L?afJ&tKJ(t(&SdUT7@BEa zKh-`}=?QA`ufhH(U{9$6{(_ymFDD#Wg|uyo#{=FffH(X80!ussUz^P~5B+m?kL8g~ zNp&kf$7c$D1PgKv$IApr{Jkn!)lO|LDiFusdHjbwvDpg0_@}R+kl!U!n*oAAiC9rv z;p2x~z&2NaODlv$)2v7Q1E<-qZ%D2zB`9_f;8=bR@5_u5V>Rf5H1)QQom4;wnAG|# z;VP7FegerwaUHipS;V(cIMP}(rlBqfK*rTtlz(x$(to(@z~X zh03QxHDXVr<;o`&$y8D=YB3nkDPB8I`=Xgae8N~Lip_g7Z)7*!Ord37)iAeZ@1rVf4BLS%K6)V*Zuy^@3z1C`DMSed;S}U CT6y*W literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/E76E54B7526CD2B5423322FB711C0CA6AA6520A2AC8BC34A84358EA137F138D0.bin b/test_fixtures/masp_proofs/E76E54B7526CD2B5423322FB711C0CA6AA6520A2AC8BC34A84358EA137F138D0.bin new file mode 100644 index 0000000000000000000000000000000000000000..4df2e0be9f296c431ccbf45a93b596618360c138 GIT binary patch literal 18792 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%0AZ#;eA|76Rb`B;G|kS4*m#I&fP@uXgr)O_6b!x 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 Ct%%V8 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin b/test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin new file mode 100644 index 0000000000000000000000000000000000000000..56b269667b85a1d899ad3cf4957cb9665f6c6378 GIT binary patch literal 7448 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 uE?rN|N$s3*$M0VI8o;nOl#z({ PathBuf { let filename = match self { TestWasms::TxMemoryLimit => "tx_memory_limit.wasm", - TestWasms::TxMintTokens => "tx_mint_tokens.wasm", TestWasms::TxNoOp => "tx_no_op.wasm", TestWasms::TxProposalCode => "tx_proposal_code.wasm", TestWasms::TxReadStorageKey => "tx_read_storage_key.wasm", diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 65c0d306f35..674bce95385 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -40,15 +40,15 @@ clap.workspace = true concat-idents.workspace = true derivative.workspace = true hyper = {version = "0.14.20", features = ["full"]} -ibc-relayer-types.workspace = true -ibc-relayer.workspace = true lazy_static.workspace = true num-traits.workspace = true prost.workspace = true regex.workspace = true serde_json.workspace = true +serde.workspace = true sha2.workspace = true tempfile.workspace = true +tendermint-light-client.workspace = true test-log.workspace = true tokio = {workspace = true, features = ["full"]} tracing-subscriber.workspace = true diff --git a/tests/src/e2e/eth_bridge_tests.rs b/tests/src/e2e/eth_bridge_tests.rs index 1d15c5323aa..d85b344f45f 100644 --- a/tests/src/e2e/eth_bridge_tests.rs +++ b/tests/src/e2e/eth_bridge_tests.rs @@ -144,17 +144,17 @@ async fn test_roundtrip_eth_transfer() -> Result<()> { "add-erc20-transfer", "--address", BERTHA, - "--signer", - BERTHA, + "--signing-keys", + BERTHA_KEY, "--amount", &amount, "--erc20", &dai_addr, "--ethereum-address", RECEIVER, - "--fee-amount", + "--gas-amount", "10", - "--fee-payer", + "--gas-payer", BERTHA, "--gas-amount", "0", @@ -335,17 +335,17 @@ async fn test_bridge_pool_e2e() { "add-erc20-transfer", "--address", BERTHA, - "--signer", - BERTHA, + "--signing-keys", + BERTHA_KEY, "--amount", "100", "--erc20", &wnam_address, "--ethereum-address", RECEIVER, - "--fee-amount", + "--gas-amount", "10", - "--fee-payer", + "--gas-payer", BERTHA, "--gas-amount", "0", diff --git a/tests/src/e2e/eth_bridge_tests/helpers.rs b/tests/src/e2e/eth_bridge_tests/helpers.rs index 09df129e2bf..a52273366cf 100644 --- a/tests/src/e2e/eth_bridge_tests/helpers.rs +++ b/tests/src/e2e/eth_bridge_tests/helpers.rs @@ -183,7 +183,7 @@ pub fn attempt_wrapped_erc20_transfer( from, "--target", to, - "--signer", + "--signing-keys", signer, "--amount", &amount, diff --git a/tests/src/e2e/helpers.rs b/tests/src/e2e/helpers.rs index 1fde997ef69..e2d887b5a21 100644 --- a/tests/src/e2e/helpers.rs +++ b/tests/src/e2e/helpers.rs @@ -458,3 +458,9 @@ pub fn wait_for_wasm_pre_compile(ledger: &mut NamadaCmd) -> Result<()> { ledger.exp_string("Finished compiling all")?; Ok(()) } + +/// Convert epoch `min_duration` in seconds to `epochs_per_year` genesis +/// parameter. +pub fn epochs_per_year_from_min_duration(min_duration: u64) -> u64 { + 60 * 60 * 24 * 365 / min_duration +} diff --git a/tests/src/e2e/ibc_tests.rs b/tests/src/e2e/ibc_tests.rs index a7f89d9a9f1..bbc959908fe 100644 --- a/tests/src/e2e/ibc_tests.rs +++ b/tests/src/e2e/ibc_tests.rs @@ -12,56 +12,43 @@ use core::convert::TryFrom; use core::str::FromStr; use core::time::Duration; +use std::collections::HashMap; use color_eyre::eyre::Result; use eyre::eyre; -use ibc_relayer::client_state::AnyClientState; -use ibc_relayer::config::types::{MaxMsgNum, MaxTxSize, Memo}; -use ibc_relayer::config::{AddressType, ChainConfig, GasPrice, PacketFilter}; -use ibc_relayer::event::ibc_event_try_from_abci_event; -use ibc_relayer::keyring::Store; -use ibc_relayer::light_client::tendermint::LightClient as TmLightClient; -use ibc_relayer::light_client::{LightClient, Verified}; -use ibc_relayer_types::clients::ics07_tendermint::client_state::{ +use namada::ibc::applications::transfer::VERSION as ICS20_VERSION; +use namada::ibc::clients::ics07_tendermint::client_state::{ AllowUpdate, ClientState as TmClientState, }; -use ibc_relayer_types::clients::ics07_tendermint::consensus_state::ConsensusState as TmConsensusState; -use ibc_relayer_types::core::ics02_client::msgs::create_client::MsgCreateClient; -use ibc_relayer_types::core::ics02_client::msgs::update_client::MsgUpdateClient; -use ibc_relayer_types::core::ics02_client::trust_threshold::TrustThreshold; -use ibc_relayer_types::core::ics03_connection::connection::Counterparty as ConnCounterparty; -use ibc_relayer_types::core::ics03_connection::msgs::conn_open_ack::MsgConnectionOpenAck; -use ibc_relayer_types::core::ics03_connection::msgs::conn_open_confirm::MsgConnectionOpenConfirm; -use ibc_relayer_types::core::ics03_connection::msgs::conn_open_init::MsgConnectionOpenInit; -use ibc_relayer_types::core::ics03_connection::msgs::conn_open_try::MsgConnectionOpenTry; -use ibc_relayer_types::core::ics03_connection::version::Version as ConnVersion; -use ibc_relayer_types::core::ics04_channel::channel::{ - ChannelEnd, Counterparty as ChanCounterparty, Order as ChanOrder, - State as ChanState, +use namada::ibc::clients::ics07_tendermint::consensus_state::ConsensusState as TmConsensusState; +use namada::ibc::clients::ics07_tendermint::header::Header as IbcTmHeader; +use namada::ibc::clients::ics07_tendermint::trust_threshold::TrustThreshold; +use namada::ibc::core::ics02_client::client_state::ClientState; +use namada::ibc::core::ics02_client::msgs::create_client::MsgCreateClient; +use namada::ibc::core::ics02_client::msgs::update_client::MsgUpdateClient; +use namada::ibc::core::ics03_connection::connection::Counterparty as ConnCounterparty; +use namada::ibc::core::ics03_connection::msgs::conn_open_ack::MsgConnectionOpenAck; +use namada::ibc::core::ics03_connection::msgs::conn_open_confirm::MsgConnectionOpenConfirm; +use namada::ibc::core::ics03_connection::msgs::conn_open_init::MsgConnectionOpenInit; +use namada::ibc::core::ics03_connection::msgs::conn_open_try::MsgConnectionOpenTry; +use namada::ibc::core::ics03_connection::version::Version as ConnVersion; +use namada::ibc::core::ics04_channel::channel::Order as ChanOrder; +use namada::ibc::core::ics04_channel::msgs::{ + MsgAcknowledgement, MsgChannelOpenAck, MsgChannelOpenConfirm, + MsgChannelOpenInit, MsgChannelOpenTry, MsgRecvPacket, MsgTimeout, }; -use ibc_relayer_types::core::ics04_channel::msgs::acknowledgement::MsgAcknowledgement; -use ibc_relayer_types::core::ics04_channel::msgs::chan_open_ack::MsgChannelOpenAck; -use ibc_relayer_types::core::ics04_channel::msgs::chan_open_confirm::MsgChannelOpenConfirm; -use ibc_relayer_types::core::ics04_channel::msgs::chan_open_init::MsgChannelOpenInit; -use ibc_relayer_types::core::ics04_channel::msgs::chan_open_try::MsgChannelOpenTry; -use ibc_relayer_types::core::ics04_channel::msgs::recv_packet::MsgRecvPacket; -use ibc_relayer_types::core::ics04_channel::msgs::timeout::MsgTimeout; -use ibc_relayer_types::core::ics04_channel::packet::Packet; -use ibc_relayer_types::core::ics04_channel::version::Version as ChanVersion; -use ibc_relayer_types::core::ics23_commitment::commitment::{ +use namada::ibc::core::ics04_channel::packet::Packet; +use namada::ibc::core::ics04_channel::timeout::TimeoutHeight; +use namada::ibc::core::ics04_channel::Version as ChanVersion; +use namada::ibc::core::ics23_commitment::commitment::{ CommitmentPrefix, CommitmentProofBytes, }; -use ibc_relayer_types::core::ics23_commitment::merkle::convert_tm_to_ics_merkle_proof; -use ibc_relayer_types::core::ics24_host::identifier::{ - ChainId, ClientId, ConnectionId, PortChannelId, PortId, +use namada::ibc::core::ics23_commitment::merkle::MerkleProof; +use namada::ibc::core::ics24_host::identifier::{ + ChainId, ChannelId, ClientId, ConnectionId, PortId, }; -use ibc_relayer_types::events::IbcEvent; -use ibc_relayer_types::proofs::{ConsensusProof, Proofs}; -use ibc_relayer_types::signer::Signer; -use ibc_relayer_types::tx_msg::Msg; -use ibc_relayer_types::Height; -use namada::ibc::core::ics24_host::identifier::PortChannelId as IbcPortChannelId; -use namada::ibc::Height as IbcHeight; +use namada::ibc::core::Msg; +use namada::ibc::{Height, Signer}; use namada::ibc_proto::google::protobuf::Any; use namada::ledger::events::EventType; use namada::ledger::ibc::storage::*; @@ -70,6 +57,8 @@ use namada::ledger::pos::{self, PosParams}; use namada::ledger::queries::RPC; use namada::ledger::storage::ics23_specs::ibc_proof_specs; use namada::ledger::storage::traits::Sha256Hasher; +use namada::tendermint::abci::Event as AbciEvent; +use namada::tendermint::block::Height as TmHeight; use namada::types::address::{Address, InternalAddress}; use namada::types::key::PublicKey; use namada::types::storage::{BlockHeight, Key}; @@ -82,12 +71,13 @@ use namada_apps::config::ethereum_bridge; use namada_apps::config::genesis::genesis_config::GenesisConfig; use namada_apps::facade::tendermint::block::Header as TmHeader; use namada_apps::facade::tendermint::merkle::proof::Proof as TmProof; -use namada_apps::facade::tendermint::trust_threshold::TrustThresholdFraction; use namada_apps::facade::tendermint_config::net::Address as TendermintAddress; use namada_apps::facade::tendermint_rpc::{Client, HttpClient, Url}; use prost::Message; use setup::constants::*; +use tendermint_light_client::components::io::{Io, ProdIo as TmLightClientIo}; +use super::helpers::wait_for_wasm_pre_compile; use super::setup::set_ethereum_bridge_mode; use crate::e2e::helpers::{find_address, get_actor_rpc, get_validator_pk}; use crate::e2e::setup::{self, sleep, Bin, NamadaCmd, Test, Who}; @@ -132,6 +122,9 @@ fn run_ledger_ibc() -> Result<()> { ledger_a.exp_string("This node is a validator")?; ledger_b.exp_string("This node is a validator")?; + wait_for_wasm_pre_compile(&mut ledger_a)?; + wait_for_wasm_pre_compile(&mut ledger_b)?; + // Wait for a first block ledger_a.exp_string("Committed block hash")?; ledger_b.exp_string("Committed block hash")?; @@ -146,14 +139,15 @@ fn run_ledger_ibc() -> Result<()> { let (conn_id_a, conn_id_b) = connection_handshake(&test_a, &test_b, &client_id_a, &client_id_b)?; - let (port_channel_id_a, port_channel_id_b) = channel_handshake( - &test_a, - &test_b, - &client_id_a, - &client_id_b, - &conn_id_a, - &conn_id_b, - )?; + let ((port_id_a, channel_id_a), (port_id_b, channel_id_b)) = + channel_handshake( + &test_a, + &test_b, + &client_id_a, + &client_id_b, + &conn_id_a, + &conn_id_b, + )?; // Transfer 100000 from the normal account on Chain A to Chain B transfer_token( @@ -161,13 +155,14 @@ fn run_ledger_ibc() -> Result<()> { &test_b, &client_id_a, &client_id_b, - &port_channel_id_a, + &port_id_a, + &channel_id_a, )?; - check_balances(&port_channel_id_b, &test_a, &test_b)?; + check_balances(&port_id_b, &channel_id_b, &test_a, &test_b)?; // Transfer 50000 received over IBC on Chain B - transfer_received_token(&port_channel_id_b, &test_b)?; - check_balances_after_non_ibc(&port_channel_id_b, &test_b)?; + transfer_received_token(&port_id_b, &channel_id_b, &test_b)?; + check_balances_after_non_ibc(&port_id_b, &channel_id_b, &test_b)?; // Transfer 50000 back from the origin-specific account on Chain B to Chain // A @@ -176,14 +171,21 @@ fn run_ledger_ibc() -> Result<()> { &test_b, &client_id_a, &client_id_b, - &port_channel_id_b, + &port_id_b, + &channel_id_b, )?; - check_balances_after_back(&port_channel_id_b, &test_a, &test_b)?; + check_balances_after_back(&port_id_b, &channel_id_b, &test_a, &test_b)?; // Transfer a token and it will time out and refund - transfer_timeout(&test_a, &test_b, &client_id_a, &port_channel_id_a)?; + transfer_timeout( + &test_a, + &test_b, + &client_id_a, + &port_id_a, + &channel_id_a, + )?; // The balance should not be changed - check_balances_after_back(&port_channel_id_b, &test_a, &test_b)?; + check_balances_after_back(&port_id_b, &channel_id_b, &test_a, &test_b)?; // Skip tests for closing a channel and timeout_on_close since the transfer // channel cannot be closed @@ -214,9 +216,9 @@ fn create_client(test_a: &Test, test_b: &Test) -> Result<(ClientId, ClientId)> { let message = MsgCreateClient { client_state: client_state.into(), consensus_state: make_consensus_state(test_b, height)?.into(), - signer: Signer::from_str("test_a").expect("invalid signer"), + signer: signer(), }; - let height_a = submit_ibc_tx(test_a, message, ALBERT)?; + let height_a = submit_ibc_tx(test_a, message, ALBERT, ALBERT_KEY, false)?; let height = query_height(test_a)?; let client_state = make_client_state(test_a, height); @@ -224,23 +226,16 @@ fn create_client(test_a: &Test, test_b: &Test) -> Result<(ClientId, ClientId)> { let message = MsgCreateClient { client_state: client_state.into(), consensus_state: make_consensus_state(test_a, height)?.into(), - signer: Signer::from_str("test_b").expect("invalid signer"), + signer: signer(), }; - let height_b = submit_ibc_tx(test_b, message, ALBERT)?; + let height_b = submit_ibc_tx(test_b, message, ALBERT, ALBERT_KEY, false)?; - // convert the client IDs from `ibc_relayer_type` to `ibc` - let client_id_a = match get_event(test_a, height_a)? { - Some(IbcEvent::CreateClient(event)) => { - ClientId::from_str(event.client_id().as_str()).unwrap() - } - _ => return Err(eyre!("Transaction failed")), - }; - let client_id_b = match get_event(test_b, height_b)? { - Some(IbcEvent::CreateClient(event)) => { - ClientId::from_str(event.client_id().as_str()).unwrap() - } - _ => return Err(eyre!("Transaction failed")), - }; + let events = get_events(test_a, height_a)?; + let client_id_a = get_client_id_from_events(&events) + .ok_or(eyre!("Transaction failed"))?; + let events = get_events(test_b, height_b)?; + let client_id_b = get_client_id_from_events(&events) + .ok_or(eyre!("Transaction failed"))?; // `client_id_a` represents the ID of the B's client on Chain A Ok((client_id_a, client_id_b)) @@ -303,7 +298,7 @@ fn update_client_with_height( target_height: Height, ) -> Result<()> { // check the current(stale) state on the target chain - let key = client_state_key(&target_client_id.as_str().parse().unwrap()); + let key = client_state_key(target_client_id); let (value, _) = query_value_with_proof(target_test, &key, None)?; let cs = match value { Some(v) => Any::decode(&v[..]) @@ -325,7 +320,6 @@ fn update_client_with_height( target_client_id, trusted_height, target_height, - client_state, ) } @@ -335,36 +329,35 @@ fn update_client( client_id: &ClientId, trusted_height: Height, target_height: Height, - client_state: TmClientState, ) -> Result<()> { - let config = dummy_chain_config(src_test); - let pk = get_validator_pk(src_test, &Who::Validator(0)).unwrap(); - let peer_id = id_from_pk(&PublicKey::try_from_pk(&pk).unwrap()); - let mut light_client = - TmLightClient::from_config(&config, peer_id).unwrap(); - let Verified { target, supporting } = light_client - .header_and_minimal_set( - trusted_height, - target_height, - &AnyClientState::Tendermint(client_state), - ) - .map_err(|e| eyre!("Building the header failed: {}", e))?; - - for header in supporting { - let message = MsgUpdateClient { - header: header.into(), - client_id: client_id.clone(), - signer: Signer::from_str("test").expect("invalid signer"), - }; - submit_ibc_tx(target_test, message, ALBERT)?; - } + let io = make_light_client_io(src_test); + + let height = TmHeight::try_from(trusted_height.revision_height()) + .expect("invalid height"); + let trusted_block = io + .fetch_light_block(height.into()) + .expect("the light client couldn't get a light block"); + + let height = TmHeight::try_from(target_height.revision_height()) + .expect("invalid height"); + let target_block = io + .fetch_light_block(height.into()) + .expect("the light client couldn't get a light block"); + + let header = IbcTmHeader { + signed_header: target_block.signed_header, + validator_set: target_block.validators, + trusted_height: Height::new(0, u64::from(trusted_block.height())) + .expect("invalid height"), + trusted_next_validator_set: trusted_block.next_validators, + }; let message = MsgUpdateClient { - header: target.into(), + header: header.into(), client_id: client_id.clone(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: signer(), }; - submit_ibc_tx(target_test, message, ALBERT)?; + submit_ibc_tx(target_test, message, ALBERT, ALBERT_KEY, false)?; check_ibc_update_query( target_test, @@ -374,40 +367,16 @@ fn update_client( Ok(()) } -fn dummy_chain_config(test: &Test) -> ChainConfig { +fn make_light_client_io(test: &Test) -> TmLightClientIo { let addr = format!("http://{}", get_actor_rpc(test, &Who::Validator(0))); let rpc_addr = Url::from_str(&addr).unwrap(); - // use only id and rpc_addr - ChainConfig { - id: ChainId::new(test.net.chain_id.as_str().to_string(), 0), - r#type: ibc_relayer::chain::ChainType::CosmosSdk, - rpc_addr: rpc_addr.clone(), - websocket_addr: rpc_addr.clone(), - grpc_addr: rpc_addr, - rpc_timeout: Duration::new(10, 0), - account_prefix: "dummy".to_string(), - key_name: "dummy".to_string(), - key_store_type: Store::default(), - store_prefix: "dummy".to_string(), - default_gas: None, - max_gas: None, - gas_adjustment: None, - gas_multiplier: None, - fee_granter: None, - max_msg_num: MaxMsgNum::default(), - max_tx_size: MaxTxSize::default(), - clock_drift: Duration::new(5, 0), - max_block_time: Duration::new(5, 0), - trusting_period: None, - memo_prefix: Memo::default(), - proof_specs: Some(ibc_proof_specs::().into()), - sequential_batch_tx: true, - trust_threshold: TrustThresholdFraction::ONE_THIRD, - gas_price: GasPrice::new(0.0, "dummy".to_string()), - packet_filter: PacketFilter::default(), - address_type: AddressType::Cosmos, - extension_options: Vec::new(), - } + let rpc_client = HttpClient::new(rpc_addr).unwrap(); + let rpc_timeout = Duration::new(10, 0); + + let pk = get_validator_pk(test, &Who::Validator(0)).unwrap(); + let peer_id = id_from_pk(&PublicKey::try_from_pk(&pk).unwrap()); + + TmLightClientIo::new(peer_id, rpc_client, Some(rpc_timeout)) } fn connection_handshake( @@ -417,117 +386,100 @@ fn connection_handshake( client_id_b: &ClientId, ) -> Result<(ConnectionId, ConnectionId)> { let msg = MsgConnectionOpenInit { - client_id: client_id_a.clone(), + client_id_on_a: client_id_a.clone(), counterparty: ConnCounterparty::new( client_id_b.clone(), None, commitment_prefix(), ), version: Some(ConnVersion::default()), - delay_period: Duration::new(1, 0), - signer: Signer::from_str("test_a").expect("invalid signer"), + delay_period: Duration::new(0, 0), + signer: signer(), }; // OpenInitConnection on Chain A - let height = submit_ibc_tx(test_a, msg, ALBERT)?; - let conn_id_a = match get_event(test_a, height)? { - Some(IbcEvent::OpenInitConnection(event)) => event - .connection_id() - .cloned() - .ok_or(eyre!("No connection ID is set"))?, - _ => return Err(eyre!("Transaction failed")), - }; + let height = submit_ibc_tx(test_a, msg, ALBERT, ALBERT_KEY, false)?; + let events = get_events(test_a, height)?; + let conn_id_a = get_connection_id_from_events(&events) + .ok_or(eyre!("No connection ID is set"))?; // get the proofs from Chain A let height_a = query_height(test_a)?; - let (client_state, proofs) = - get_connection_proofs(test_a, client_id_a, &conn_id_a, height_a)?; + let conn_proof = get_connection_proof(test_a, &conn_id_a, height_a)?; + let (client_state, client_state_proof, consensus_proof) = + get_client_states(test_a, client_id_a, height_a)?; let counterparty = ConnCounterparty::new( client_id_a.clone(), Some(conn_id_a.clone()), commitment_prefix(), ); - let msg = MsgConnectionOpenTry { - previous_connection_id: None, - client_id: client_id_b.clone(), - client_state: Some(client_state.into()), + let msg = make_msg_conn_open_try( + client_id_b.clone(), + client_state, counterparty, - counterparty_versions: vec![ConnVersion::default()], - proofs, - delay_period: Duration::new(1, 0), - signer: Signer::from_str("test_b").expect("invalid signer"), - }; + conn_proof, + client_state_proof, + consensus_proof, + height_a, + ); // Update the client state of Chain A on Chain B update_client_with_height(test_a, test_b, client_id_b, height_a)?; // OpenTryConnection on Chain B - let height = submit_ibc_tx(test_b, msg, ALBERT)?; - let conn_id_b = match get_event(test_b, height)? { - Some(IbcEvent::OpenTryConnection(event)) => event - .connection_id() - .cloned() - .ok_or(eyre!("No connection ID is set"))?, - _ => return Err(eyre!("Transaction failed")), - }; + let height = submit_ibc_tx(test_b, msg, ALBERT, ALBERT_KEY, false)?; + let events = get_events(test_b, height)?; + let conn_id_b = get_connection_id_from_events(&events) + .ok_or(eyre!("No connection ID is set"))?; // get the A's proofs on Chain B let height_b = query_height(test_b)?; - let (client_state, proofs) = - get_connection_proofs(test_b, client_id_b, &conn_id_b, height_b)?; + let conn_proof = get_connection_proof(test_b, &conn_id_b, height_b)?; + let (client_state, client_state_proof, consensus_proof) = + get_client_states(test_b, client_id_b, height_b)?; + let consensus_height_of_a_on_b = client_state.latest_height(); let msg = MsgConnectionOpenAck { - connection_id: conn_id_a.clone(), - counterparty_connection_id: conn_id_b.clone(), - client_state: Some(client_state.into()), - proofs, + conn_id_on_a: conn_id_a.clone(), + conn_id_on_b: conn_id_b.clone(), + client_state_of_a_on_b: client_state.into(), + proof_conn_end_on_b: conn_proof, + proof_client_state_of_a_on_b: client_state_proof, + proof_consensus_state_of_a_on_b: consensus_proof, + proofs_height_on_b: height_b, + consensus_height_of_a_on_b, version: ConnVersion::default(), - signer: Signer::from_str("test_a").expect("invalid signer"), + signer: signer(), }; // Update the client state of Chain B on Chain A update_client_with_height(test_b, test_a, client_id_a, height_b)?; // OpenAckConnection on Chain A - submit_ibc_tx(test_a, msg, ALBERT)?; + submit_ibc_tx(test_a, msg, ALBERT, ALBERT_KEY, false)?; // get the proofs on Chain A let height_a = query_height(test_a)?; - let (_, proofs) = - get_connection_proofs(test_a, client_id_a, &conn_id_a, height_a)?; + let proof = get_connection_proof(test_a, &conn_id_a, height_a)?; let msg = MsgConnectionOpenConfirm { - connection_id: conn_id_b.clone(), - proofs, - signer: Signer::from_str("test_b").expect("invalid signer"), + conn_id_on_b: conn_id_b.clone(), + proof_conn_end_on_a: proof, + proof_height_on_a: height_a, + signer: signer(), }; // Update the client state of Chain A on Chain B update_client_with_height(test_a, test_b, client_id_b, height_a)?; // OpenConfirmConnection on Chain B - submit_ibc_tx(test_b, msg, ALBERT)?; + submit_ibc_tx(test_b, msg, ALBERT, ALBERT_KEY, false)?; Ok((conn_id_a, conn_id_b)) } // get the proofs on the target height -fn get_connection_proofs( +fn get_connection_proof( test: &Test, - client_id: &ClientId, conn_id: &ConnectionId, target_height: Height, -) -> Result<(TmClientState, Proofs)> { +) -> Result { // we need proofs at the height of the previous block let query_height = target_height.decrement().unwrap(); - let key = connection_key(&conn_id.as_str().parse().unwrap()); + let key = connection_key(conn_id); let (_, tm_proof) = query_value_with_proof(test, &key, Some(query_height))?; - let connection_proof = convert_proof(tm_proof)?; - - let (client_state, client_state_proof, consensus_proof) = - get_client_states(test, client_id, query_height)?; - - let proofs = Proofs::new( - connection_proof, - Some(client_state_proof), - Some(consensus_proof), - None, - target_height, - ) - .map_err(|e| eyre!("Creating proofs failed: error {}", e))?; - - Ok((client_state, proofs)) + convert_proof(tm_proof) } fn channel_handshake( @@ -537,131 +489,99 @@ fn channel_handshake( client_id_b: &ClientId, conn_id_a: &ConnectionId, conn_id_b: &ConnectionId, -) -> Result<(PortChannelId, PortChannelId)> { +) -> Result<((PortId, ChannelId), (PortId, ChannelId))> { // OpenInitChannel on Chain A let port_id = PortId::transfer(); - let counterparty = ChanCounterparty::new(port_id.clone(), None); - let channel = ChannelEnd::new( - ChanState::Init, - ChanOrder::Unordered, - counterparty, - vec![conn_id_a.clone()], - ChanVersion::ics20(), - ); + let connection_hops_on_a = vec![conn_id_a.clone()]; + let channel_version = ChanVersion::new(ICS20_VERSION.to_string()); let msg = MsgChannelOpenInit { - port_id: port_id.clone(), - channel, - signer: Signer::from_str("test_a").expect("invalid signer"), + port_id_on_a: port_id.clone(), + connection_hops_on_a, + port_id_on_b: port_id.clone(), + ordering: ChanOrder::Unordered, + signer: signer(), + version_proposal: channel_version.clone(), }; - let height = submit_ibc_tx(test_a, msg, ALBERT)?; - let channel_id_a = - match get_event(test_a, height)? { - Some(IbcEvent::OpenInitChannel(event)) => event - .channel_id() - .cloned() - .ok_or(eyre!("No channel ID is set"))?, - _ => return Err(eyre!("Transaction failed")), - }; - let port_channel_id_a = - PortChannelId::new(channel_id_a.clone(), port_id.clone()); + let height = submit_ibc_tx(test_a, msg, ALBERT, ALBERT_KEY, false)?; + let events = get_events(test_a, height)?; + let channel_id_a = get_channel_id_from_events(&events) + .ok_or(eyre!("Transaction failed"))?; // get the proofs from Chain A let height_a = query_height(test_a)?; - let proofs = - get_channel_proofs(test_a, client_id_a, &port_channel_id_a, height_a)?; - let counterparty = - ChanCounterparty::new(port_id.clone(), Some(channel_id_a.clone())); - let channel = ChannelEnd::new( - ChanState::TryOpen, - ChanOrder::Unordered, - counterparty, - vec![conn_id_b.clone()], - ChanVersion::ics20(), - ); + let proof_chan_end_on_a = + get_channel_proof(test_a, &port_id, &channel_id_a, height_a)?; + let connection_hops_on_b = vec![conn_id_b.clone()]; + #[allow(deprecated)] let msg = MsgChannelOpenTry { - port_id: port_id.clone(), - previous_channel_id: None, - channel, - counterparty_version: ChanVersion::ics20(), - proofs, - signer: Signer::from_str("test_b").expect("invalid signer"), + port_id_on_b: port_id.clone(), + connection_hops_on_b, + port_id_on_a: port_id.clone(), + chan_id_on_a: channel_id_a.clone(), + version_supported_on_a: channel_version.clone(), + proof_chan_end_on_a, + proof_height_on_a: height_a, + ordering: ChanOrder::Unordered, + signer: signer(), + version_proposal: channel_version.clone(), }; + // Update the client state of Chain A on Chain B update_client_with_height(test_a, test_b, client_id_b, height_a)?; // OpenTryChannel on Chain B - let height = submit_ibc_tx(test_b, msg, ALBERT)?; - let channel_id_b = match get_event(test_b, height)? { - Some(IbcEvent::OpenTryChannel(event)) => event - .channel_id() - .cloned() - .ok_or(eyre!("No channel ID is set"))?, - _ => return Err(eyre!("Transaction failed")), - }; - let port_channel_id_b = - PortChannelId::new(channel_id_b.clone(), port_id.clone()); + let height = submit_ibc_tx(test_b, msg, ALBERT, ALBERT_KEY, false)?; + let events = get_events(test_b, height)?; + let channel_id_b = get_channel_id_from_events(&events) + .ok_or(eyre!("Transaction failed"))?; // get the A's proofs on Chain B let height_b = query_height(test_b)?; - let proofs = - get_channel_proofs(test_b, client_id_b, &port_channel_id_b, height_b)?; + let proof_chan_end_on_b = + get_channel_proof(test_b, &port_id, &channel_id_b, height_b)?; let msg = MsgChannelOpenAck { - port_id: port_id.clone(), - channel_id: channel_id_a, - counterparty_channel_id: channel_id_b.clone(), - counterparty_version: ChanVersion::ics20(), - proofs, - signer: Signer::from_str("test_a").expect("invalid signer"), + port_id_on_a: port_id.clone(), + chan_id_on_a: channel_id_a.clone(), + chan_id_on_b: channel_id_b.clone(), + version_on_b: channel_version, + proof_chan_end_on_b, + proof_height_on_b: height_b, + signer: signer(), }; // Update the client state of Chain B on Chain A update_client_with_height(test_b, test_a, client_id_a, height_b)?; // OpenAckChannel on Chain A - submit_ibc_tx(test_a, msg, ALBERT)?; + submit_ibc_tx(test_a, msg, ALBERT, ALBERT_KEY, false)?; // get the proofs on Chain A let height_a = query_height(test_a)?; - let proofs = - get_channel_proofs(test_a, client_id_a, &port_channel_id_a, height_a)?; + let proof_chan_end_on_a = + get_channel_proof(test_a, &port_id, &channel_id_a, height_a)?; let msg = MsgChannelOpenConfirm { - port_id, - channel_id: channel_id_b, - proofs, - signer: Signer::from_str("test_b").expect("invalid signer"), + port_id_on_b: port_id.clone(), + chan_id_on_b: channel_id_b.clone(), + proof_chan_end_on_a, + proof_height_on_a: height_a, + signer: signer(), }; // Update the client state of Chain A on Chain B update_client_with_height(test_a, test_b, client_id_b, height_a)?; // OpenConfirmChannel on Chain B - submit_ibc_tx(test_b, msg, ALBERT)?; + submit_ibc_tx(test_b, msg, ALBERT, ALBERT_KEY, false)?; - Ok((port_channel_id_a, port_channel_id_b)) + Ok(((port_id.clone(), channel_id_a), (port_id, channel_id_b))) } -fn get_channel_proofs( +fn get_channel_proof( test: &Test, - client_id: &ClientId, - port_channel_id: &PortChannelId, + port_id: &PortId, + channel_id: &ChannelId, target_height: Height, -) -> Result { +) -> Result { // we need proofs at the height of the previous block let query_height = target_height.decrement().unwrap(); - let port_channel_id = IbcPortChannelId::new( - port_channel_id.channel_id.as_str().parse().unwrap(), - port_channel_id.port_id.as_str().parse().unwrap(), - ); - let key = channel_key(&port_channel_id); + let key = channel_key(port_id, channel_id); let (_, tm_proof) = query_value_with_proof(test, &key, Some(query_height))?; - let proof = convert_proof(tm_proof)?; - - let (_, client_state_proof, consensus_proof) = - get_client_states(test, client_id, query_height)?; - - Proofs::new( - proof, - Some(client_state_proof), - Some(consensus_proof), - None, - target_height, - ) - .map_err(|e| eyre!("Creating proofs failed: error {}", e)) + convert_proof(tm_proof) } // get the client state, the proof of the client state, and the proof of the @@ -670,10 +590,12 @@ fn get_client_states( test: &Test, client_id: &ClientId, target_height: Height, // should have been already decremented -) -> Result<(TmClientState, CommitmentProofBytes, ConsensusProof)> { - let key = client_state_key(&client_id.as_str().parse().unwrap()); +) -> Result<(TmClientState, CommitmentProofBytes, CommitmentProofBytes)> { + // we need proofs at the height of the previous block + let query_height = target_height.decrement().unwrap(); + let key = client_state_key(client_id); let (value, tm_proof) = - query_value_with_proof(test, &key, Some(target_height))?; + query_value_with_proof(test, &key, Some(query_height))?; let cs = match value { Some(v) => Any::decode(&v[..]) .map_err(|e| eyre!("Decoding the client state failed: {}", e))?, @@ -689,14 +611,10 @@ fn get_client_states( let client_state_proof = convert_proof(tm_proof)?; let height = client_state.latest_height(); - let ibc_height = IbcHeight::new(0, height.revision_height()).unwrap(); - let key = - consensus_state_key(&client_id.as_str().parse().unwrap(), ibc_height); - let (_, tm_proof) = - query_value_with_proof(test, &key, Some(target_height))?; - let proof = convert_proof(tm_proof)?; - let consensus_proof = ConsensusProof::new(proof, height) - .map_err(|e| eyre!("Creating ConsensusProof failed: error {}", e))?; + let ibc_height = Height::new(0, height.revision_height()).unwrap(); + let key = consensus_state_key(client_id, ibc_height); + let (_, tm_proof) = query_value_with_proof(test, &key, Some(query_height))?; + let consensus_proof = convert_proof(tm_proof)?; Ok((client_state, client_state_proof, consensus_proof)) } @@ -706,7 +624,8 @@ fn transfer_token( test_b: &Test, client_id_a: &ClientId, client_id_b: &ClientId, - port_channel_id_a: &PortChannelId, + port_id_a: &PortId, + channel_id_a: &ChannelId, ) -> Result<()> { // Send a token from Chain A let receiver = find_address(test_b, BERTHA)?; @@ -716,32 +635,35 @@ fn transfer_token( &receiver, NAM, &Amount::native_whole(100000), - port_channel_id_a, + ALBERT_KEY, + port_id_a, + channel_id_a, None, + false, )?; - let packet = match get_event(test_a, height)? { - Some(IbcEvent::SendPacket(event)) => event.packet, - _ => return Err(eyre!("Transaction failed")), - }; + let events = get_events(test_a, height)?; + let packet = + get_packet_from_events(&events).ok_or(eyre!("Transaction failed"))?; check_ibc_packet_query(test_a, &"send_packet".parse().unwrap(), &packet)?; let height_a = query_height(test_a)?; - let proofs = get_commitment_proof(test_a, &packet, height_a)?; + let proof_commitment_on_a = + get_commitment_proof(test_a, &packet, height_a)?; let msg = MsgRecvPacket { packet, - proofs, - signer: Signer::from_str("test_b").expect("invalid signer"), + proof_commitment_on_a, + proof_height_on_a: height_a, + signer: signer(), }; // Update the client state of Chain A on Chain B update_client_with_height(test_a, test_b, client_id_b, height_a)?; // Receive the token on Chain B - let height = submit_ibc_tx(test_b, msg, ALBERT)?; - let (acknowledgement, packet) = match get_event(test_b, height)? { - Some(IbcEvent::WriteAcknowledgement(event)) => { - (event.ack, event.packet) - } - _ => return Err(eyre!("Transaction failed")), - }; + let height = submit_ibc_tx(test_b, msg, ALBERT, ALBERT_KEY, false)?; + let events = get_events(test_b, height)?; + let packet = + get_packet_from_events(&events).ok_or(eyre!("Transaction failed"))?; + let ack = + get_ack_from_events(&events).ok_or(eyre!("Transaction failed"))?; check_ibc_packet_query( test_b, &"write_acknowledgement".parse().unwrap(), @@ -750,31 +672,30 @@ fn transfer_token( // get the proof on Chain B let height_b = query_height(test_b)?; - let proofs = get_ack_proof(test_b, &packet, height_b)?; + let proof_acked_on_b = get_ack_proof(test_b, &packet, height_b)?; let msg = MsgAcknowledgement { packet, - acknowledgement: acknowledgement.into(), - proofs, - signer: Signer::from_str("test_a").expect("invalid signer"), + acknowledgement: ack.try_into().expect("invalid ack"), + proof_acked_on_b, + proof_height_on_b: height_b, + signer: signer(), }; // Update the client state of Chain B on Chain A update_client_with_height(test_b, test_a, client_id_a, height_b)?; // Acknowledge on Chain A - submit_ibc_tx(test_a, msg, ALBERT)?; + submit_ibc_tx(test_a, msg, ALBERT, ALBERT_KEY, false)?; Ok(()) } fn transfer_received_token( - port_channel_id: &PortChannelId, + port_id: &PortId, + channel_id: &ChannelId, test: &Test, ) -> Result<()> { - let xan = find_address(test, NAM)?; + let nam = find_address(test, NAM)?; // token received via the port and channel - let denom = format!( - "{}/{}/{}", - port_channel_id.port_id, port_channel_id.channel_id, xan - ); + let denom = format!("{port_id}/{channel_id}/{nam}"); let ibc_token = ibc_token(denom).to_string(); let rpc = get_actor_rpc(test, &Who::Validator(0)); @@ -811,16 +732,14 @@ fn transfer_back( test_b: &Test, client_id_a: &ClientId, client_id_b: &ClientId, - port_channel_id_b: &PortChannelId, + port_id_b: &PortId, + channel_id_b: &ChannelId, ) -> Result<()> { - let xan = find_address(test_b, NAM)?.to_string(); + let nam = find_address(test_b, NAM)?.to_string(); let receiver = find_address(test_a, ALBERT)?; // Chain A was the source for the sent token - let denom_raw = format!( - "{}/{}/{}", - port_channel_id_b.port_id, port_channel_id_b.channel_id, xan - ); + let denom_raw = format!("{}/{}/{}", port_id_b, channel_id_b, nam); let ibc_token = ibc_token(denom_raw).to_string(); // Send a token from Chain B let height = transfer( @@ -829,45 +748,48 @@ fn transfer_back( &receiver, ibc_token, &Amount::native_whole(50000), - port_channel_id_b, + BERTHA_KEY, + port_id_b, + channel_id_b, None, + false, )?; - let packet = match get_event(test_b, height)? { - Some(IbcEvent::SendPacket(event)) => event.packet, - _ => return Err(eyre!("Transaction failed")), - }; + let events = get_events(test_b, height)?; + let packet = + get_packet_from_events(&events).ok_or(eyre!("Transaction failed"))?; let height_b = query_height(test_b)?; - let proofs = get_commitment_proof(test_b, &packet, height_b)?; + let proof = get_commitment_proof(test_b, &packet, height_b)?; let msg = MsgRecvPacket { packet, - proofs, - signer: Signer::from_str("test_a").expect("invalid signer"), + proof_commitment_on_a: proof, + proof_height_on_a: height_b, + signer: signer(), }; // Update the client state of Chain B on Chain A update_client_with_height(test_b, test_a, client_id_a, height_b)?; // Receive the token on Chain A - let height = submit_ibc_tx(test_a, msg, ALBERT)?; - let (acknowledgement, packet) = match get_event(test_a, height)? { - Some(IbcEvent::WriteAcknowledgement(event)) => { - (event.ack, event.packet) - } - _ => return Err(eyre!("Transaction failed")), - }; + let height = submit_ibc_tx(test_a, msg, ALBERT, ALBERT_KEY, false)?; + let events = get_events(test_a, height)?; + let packet = + get_packet_from_events(&events).ok_or(eyre!("Transaction failed"))?; + let ack = + get_ack_from_events(&events).ok_or(eyre!("Transaction failed"))?; // get the proof on Chain A let height_a = query_height(test_a)?; - let proofs = get_ack_proof(test_a, &packet, height_a)?; + let proof_acked_on_b = get_ack_proof(test_a, &packet, height_a)?; let msg = MsgAcknowledgement { packet, - acknowledgement: acknowledgement.into(), - proofs, - signer: Signer::from_str("test_b").expect("invalid signer"), + acknowledgement: ack.try_into().expect("invalid ack"), + proof_acked_on_b, + proof_height_on_b: height_a, + signer: signer(), }; // Update the client state of Chain A on Chain B update_client_with_height(test_a, test_b, client_id_b, height_a)?; // Acknowledge on Chain B - submit_ibc_tx(test_b, msg, ALBERT)?; + submit_ibc_tx(test_b, msg, ALBERT, ALBERT_KEY, false)?; Ok(()) } @@ -876,7 +798,8 @@ fn transfer_timeout( test_a: &Test, test_b: &Test, client_id_a: &ClientId, - port_channel_id_a: &PortChannelId, + port_id_a: &PortId, + channel_id_a: &ChannelId, ) -> Result<()> { let receiver = find_address(test_b, BERTHA)?; @@ -887,29 +810,33 @@ fn transfer_timeout( &receiver, NAM, &Amount::native_whole(100000), - port_channel_id_a, + ALBERT_KEY, + port_id_a, + channel_id_a, Some(Duration::new(5, 0)), + false, )?; - let packet = match get_event(test_a, height)? { - Some(IbcEvent::SendPacket(event)) => event.packet, - _ => return Err(eyre!("Transaction failed")), - }; + let events = get_events(test_a, height)?; + let packet = + get_packet_from_events(&events).ok_or(eyre!("Transaction failed"))?; // wait for the timeout sleep(5); let height_b = query_height(test_b)?; - let proofs = get_receipt_absence_proof(test_b, &packet, height_b)?; + let proof_unreceived_on_b = + get_receipt_absence_proof(test_b, &packet, height_b)?; let msg = MsgTimeout { - next_sequence_recv: packet.sequence, packet, - proofs, - signer: Signer::from_str("test_a").expect("invalid signer"), + next_seq_recv_on_b: 1.into(), // not used + proof_unreceived_on_b, + proof_height_on_b: height_b, + signer: signer(), }; // Update the client state of Chain B on Chain A update_client_with_height(test_b, test_a, client_id_a, height_b)?; // Timeout on Chain A - submit_ibc_tx(test_a, msg, ALBERT)?; + submit_ibc_tx(test_a, msg, ALBERT, ALBERT_KEY, false)?; Ok(()) } @@ -918,57 +845,45 @@ fn get_commitment_proof( test: &Test, packet: &Packet, target_height: Height, -) -> Result { +) -> Result { // we need proofs at the height of the previous block let query_height = target_height.decrement().unwrap(); let key = commitment_key( - &packet.source_port.as_str().parse().unwrap(), - &packet.source_channel.as_str().parse().unwrap(), - u64::from(packet.sequence).into(), + &packet.port_id_on_a, + &packet.chan_id_on_a, + packet.seq_on_a, ); let (_, tm_proof) = query_value_with_proof(test, &key, Some(query_height))?; - let commitment_proof = convert_proof(tm_proof)?; - - Proofs::new(commitment_proof, None, None, None, target_height) - .map_err(|e| eyre!("Creating proofs failed: error {}", e)) + convert_proof(tm_proof) } fn get_ack_proof( test: &Test, packet: &Packet, target_height: Height, -) -> Result { +) -> Result { // we need proofs at the height of the previous block let query_height = target_height.decrement().unwrap(); - let key = ack_key( - &packet.destination_port.as_str().parse().unwrap(), - &packet.destination_channel.as_str().parse().unwrap(), - u64::from(packet.sequence).into(), - ); + let key = + ack_key(&packet.port_id_on_b, &packet.chan_id_on_b, packet.seq_on_a); let (_, tm_proof) = query_value_with_proof(test, &key, Some(query_height))?; - let ack_proof = convert_proof(tm_proof)?; - - Proofs::new(ack_proof, None, None, None, target_height) - .map_err(|e| eyre!("Creating proofs failed: error {}", e)) + convert_proof(tm_proof) } fn get_receipt_absence_proof( test: &Test, packet: &Packet, target_height: Height, -) -> Result { +) -> Result { // we need proofs at the height of the previous block let query_height = target_height.decrement().unwrap(); let key = receipt_key( - &packet.destination_port.as_str().parse().unwrap(), - &packet.destination_channel.as_str().parse().unwrap(), - u64::from(packet.sequence).into(), + &packet.port_id_on_b, + &packet.chan_id_on_b, + packet.seq_on_a, ); let (_, tm_proof) = query_value_with_proof(test, &key, Some(query_height))?; - let absence_proof = convert_proof(tm_proof)?; - - Proofs::new(absence_proof, None, None, None, target_height) - .map_err(|e| eyre!("Creating proofs failed: error {}", e)) + convert_proof(tm_proof) } fn commitment_prefix() -> CommitmentPrefix { @@ -979,7 +894,9 @@ fn commitment_prefix() -> CommitmentPrefix { fn submit_ibc_tx( test: &Test, message: impl Msg + std::fmt::Debug, + owner: &str, signer: &str, + wait_reveal_pk: bool, ) -> Result { let data_path = test.test_dir.path().join("tx.data"); let data = make_ibc_data(message); @@ -996,7 +913,9 @@ fn submit_ibc_tx( TX_IBC_WASM, "--data-path", &data_path, - "--signer", + "--owner", + owner, + "--signing-keys", signer, "--gas-amount", "0", @@ -1010,6 +929,9 @@ fn submit_ibc_tx( Some(40) )?; client.exp_string("Transaction applied")?; + if wait_reveal_pk { + client.exp_string("Transaction applied")?; + } check_tx_height(test, &mut client) } @@ -1020,23 +942,26 @@ fn transfer( receiver: &Address, token: impl AsRef, amount: &Amount, - port_channel_id: &PortChannelId, + signer: impl AsRef, + port_id: &PortId, + channel_id: &ChannelId, timeout_sec: Option, + wait_reveal_pk: bool, ) -> Result { let rpc = get_actor_rpc(test, &Who::Validator(0)); let receiver = receiver.to_string(); let amount = amount.to_string_native(); - let port_id = port_channel_id.port_id.to_string(); - let channel_id = port_channel_id.channel_id.to_string(); + let channel_id = channel_id.to_string(); + let port_id = port_id.to_string(); let mut tx_args = vec![ "ibc-transfer", "--source", sender.as_ref(), "--receiver", &receiver, - "--signer", - sender.as_ref(), + "--signing-keys", + signer.as_ref(), "--token", token.as_ref(), "--amount", @@ -1057,6 +982,9 @@ fn transfer( let mut client = run!(test, Bin::Client, tx_args, Some(40))?; client.exp_string("Transaction applied")?; + if wait_reveal_pk { + client.exp_string("Transaction applied")?; + } check_tx_height(test, &mut client) } @@ -1127,40 +1055,6 @@ fn query_header(test: &Test, height: Height) -> Result { } } -fn get_event(test: &Test, height: u32) -> Result> { - let rpc = get_actor_rpc(test, &Who::Validator(0)); - let ledger_address = TendermintAddress::from_str(&rpc).unwrap(); - let client = HttpClient::new(ledger_address).unwrap(); - - let response = test - .async_runtime() - .block_on(client.block_results(height)) - .map_err(|e| eyre!("block_results() for an IBC event failed: {}", e))?; - let tx_results = response.txs_results.ok_or_else(|| { - eyre!("No transaction has been executed: height {}", height) - })?; - for result in tx_results { - if result.code.is_err() { - return Err(eyre!( - "The transaction failed: code {:?}, log {}", - result.code, - result.log - )); - } - } - let events = response - .end_block_events - .ok_or_else(|| eyre!("IBC event was not found: height {}", height))?; - for event in &events { - match ibc_event_try_from_abci_event(event) { - Ok(ibc_event) => return Ok(Some(ibc_event)), - Err(_) => continue, - } - } - // No IBC event was found - Ok(None) -} - fn check_ibc_update_query( test: &Test, client_id: &ClientId, @@ -1171,7 +1065,7 @@ fn check_ibc_update_query( let client = HttpClient::new(ledger_address).unwrap(); match test.async_runtime().block_on(RPC.shell().ibc_client_update( &client, - &client_id.as_str().parse().unwrap(), + client_id, &consensus_height, )) { Ok(Some(event)) => { @@ -1194,11 +1088,11 @@ fn check_ibc_packet_query( match test.async_runtime().block_on(RPC.shell().ibc_packet( &client, event_type, - &packet.source_port.as_str().parse().unwrap(), - &packet.source_channel.as_str().parse().unwrap(), - &packet.destination_port.as_str().parse().unwrap(), - &packet.destination_channel.as_str().parse().unwrap(), - &packet.sequence.to_string().parse().unwrap(), + &packet.port_id_on_a, + &packet.chan_id_on_a, + &packet.port_id_on_b, + &packet.chan_id_on_b, + &packet.seq_on_a, )) { Ok(Some(event)) => { println!("Found the packet event: {:?}", event); @@ -1230,8 +1124,19 @@ fn query_value_with_proof( } fn convert_proof(tm_proof: TmProof) -> Result { - let merkle_proof = convert_tm_to_ics_merkle_proof(&tm_proof) - .map_err(|e| eyre!("Proof conversion to MerkleProof failed: {}", e))?; + use namada::ibc_proto::ibc::core::commitment::v1::MerkleProof as RawMerkleProof; + use namada::ibc_proto::ics23::CommitmentProof; + + let mut proofs = Vec::new(); + + for op in &tm_proof.ops { + let mut parsed = CommitmentProof { proof: None }; + prost::Message::merge(&mut parsed, op.data.as_slice()) + .expect("merging CommitmentProof failed"); + proofs.push(parsed); + } + + let merkle_proof = MerkleProof::from(RawMerkleProof { proofs }); CommitmentProofBytes::try_from(merkle_proof).map_err(|e| { eyre!("Proof conversion to CommitmentProofBytes failed: {}", e) }) @@ -1239,7 +1144,8 @@ fn convert_proof(tm_proof: TmProof) -> Result { /// Check balances after IBC transfer fn check_balances( - dest_port_channel_id: &PortChannelId, + dest_port_id: &PortId, + dest_channel_id: &ChannelId, test_a: &Test, test_b: &Test, ) -> Result<()> { @@ -1261,10 +1167,7 @@ fn check_balances( client.assert_success(); // Check the balance on Chain B - let denom = format!( - "{}/{}/{}", - &dest_port_channel_id.port_id, &dest_port_channel_id.channel_id, &token, - ); + let denom = format!("{}/{}/{}", &dest_port_id, &dest_channel_id, &token,); let ibc_token = ibc_token(denom).to_string(); let rpc_b = get_actor_rpc(test_b, &Who::Validator(0)); let query_args = vec![ @@ -1279,15 +1182,13 @@ fn check_balances( /// Check balances after non IBC transfer fn check_balances_after_non_ibc( - port_channel_id: &PortChannelId, + port_id: &PortId, + channel_id: &ChannelId, test: &Test, ) -> Result<()> { // Check the balance on Chain B let token = find_address(test, NAM)?; - let denom = format!( - "{}/{}/{}", - port_channel_id.port_id, port_channel_id.channel_id, token - ); + let denom = format!("{}/{}/{}", port_id, channel_id, token); let ibc_token = ibc_token(denom).to_string(); // Check the source @@ -1314,7 +1215,8 @@ fn check_balances_after_non_ibc( /// Check balances after IBC transfer back fn check_balances_after_back( - dest_port_channel_id: &PortChannelId, + dest_port_id: &PortId, + dest_channel_id: &ChannelId, test_a: &Test, test_b: &Test, ) -> Result<()> { @@ -1336,10 +1238,7 @@ fn check_balances_after_back( client.assert_success(); // Check the balance on Chain B - let denom = format!( - "{}/{}/{}", - &dest_port_channel_id.port_id, &dest_port_channel_id.channel_id, &token, - ); + let denom = format!("{}/{}/{}", dest_port_id, dest_channel_id, &token,); let ibc_token = ibc_token(denom).to_string(); let rpc_b = get_actor_rpc(test_b, &Who::Validator(0)); let query_args = vec![ @@ -1351,3 +1250,146 @@ fn check_balances_after_back( client.assert_success(); Ok(()) } + +fn signer() -> Signer { + "signer".to_string().into() +} + +/// Helper function to make the MsgConnectionOpenTry because it has a private +/// field +fn make_msg_conn_open_try( + client_id: ClientId, + client_state: TmClientState, + counterparty: ConnCounterparty, + conn_proof: CommitmentProofBytes, + client_state_proof: CommitmentProofBytes, + consensus_proof: CommitmentProofBytes, + proofs_height: Height, +) -> MsgConnectionOpenTry { + use namada::ibc_proto::ibc::core::connection::v1::MsgConnectionOpenTry as RawMsgConnectionOpenTry; + + let consensus_height = client_state.latest_height(); + #[allow(deprecated)] + RawMsgConnectionOpenTry { + client_id: client_id.as_str().to_string(), + client_state: Some(client_state.into()), + counterparty: Some(counterparty.into()), + delay_period: 0, + counterparty_versions: vec![ConnVersion::default().into()], + proof_init: conn_proof.into(), + proof_height: Some(proofs_height.into()), + proof_client: client_state_proof.into(), + proof_consensus: consensus_proof.into(), + consensus_height: Some(consensus_height.into()), + signer: "signer".to_string(), + previous_connection_id: ConnectionId::default().to_string(), + } + .try_into() + .expect("invalid message") +} + +fn get_client_id_from_events(events: &Vec) -> Option { + get_attribute_from_events(events, "client_id").map(|v| v.parse().unwrap()) +} + +fn get_connection_id_from_events( + events: &Vec, +) -> Option { + get_attribute_from_events(events, "connection_id") + .map(|v| v.parse().unwrap()) +} + +fn get_channel_id_from_events(events: &Vec) -> Option { + get_attribute_from_events(events, "channel_id").map(|v| v.parse().unwrap()) +} + +fn get_ack_from_events(events: &Vec) -> Option> { + get_attribute_from_events(events, "packet_ack") + .map(|v| Vec::from(v.as_bytes())) +} + +fn get_attribute_from_events( + events: &Vec, + key: &str, +) -> Option { + for event in events { + let attributes = get_attributes_from_event(event); + if let Some(value) = attributes.get(key) { + return Some(value.clone()); + } + } + None +} + +fn get_packet_from_events(events: &Vec) -> Option { + for event in events { + let attributes = get_attributes_from_event(event); + if !attributes.contains_key("packet_src_port") { + continue; + } + let mut packet = Packet::default(); + for (key, val) in attributes { + match key.as_str() { + "packet_src_port" => packet.port_id_on_a = val.parse().unwrap(), + "packet_src_channel" => { + packet.chan_id_on_a = val.parse().unwrap() + } + "packet_dst_port" => packet.port_id_on_b = val.parse().unwrap(), + "packet_dst_channel" => { + packet.chan_id_on_b = val.parse().unwrap() + } + "packet_timeout_height" => { + packet.timeout_height_on_b = match Height::from_str(&val) { + Ok(height) => TimeoutHeight::At(height), + Err(_) => TimeoutHeight::Never, + } + } + "packet_timeout_timestamp" => { + packet.timeout_timestamp_on_b = val.parse().unwrap() + } + "packet_sequence" => { + packet.seq_on_a = u64::from_str(&val).unwrap().into() + } + "packet_data" => packet.data = Vec::from(val.as_bytes()), + _ => {} + } + } + return Some(packet); + } + None +} + +fn get_attributes_from_event(event: &AbciEvent) -> HashMap { + event + .attributes + .iter() + .map(|tag| (tag.key.to_string(), tag.value.to_string())) + .collect() +} + +fn get_events(test: &Test, height: u32) -> Result> { + let rpc = get_actor_rpc(test, &Who::Validator(0)); + let ledger_address = TendermintAddress::from_str(&rpc).unwrap(); + let client = HttpClient::new(ledger_address).unwrap(); + + let response = test + .async_runtime() + .block_on(client.block_results(height)) + .map_err(|e| eyre!("block_results() for an IBC event failed: {}", e))?; + let tx_results = response.txs_results.ok_or_else(|| { + eyre!("No transaction has been executed: height {}", height) + })?; + for result in tx_results { + if result.code.is_err() { + return Err(eyre!( + "The transaction failed: code {:?}, log {}", + result.code, + result.log + )); + } + } + + response + .end_block_events + .ok_or_else(|| eyre!("IBC event was not found: height {}", height)) +} diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index b9e000b9a71..51bf2a4b34f 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -20,7 +20,6 @@ use borsh::BorshSerialize; use color_eyre::eyre::Result; use data_encoding::HEXLOWER; use namada::types::address::Address; -use namada::types::governance::ProposalType; use namada::types::storage::Epoch; use namada::types::token; use namada_apps::config::ethereum_bridge; @@ -29,18 +28,21 @@ use namada_apps::config::genesis::genesis_config::{ }; use namada_apps::config::utils::convert_tm_addr_to_socket_addr; use namada_apps::facade::tendermint_config::net::Address as TendermintAddress; +use namada_core::ledger::governance::cli::onchain::{PgfAction, PgfSteward}; use namada_test_utils::TestWasms; +use namada_vp_prelude::testnet_pow; use serde_json::json; use setup::constants::*; use setup::Test; use super::helpers::{ - get_height, wait_for_block_height, wait_for_wasm_pre_compile, + epochs_per_year_from_min_duration, get_height, wait_for_block_height, + wait_for_wasm_pre_compile, }; use super::setup::{get_all_wasms_hashes, set_ethereum_bridge_mode, NamadaCmd}; use crate::e2e::helpers::{ epoch_sleep, find_address, find_bonded_stake, get_actor_rpc, get_epoch, - parse_reached_epoch, + is_debug_mode, parse_reached_epoch, }; use crate::e2e::setup::{self, default_port_offset, sleep, Bin, Who}; use crate::{run, run_as}; @@ -170,6 +172,8 @@ fn test_node_connectivity_and_consensus() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &validator_one_rpc, ]; @@ -406,7 +410,22 @@ fn stop_ledger_at_height() -> Result<()> { /// 8. Query the raw bytes of a storage key #[test] fn ledger_txs_and_queries() -> Result<()> { - let test = setup::network(|genesis| genesis, None)?; + let test = setup::network( + |genesis| { + #[cfg(not(feature = "mainnet"))] + { + GenesisConfig { + faucet_pow_difficulty: testnet_pow::Difficulty::try_new(1), + ..genesis + } + } + #[cfg(feature = "mainnet")] + { + genesis + } + }, + None, + )?; set_ethereum_bridge_mode( &test, @@ -441,6 +460,9 @@ fn ledger_txs_and_queries() -> Result<()> { let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); + let multisig_account = + format!("{},{},{}", BERTHA_KEY, ALBERT_KEY, CHRISTEL_KEY); + let txs_args = vec![ // 2. Submit a token transfer tx (from an established account) vec![ @@ -459,6 +481,8 @@ fn ledger_txs_and_queries() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &validator_one_rpc, ], @@ -479,6 +503,8 @@ fn ledger_txs_and_queries() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + DAEWON, "--node", &validator_one_rpc, ], @@ -505,46 +531,50 @@ fn ledger_txs_and_queries() -> Result<()> { // 3. Submit a transaction to update an account's validity // predicate vec![ - "update", - "--address", - BERTHA, - "--code-path", - VP_USER_WASM, - "--gas-amount", - "0", - "--gas-limit", - "0", - "--gas-token", - NAM, + "update-account", + "--address", + BERTHA, + "--code-path", + VP_USER_WASM, + "--gas-amount", + "0", + "--gas-limit", + "0", + "--gas-token", + NAM, + "--signing-keys", + BERTHA_KEY, "--node", &validator_one_rpc, ], // 4. Submit a custom tx vec![ "tx", - "--signer", - BERTHA, "--code-path", TX_TRANSFER_WASM, "--data-path", &tx_data_path, + "--owner", + BERTHA, "--gas-amount", "0", "--gas-limit", "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &validator_one_rpc ], // 5. Submit a tx to initialize a new account vec![ "init-account", - "--source", - BERTHA, - "--public-key", + "--public-keys", // Value obtained from `namada::types::key::ed25519::tests::gen_keypair` "001be519a321e29020fa3cbfbfd01bd5e92db134305609270b71dace25b5a21168", + "--threshold", + "1", "--code-path", VP_USER_WASM, "--alias", @@ -555,11 +585,35 @@ fn ledger_txs_and_queries() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &validator_one_rpc, ], - // 6. Submit a tx to withdraw from faucet account (requires PoW challenge - // solution) + // 5. Submit a tx to initialize a new multisig account + vec![ + "init-account", + "--public-keys", + &multisig_account, + "--threshold", + "2", + "--code-path", + VP_USER_WASM, + "--alias", + "Test-Account-2", + "--gas-amount", + "0", + "--gas-limit", + "0", + "--gas-token", + NAM, + "--signing-keys", + BERTHA_KEY, + "--node", + &validator_one_rpc, + ], + // 6. Submit a tx to withdraw from faucet account (requires PoW challenge + // solution) vec![ "transfer", "--source", @@ -571,8 +625,8 @@ fn ledger_txs_and_queries() -> Result<()> { "--amount", "10.1", // Faucet withdrawal requires an explicit signer - "--signer", - ALBERT, + "--signing-keys", + ALBERT_KEY, "--node", &validator_one_rpc, ], @@ -612,6 +666,8 @@ fn ledger_txs_and_queries() -> Result<()> { ], // expect a decimal vec![r"nam: \d+(\.\d+)?"], + // check also as validator node + true, ), // Unspecified token expect all tokens from wallet derived from genesis ( @@ -625,9 +681,25 @@ fn ledger_txs_and_queries() -> Result<()> { r"kartoffel: \d+(\.\d+)?", r"schnitzel: \d+(\.\d+)?", ], + // check also as validator node + true, + ), + ( + vec![ + "query-account", + "--owner", + "Test-Account-2", + "--node", + &validator_one_rpc, + ], + vec!["Threshold: 2"], + // check also as validator node + false, ), ]; - for (query_args, expected) in &query_args_and_expected_response { + for (query_args, expected, check_as_validator) in + &query_args_and_expected_response + { // Run as a non-validator let mut client = run!(test, Bin::Client, query_args, Some(40))?; for pattern in expected { @@ -635,6 +707,10 @@ fn ledger_txs_and_queries() -> Result<()> { } client.assert_success(); + if !check_as_validator { + continue; + } + // Run as a validator let mut client = run_as!( test, @@ -707,9 +783,7 @@ fn invalid_transactions() -> Result<()> { let tx_args = vec![ "transfer", "--source", - DAEWON, - "--signing-key", - ALBERT_KEY, + BERTHA, "--target", ALBERT, "--token", @@ -722,8 +796,11 @@ fn invalid_transactions() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + ALBERT_KEY, "--node", &validator_one_rpc, + "--force", ]; let mut client = run!(test, Bin::Client, tx_args, Some(40))?; @@ -756,13 +833,16 @@ fn invalid_transactions() -> Result<()> { ledger.exp_string("Committed block hash")?; let _bg_ledger = ledger.background(); + // we need to wait for the rpc endpoint to start + sleep(10); + // 5. Submit an invalid transactions (invalid token address) let daewon_lower = DAEWON.to_lowercase(); let tx_args = vec![ "transfer", "--source", DAEWON, - "--signing-key", + "--signing-keys", &daewon_lower, "--target", ALBERT, @@ -859,6 +939,8 @@ fn pos_bonds() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + "validator-0-account-key", "--node", &validator_one_rpc, ]; @@ -883,6 +965,8 @@ fn pos_bonds() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &validator_one_rpc, ]; @@ -904,6 +988,8 @@ fn pos_bonds() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + "validator-0-account-key", "--node", &validator_one_rpc, ]; @@ -928,6 +1014,8 @@ fn pos_bonds() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &validator_one_rpc, ]; @@ -947,7 +1035,7 @@ fn pos_bonds() -> Result<()> { epoch, delegation_withdrawable_epoch ); let start = Instant::now(); - let loop_timeout = Duration::new(60, 0); + let loop_timeout = Duration::new(120, 0); loop { if Instant::now().duration_since(start) > loop_timeout { panic!( @@ -972,6 +1060,8 @@ fn pos_bonds() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + "validator-0-account-key", "--node", &validator_one_rpc, ]; @@ -994,6 +1084,8 @@ fn pos_bonds() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &validator_one_rpc, ]; @@ -1070,6 +1162,8 @@ fn pos_rewards() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--ledger-address", &validator_zero_rpc, ]; @@ -1106,6 +1200,8 @@ fn pos_rewards() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + "validator-1-account-key", "--ledger-address", &validator_one_rpc, ]; @@ -1128,6 +1224,8 @@ fn pos_rewards() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + "validator-2-account-key", "--ledger-address", &validator_two_rpc, ]; @@ -1216,6 +1314,8 @@ fn test_bond_queries() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--ledger-address", &validator_one_rpc, ]; @@ -1252,6 +1352,8 @@ fn test_bond_queries() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--ledger-address", &validator_one_rpc, ]; @@ -1275,6 +1377,8 @@ fn test_bond_queries() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--ledger-address", &validator_one_rpc, ]; @@ -1368,14 +1472,13 @@ fn pos_init_validator() -> Result<()> { // 2. Initialize a new validator account with the non-validator node let new_validator = "new-validator"; - let new_validator_key = format!("{}-key", new_validator); + let _new_validator_key = format!("{}-key", new_validator); let tx_args = vec![ "init-validator", "--alias", new_validator, - "--source", - BERTHA, - "--unsafe-dont-encrypt", + "--account-keys", + "bertha-key", "--gas-amount", "0", "--gas-limit", @@ -1386,8 +1489,11 @@ fn pos_init_validator() -> Result<()> { "0.05", "--max-commission-rate-change", "0.01", + "--signing-keys", + "bertha-key", "--node", &non_validator_rpc, + "--unsafe-dont-encrypt", ]; let mut client = run!(test, Bin::Client, tx_args, Some(40))?; client.exp_string("Transaction is valid.")?; @@ -1400,7 +1506,7 @@ fn pos_init_validator() -> Result<()> { "--source", BERTHA, "--target", - &new_validator_key, + new_validator, "--token", NAM, "--amount", @@ -1411,6 +1517,8 @@ fn pos_init_validator() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &non_validator_rpc, ]; @@ -1434,6 +1542,8 @@ fn pos_init_validator() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &non_validator_rpc, ]; @@ -1459,6 +1569,8 @@ fn pos_init_validator() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", &non_validator_rpc, ]; @@ -1491,6 +1603,13 @@ fn pos_init_validator() -> Result<()> { non_validator.interrupt()?; non_validator.exp_eof()?; + // it takes a bit before the node is shutdown. We dont want flasky test. + if is_debug_mode() { + sleep(10); + } else { + sleep(5); + } + let loc = format!("{}:{}", std::file!(), std::line!()); let validator_1_base_dir = test.get_base_dir(&Who::NonValidator); let mut validator_1 = setup::run_cmd( @@ -1582,6 +1701,8 @@ fn ledger_many_txs_in_a_block() -> Result<()> { "0", "--gas-token", NAM, + "--signing-keys", + BERTHA_KEY, "--node", ]); @@ -1702,12 +1823,8 @@ fn proposal_submission() -> Result<()> { let valid_proposal_json_path = prepare_proposal_data( &test, albert, - ProposalType::Default(Some( - TestWasms::TxProposalCode - .path() - .to_string_lossy() - .to_string(), - )), + TestWasms::TxProposalCode.read_bytes(), + 12, ); let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); @@ -1737,7 +1854,7 @@ fn proposal_submission() -> Result<()> { ]; let mut client = run!(test, Bin::Client, proposal_query_args, Some(40))?; - client.exp_string("Proposal: 0")?; + client.exp_string("Proposal Id: 0")?; client.assert_success(); // 4. Query token balance proposal author (submitted funds) @@ -1773,66 +1890,28 @@ fn proposal_submission() -> Result<()> { // 6. Submit an invalid proposal // proposal is invalid due to voting_end_epoch - voting_start_epoch < 3 let albert = find_address(&test, ALBERT)?; - let invalid_proposal_json = json!( - { - "content": { - "title": "TheTitle", - "authors": "test@test.com", - "discussions-to": "www.github.com/anoma/aip/1", - "created": "2022-03-10T08:54:37Z", - "license": "MIT", - "abstract": "Ut convallis eleifend orci vel venenatis. Duis - vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit - ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum - fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra - varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida - eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. - Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum - bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue - viverra enim.", - "motivation": "Ut convallis eleifend orci vel venenatis. Duis - vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit - ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum - fermentum. Morbi aliquet purus at sollicitudin ultrices.", - "details": "Ut convallis eleifend orci vel venenatis. Duis - vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit - ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum - fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra - varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida - eros.", "requires": "2" - }, - "author": albert, - "voting_start_epoch": 9999_u64, - "voting_end_epoch": 10000_u64, - "grace_epoch": 10009_u64, - "type": { - "Default":null - } - } - ); - let invalid_proposal_json_path = - test.test_dir.path().join("invalid_proposal.json"); - generate_proposal_json_file( - invalid_proposal_json_path.as_path(), - &invalid_proposal_json, + let invalid_proposal_json = prepare_proposal_data( + &test, + albert, + TestWasms::TxProposalCode.read_bytes(), + 1, ); let submit_proposal_args = vec![ "init-proposal", "--data-path", - invalid_proposal_json_path.to_str().unwrap(), + invalid_proposal_json.to_str().unwrap(), "--node", &validator_one_rpc, ]; let mut client = run!(test, Bin::Client, submit_proposal_args, Some(40))?; - client.exp_string( - "Invalid proposal end epoch: difference between proposal start and \ - end epoch must be at least 3 and at max 27 and end epoch must be a \ - multiple of 3", + client.exp_regex( + "Proposal data are invalid: Invalid proposal start epoch: 1 must be \ + greater than current epoch .* and a multiple of 3", )?; client.assert_failure(); - // 7. Check invalid proposal was not accepted + // 7. Check invalid proposal was not submitted let proposal_query_args = vec![ "query-proposal", "--proposal-id", @@ -1842,7 +1921,7 @@ fn proposal_submission() -> Result<()> { ]; let mut client = run!(test, Bin::Client, proposal_query_args, Some(40))?; - client.exp_string("No valid proposal was found with id 1")?; + client.exp_string("No proposal found with id: 1")?; client.assert_success(); // 8. Query token balance (funds shall not be submitted) @@ -1873,7 +1952,7 @@ fn proposal_submission() -> Result<()> { "0", "--vote", "yay", - "--signer", + "--address", "validator-0", "--node", &validator_one_rpc, @@ -1895,7 +1974,7 @@ fn proposal_submission() -> Result<()> { "0", "--vote", "nay", - "--signer", + "--address", BERTHA, "--node", &validator_one_rpc, @@ -1913,7 +1992,7 @@ fn proposal_submission() -> Result<()> { "0", "--vote", "yay", - "--signer", + "--address", ALBERT, "--node", &validator_one_rpc, @@ -1941,7 +2020,10 @@ fn proposal_submission() -> Result<()> { ]; let mut client = run!(test, Bin::Client, query_proposal, Some(15))?; - client.exp_string("Result: passed")?; + client.exp_string("Proposal Id: 0")?; + client.exp_string( + "passed with 200900.000000 yay votes and 0.000000 nay votes (0.%)", + )?; client.assert_success(); // 12. Wait proposal grace and check proposal author funds @@ -1992,228 +2074,6 @@ fn proposal_submission() -> Result<()> { Ok(()) } -/// Test submission and vote of an ETH proposal. -/// -/// 1 - Submit proposal -/// 2 - Vote with delegator and check failure -/// 3 - Vote with validator and check success -/// 4 - Check that proposal passed and funds -#[test] -fn eth_governance_proposal() -> Result<()> { - let test = setup::network( - |genesis| { - let parameters = ParametersConfig { - epochs_per_year: epochs_per_year_from_min_duration(1), - max_proposal_bytes: Default::default(), - min_num_of_blocks: 1, - max_expected_time_per_block: 1, - ..genesis.parameters - }; - - GenesisConfig { - parameters, - ..genesis - } - }, - None, - )?; - - let namadac_help = vec!["--help"]; - - let mut client = run!(test, Bin::Client, namadac_help, Some(40))?; - client.exp_string("Namada client command line interface.")?; - client.assert_success(); - - // Run the ledger node - let _bg_ledger = - start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? - .background(); - - let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); - - // Delegate some token - let tx_args = vec![ - "bond", - "--validator", - "validator-0", - "--source", - BERTHA, - "--amount", - "900", - "--gas-amount", - "0", - "--gas-limit", - "0", - "--gas-token", - NAM, - "--ledger-address", - &validator_one_rpc, - ]; - client = run!(test, Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - - // 1 - Submit proposal - let albert = find_address(&test, ALBERT)?; - let valid_proposal_json_path = - prepare_proposal_data(&test, albert, ProposalType::ETHBridge); - let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); - - let submit_proposal_args = vec![ - "init-proposal", - "--data-path", - valid_proposal_json_path.to_str().unwrap(), - "--ledger-address", - &validator_one_rpc, - ]; - client = run!(test, Bin::Client, submit_proposal_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - - // Query the proposal - let proposal_query_args = vec![ - "query-proposal", - "--proposal-id", - "0", - "--ledger-address", - &validator_one_rpc, - ]; - - client = run!(test, Bin::Client, proposal_query_args, Some(40))?; - client.exp_string("Proposal: 0")?; - client.assert_success(); - - // Query token balance proposal author (submitted funds) - let query_balance_args = vec![ - "balance", - "--owner", - ALBERT, - "--token", - NAM, - "--ledger-address", - &validator_one_rpc, - ]; - - client = run!(test, Bin::Client, query_balance_args, Some(40))?; - client.exp_string("nam: 999500")?; - client.assert_success(); - - // Query token balance governance - let query_balance_args = vec![ - "balance", - "--owner", - GOVERNANCE_ADDRESS, - "--token", - NAM, - "--ledger-address", - &validator_one_rpc, - ]; - - client = run!(test, Bin::Client, query_balance_args, Some(40))?; - client.exp_string("nam: 500")?; - client.assert_success(); - - // 2 - Vote with delegator and check failure - let mut epoch = get_epoch(&test, &validator_one_rpc).unwrap(); - while epoch.0 <= 13 { - sleep(1); - epoch = get_epoch(&test, &validator_one_rpc).unwrap(); - } - - use namada::types::key::{self, secp256k1, SigScheme}; - use rand::prelude::ThreadRng; - use rand::thread_rng; - - // Generate a signing key to sign the eth message to sign the eth message to - // sign the eth message - let mut rng: ThreadRng = thread_rng(); - let node_sk = secp256k1::SigScheme::generate(&mut rng); - let signing_key = key::common::SecretKey::Secp256k1(node_sk); - let msg = "fd34672ab5"; - let vote_arg = format!("{} {}", signing_key, msg); - let submit_proposal_vote_delagator = vec![ - "vote-proposal", - "--proposal-id", - "0", - "--vote", - "yay", - "--eth", - &vote_arg, - "--signer", - BERTHA, - "--ledger-address", - &validator_one_rpc, - ]; - - client = run!(test, Bin::Client, submit_proposal_vote_delagator, Some(40))?; - client.exp_string("Transaction is invalid.")?; - client.assert_success(); - - // 3 - Send a yay vote from a validator - let vote_arg = format!("{} {}", signing_key, msg); - - let submit_proposal_vote = vec![ - "vote-proposal", - "--proposal-id", - "0", - "--vote", - "yay", - "--eth", - &vote_arg, - "--signer", - "validator-0", - "--ledger-address", - &validator_one_rpc, - ]; - - client = run_as!( - test, - Who::Validator(0), - Bin::Client, - submit_proposal_vote, - Some(15) - )?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - - // 4 - Wait proposals grace and check proposal author funds - while epoch.0 < 31 { - sleep(1); - epoch = get_epoch(&test, &validator_one_rpc).unwrap(); - } - - let query_balance_args = vec![ - "balance", - "--owner", - ALBERT, - "--token", - NAM, - "--ledger-address", - &validator_one_rpc, - ]; - - client = run!(test, Bin::Client, query_balance_args, Some(30))?; - client.exp_string("nam: 1000000")?; - client.assert_success(); - - // Check if governance funds are 0 - let query_balance_args = vec![ - "balance", - "--owner", - GOVERNANCE_ADDRESS, - "--token", - NAM, - "--ledger-address", - &validator_one_rpc, - ]; - - client = run!(test, Bin::Client, query_balance_args, Some(30))?; - client.exp_string("nam: 0")?; - client.assert_success(); - - Ok(()) -} - /// Test submission and vote of a PGF proposal /// /// 1 - Sumbit two proposals @@ -2287,12 +2147,18 @@ fn pgf_governance_proposal() -> Result<()> { // 1 - Submit proposal let albert = find_address(&test, ALBERT)?; + let pgf_stewards = PgfSteward { + action: PgfAction::Add, + address: albert.clone(), + }; + let valid_proposal_json_path = - prepare_proposal_data(&test, albert.clone(), ProposalType::PGFCouncil); + prepare_proposal_data(&test, albert, vec![pgf_stewards], 12); let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); let submit_proposal_args = vec![ "init-proposal", + "--pgf-stewards", "--data-path", valid_proposal_json_path.to_str().unwrap(), "--ledger-address", @@ -2303,22 +2169,6 @@ fn pgf_governance_proposal() -> Result<()> { client.exp_string("Transaction is valid.")?; client.assert_success(); - // Sumbit another proposal - let valid_proposal_json_path = - prepare_proposal_data(&test, albert, ProposalType::PGFCouncil); - let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); - - let submit_proposal_args = vec![ - "init-proposal", - "--data-path", - valid_proposal_json_path.to_str().unwrap(), - "--ledger-address", - &validator_one_rpc, - ]; - client = run!(test, Bin::Client, submit_proposal_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - // 2 - Query the proposal let proposal_query_args = vec![ "query-proposal", @@ -2329,19 +2179,7 @@ fn pgf_governance_proposal() -> Result<()> { ]; client = run!(test, Bin::Client, proposal_query_args, Some(40))?; - client.exp_string("Proposal: 0")?; - client.assert_success(); - - let proposal_query_args = vec![ - "query-proposal", - "--proposal-id", - "1", - "--ledger-address", - &validator_one_rpc, - ]; - - client = run!(test, Bin::Client, proposal_query_args, Some(40))?; - client.exp_string("Proposal: 1")?; + client.exp_string("Proposal Id: 0")?; client.assert_success(); // Query token balance proposal author (submitted funds) @@ -2356,7 +2194,7 @@ fn pgf_governance_proposal() -> Result<()> { ]; client = run!(test, Bin::Client, query_balance_args, Some(40))?; - client.exp_string("nam: 999000")?; + client.exp_string("nam: 999500")?; client.assert_success(); // Query token balance governance @@ -2371,7 +2209,7 @@ fn pgf_governance_proposal() -> Result<()> { ]; client = run!(test, Bin::Client, query_balance_args, Some(40))?; - client.exp_string("nam: 1000")?; + client.exp_string("nam: 500")?; client.assert_success(); // 3 - Send a yay vote from a validator @@ -2382,17 +2220,13 @@ fn pgf_governance_proposal() -> Result<()> { } let albert_address = find_address(&test, ALBERT)?; - let arg_vote = format!("{} 1000", albert_address); - let submit_proposal_vote = vec![ "vote-proposal", "--proposal-id", "0", "--vote", "yay", - "--pgf", - &arg_vote, - "--signer", + "--address", "validator-0", "--ledger-address", &validator_one_rpc, @@ -2410,16 +2244,13 @@ fn pgf_governance_proposal() -> Result<()> { client.assert_success(); // Send different yay vote from delegator to check majority on 1/3 - let different_vote = format!("{} 900", albert_address); let submit_proposal_vote_delagator = vec![ "vote-proposal", "--proposal-id", "0", "--vote", "yay", - "--pgf", - &different_vote, - "--signer", + "--address", BERTHA, "--ledger-address", &validator_one_rpc, @@ -2431,29 +2262,6 @@ fn pgf_governance_proposal() -> Result<()> { client.exp_string("Transaction is valid.")?; client.assert_success(); - // Send vote to the second proposal from delegator - let submit_proposal_vote_delagator = vec![ - "vote-proposal", - "--proposal-id", - "1", - "--vote", - "yay", - "--pgf", - &different_vote, - "--signer", - BERTHA, - "--ledger-address", - &validator_one_rpc, - ]; - - // this is valid because the client filter ALBERT delegation and there are - // none - let mut client = - run!(test, Bin::Client, submit_proposal_vote_delagator, Some(15))?; - client.exp_string("Transaction applied with result:")?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - // 4 - Query the proposal and check the result is the one voted by the // validator (majority) epoch = get_epoch(&test, &validator_one_rpc).unwrap(); @@ -2471,23 +2279,7 @@ fn pgf_governance_proposal() -> Result<()> { ]; client = run!(test, Bin::Client, query_proposal, Some(15))?; - client.exp_string(&format!( - "Result: passed with PGF council address: {}, spending cap: 0.001", - albert_address - ))?; - client.assert_success(); - - // Query the second proposal and check the it didn't pass - let query_proposal = vec![ - "query-proposal-result", - "--proposal-id", - "1", - "--ledger-address", - &validator_one_rpc, - ]; - - client = run!(test, Bin::Client, query_proposal, Some(15))?; - client.exp_string("Result: rejected")?; + client.exp_string("passed")?; client.assert_success(); // 12. Wait proposals grace and check proposal author funds @@ -2507,7 +2299,7 @@ fn pgf_governance_proposal() -> Result<()> { ]; client = run!(test, Bin::Client, query_balance_args, Some(30))?; - client.exp_string("nam: 999500")?; + client.exp_string("nam: 1000000")?; client.assert_success(); // Check if governance funds are 0 @@ -2525,6 +2317,15 @@ fn pgf_governance_proposal() -> Result<()> { client.exp_string("nam: 0")?; client.assert_success(); + // 14. Query pgf stewards + let query_pgf = vec!["query-pgf", "--node", &validator_one_rpc]; + + let mut client = run!(test, Bin::Client, query_pgf, Some(30))?; + client.exp_string("Pgf stewards:")?; + client.exp_string(&format!("- {}", albert_address))?; + client.exp_string("Pgf fundings: no fundings are currently set.")?; + client.assert_success(); + Ok(()) } @@ -2602,7 +2403,7 @@ fn proposal_offline() -> Result<()> { client.exp_string("Transaction is valid.")?; client.assert_success(); - // 2. Create an offline + // 2. Create an offline proposal let albert = find_address(&test, ALBERT)?; let valid_proposal_json = json!( { @@ -2618,12 +2419,7 @@ fn proposal_offline() -> Result<()> { "requires": "2" }, "author": albert, - "voting_start_epoch": 3_u64, - "voting_end_epoch": 9_u64, - "grace_epoch": 18_u64, - "type": { - "Default": null - } + "tally_epoch": 3_u64, } ); let valid_proposal_json_path = @@ -2633,6 +2429,12 @@ fn proposal_offline() -> Result<()> { &valid_proposal_json, ); + let mut epoch = get_epoch(&test, &validator_one_rpc).unwrap(); + while epoch.0 <= 3 { + sleep(1); + epoch = get_epoch(&test, &validator_one_rpc).unwrap(); + } + let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); let offline_proposal_args = vec![ @@ -2640,44 +2442,48 @@ fn proposal_offline() -> Result<()> { "--data-path", valid_proposal_json_path.to_str().unwrap(), "--offline", + "--signing-keys", + ALBERT_KEY, + "--output-folder-path", + test.test_dir.path().to_str().unwrap(), "--node", &validator_one_rpc, ]; let mut client = run!(test, Bin::Client, offline_proposal_args, Some(15))?; - client.exp_string("Proposal created: ")?; + let (_, matched) = client.exp_regex("Proposal serialized to: .*")?; client.assert_success(); - // 3. Generate an offline yay vote - let mut epoch = get_epoch(&test, &validator_one_rpc).unwrap(); - while epoch.0 <= 2 { - sleep(1); - epoch = get_epoch(&test, &validator_one_rpc).unwrap(); - } - - let proposal_path = test.test_dir.path().join("proposal"); + let proposal_path = matched + .split(':') + .collect::>() + .get(1) + .unwrap() + .trim() + .to_string(); + // 3. Generate an offline yay vote let submit_proposal_vote = vec![ "vote-proposal", "--data-path", - proposal_path.to_str().unwrap(), + &proposal_path, "--vote", "yay", - "--signer", + "--address", ALBERT, "--offline", + "--signing-keys", + ALBERT_KEY, + "--output-folder-path", + test.test_dir.path().to_str().unwrap(), "--node", &validator_one_rpc, ]; let mut client = run!(test, Bin::Client, submit_proposal_vote, Some(15))?; - client.exp_string("Proposal vote created: ")?; + client.exp_string("Proposal vote serialized to: ")?; client.assert_success(); - let expected_file_name = format!("proposal-vote-{}", albert); - let expected_path_vote = test.test_dir.path().join(expected_file_name); - assert!(expected_path_vote.exists()); - // 4. Compute offline tally let tally_offline = vec![ "query-proposal-result", @@ -2689,7 +2495,8 @@ fn proposal_offline() -> Result<()> { ]; let mut client = run!(test, Bin::Client, tally_offline, Some(15))?; - client.exp_string("Result: rejected")?; + client.exp_string("Parsed 1 votes")?; + client.exp_string("rejected with 900.000000 yay votes")?; client.assert_success(); Ok(()) @@ -3472,6 +3279,8 @@ fn implicit_account_reveal_pk() -> Result<()> { NAM, "--amount", "10.1", + "--signing-keys", + source, "--node", &validator_0_rpc, ] @@ -3489,6 +3298,8 @@ fn implicit_account_reveal_pk() -> Result<()> { source, "--amount", "10.1", + "--signing-keys", + source, "--node", &validator_0_rpc, ] @@ -3499,16 +3310,19 @@ fn implicit_account_reveal_pk() -> Result<()> { // Submit proposal Box::new(|source| { // Gen data for proposal tx - let source = find_address(&test, source).unwrap(); + let author = find_address(&test, source).unwrap(); let valid_proposal_json_path = prepare_proposal_data( &test, - source, - ProposalType::Default(None), + author, + TestWasms::TxProposalCode.read_bytes(), + 12, ); vec![ "init-proposal", "--data-path", valid_proposal_json_path.to_str().unwrap(), + "--signing-keys", + source, "--node", &validator_0_rpc, ] @@ -3544,6 +3358,8 @@ fn implicit_account_reveal_pk() -> Result<()> { NAM, "--amount", "1000", + "--signing-keys", + BERTHA_KEY, "--node", &validator_0_rpc, ]; @@ -3617,10 +3433,11 @@ fn test_epoch_sleep() -> Result<()> { fn prepare_proposal_data( test: &setup::Test, source: Address, - proposal_type: ProposalType, + data: impl serde::Serialize, + start_epoch: u64, ) -> PathBuf { - let valid_proposal_json = json!( - { + let valid_proposal_json = json!({ + "proposal": { "content": { "title": "TheTitle", "authors": "test@test.com", @@ -3633,12 +3450,13 @@ fn prepare_proposal_data( "requires": "2" }, "author": source, - "voting_start_epoch": 12_u64, + "voting_start_epoch": start_epoch, "voting_end_epoch": 24_u64, "grace_epoch": 30_u64, - "type": proposal_type - } - ); + }, + "data": data + }); + let valid_proposal_json_path = test.test_dir.path().join("valid_proposal.json"); generate_proposal_json_file( @@ -3647,9 +3465,3 @@ fn prepare_proposal_data( ); valid_proposal_json_path } - -/// Convert epoch `min_duration` in seconds to `epochs_per_year` genesis -/// parameter. -fn epochs_per_year_from_min_duration(min_duration: u64) -> u64 { - 60 * 60 * 24 * 365 / min_duration -} diff --git a/tests/src/e2e/multitoken_tests.rs b/tests/src/e2e/multitoken_tests.rs new file mode 100644 index 00000000000..5d713b2aedd --- /dev/null +++ b/tests/src/e2e/multitoken_tests.rs @@ -0,0 +1,372 @@ +//! Tests for multitoken functionality +use color_eyre::eyre::Result; +use namada_core::types::token; + +use super::helpers::get_actor_rpc; +use super::setup::constants::{ALBERT, BERTHA}; +use super::setup::{self, Who}; +use crate::e2e; +use crate::e2e::setup::constants::{ALBERT_KEY, BERTHA_KEY, CHRISTEL_KEY}; + +mod helpers; + +#[test] +fn test_multitoken_transfer_implicit_to_implicit() -> Result<()> { + let (test, _ledger) = e2e::helpers::setup_single_node_test()?; + + let rpc_addr = get_actor_rpc(&test, &Who::Validator(0)); + let multitoken_alias = helpers::init_multitoken_vp(&test, &rpc_addr)?; + + // establish a multitoken VP with the following balances + // - #atest5blah/tokens/red/balance/$albert_established = 100 + // - #atest5blah/tokens/red/balance/$bertha = 0 + + let multitoken_vp_addr = + e2e::helpers::find_address(&test, &multitoken_alias)?; + println!("Fake multitoken VP established at {}", multitoken_vp_addr); + + let albert_addr = e2e::helpers::find_address(&test, ALBERT)?; + let albert_starting_red_balance = token::Amount::native_whole(100_000_000); + helpers::mint_red_tokens( + &test, + &rpc_addr, + &multitoken_vp_addr, + &albert_addr, + &albert_starting_red_balance, + )?; + + let transfer_amount = token::Amount::native_whole(10_000_000); + + // make a transfer from Albert to Bertha, signed by Christel - this should + // be rejected + let mut unauthorized_transfer = helpers::attempt_red_tokens_transfer( + &test, + &rpc_addr, + &multitoken_alias, + ALBERT, + BERTHA, + CHRISTEL_KEY, + &transfer_amount, + )?; + unauthorized_transfer.exp_string("Transaction applied with result")?; + unauthorized_transfer.exp_string("Transaction is invalid")?; + unauthorized_transfer.exp_string(&format!("Rejected: {albert_addr}"))?; + unauthorized_transfer.assert_success(); + + let albert_balance = helpers::fetch_red_token_balance( + &test, + &rpc_addr, + &multitoken_alias, + ALBERT, + )?; + assert_eq!(albert_balance, albert_starting_red_balance); + + // make a transfer from Albert to Bertha, signed by Albert - this should + // be accepted + let mut authorized_transfer = helpers::attempt_red_tokens_transfer( + &test, + &rpc_addr, + &multitoken_alias, + ALBERT, + BERTHA, + ALBERT_KEY, + &token::Amount::native_whole(10_000_000), + )?; + authorized_transfer.exp_string("Transaction applied with result")?; + authorized_transfer.exp_string("Transaction is valid")?; + authorized_transfer.assert_success(); + + let albert_balance = helpers::fetch_red_token_balance( + &test, + &rpc_addr, + &multitoken_alias, + ALBERT, + )?; + assert_eq!( + albert_balance, + albert_starting_red_balance - transfer_amount + ); + Ok(()) +} + +#[test] +fn test_multitoken_transfer_established_to_implicit() -> Result<()> { + let (test, _ledger) = e2e::helpers::setup_single_node_test()?; + + let rpc_addr = get_actor_rpc(&test, &Who::Validator(0)); + let multitoken_alias = helpers::init_multitoken_vp(&test, &rpc_addr)?; + + let multitoken_vp_addr = + e2e::helpers::find_address(&test, &multitoken_alias)?; + println!("Fake multitoken VP established at {}", multitoken_vp_addr); + + // create an established account that Albert controls + let established_alias = "established"; + e2e::helpers::init_established_account( + &test, + &rpc_addr, + ALBERT, + ALBERT_KEY, + established_alias, + )?; + + let established_starting_red_balance = + token::Amount::native_whole(100_000_000); + // mint some red tokens for the established account + let established_addr = + e2e::helpers::find_address(&test, established_alias)?; + helpers::mint_red_tokens( + &test, + &rpc_addr, + &multitoken_vp_addr, + &established_addr, + &established_starting_red_balance, + )?; + + let transfer_amount = token::Amount::native_whole(10_000_000); + // attempt an unauthorized transfer to Albert from the established account + let mut unauthorized_transfer = helpers::attempt_red_tokens_transfer( + &test, + &rpc_addr, + &multitoken_alias, + established_alias, + BERTHA, + CHRISTEL_KEY, + &transfer_amount, + )?; + unauthorized_transfer.exp_string("Transaction applied with result")?; + unauthorized_transfer.exp_string("Transaction is invalid")?; + unauthorized_transfer + .exp_string(&format!("Rejected: {established_addr}"))?; + unauthorized_transfer.assert_success(); + + let established_balance = helpers::fetch_red_token_balance( + &test, + &rpc_addr, + &multitoken_alias, + established_alias, + )?; + assert_eq!(established_balance, established_starting_red_balance); + + // attempt an authorized transfer to Albert from the established account + let mut authorized_transfer = helpers::attempt_red_tokens_transfer( + &test, + &rpc_addr, + &multitoken_alias, + established_alias, + BERTHA, + ALBERT_KEY, + &transfer_amount, + )?; + authorized_transfer.exp_string("Transaction applied with result")?; + authorized_transfer.exp_string("Transaction is valid")?; + authorized_transfer.assert_success(); + + let established_balance = helpers::fetch_red_token_balance( + &test, + &rpc_addr, + &multitoken_alias, + established_alias, + )?; + assert_eq!( + established_balance, + established_starting_red_balance - transfer_amount + ); + + Ok(()) +} + +#[test] +fn test_multitoken_transfer_implicit_to_established() -> Result<()> { + let (test, _ledger) = e2e::helpers::setup_single_node_test()?; + + let rpc_addr = get_actor_rpc(&test, &Who::Validator(0)); + let multitoken_alias = helpers::init_multitoken_vp(&test, &rpc_addr)?; + + let multitoken_vp_addr = + e2e::helpers::find_address(&test, &multitoken_alias)?; + println!("Fake multitoken VP established at {}", multitoken_vp_addr); + + // create an established account controlled by Bertha + let established_alias = "established"; + e2e::helpers::init_established_account( + &test, + &rpc_addr, + BERTHA, + BERTHA_KEY, + established_alias, + )?; + + let albert_addr = e2e::helpers::find_address(&test, ALBERT)?; + let albert_starting_red_balance = token::Amount::native_whole(100_000_000); + helpers::mint_red_tokens( + &test, + &rpc_addr, + &multitoken_vp_addr, + &albert_addr, + &albert_starting_red_balance, + )?; + + let transfer_amount = token::Amount::native_whole(10_000_000); + + // attempt an unauthorized transfer from Albert to the established account + let mut unauthorized_transfer = helpers::attempt_red_tokens_transfer( + &test, + &rpc_addr, + &multitoken_alias, + ALBERT, + established_alias, + CHRISTEL_KEY, + &transfer_amount, + )?; + unauthorized_transfer.exp_string("Transaction applied with result")?; + unauthorized_transfer.exp_string("Transaction is invalid")?; + unauthorized_transfer.exp_string(&format!("Rejected: {albert_addr}"))?; + unauthorized_transfer.assert_success(); + + let albert_balance = helpers::fetch_red_token_balance( + &test, + &rpc_addr, + &multitoken_alias, + ALBERT, + )?; + assert_eq!(albert_balance, albert_starting_red_balance); + + // attempt an authorized transfer to Albert from the established account + let mut authorized_transfer = helpers::attempt_red_tokens_transfer( + &test, + &rpc_addr, + &multitoken_alias, + ALBERT, + established_alias, + ALBERT_KEY, + &transfer_amount, + )?; + authorized_transfer.exp_string("Transaction applied with result")?; + authorized_transfer.exp_string("Transaction is valid")?; + authorized_transfer.assert_success(); + + let albert_balance = helpers::fetch_red_token_balance( + &test, + &rpc_addr, + &multitoken_alias, + ALBERT, + )?; + assert_eq!( + albert_balance, + albert_starting_red_balance - transfer_amount + ); + + Ok(()) +} + +#[test] +fn test_multitoken_transfer_established_to_established() -> Result<()> { + let (test, _ledger) = e2e::helpers::setup_single_node_test()?; + + let rpc_addr = get_actor_rpc(&test, &Who::Validator(0)); + let multitoken_alias = helpers::init_multitoken_vp(&test, &rpc_addr)?; + + let multitoken_vp_addr = + e2e::helpers::find_address(&test, &multitoken_alias)?; + println!("Fake multitoken VP established at {}", multitoken_vp_addr); + + // create an established account that Albert controls + let established_alias = "established"; + e2e::helpers::init_established_account( + &test, + &rpc_addr, + ALBERT, + ALBERT_KEY, + established_alias, + )?; + + let established_starting_red_balance = + token::Amount::native_whole(100_000_000); + // mint some red tokens for the established account + let established_addr = + e2e::helpers::find_address(&test, established_alias)?; + helpers::mint_red_tokens( + &test, + &rpc_addr, + &multitoken_vp_addr, + &established_addr, + &established_starting_red_balance, + )?; + + // create another established account to receive transfers + let receiver_alias = "receiver"; + e2e::helpers::init_established_account( + &test, + &rpc_addr, + BERTHA, + BERTHA_KEY, + receiver_alias, + )?; + + let established_starting_red_balance = + token::Amount::native_whole(100_000_000); + // mint some red tokens for the established account + let established_addr = + e2e::helpers::find_address(&test, established_alias)?; + helpers::mint_red_tokens( + &test, + &rpc_addr, + &multitoken_vp_addr, + &established_addr, + &established_starting_red_balance, + )?; + + let transfer_amount = token::Amount::native_whole(10_000_000); + + // attempt an unauthorized transfer + let mut unauthorized_transfer = helpers::attempt_red_tokens_transfer( + &test, + &rpc_addr, + &multitoken_alias, + established_alias, + receiver_alias, + CHRISTEL_KEY, + &transfer_amount, + )?; + unauthorized_transfer.exp_string("Transaction applied with result")?; + unauthorized_transfer.exp_string("Transaction is invalid")?; + unauthorized_transfer + .exp_string(&format!("Rejected: {established_addr}"))?; + unauthorized_transfer.assert_success(); + + let established_balance = helpers::fetch_red_token_balance( + &test, + &rpc_addr, + &multitoken_alias, + established_alias, + )?; + assert_eq!(established_balance, established_starting_red_balance); + + // attempt an authorized transfer which should succeed + let mut authorized_transfer = helpers::attempt_red_tokens_transfer( + &test, + &rpc_addr, + &multitoken_alias, + established_alias, + receiver_alias, + ALBERT_KEY, + &transfer_amount, + )?; + authorized_transfer.exp_string("Transaction applied with result")?; + authorized_transfer.exp_string("Transaction is valid")?; + authorized_transfer.assert_success(); + + let established_balance = helpers::fetch_red_token_balance( + &test, + &rpc_addr, + &multitoken_alias, + established_alias, + )?; + assert_eq!( + established_balance, + established_starting_red_balance - transfer_amount + ); + + Ok(()) +} diff --git a/tests/src/e2e/multitoken_tests/helpers.rs b/tests/src/e2e/multitoken_tests/helpers.rs new file mode 100644 index 00000000000..176692c508e --- /dev/null +++ b/tests/src/e2e/multitoken_tests/helpers.rs @@ -0,0 +1,190 @@ +//! Helpers for use in multitoken tests. +use std::path::PathBuf; + +use borsh::BorshSerialize; +use color_eyre::eyre::Result; +use eyre::Context; +use namada_core::types::address::Address; +use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; +use namada_core::types::{storage, token}; +use namada_test_utils::tx_data::TxWriteData; +use namada_test_utils::TestWasms; +use namada_tx_prelude::storage::KeySeg; +use rand::Rng; +use regex::Regex; + +use super::setup::constants::NAM; +use super::setup::{Bin, NamadaCmd, Test}; +use crate::e2e::setup::constants::{ALBERT, ALBERT_KEY}; +use crate::run; + +const MULTITOKEN_KEY_SEGMENT: &str = "tokens"; +const BALANCE_KEY_SEGMENT: &str = "balance"; +const RED_TOKEN_KEY_SEGMENT: &str = "red"; +const MULTITOKEN_RED_TOKEN_SUB_PREFIX: &str = "tokens/red"; + +const ARBITRARY_SIGNER: &str = ALBERT; +const ARBITRARY_SIGNER_KEY: &str = ALBERT_KEY; + +/// Initializes a VP to represent a multitoken account. +pub fn init_multitoken_vp(test: &Test, rpc_addr: &str) -> Result { + // we use a VP that always returns true for the multitoken VP here, as we + // are testing out the VPs of the sender and receiver of multitoken + // transactions here - not any multitoken VP itself + let multitoken_vp_wasm_path = + TestWasms::VpAlwaysTrue.path().to_string_lossy().to_string(); + let multitoken_alias = "multitoken"; + + let init_account_args = vec![ + "init-account", + "--source", + ARBITRARY_SIGNER, + "--public-key", + // Value obtained from + // `namada::types::key::ed25519::tests::gen_keypair` + "001be519a321e29020fa3cbfbfd01bd5e92db134305609270b71dace25b5a21168", + "--code-path", + &multitoken_vp_wasm_path, + "--alias", + multitoken_alias, + "--gas-amount", + "0", + "--gas-limit", + "0", + "--gas-token", + NAM, + "--ledger-address", + rpc_addr, + ]; + let mut client_init_account = + run!(test, Bin::Client, init_account_args, Some(40))?; + client_init_account.exp_string("Transaction is valid.")?; + client_init_account.exp_string("Transaction applied")?; + client_init_account.assert_success(); + Ok(multitoken_alias.to_string()) +} + +/// Generates a random path within the `test` directory. +fn generate_random_test_dir_path(test: &Test) -> PathBuf { + let rng = rand::thread_rng(); + let random_string: String = rng + .sample_iter(&rand::distributions::Alphanumeric) + .take(24) + .map(char::from) + .collect(); + test.test_dir.path().join(random_string) +} + +/// Writes `contents` to a random path within the `test` directory, and return +/// the path. +pub fn write_test_file( + test: &Test, + contents: impl AsRef<[u8]>, +) -> Result { + let path = generate_random_test_dir_path(test); + std::fs::write(&path, contents)?; + Ok(path) +} + +/// Mint red tokens to the given address. +pub fn mint_red_tokens( + test: &Test, + rpc_addr: &str, + multitoken: &Address, + owner: &Address, + amount: &token::Amount, +) -> Result<()> { + let red_balance_key = storage::Key::from(multitoken.to_db_key()) + .push(&MULTITOKEN_KEY_SEGMENT.to_owned())? + .push(&RED_TOKEN_KEY_SEGMENT.to_owned())? + .push(&BALANCE_KEY_SEGMENT.to_owned())? + .push(owner)?; + + let tx_code_path = TestWasms::TxWriteStorageKey.path(); + let tx_data_path = write_test_file( + test, + TxWriteData { + key: red_balance_key, + value: amount.try_to_vec()?, + } + .try_to_vec()?, + )?; + + let tx_data_path = tx_data_path.to_string_lossy().to_string(); + let tx_code_path = tx_code_path.to_string_lossy().to_string(); + let tx_args = vec![ + "tx", + "--signing-keys", + ARBITRARY_SIGNER_KEY, + "--code-path", + &tx_code_path, + "--data-path", + &tx_data_path, + "--ledger-address", + rpc_addr, + ]; + let mut client_tx = run!(test, Bin::Client, tx_args, Some(40))?; + client_tx.exp_string("Transaction is valid.")?; + client_tx.exp_string("Transaction applied")?; + client_tx.assert_success(); + Ok(()) +} + +pub fn attempt_red_tokens_transfer( + test: &Test, + rpc_addr: &str, + multitoken: &str, + from: &str, + to: &str, + signing_keys: &str, + amount: &token::Amount, +) -> Result { + let amount = amount.to_string_native(); + let transfer_args = vec![ + "transfer", + "--token", + multitoken, + "--sub-prefix", + MULTITOKEN_RED_TOKEN_SUB_PREFIX, + "--source", + from, + "--target", + to, + "--signing-keys", + signing_keys, + "--amount", + &amount, + "--ledger-address", + rpc_addr, + ]; + run!(test, Bin::Client, transfer_args, Some(40)) +} + +pub fn fetch_red_token_balance( + test: &Test, + rpc_addr: &str, + multitoken_alias: &str, + owner_alias: &str, +) -> Result { + let balance_args = vec![ + "balance", + "--owner", + owner_alias, + "--token", + multitoken_alias, + "--sub-prefix", + MULTITOKEN_RED_TOKEN_SUB_PREFIX, + "--ledger-address", + rpc_addr, + ]; + let mut client_balance = run!(test, Bin::Client, balance_args, Some(40))?; + let (_, matched) = client_balance.exp_regex(&format!( + r"{MULTITOKEN_RED_TOKEN_SUB_PREFIX}: (\d*\.?\d+)" + ))?; + let decimal_regex = Regex::new(r"(\d*\.?\d+)").unwrap(); + println!("Got balance for {}: {}", owner_alias, matched); + let decimal = decimal_regex.find(&matched).unwrap().as_str(); + client_balance.assert_success(); + token::Amount::from_str(decimal, NATIVE_MAX_DECIMAL_PLACES) + .wrap_err(format!("Failed to parse {}", matched)) +} diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index 5f148b4fc2c..eecc60588f1 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -839,6 +839,7 @@ pub mod constants { pub const CHRISTEL: &str = "Christel"; pub const CHRISTEL_KEY: &str = "Christel-key"; pub const DAEWON: &str = "Daewon"; + pub const DAEWON_KEY: &str = "Daewon-key"; pub const ESTER: &str = "Ester"; pub const MATCHMAKER_KEY: &str = "matchmaker-key"; pub const MASP: &str = "atest1v4ehgw36xaryysfsx5unvve4g5my2vjz89p52sjxxgenzd348yuyyv3hg3pnjs35g5unvde4ca36y5"; diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index b8f9c47ed5c..d024f84132b 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -391,7 +391,7 @@ fn masp_incentives() -> Result<()> { ETH, "--amount", "10", - "--signer", + "--signing-keys", BERTHA, "--node", validator_one_rpc, @@ -488,7 +488,7 @@ fn masp_incentives() -> Result<()> { BTC, "--amount", "20", - "--signer", + "--signing-keys", ALBERT, "--node", validator_one_rpc, @@ -661,7 +661,7 @@ fn masp_incentives() -> Result<()> { "--amount", &((amt10 * masp_rewards[ð()]).0 * (ep5.0 - ep3.0)) .to_string_native(), - "--signer", + "--signing-keys", BERTHA, "--node", validator_one_rpc, @@ -687,7 +687,7 @@ fn masp_incentives() -> Result<()> { "--amount", &((amt20 * masp_rewards[&btc()]).0 * (ep6.0 - ep0.0)) .to_string_native(), - "--signer", + "--signing-keys", ALBERT, "--node", validator_one_rpc, diff --git a/tests/src/native_vp/eth_bridge_pool.rs b/tests/src/native_vp/eth_bridge_pool.rs index 46478acf480..544889b2d14 100644 --- a/tests/src/native_vp/eth_bridge_pool.rs +++ b/tests/src/native_vp/eth_bridge_pool.rs @@ -8,7 +8,7 @@ mod test_bridge_pool_vp { wrapped_erc20s, Contracts, EthereumBridgeConfig, UpgradeableContract, }; use namada::ledger::native_vp::ethereum_bridge::bridge_pool_vp::BridgePoolVp; - use namada::proto::{Code, Data, Section, Signature, Tx}; + use namada::proto::Tx; use namada::types::address::{nam, wnam}; use namada::types::chain::ChainId; use namada::types::eth_bridge_pool::{ @@ -17,7 +17,6 @@ mod test_bridge_pool_vp { use namada::types::ethereum_events::EthAddress; use namada::types::key::{common, ed25519, SecretKey}; use namada::types::token::Amount; - use namada::types::transaction::TxType; use namada_apps::wallet::defaults::{albert_address, bertha_address}; use namada_apps::wasm_loader; @@ -108,14 +107,11 @@ mod test_bridge_pool_vp { let data = transfer.try_to_vec().expect("Test failed"); let wasm_code = wasm_loader::read_wasm_or_exit(wasm_dir(), ADD_TRANSFER_WASM); - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = ChainId::default(); - tx.set_data(Data::new(data)); - tx.set_code(Code::new(wasm_code)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.data_sechash(), *tx.code_sechash()], - keypair, - ))); + + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(wasm_code) + .add_serialized_data(data) + .sign_wrapper(keypair.clone()); tx } diff --git a/tests/src/native_vp/pos.rs b/tests/src/native_vp/pos.rs index b76b4dd041b..077385dc61b 100644 --- a/tests/src/native_vp/pos.rs +++ b/tests/src/native_vp/pos.rs @@ -118,6 +118,11 @@ pub fn init_pos( tx_env.spawn_accounts([&native_token]); for validator in genesis_validators { tx_env.spawn_accounts([&validator.address]); + tx_env.init_account_storage( + &validator.address, + vec![validator.consensus_key.clone()], + 1, + ) } tx_env.wl_storage.storage.block.epoch = start_epoch; // Initialize PoS storage diff --git a/tests/src/vm_host_env/ibc.rs b/tests/src/vm_host_env/ibc.rs index 5858abe7d3f..f88be446fe0 100644 --- a/tests/src/vm_host_env/ibc.rs +++ b/tests/src/vm_host_env/ibc.rs @@ -1,6 +1,5 @@ use core::time::Duration; use std::collections::HashMap; -use std::str::FromStr; use namada::ibc::applications::transfer::acknowledgement::TokenTransferAcknowledgement; use namada::ibc::applications::transfer::coin::PrefixedCoin; @@ -24,16 +23,11 @@ use namada::ibc::core::ics03_connection::version::Version as ConnVersion; use namada::ibc::core::ics04_channel::channel::{ ChannelEnd, Counterparty as ChanCounterparty, Order, State as ChanState, }; -use namada::ibc::core::ics04_channel::msgs::acknowledgement::MsgAcknowledgement; -use namada::ibc::core::ics04_channel::msgs::chan_close_confirm::MsgChannelCloseConfirm; -use namada::ibc::core::ics04_channel::msgs::chan_close_init::MsgChannelCloseInit; -use namada::ibc::core::ics04_channel::msgs::chan_open_ack::MsgChannelOpenAck; -use namada::ibc::core::ics04_channel::msgs::chan_open_confirm::MsgChannelOpenConfirm; -use namada::ibc::core::ics04_channel::msgs::chan_open_init::MsgChannelOpenInit; -use namada::ibc::core::ics04_channel::msgs::chan_open_try::MsgChannelOpenTry; -use namada::ibc::core::ics04_channel::msgs::recv_packet::MsgRecvPacket; -use namada::ibc::core::ics04_channel::msgs::timeout::MsgTimeout; -use namada::ibc::core::ics04_channel::msgs::timeout_on_close::MsgTimeoutOnClose; +use namada::ibc::core::ics04_channel::msgs::{ + MsgAcknowledgement, MsgChannelCloseConfirm, MsgChannelCloseInit, + MsgChannelOpenAck, MsgChannelOpenConfirm, MsgChannelOpenInit, + MsgChannelOpenTry, MsgRecvPacket, MsgTimeout, MsgTimeoutOnClose, +}; pub use namada::ibc::core::ics04_channel::packet::{Packet, Sequence}; use namada::ibc::core::ics04_channel::timeout::TimeoutHeight; use namada::ibc::core::ics04_channel::Version as ChanVersion; @@ -41,15 +35,13 @@ use namada::ibc::core::ics23_commitment::commitment::{ CommitmentPrefix, CommitmentProofBytes, }; pub use namada::ibc::core::ics24_host::identifier::{ - ChannelId, ClientId, ConnectionId, PortChannelId, PortId, + ChannelId, ClientId, ConnectionId, PortId, }; +use namada::ibc::core::timestamp::Timestamp; use namada::ibc::mock::client_state::{MockClientState, MOCK_CLIENT_TYPE}; use namada::ibc::mock::consensus_state::MockConsensusState; use namada::ibc::mock::header::MockHeader; -use namada::ibc::signer::Signer; -use namada::ibc::timestamp::Timestamp; use namada::ibc::Height; -use namada::ibc_proto::cosmos::base::v1beta1::Coin; use namada::ibc_proto::google::protobuf::Any; use namada::ibc_proto::ibc::core::commitment::v1::MerkleProof; use namada::ibc_proto::ibc::core::connection::v1::MsgConnectionOpenTry as RawMsgConnectionOpenTry; @@ -58,9 +50,9 @@ use namada::ibc_proto::protobuf::Protobuf; use namada::ledger::gas::VpGasMeter; pub use namada::ledger::ibc::storage::{ ack_key, channel_counter_key, channel_key, client_counter_key, - client_state_key, client_type_key, client_update_height_key, - client_update_timestamp_key, commitment_key, connection_counter_key, - connection_key, consensus_state_key, ibc_token, next_sequence_ack_key, + client_state_key, client_update_height_key, client_update_timestamp_key, + commitment_key, connection_counter_key, connection_key, + consensus_state_key, ibc_token, next_sequence_ack_key, next_sequence_recv_key, next_sequence_send_key, port_key, receipt_key, }; use namada::ledger::ibc::vp::{ @@ -296,23 +288,12 @@ pub fn prepare_client() -> (ClientId, Any, HashMap>) { // client state let client_id = client_id(); let key = client_state_key(&client_id); - let bytes = client_state - .into_box() - .encode_vec() - .expect("encoding failed"); - writes.insert(key, bytes); - // client type - let key = client_type_key(&client_id); - let client_type = client_state.client_type(); - let bytes = client_type.as_str().as_bytes().to_vec(); + let bytes = client_state.into_box().encode_vec(); writes.insert(key, bytes); // consensus state let height = client_state.latest_height(); let key = consensus_state_key(&client_id, height); - let bytes = consensus_state - .into_box() - .encode_vec() - .expect("encoding failed"); + let bytes = consensus_state.into_box().encode_vec(); writes.insert(key, bytes); // client update time let key = client_update_timestamp_key(&client_id); @@ -337,7 +318,7 @@ pub fn prepare_client() -> (ClientId, Any, HashMap>) { let height = env.wl_storage.storage.get_block_height().0; Height::new(0, height.0).expect("invalid height") }); - let bytes = height.encode_vec().expect("encoding failed"); + let bytes = height.encode_vec(); writes.insert(key, bytes); // client counter let key = client_counter_key(); @@ -366,15 +347,15 @@ pub fn prepare_opened_connection( let conn_id = ConnectionId::new(0); let key = connection_key(&conn_id); - let msg = msg_connection_open_init(client_id.clone()); let conn = ConnectionEnd::new( ConnState::Open, - msg.client_id_on_a.clone(), - msg.counterparty.clone(), - vec![msg.version.clone().unwrap_or_default()], - msg.delay_period, - ); - let bytes = conn.encode_vec().expect("encoding failed"); + client_id.clone(), + dummy_connection_counterparty(), + vec![ConnVersion::default()], + Duration::new(0, 0), + ) + .expect("invalid connection"); + let bytes = conn.encode_vec(); writes.insert(key, bytes); // connection counter let key = connection_counter_key(); @@ -396,20 +377,19 @@ pub fn prepare_opened_channel( writes.insert(key, 0_u64.to_be_bytes().to_vec()); // channel let channel_id = ChannelId::new(0); - let port_channel_id = - PortChannelId::new(channel_id.clone(), port_id.clone()); - let key = channel_key(&port_channel_id); + let key = channel_key(&port_id, &channel_id); let mut channel = ChannelEnd::new( ChanState::Open, Order::Unordered, dummy_channel_counterparty(), vec![conn_id.clone()], ChanVersion::new(VERSION.to_string()), - ); + ) + .expect("invalid channel"); if is_ordered { channel.ordering = Order::Ordered; } - let bytes = channel.encode_vec().expect("encoding failed"); + let bytes = channel.encode_vec(); writes.insert(key, bytes); (port_id, channel_id, writes) @@ -420,7 +400,7 @@ pub fn msg_create_client() -> MsgCreateClient { MsgCreateClient { client_state: client_state.into(), consensus_state: consensus_state.into(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -434,7 +414,7 @@ pub fn msg_update_client(client_id: ClientId) -> MsgUpdateClient { MsgUpdateClient { client_id, header, - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -458,17 +438,24 @@ pub fn msg_upgrade_client(client_id: ClientId) -> MsgUpgradeClient { consensus_state, proof_upgrade_client, proof_upgrade_consensus_state, - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } pub fn msg_connection_open_init(client_id: ClientId) -> MsgConnectionOpenInit { + let client_type = ClientType::new(MOCK_CLIENT_TYPE.to_string()).unwrap(); + let counterparty_client_id = ClientId::new(client_type, 42).unwrap(); + let commitment_prefix = + CommitmentPrefix::try_from(COMMITMENT_PREFIX.to_vec()).unwrap(); + let counterparty = + ConnCounterparty::new(counterparty_client_id, None, commitment_prefix); + MsgConnectionOpenInit { client_id_on_a: client_id, - counterparty: dummy_connection_counterparty(), + counterparty, version: None, delay_period: Duration::new(0, 0), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -514,7 +501,7 @@ pub fn msg_connection_open_ack( proofs_height_on_b: dummy_proof_height(), consensus_height_of_a_on_b: consensus_height, version: ConnVersion::default(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -525,7 +512,7 @@ pub fn msg_connection_open_confirm( conn_id_on_b: connection_id, proof_conn_end_on_a: dummy_proof(), proof_height_on_a: dummy_proof_height(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -538,7 +525,7 @@ fn dummy_proof_height() -> Height { } fn dummy_connection_counterparty() -> ConnCounterparty { - let client_type = ClientType::new(MOCK_CLIENT_TYPE.to_string()); + let client_type = ClientType::new(MOCK_CLIENT_TYPE.to_string()).unwrap(); let client_id = ClientId::new(client_type, 42).expect("invalid client ID"); let conn_id = ConnectionId::new(12); let commitment_prefix = @@ -556,7 +543,7 @@ pub fn msg_channel_open_init( connection_hops_on_a: vec![conn_id], port_id_on_b: PortId::transfer(), ordering: Order::Unordered, - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), version_proposal: ChanVersion::new(VERSION.to_string()), } } @@ -576,8 +563,7 @@ pub fn msg_channel_open_try( proof_chan_end_on_a: dummy_proof(), proof_height_on_a: dummy_proof_height(), ordering: Order::Unordered, - signer: Signer::from_str("test").expect("invalid signer"), - previous_channel_id: ChannelId::default().to_string(), + signer: "test".to_string().into(), version_proposal: ChanVersion::default(), } } @@ -594,7 +580,7 @@ pub fn msg_channel_open_ack( version_on_b: ChanVersion::new(VERSION.to_string()), proof_chan_end_on_b: dummy_proof(), proof_height_on_b: dummy_proof_height(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -607,7 +593,7 @@ pub fn msg_channel_open_confirm( chan_id_on_b: channel_id, proof_chan_end_on_a: dummy_proof(), proof_height_on_a: dummy_proof_height(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -618,7 +604,7 @@ pub fn msg_channel_close_init( MsgChannelCloseInit { port_id_on_a: port_id, chan_id_on_a: channel_id, - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -631,7 +617,7 @@ pub fn msg_channel_close_confirm( chan_id_on_b: channel_id, proof_chan_end_on_a: dummy_proof(), proof_height_on_a: dummy_proof_height(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -648,22 +634,24 @@ pub fn unorder_channel(channel: &mut ChannelEnd) { pub fn msg_transfer( port_id: PortId, channel_id: ChannelId, - token: String, + denom: String, sender: &Address, ) -> MsgTransfer { let timestamp = (Timestamp::now() + Duration::from_secs(100)).unwrap(); MsgTransfer { port_id_on_a: port_id, chan_id_on_a: channel_id, - token: Coin { - denom: token, - amount: 100u64.to_string(), + packet_data: PacketData { + token: PrefixedCoin { + denom: denom.parse().expect("invalid denom"), + amount: 100.into(), + }, + sender: sender.to_string().into(), + receiver: address::testing::gen_established_address() + .to_string() + .into(), + memo: "memo".to_string().into(), }, - sender: Signer::from_str(&sender.to_string()).expect("invalid signer"), - receiver: Signer::from_str( - &address::testing::gen_established_address().to_string(), - ) - .expect("invalid signer"), timeout_height_on_b: TimeoutHeight::Never, timeout_timestamp_on_b: timestamp, } @@ -679,7 +667,7 @@ pub fn msg_packet_recv(packet: Packet) -> MsgRecvPacket { packet, proof_commitment_on_a: dummy_proof(), proof_height_on_a: dummy_proof_height(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -690,7 +678,7 @@ pub fn msg_packet_ack(packet: Packet) -> MsgAcknowledgement { acknowledgement: packet_ack.into(), proof_acked_on_b: dummy_proof(), proof_height_on_b: dummy_proof_height(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -707,12 +695,12 @@ pub fn received_packet( denom: token.parse().expect("invalid denom"), amount: 100.into(), }; - let sender = address::testing::gen_established_address().to_string(); + let sender = address::testing::gen_established_address(); let data = PacketData { token: coin, - sender: Signer::from_str(&sender).expect("invalid signer"), - receiver: Signer::from_str(&receiver.to_string()) - .expect("invalid signer"), + sender: sender.to_string().into(), + receiver: receiver.to_string().into(), + memo: "memo".to_string().into(), }; Packet { seq_on_a: sequence, @@ -732,7 +720,7 @@ pub fn msg_timeout(packet: Packet, next_sequence_recv: Sequence) -> MsgTimeout { next_seq_recv_on_b: next_sequence_recv, proof_unreceived_on_b: dummy_proof(), proof_height_on_b: dummy_proof_height(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -746,7 +734,7 @@ pub fn msg_timeout_on_close( proof_unreceived_on_b: dummy_proof(), proof_close_on_b: dummy_proof(), proof_height_on_b: dummy_proof_height(), - signer: Signer::from_str("test").expect("invalid signer"), + signer: "test".to_string().into(), } } @@ -755,11 +743,11 @@ pub fn packet_from_message( sequence: Sequence, counterparty: &ChanCounterparty, ) -> Packet { - let coin = PrefixedCoin::try_from(msg.token.clone()).expect("invalid coin"); let packet_data = PacketData { - token: coin, - sender: msg.sender.clone(), - receiver: msg.receiver.clone(), + token: msg.packet_data.token.clone(), + sender: msg.packet_data.sender.clone(), + receiver: msg.packet_data.receiver.clone(), + memo: "memo".to_string().into(), }; let data = serde_json::to_vec(&packet_data).expect("Encoding PacketData failed"); diff --git a/tests/src/vm_host_env/mod.rs b/tests/src/vm_host_env/mod.rs index a8c72cf9b7e..878d93aeef6 100644 --- a/tests/src/vm_host_env/mod.rs +++ b/tests/src/vm_host_env/mod.rs @@ -21,25 +21,28 @@ mod tests { use std::panic; use itertools::Itertools; - use namada::ibc::tx_msg::Msg; + use namada::ibc::core::Msg; use namada::ledger::ibc::storage as ibc_storage; use namada::ledger::ibc::vp::{ get_dummy_header as tm_dummy_header, Error as IbcError, }; use namada::ledger::tx_env::TxEnv; - use namada::proto::{Code, Data, Section, Signature, Tx}; - use namada::types::address::{Address, InternalAddress}; + use namada::proto::Tx; use namada::types::hash::Hash; use namada::types::key::*; use namada::types::storage::{self, BlockHash, BlockHeight, Key, KeySeg}; use namada::types::time::DateTimeUtc; use namada::types::token::{self, Amount}; - use namada::types::transaction::TxType; use namada::types::{address, key}; use namada_core::ledger::ibc::context::transfer_mod::testing::DummyTransferModule; use namada_core::ledger::ibc::Error as IbcActionError; use namada_test_utils::TestWasms; - use namada_tx_prelude::{BorshSerialize, StorageRead, StorageWrite}; + use namada_tx_prelude::address::InternalAddress; + use namada_tx_prelude::chain::ChainId; + use namada_tx_prelude::{ + Address, BorshSerialize, StorageRead, StorageWrite, + }; + use namada_vp_prelude::account::AccountPublicKeysMap; use namada_vp_prelude::VpEnv; use prost::Message; use test_log::test; @@ -437,12 +440,11 @@ mod tests { let addr = address::testing::established_address_1(); // Write the public key to storage - let pk_key = key::pk_key(&addr); let keypair = key::testing::keypair_1(); let pk = keypair.ref_to(); - env.wl_storage - .write(&pk_key, pk.try_to_vec().unwrap()) - .unwrap(); + + let _ = pks_handle(&addr).insert(&mut env.wl_storage, 0_u8, pk.clone()); + // Initialize the environment vp_host_env::set(env); @@ -455,28 +457,29 @@ mod tests { // Tx without any data vec![], ] { + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter(vec![pk.clone()]); let signed_tx_data = vp_host_env::with(|env| { - let mut tx = Tx::new(TxType::Raw); - tx.header.chain_id = env.wl_storage.storage.chain_id.clone(); - tx.header.expiration = expiration; - tx.set_code(Code::new(code.clone())); - tx.set_data(Data::new(data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &keypair, - ))); + let chain_id = env.wl_storage.storage.chain_id.clone(); + let mut tx = Tx::new(chain_id, expiration); + tx.add_code(code.clone()) + .add_serialized_data(data.to_vec()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); env.tx = tx; env.tx.clone() }); assert_eq!(signed_tx_data.data().as_ref(), Some(data)); assert!( signed_tx_data - .verify_signature( - &pk, + .verify_section_signatures( &[ *signed_tx_data.data_sechash(), *signed_tx_data.code_sechash(), ], + pks_map, + 1, + None ) .is_ok() ); @@ -484,12 +487,16 @@ mod tests { let other_keypair = key::testing::keypair_2(); assert!( signed_tx_data - .verify_signature( - &other_keypair.ref_to(), + .verify_section_signatures( &[ *signed_tx_data.data_sechash(), *signed_tx_data.code_sechash(), ], + AccountPublicKeysMap::from_iter([ + other_keypair.ref_to() + ]), + 1, + None ) .is_err() ); @@ -543,13 +550,17 @@ mod tests { // evaluating without any code should fail let empty_code = Hash::zero(); let input_data = vec![]; - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(input_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(input_data.clone()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); let result = vp::CTX.eval(empty_code, tx).unwrap(); assert!(!result); @@ -561,14 +572,11 @@ mod tests { let key = Key::wasm_code(&code_hash); env.wl_storage.storage.write(&key, code.clone()).unwrap(); }); - let input_data = vec![]; - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(input_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code_from_hash(code_hash) + .add_serialized_data(input_data.clone()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); let result = vp::CTX.eval(code_hash, tx).unwrap(); assert!(result); @@ -581,14 +589,11 @@ mod tests { let key = Key::wasm_code(&code_hash); env.wl_storage.storage.write(&key, code.clone()).unwrap(); }); - let input_data = vec![]; - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(input_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code_from_hash(code_hash) + .add_serialized_data(input_data) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); let result = vp::CTX.eval(code_hash, tx).unwrap(); assert!(!result); } @@ -599,18 +604,21 @@ mod tests { tx_host_env::init(); ibc::init_storage(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); // Start a transaction to create a new client let msg = ibc::msg_create_client(); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); // create a client with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -640,13 +648,11 @@ mod tests { let msg = ibc::msg_update_client(client_id); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // update the client with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -663,6 +669,12 @@ mod tests { // The environment must be initialized first tx_host_env::init(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Set the initial state before starting transactions ibc::init_storage(); let (client_id, client_state, writes) = ibc::prepare_client(); @@ -679,13 +691,11 @@ mod tests { let msg = ibc::msg_connection_open_init(client_id); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); // init a connection with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -714,13 +724,11 @@ mod tests { let msg = ibc::msg_connection_open_ack(conn_id, client_state); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // open the connection with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -740,6 +748,12 @@ mod tests { // Set the initial state before starting transactions ibc::init_storage(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + let (client_id, client_state, writes) = ibc::prepare_client(); writes.into_iter().for_each(|(key, val)| { tx_host_env::with(|env| { @@ -754,13 +768,11 @@ mod tests { let msg = ibc::msg_connection_open_try(client_id, client_state); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); // open try a connection with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -789,13 +801,11 @@ mod tests { let msg = ibc::msg_connection_open_confirm(conn_id); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // open the connection with the mssage tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -812,6 +822,12 @@ mod tests { // The environment must be initialized first tx_host_env::init(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Set the initial state before starting transactions ibc::init_storage(); let (client_id, _client_state, mut writes) = ibc::prepare_client(); @@ -831,13 +847,11 @@ mod tests { let msg = ibc::msg_channel_open_init(port_id.clone(), conn_id); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); // init a channel with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -866,13 +880,11 @@ mod tests { let msg = ibc::msg_channel_open_ack(port_id, channel_id); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // open the channle with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -903,18 +915,22 @@ mod tests { }); }); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Start a transaction for ChannelOpenTry let port_id = ibc::PortId::transfer(); let msg = ibc::msg_channel_open_try(port_id.clone(), conn_id); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); // try open a channel with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -944,13 +960,11 @@ mod tests { let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // open a channel with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -984,18 +998,22 @@ mod tests { }); }); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Start a transaction to close the channel let msg = ibc::msg_channel_close_init(port_id, channel_id); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // close the channel with the message let mut actions = tx_host_env::ibc::ibc_actions(tx::ctx()); // the dummy module closes the channel @@ -1037,18 +1055,22 @@ mod tests { }); }); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Start a transaction to close the channel let msg = ibc::msg_channel_close_confirm(port_id, channel_id); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // close the channel with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1083,6 +1105,12 @@ mod tests { }); }); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Start a transaction to send a packet let msg = ibc::msg_transfer(port_id, channel_id, token.to_string(), &sender); @@ -1092,13 +1120,11 @@ mod tests { .encode(&mut tx_data) .expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_wrapper(keypair.clone()); // send the token and a packet with the data tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -1141,13 +1167,11 @@ mod tests { let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // ack the packet with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -1179,6 +1203,12 @@ mod tests { // The environment must be initialized first tx_host_env::init(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Set the initial state before starting transactions let (token, sender) = ibc::init_storage(); let (client_id, _client_state, mut writes) = ibc::prepare_client(); @@ -1217,18 +1247,15 @@ mod tests { // Start a transaction to send a packet // Set this chain is the sink zone - let hashed_denom = ibc_token.to_string(); - let msg = ibc::msg_transfer(port_id, channel_id, hashed_denom, &sender); + let msg = ibc::msg_transfer(port_id, channel_id, denom, &sender); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // send the token and a packet with the data tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -1259,6 +1286,12 @@ mod tests { // The environment must be initialized first tx_host_env::init(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Set the initial state before starting transactions let (token, receiver) = ibc::init_storage(); let (client_id, _client_state, mut writes) = ibc::prepare_client(); @@ -1291,13 +1324,11 @@ mod tests { let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // receive a packet with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -1332,6 +1363,12 @@ mod tests { // The environment must be initialized first tx_host_env::init(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Set the initial state before starting transactions let (token, receiver) = ibc::init_storage(); let (client_id, _client_state, mut writes) = ibc::prepare_client(); @@ -1382,13 +1419,11 @@ mod tests { let msg = ibc::msg_packet_recv(packet); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // receive a packet with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -1420,6 +1455,12 @@ mod tests { // The environment must be initialized first tx_host_env::init(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Set the initial state before starting transactions let (token, receiver) = ibc::init_storage(); let (client_id, _client_state, mut writes) = ibc::prepare_client(); @@ -1477,13 +1518,11 @@ mod tests { let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // receive a packet with the message tx_host_env::ibc::ibc_actions(tx::ctx()) .execute(&tx_data) @@ -1518,6 +1557,12 @@ mod tests { // The environment must be initialized first tx_host_env::init(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Set the initial state before starting transactions let (token, sender) = ibc::init_storage(); let (client_id, _client_state, mut writes) = ibc::prepare_client(); @@ -1573,13 +1618,11 @@ mod tests { let msg = ibc::msg_timeout(packet, ibc::Sequence::from(1)); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // timeout the packet tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1604,6 +1647,12 @@ mod tests { // The environment must be initialized first tx_host_env::init(); + let keypair = key::testing::keypair_1(); + let keypairs = vec![keypair.clone()]; + let pks_map = AccountPublicKeysMap::from_iter([ + key::testing::keypair_1().ref_to(), + ]); + // Set the initial state before starting transactions let (token, sender) = ibc::init_storage(); let (client_id, _client_state, mut writes) = ibc::prepare_client(); @@ -1658,13 +1707,11 @@ mod tests { let msg = ibc::msg_timeout_on_close(packet, ibc::Sequence::from(1)); let mut tx_data = vec![]; msg.to_any().encode(&mut tx_data).expect("encoding failed"); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(vec![])); - tx.set_data(Data::new(tx_data.clone())); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.code_sechash(), *tx.data_sechash()], - &key::testing::keypair_1(), - ))); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(vec![]) + .add_serialized_data(tx_data.clone()) + .sign_raw(keypairs, pks_map) + .sign_wrapper(keypair); // timeout the packet tx_host_env::ibc::ibc_actions(tx::ctx()) diff --git a/tests/src/vm_host_env/tx.rs b/tests/src/vm_host_env/tx.rs index d3da806ca5b..a0e88ab8025 100644 --- a/tests/src/vm_host_env/tx.rs +++ b/tests/src/vm_host_env/tx.rs @@ -18,7 +18,8 @@ use namada::vm::prefix_iter::PrefixIterators; use namada::vm::wasm::run::Error; use namada::vm::wasm::{self, TxCache, VpCache}; use namada::vm::{self, WasmCacheRwAccess}; -use namada_tx_prelude::{BorshSerialize, Ctx}; +use namada_tx_prelude::{storage_api, BorshSerialize, Ctx}; +use namada_vp_prelude::key::common; use tempfile::TempDir; use crate::vp::TestVpEnv; @@ -67,7 +68,7 @@ impl Default for TestTxEnv { storage: TestStorage::default(), write_log: WriteLog::default(), }; - let mut tx = Tx::new(TxType::Raw); + let mut tx = Tx::from_type(TxType::Raw); tx.header.chain_id = wl_storage.storage.chain_id.clone(); Self { wl_storage, @@ -102,6 +103,7 @@ impl TestTxEnv { epoch_duration: Option, vp_whitelist: Option>, tx_whitelist: Option>, + max_signatures_per_transaction: Option, ) { parameters::update_epoch_parameter( &mut self.wl_storage, @@ -121,6 +123,11 @@ impl TestTxEnv { vp_whitelist.unwrap_or_default(), ) .unwrap(); + parameters::update_max_signature_per_tx( + &mut self.wl_storage, + max_signatures_per_transaction.unwrap_or(15), + ) + .unwrap(); } pub fn store_wasm_code(&mut self, code: Vec) { @@ -155,6 +162,34 @@ impl TestTxEnv { } } + pub fn init_account_storage( + &mut self, + owner: &Address, + public_keys: Vec, + threshold: u8, + ) { + storage_api::account::init_account_storage( + &mut self.wl_storage, + owner, + &public_keys, + threshold, + ) + .expect("Unable to write Account substorage."); + } + + /// Set public key for the address. + pub fn write_account_threshold( + &mut self, + address: &Address, + threshold: u8, + ) { + let storage_key = key::threshold_key(address); + self.wl_storage + .storage + .write(&storage_key, threshold.try_to_vec().unwrap()) + .unwrap(); + } + /// Commit the genesis state. Typically, you'll want to call this after /// setting up the initial state, before running a transaction. pub fn commit_genesis(&mut self) { @@ -186,19 +221,6 @@ impl TestTxEnv { .unwrap(); } - /// Set public key for the address. - pub fn write_public_key( - &mut self, - address: &Address, - public_key: &key::common::PublicKey, - ) { - let storage_key = key::pk_key(address); - self.wl_storage - .storage - .write(&storage_key, public_key.try_to_vec().unwrap()) - .unwrap(); - } - /// Apply the tx changes to the write log. pub fn execute_tx(&mut self) -> Result<(), Error> { wasm::run::tx( diff --git a/tests/src/vm_host_env/vp.rs b/tests/src/vm_host_env/vp.rs index 02561dbc9a7..890d0681d8b 100644 --- a/tests/src/vm_host_env/vp.rs +++ b/tests/src/vm_host_env/vp.rs @@ -69,7 +69,7 @@ impl Default for TestVpEnv { storage: TestStorage::default(), write_log: WriteLog::default(), }; - let mut tx = Tx::new(TxType::Raw); + let mut tx = Tx::from_type(TxType::Raw); tx.header.chain_id = wl_storage.storage.chain_id.clone(); Self { addr: address::testing::established_address_1(), diff --git a/tx_prelude/src/account.rs b/tx_prelude/src/account.rs new file mode 100644 index 00000000000..da6c213601e --- /dev/null +++ b/tx_prelude/src/account.rs @@ -0,0 +1,18 @@ +use namada_core::types::transaction::account::InitAccount; + +use super::*; + +pub fn init_account( + ctx: &mut Ctx, + owner: &Address, + data: InitAccount, +) -> EnvResult
{ + storage_api::account::init_account_storage( + ctx, + owner, + &data.public_keys, + data.threshold, + )?; + + Ok(owner.to_owned()) +} diff --git a/tx_prelude/src/lib.rs b/tx_prelude/src/lib.rs index 6e5a0192c87..cd2f5d5f92d 100644 --- a/tx_prelude/src/lib.rs +++ b/tx_prelude/src/lib.rs @@ -6,6 +6,7 @@ #![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::private_intra_doc_links)] +pub mod account; pub mod ibc; pub mod key; pub mod proof_of_stake; @@ -18,7 +19,6 @@ pub use borsh::{BorshDeserialize, BorshSerialize}; pub use namada_core::ledger::eth_bridge; pub use namada_core::ledger::governance::storage as gov_storage; pub use namada_core::ledger::parameters::storage as parameters_storage; -pub use namada_core::ledger::slash_fund::storage as slash_fund_storage; pub use namada_core::ledger::storage::types::encode; pub use namada_core::ledger::storage_api::{ self, governance, iter_prefix, iter_prefix_bytes, Error, OptionExt, diff --git a/tx_prelude/src/proof_of_stake.rs b/tx_prelude/src/proof_of_stake.rs index 48b0cb665f4..cc8bcb7b630 100644 --- a/tx_prelude/src/proof_of_stake.rs +++ b/tx_prelude/src/proof_of_stake.rs @@ -2,7 +2,7 @@ use namada_core::types::dec::Dec; use namada_core::types::hash::Hash; -use namada_core::types::transaction::InitValidator; +use namada_core::types::transaction::pos::InitValidator; use namada_core::types::{key, token}; pub use namada_proof_of_stake::parameters::PosParams; use namada_proof_of_stake::{ @@ -74,7 +74,8 @@ impl Ctx { pub fn init_validator( &mut self, InitValidator { - account_key, + account_keys, + threshold, consensus_key, eth_cold_key, eth_hot_key, @@ -89,8 +90,12 @@ impl Ctx { let current_epoch = self.get_block_epoch()?; // Init validator account let validator_address = self.init_account(validator_vp_code_hash)?; - let pk_key = key::pk_key(&validator_address); - self.write(&pk_key, &account_key)?; + storage_api::account::init_account_storage( + self, + &validator_address, + &account_keys, + threshold, + )?; let protocol_pk_key = key::protocol_pk_key(&validator_address); self.write(&protocol_pk_key, &protocol_key)?; let dkg_pk_key = key::dkg_session_keys::dkg_pk_key(&validator_address); diff --git a/vp_prelude/src/lib.rs b/vp_prelude/src/lib.rs index 8ec55ef7cd1..c8e555a87bc 100644 --- a/vp_prelude/src/lib.rs +++ b/vp_prelude/src/lib.rs @@ -6,8 +6,6 @@ #![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::private_intra_doc_links)] -pub mod key; - // used in the VP input use core::convert::AsRef; use core::slice; @@ -74,11 +72,32 @@ pub fn log_string>(msg: T) { /// Checks if a proposal id is being executed pub fn is_proposal_accepted(ctx: &Ctx, proposal_id: u64) -> VpResult { let proposal_execution_key = - gov_storage::get_proposal_execution_key(proposal_id); + gov_storage::keys::get_proposal_execution_key(proposal_id); ctx.has_key_pre(&proposal_execution_key) } +/// Verify section signatures +pub fn verify_signatures(ctx: &Ctx, tx: &Tx, owner: &Address) -> VpResult { + let max_signatures_per_transaction = + parameters::max_signatures_per_transaction(&ctx.pre())?; + + let public_keys_index_map = + storage_api::account::public_keys_index_map(&ctx.pre(), owner)?; + let threshold = + storage_api::account::threshold(&ctx.pre(), owner)?.unwrap_or(1); + + let targets = &[*tx.data_sechash(), *tx.code_sechash()]; + tx.verify_section_signatures( + targets, + public_keys_index_map, + threshold, + max_signatures_per_transaction, + ) + .map_err(|_e| Error::SimpleMessage("Invalid signatures")) + .map(|_| true) +} + /// Checks whether a transaction is valid, which happens in two cases: /// - tx is whitelisted, or /// - tx is executed by an approved governance proposal (no need to be diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index a413f7b2fbf..be65562b6d4 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -278,28 +278,6 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.16", -] - [[package]] name = "async-trait" version = "0.1.68" @@ -311,22 +289,6 @@ dependencies = [ "syn 2.0.16", ] -[[package]] -name = "async-tungstenite" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00550829ef8e2c4115250d0ee43305649b0fa95f78a32ce5b07da0b73d95c5c" -dependencies = [ - "futures-io", - "futures-util", - "log", - "pin-project-lite", - "tokio", - "tokio-rustls 0.22.0", - "tungstenite", - "webpki-roots 0.21.1", -] - [[package]] name = "async_io_stream" version = "0.3.3" @@ -356,51 +318,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "axum" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" -dependencies = [ - "async-trait", - "axum-core", - "bitflags 1.3.2", - "bytes", - "futures-util", - "http", - "http-body", - "hyper", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "mime", - "rustversion", - "tower-layer", - "tower-service", -] - [[package]] name = "backtrace" version = "0.3.67" @@ -416,12 +333,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base16ct" version = "0.2.0" @@ -464,12 +375,6 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - [[package]] name = "bellman" version = "0.13.1" @@ -533,39 +438,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -[[package]] -name = "bitcoin" -version = "0.29.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0694ea59225b0c5f3cb405ff3f670e4828358ed26aec49dc352f730f0cb1a8a3" -dependencies = [ - "bech32 0.9.1", - "bitcoin_hashes", - "secp256k1", - "serde", -] - -[[package]] -name = "bitcoin_hashes" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" -dependencies = [ - "serde", -] - [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bitflags" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" - [[package]] name = "bitvec" version = "0.17.4" @@ -706,17 +584,40 @@ name = "borsh" version = "0.9.4" source = "git+https://github.com/heliaxdev/borsh-rs.git?rev=cd5223e5103c4f139e0c54cf8259b7ec5ec4073a#cd5223e5103c4f139e0c54cf8259b7ec5ec4073a" dependencies = [ - "borsh-derive", + "borsh-derive 0.9.4", "hashbrown 0.11.2", ] +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown 0.12.3", +] + [[package]] name = "borsh-derive" version = "0.9.4" source = "git+https://github.com/heliaxdev/borsh-rs.git?rev=cd5223e5103c4f139e0c54cf8259b7ec5ec4073a#cd5223e5103c4f139e0c54cf8259b7ec5ec4073a" dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", + "borsh-derive-internal 0.9.4", + "borsh-schema-derive-internal 0.9.4", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", "proc-macro-crate 0.1.5", "proc-macro2", "syn 1.0.109", @@ -732,6 +633,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "borsh-schema-derive-internal" version = "0.9.4" @@ -742,6 +654,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bs58" version = "0.4.0" @@ -791,12 +714,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytecount" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" - [[package]] name = "byteorder" version = "1.4.3" @@ -830,19 +747,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cargo_metadata" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.17", - "serde", - "serde_json", -] - [[package]] name = "cargo_metadata" version = "0.15.4" @@ -953,18 +857,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.11" +version = "4.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d" +checksum = "5fd304a20bff958a57f04c4e96a2e7594cc4490a0e809cbd48bb6437edaa452d" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.3.11" +version = "4.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b" +checksum = "01c6a3f08f1fe5662a35cfe393aec09c4df95f60ee93b7556505260f75eee9e1" dependencies = [ "anstream", "anstyle", @@ -995,7 +899,7 @@ dependencies = [ "digest 0.10.6", "getrandom 0.2.9", "hmac 0.12.1", - "k256 0.13.1", + "k256", "lazy_static", "serde", "sha2 0.10.6", @@ -1254,18 +1158,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.2" @@ -1408,15 +1300,6 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", -] - [[package]] name = "der" version = "0.7.7" @@ -1494,16 +1377,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.3.7" @@ -1515,17 +1388,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "displaydoc" version = "0.2.4" @@ -1555,7 +1417,7 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" dependencies = [ - "bitflags 1.3.2", + "bitflags", "byteorder", "lazy_static", "proc-macro-error", @@ -1575,28 +1437,16 @@ dependencies = [ "memmap2", ] -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" dependencies = [ - "der 0.7.7", + "der", "digest 0.10.6", - "elliptic-curve 0.13.5", - "rfc6979 0.4.0", + "elliptic-curve", + "rfc6979", "signature 2.1.0", "spki", ] @@ -1642,58 +1492,27 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ed25519-dalek-bip32" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" -dependencies = [ - "derivation-path", - "ed25519-dalek", - "hmac 0.12.1", - "sha2 0.10.6", -] - [[package]] name = "either" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.6", - "ff 0.12.1", - "generic-array 0.14.7", - "group 0.12.1", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "elliptic-curve" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.2", + "base16ct", + "crypto-bigint", "digest 0.10.6", "ff 0.13.0", "generic-array 0.14.7", "group 0.13.0", "pkcs8", "rand_core 0.6.4", - "sec1 0.7.2", + "sec1", "subtle 2.4.1", "zeroize", ] @@ -1716,7 +1535,7 @@ dependencies = [ "base64 0.13.1", "bytes", "hex", - "k256 0.13.1", + "k256", "log", "rand 0.8.5", "rlp", @@ -1802,15 +1621,6 @@ dependencies = [ "libc", ] -[[package]] -name = "error-chain" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" -dependencies = [ - "version_check", -] - [[package]] name = "eth-keystore" version = "0.5.0" @@ -1830,7 +1640,7 @@ dependencies = [ "sha2 0.10.6", "sha3", "thiserror", - "uuid 0.8.2", + "uuid", ] [[package]] @@ -2031,13 +1841,13 @@ checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" dependencies = [ "arrayvec", "bytes", - "cargo_metadata 0.15.4", + "cargo_metadata", "chrono", - "elliptic-curve 0.13.5", + "elliptic-curve", "ethabi", "generic-array 0.14.7", "hex", - "k256 0.13.1", + "k256", "num_enum", "once_cell", "open-fastrlp", @@ -2140,7 +1950,7 @@ dependencies = [ "async-trait", "coins-bip32", "coins-bip39", - "elliptic-curve 0.13.5", + "elliptic-curve", "eth-keystore", "ethers-core", "hex", @@ -2197,7 +2007,7 @@ dependencies = [ "bincode", "blake2", "blake2b_simd", - "borsh", + "borsh 0.9.4", "digest 0.10.6", "ed25519-dalek", "either", @@ -2496,12 +2306,6 @@ version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - [[package]] name = "gloo-timers" version = "0.2.6" @@ -2639,15 +2443,6 @@ dependencies = [ "fxhash", ] -[[package]] -name = "hdpath" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ae1615f843ce3981b47468f3f7c435ac17deb33c2261e64d7f1e87f5c11acc" -dependencies = [ - "byteorder", -] - [[package]] name = "headers" version = "0.3.8" @@ -2655,7 +2450,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ "base64 0.13.1", - "bitflags 1.3.2", + "bitflags", "bytes", "headers-core", "http", @@ -2801,22 +2596,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "humantime-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" -dependencies = [ - "humantime", - "serde", -] - [[package]] name = "hyper" version = "0.14.26" @@ -2853,9 +2632,9 @@ dependencies = [ "http", "hyper", "hyper-rustls", - "rustls-native-certs 0.5.0", + "rustls-native-certs", "tokio", - "tokio-rustls 0.22.0", + "tokio-rustls", "tower-service", "webpki 0.21.4", ] @@ -2871,25 +2650,13 @@ dependencies = [ "hyper", "log", "rustls 0.19.1", - "rustls-native-certs 0.5.0", + "rustls-native-certs", "tokio", - "tokio-rustls 0.22.0", + "tokio-rustls", "webpki 0.21.4", "webpki-roots 0.21.1", ] -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - [[package]] name = "iana-time-zone" version = "0.1.56" @@ -2915,8 +2682,8 @@ dependencies = [ [[package]] name = "ibc" -version = "0.36.0" -source = "git+https://github.com/heliaxdev/cosmos-ibc-rs.git?rev=634f4ede136d045dd6f1ff8f4984dd0006aa15f0#634f4ede136d045dd6f1ff8f4984dd0006aa15f0" +version = "0.41.0" +source = "git+https://github.com/heliaxdev/cosmos-ibc-rs.git?rev=38a827d3901e590b2935ee5b6b81b4d67c399560#38a827d3901e590b2935ee5b6b81b4d67c399560" dependencies = [ "bytes", "cfg-if 1.0.0", @@ -2947,113 +2714,26 @@ dependencies = [ [[package]] name = "ibc-proto" -version = "0.26.0" -source = "git+https://github.com/heliaxdev/ibc-proto-rs.git?rev=bb16e17a4d9260d5f20516a8eda43fa52377fad2#bb16e17a4d9260d5f20516a8eda43fa52377fad2" +version = "0.30.0" +source = "git+https://github.com/heliaxdev/ibc-proto-rs.git?rev=31892ee743b2af017d5629b2af419ee20b6100c7#31892ee743b2af017d5629b2af419ee20b6100c7" dependencies = [ - "base64 0.13.1", + "base64 0.21.0", + "borsh 0.10.3", "bytes", "flex-error", + "parity-scale-codec", "prost", + "scale-info", "serde", "subtle-encoding", "tendermint-proto", - "tonic", ] [[package]] -name = "ibc-relayer" -version = "0.22.0" -source = "git+https://github.com/heliaxdev/hermes.git?rev=fea6928dace1af3e38c5b223f933c1d07720811d#fea6928dace1af3e38c5b223f933c1d07720811d" -dependencies = [ - "anyhow", - "async-stream", - "bech32 0.9.1", - "bitcoin", - "bs58", - "bytes", - "crossbeam-channel 0.5.8", - "digest 0.10.6", - "dirs-next", - "ed25519", - "ed25519-dalek", - "ed25519-dalek-bip32", - "flex-error", - "futures", - "generic-array 0.14.7", - "hdpath", - "hex", - "http", - "humantime", - "humantime-serde", - "ibc-proto", - "ibc-relayer-types", - "itertools", - "moka", - "num-bigint 0.4.3", - "num-rational 0.4.1", - "prost", - "regex", - "retry", - "ripemd", - "secp256k1", - "semver 1.0.17", - "serde", - "serde_derive", - "serde_json", - "sha2 0.10.6", - "signature 1.6.4", - "strum", - "subtle-encoding", - "tendermint", - "tendermint-light-client", - "tendermint-light-client-verifier", - "tendermint-proto", - "tendermint-rpc", - "thiserror", - "tiny-bip39 1.0.0", - "tiny-keccak", - "tokio", - "toml 0.5.11", - "tonic", - "tracing", - "uuid 1.3.2", -] - -[[package]] -name = "ibc-relayer-types" -version = "0.22.0" -source = "git+https://github.com/heliaxdev/hermes.git?rev=fea6928dace1af3e38c5b223f933c1d07720811d#fea6928dace1af3e38c5b223f933c1d07720811d" -dependencies = [ - "bytes", - "derive_more", - "dyn-clone", - "erased-serde", - "flex-error", - "ibc-proto", - "ics23", - "itertools", - "num-rational 0.4.1", - "primitive-types", - "prost", - "safe-regex", - "serde", - "serde_derive", - "serde_json", - "subtle-encoding", - "tendermint", - "tendermint-light-client-verifier", - "tendermint-proto", - "tendermint-rpc", - "tendermint-testgen", - "time", - "uint", -] - -[[package]] -name = "ics23" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca44b684ce1859cff746ff46f5765ab72e12e3c06f76a8356db8f9a2ecf43f17" +name = "ics23" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca44b684ce1859cff746ff46f5765ab72e12e3c06f76a8356db8f9a2ecf43f17" dependencies = [ "anyhow", "bytes", @@ -3149,7 +2829,7 @@ name = "index-set" version = "0.7.1" source = "git+https://github.com/heliaxdev/index-set?tag=v0.7.1#dc24cdbbe3664514d59f1a4c4031863fc565f1c2" dependencies = [ - "borsh", + "borsh 0.9.4", "serde", ] @@ -3183,15 +2863,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "input_buffer" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" -dependencies = [ - "bytes", -] - [[package]] name = "instant" version = "0.1.12" @@ -3232,12 +2903,13 @@ checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", - "rustix 0.38.4", + "io-lifetimes", + "rustix", "windows-sys 0.48.0", ] @@ -3279,18 +2951,6 @@ dependencies = [ "subtle 2.4.1", ] -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if 1.0.0", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.6", -] - [[package]] name = "k256" version = "0.13.1" @@ -3298,8 +2958,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if 1.0.0", - "ecdsa 0.16.7", - "elliptic-curve 0.13.5", + "ecdsa", + "elliptic-curve", "once_cell", "sha2 0.10.6", "signature 2.1.0", @@ -3328,9 +2988,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libloading" @@ -3414,12 +3074,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" -[[package]] -name = "linux-raw-sys" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" - [[package]] name = "lock_api" version = "0.4.9" @@ -3471,7 +3125,7 @@ name = "masp_note_encryption" version = "0.2.0" source = "git+https://github.com/anoma/masp?rev=252a6059565b125c1444e9e7d0b7c8da0fba8f8f#252a6059565b125c1444e9e7d0b7c8da0fba8f8f" dependencies = [ - "borsh", + "borsh 0.9.4", "chacha20 0.9.1", "chacha20poly1305", "cipher 0.4.4", @@ -3490,7 +3144,7 @@ dependencies = [ "blake2b_simd", "blake2s_simd", "bls12_381", - "borsh", + "borsh 0.9.4", "byteorder", "ff 0.12.1", "fpe", @@ -3539,12 +3193,6 @@ dependencies = [ "regex-automata", ] -[[package]] -name = "matchit" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" - [[package]] name = "maybe-uninit" version = "2.0.0" @@ -3670,29 +3318,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94c7128ba23c81f6471141b90f17654f89ef44a56e14b8a4dd0fddfccd655277" -[[package]] -name = "moka" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b9268097a2cf211ac9955b1cc95e80fa84fff5c2d13ba292916445dc8a311f" -dependencies = [ - "crossbeam-channel 0.5.8", - "crossbeam-epoch", - "crossbeam-utils 0.8.15", - "num_cpus", - "once_cell", - "parking_lot", - "quanta", - "rustc_version 0.4.0", - "scheduled-thread-pool", - "skeptic", - "smallvec", - "tagptr", - "thiserror", - "triomphe", - "uuid 1.3.2", -] - [[package]] name = "more-asserts" version = "0.2.2" @@ -3707,11 +3332,11 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "namada" -version = "0.20.1" +version = "0.21.1" dependencies = [ "async-trait", "bimap", - "borsh", + "borsh 0.9.4", "circular-queue", "clru", "data-encoding", @@ -3748,7 +3373,7 @@ dependencies = [ "tempfile", "tendermint-rpc", "thiserror", - "tiny-bip39 0.8.2", + "tiny-bip39", "tiny-hderive", "tokio", "toml 0.5.11", @@ -3767,13 +3392,13 @@ dependencies = [ [[package]] name = "namada_core" -version = "0.20.1" +version = "0.21.1" dependencies = [ "ark-bls12-381", "ark-ec", "ark-serialize", "bech32 0.8.1", - "borsh", + "borsh 0.9.4", "chrono", "data-encoding", "derivative", @@ -3819,9 +3444,9 @@ dependencies = [ [[package]] name = "namada_ethereum_bridge" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "ethers", "eyre", "itertools", @@ -3839,7 +3464,7 @@ dependencies = [ [[package]] name = "namada_macros" -version = "0.20.1" +version = "0.21.1" dependencies = [ "proc-macro2", "quote", @@ -3848,9 +3473,9 @@ dependencies = [ [[package]] name = "namada_proof_of_stake" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "data-encoding", "derivative", "namada_core", @@ -3862,16 +3487,16 @@ dependencies = [ [[package]] name = "namada_test_utils" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "namada_core", "strum", ] [[package]] name = "namada_tests" -version = "0.20.1" +version = "0.21.1" dependencies = [ "async-trait", "chrono", @@ -3879,8 +3504,6 @@ dependencies = [ "concat-idents", "derivative", "hyper", - "ibc-relayer", - "ibc-relayer-types", "lazy_static", "namada", "namada_core", @@ -3890,9 +3513,11 @@ dependencies = [ "num-traits", "prost", "regex", + "serde", "serde_json", "sha2 0.9.9", "tempfile", + "tendermint-light-client", "test-log", "tokio", "tracing", @@ -3901,9 +3526,9 @@ dependencies = [ [[package]] name = "namada_tx_prelude" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "masp_primitives", "namada_core", "namada_macros", @@ -3915,18 +3540,18 @@ dependencies = [ [[package]] name = "namada_vm_env" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "masp_primitives", "namada_core", ] [[package]] name = "namada_vp_prelude" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "namada_core", "namada_macros", "namada_proof_of_stake", @@ -3937,9 +3562,9 @@ dependencies = [ [[package]] name = "namada_wasm" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "getrandom 0.2.9", "masp_primitives", "namada", @@ -4009,7 +3634,6 @@ dependencies = [ "autocfg", "num-integer", "num-traits", - "serde", ] [[package]] @@ -4085,7 +3709,6 @@ dependencies = [ "num-bigint 0.4.3", "num-integer", "num-traits", - "serde", ] [[package]] @@ -4462,7 +4085,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.7", + "der", "spki", ] @@ -4576,7 +4199,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" dependencies = [ "bit-set", - "bitflags 1.3.2", + "bitflags", "byteorder", "lazy_static", "num-traits", @@ -4663,33 +4286,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "pulldown-cmark" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9cc634bc78768157b5cbfe988ffcd1dcba95cd2b2f03a88316c08c6d00ed63" -dependencies = [ - "bitflags 1.3.2", - "memchr", - "unicase", -] - -[[package]] -name = "quanta" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e31331286705f455e56cca62e0e717158474ff02b7936c1fa596d983f4ae27" -dependencies = [ - "crossbeam-utils 0.8.15", - "libc", - "mach", - "once_cell", - "raw-cpuid", - "wasi 0.10.2+wasi-snapshot-preview1", - "web-sys", - "winapi", -] - [[package]] name = "quick-error" version = "1.2.3" @@ -4797,15 +4393,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "raw-cpuid" -version = "10.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "rayon" version = "1.5.3" @@ -4852,7 +4439,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] @@ -4861,7 +4448,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] @@ -4924,7 +4511,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" dependencies = [ - "bitflags 1.3.2", + "bitflags", "libc", "mach", "winapi", @@ -4973,23 +4560,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "retry" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9166d72162de3575f950507683fac47e30f6f2c3836b71b7fbc61aa517c9c5f4" - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac 0.12.1", - "zeroize", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -5024,17 +4594,6 @@ dependencies = [ "digest 0.10.6", ] -[[package]] -name = "ripemd160" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - [[package]] name = "rkyv" version = "0.7.41" @@ -5124,24 +4683,11 @@ version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ - "bitflags 1.3.2", + "bitflags", "errno", "io-lifetimes", "libc", - "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" -dependencies = [ - "bitflags 2.3.3", - "errno", - "libc", - "linux-raw-sys 0.4.3", + "linux-raw-sys", "windows-sys 0.48.0", ] @@ -5182,27 +4728,6 @@ dependencies = [ "security-framework", ] -[[package]] -name = "rustls-native-certs" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" -dependencies = [ - "base64 0.21.0", -] - [[package]] name = "rustversion" version = "1.0.12" @@ -5325,15 +4850,6 @@ dependencies = [ "windows-sys 0.42.0", ] -[[package]] -name = "scheduled-thread-pool" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" -dependencies = [ - "parking_lot", -] - [[package]] name = "scopeguard" version = "1.1.0" @@ -5378,61 +4894,27 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.7", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "sec1" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" dependencies = [ - "base16ct 0.2.0", - "der 0.7.7", + "base16ct", + "der", "generic-array 0.14.7", "pkcs8", "subtle 2.4.1", "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" -dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "secp256k1-sys", - "serde", -] - -[[package]] -name = "secp256k1-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" -dependencies = [ - "cc", -] - [[package]] name = "security-framework" version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -5570,19 +5052,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - [[package]] name = "sha1" version = "0.10.5" @@ -5663,10 +5132,6 @@ name = "signature" version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.6", - "rand_core 0.6.4", -] [[package]] name = "signature" @@ -5690,21 +5155,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc47a29ce97772ca5c927f75bac34866b16d64e07f330c3248e2d7226623901b" -[[package]] -name = "skeptic" -version = "0.13.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" -dependencies = [ - "bytecount", - "cargo_metadata 0.14.2", - "error-chain", - "glob", - "pulldown-cmark", - "tempfile", - "walkdir", -] - [[package]] name = "slab" version = "0.4.8" @@ -5744,7 +5194,7 @@ name = "sparse-merkle-tree" version = "0.3.1-pre" source = "git+https://github.com/heliaxdev/sparse-merkle-tree?rev=e086b235ed6e68929bf73f617dd61cd17b000a56#e086b235ed6e68929bf73f617dd61cd17b000a56" dependencies = [ - "borsh", + "borsh 0.9.4", "cfg-if 1.0.0", "ics23", "sha2 0.9.9", @@ -5763,7 +5213,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", - "der 0.7.7", + "der", ] [[package]] @@ -5868,18 +5318,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - [[package]] name = "tap" version = "1.0.1" @@ -5901,7 +5339,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.19", + "rustix", "windows-sys 0.45.0", ] @@ -5916,12 +5354,10 @@ dependencies = [ "ed25519-dalek", "flex-error", "futures", - "k256 0.11.6", "num-traits", "once_cell", "prost", "prost-types", - "ripemd160", "serde", "serde_bytes", "serde_json", @@ -6004,7 +5440,6 @@ version = "0.23.6" source = "git+https://github.com/heliaxdev/tendermint-rs.git?rev=b7d1e5afc6f2ccb3fd1545c2174bab1cc48d7fa7#b7d1e5afc6f2ccb3fd1545c2174bab1cc48d7fa7" dependencies = [ "async-trait", - "async-tungstenite", "bytes", "flex-error", "futures", @@ -6027,7 +5462,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid 0.8.2", + "uuid", "walkdir", ] @@ -6131,25 +5566,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "tiny-bip39" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" -dependencies = [ - "anyhow", - "hmac 0.12.1", - "once_cell", - "pbkdf2 0.11.0", - "rand 0.8.5", - "rustc-hash", - "sha2 0.10.6", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - [[package]] name = "tiny-hderive" version = "0.3.0" @@ -6206,16 +5622,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-macros" version = "2.1.0" @@ -6238,28 +5644,6 @@ dependencies = [ "webpki 0.21.4", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki 0.22.0", -] - -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.8" @@ -6317,41 +5701,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tonic" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.13.1", - "bytes", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost", - "prost-derive", - "rustls-native-certs 0.6.2", - "rustls-pemfile", - "tokio", - "tokio-rustls 0.23.4", - "tokio-stream", - "tokio-util", - "tower", - "tower-layer", - "tower-service", - "tracing", - "tracing-futures", -] - [[package]] name = "tonic-build" version = "0.8.4" @@ -6365,32 +5714,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - [[package]] name = "tower-service" version = "0.3.2" @@ -6455,42 +5778,17 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "triomphe" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1ee9bd9239c339d714d657fac840c6d2a4f9c45f4f9ec7b0975113458be78db" - [[package]] name = "try-lock" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" -[[package]] -name = "tungstenite" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" -dependencies = [ - "base64 0.13.1", - "byteorder", - "bytes", - "http", - "httparse", - "input_buffer", - "log", - "rand 0.8.5", - "sha-1", - "url", - "utf-8", -] - [[package]] name = "tx_template" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "getrandom 0.2.9", "namada_tests", "namada_tx_prelude", @@ -6527,15 +5825,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.13" @@ -6596,12 +5885,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8parse" version = "0.2.1" @@ -6618,15 +5901,6 @@ dependencies = [ "serde", ] -[[package]] -name = "uuid" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2" -dependencies = [ - "getrandom 0.2.9", -] - [[package]] name = "version_check" version = "0.9.4" @@ -6635,9 +5909,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vp_template" -version = "0.20.1" +version = "0.21.1" dependencies = [ - "borsh", + "borsh 0.9.4", "getrandom 0.2.9", "namada_tests", "namada_vp_prelude", @@ -6679,12 +5953,6 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/wasm/checksums.json b/wasm/checksums.json index cb9ca8ed52d..71b5580e4ac 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.08cedac1d825cd8ee9b04ef059bc68fee04f82fec57e0f6bc38123de8fb35b85.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.c9ef2bdb19910e12eadabc7f0552b45c937bcf1f47ca09759e52112b68d94114.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.2be60082c6b891cb437b4392e1b2570f5d92fed35dd624cd079ea48c4bc7902c.wasm", - "tx_ibc.wasm": "tx_ibc.f8056f465d17043d2864309d1c50a897a028b6ebf9702e5c403e1bf8c670f6e6.wasm", - "tx_init_account.wasm": "tx_init_account.e91ab25cebd15af9a958eca4a34ba287804b1ff6ba4c82fc941f7f50816e9c4d.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.1683eb9a2b2616af21f4f55457f7e06e0ae0591f460ede412a548ea9b1ab694c.wasm", - "tx_init_validator.wasm": "tx_init_validator.67574f70c1f76c2c68498d17323793366c13d119480b6787c8c5ede312e51da0.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.e6375abba3f750700c06fbdeb2d5edec22b6a382116a67a7f9d7f7ba49f134e1.wasm", - "tx_transfer.wasm": "tx_transfer.e65b47bc94c5a09e3edc68298ad0e5e35041b91bc4d679bf5b7f433dffdce58e.wasm", - "tx_unbond.wasm": "tx_unbond.4fd70d297ccedb369bf88d8a8459a47ea733d329410387a6f80a0e026c6e480d.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.b8e7204b14e15a3c395432f35788eca45ef4332916d96dfba87627a5717916de.wasm", - "tx_update_vp.wasm": "tx_update_vp.65c5ca3e48fdef70e696460eca7540cf6196511d76fb2465133b145409329b3e.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.e0a003d922230d32b741b57ca18913cbc4d5d2290f02cb37dfdaa7f27cebb486.wasm", - "tx_withdraw.wasm": "tx_withdraw.40499cb0e268d3cc3d9bca5dacca05d8df35f5b90adf4087a5171505472d921a.wasm", - "vp_implicit.wasm": "vp_implicit.57af3b7d2ee9e2c9d7ef1e33a85646abeea7ea02dad19b7e0b20b289de5a7ae9.wasm", - "vp_masp.wasm": "vp_masp.4d656f775b7462095e7d9ff533e346829fad02568b1cf92fa2f99cc0677720ce.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.b0c855f0356a468db1d26baebc988508d4824836b86adb94ac432368feb03ac4.wasm", - "vp_user.wasm": "vp_user.31967a7411caf61729e46840eec90d2db386cf4745f49d59086a43cc3c3e2d39.wasm", - "vp_validator.wasm": "vp_validator.0bca8e34f5d51c74b2861d588e3dd6a8e61de7c63d356af63e2182e030ac42ee.wasm" + "tx_bond.wasm": "tx_bond.0967203d10b78f7f28c3e1d674c0ff3ec25ec00e9b3a4010648c5cc381ad52ec.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.c6dd30e79edff950016f495cee946bc6c0d6847f89322fbf733c89bb768c1fd4.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.1e89cf7f091a324872582c1092f2bda662be21040ac796d8aca08d08e9332a3e.wasm", + "tx_ibc.wasm": "tx_ibc.2b35a3a35049fe267121906176bafc0ea2b221a185fe31652216f93da66209e7.wasm", + "tx_init_account.wasm": "tx_init_account.6e77218b385a386f49c65c13b6112c75dcb06c50cf7bf7a5a479e7e8b7b458fa.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.d0c969c6b7a3d262d82586c630f29a00e587653fa9df1cf17021914764d4d3ab.wasm", + "tx_init_validator.wasm": "tx_init_validator.df780e2cc9ab4a5726931b662fd75cad907e495745aec1c466877878cee1ae3a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.062b11c679a35e50f7fcfca95e3ada01bc89098591ae92526cfafaab5adf954e.wasm", + "tx_transfer.wasm": "tx_transfer.5f9e5a2f85fa5c1ec2bbb0aa9bebaba6bddc7e777ca956f5d980ad1cc9af3e7e.wasm", + "tx_unbond.wasm": "tx_unbond.dc169426d36f2bcfd82d976e77e2f3beb85ac98e75652ddf8367fa081fb17b3d.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.23d1b075f28d5fa3ee413ee4db31792a2714d9b21929cbf1ba59832c3adec886.wasm", + "tx_update_account.wasm": "tx_update_account.88646c9fb5d3327701d69b12ce49ae35431ebe2ea3691900874cad66791f1ca9.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.c9abcd6f37d59daf9a39e30dcebd9e0789d5bcd679f5931ed7899073d0a5d36f.wasm", + "tx_withdraw.wasm": "tx_withdraw.02ac0399bc5b745346641facd968607931bf9abf67d7ed336b6b0540360f2d43.wasm", + "vp_implicit.wasm": "vp_implicit.1d212280efc3fccc16de9497dae8cc1670f21f0e0ce4c3bd9fc58fc816037cdf.wasm", + "vp_masp.wasm": "vp_masp.1d264f4ba602df546011ae4040da00bd0b103c6bad62ee5de985940e8bf0c2e7.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.d279129573a4f0625f411c7b147ac94bc40e0db2ea04b777f29e57be33a53522.wasm", + "vp_user.wasm": "vp_user.788b8039744b73bd6fe2b67b273802bae4c26cd117092eb8437f455d5aa95dbd.wasm", + "vp_validator.wasm": "vp_validator.98457b70476c76a16b1cd28232bacf043438bfd5e054bc9f7651ef1747e48594.wasm" } \ No newline at end of file diff --git a/wasm/tx_template/Cargo.toml b/wasm/tx_template/Cargo.toml index ab661039f92..aece3dba98a 100644 --- a/wasm/tx_template/Cargo.toml +++ b/wasm/tx_template/Cargo.toml @@ -4,7 +4,7 @@ edition = "2021" license = "GPL-3.0" name = "tx_template" resolver = "2" -version = "0.20.1" +version = "0.21.1" [lib] crate-type = ["cdylib"] diff --git a/wasm/tx_template/src/lib.rs b/wasm/tx_template/src/lib.rs index 4a147833258..5b0f8fb501c 100644 --- a/wasm/tx_template/src/lib.rs +++ b/wasm/tx_template/src/lib.rs @@ -19,7 +19,7 @@ mod tests { // The environment must be initialized first tx_host_env::init(); - let tx = Tx::new(TxType::Raw); + let tx = Tx::from_type(TxType::Raw); apply_tx(ctx(), tx).unwrap(); let env = tx_host_env::take(); diff --git a/wasm/vp_template/Cargo.toml b/wasm/vp_template/Cargo.toml index 5d2ecf553eb..f5286efeef0 100644 --- a/wasm/vp_template/Cargo.toml +++ b/wasm/vp_template/Cargo.toml @@ -4,7 +4,7 @@ edition = "2021" license = "GPL-3.0" name = "vp_template" resolver = "2" -version = "0.20.1" +version = "0.21.1" [lib] crate-type = ["cdylib"] diff --git a/wasm/wasm_source/Cargo.toml b/wasm/wasm_source/Cargo.toml index d25f6d8b9ad..e5ca25f581a 100644 --- a/wasm/wasm_source/Cargo.toml +++ b/wasm/wasm_source/Cargo.toml @@ -4,7 +4,7 @@ edition = "2021" license = "GPL-3.0" name = "namada_wasm" resolver = "2" -version = "0.20.1" +version = "0.21.1" [lib] crate-type = ["cdylib"] @@ -24,7 +24,7 @@ tx_reveal_pk = ["namada_tx_prelude"] tx_transfer = ["namada_tx_prelude"] tx_unbond = ["namada_tx_prelude"] tx_unjail_validator = ["namada_tx_prelude"] -tx_update_vp = ["namada_tx_prelude"] +tx_update_account = ["namada_tx_prelude"] tx_vote_proposal = ["namada_tx_prelude"] tx_withdraw = ["namada_tx_prelude"] vp_implicit = ["namada_vp_prelude", "once_cell"] diff --git a/wasm/wasm_source/Makefile b/wasm/wasm_source/Makefile index f394179dc70..a88065355fc 100644 --- a/wasm/wasm_source/Makefile +++ b/wasm/wasm_source/Makefile @@ -16,7 +16,7 @@ wasms += tx_reveal_pk wasms += tx_transfer wasms += tx_unbond wasms += tx_unjail_validator -wasms += tx_update_vp +wasms += tx_update_account wasms += tx_vote_proposal wasms += tx_withdraw wasms += vp_implicit diff --git a/wasm/wasm_source/src/lib.rs b/wasm/wasm_source/src/lib.rs index 2fc69f65c91..ce5b1b15618 100644 --- a/wasm/wasm_source/src/lib.rs +++ b/wasm/wasm_source/src/lib.rs @@ -20,8 +20,8 @@ pub mod tx_transfer; pub mod tx_unbond; #[cfg(feature = "tx_unjail_validator")] pub mod tx_unjail_validator; -#[cfg(feature = "tx_update_vp")] -pub mod tx_update_vp; +#[cfg(feature = "tx_update_account")] +pub mod tx_update_account; #[cfg(feature = "tx_vote_proposal")] pub mod tx_vote_proposal; #[cfg(feature = "tx_withdraw")] diff --git a/wasm/wasm_source/src/tx_bond.rs b/wasm/wasm_source/src/tx_bond.rs index 33d004591b2..f9a6ab9c60e 100644 --- a/wasm/wasm_source/src/tx_bond.rs +++ b/wasm/wasm_source/src/tx_bond.rs @@ -22,10 +22,8 @@ mod tests { bond_handle, read_consensus_validator_set_addresses_with_stake, read_total_stake, read_validator_stake, }; - use namada::proto::{Code, Data, Signature, Tx}; use namada::types::dec::Dec; use namada::types::storage::Epoch; - use namada::types::transaction::TxType; use namada_tests::log::test; use namada_tests::native_vp::pos::init_pos; use namada_tests::native_vp::TestNativeVpEnv; @@ -34,6 +32,7 @@ mod tests { arb_established_address, arb_non_internal_address, }; use namada_tx_prelude::address::InternalAddress; + use namada_tx_prelude::chain::ChainId; use namada_tx_prelude::key::testing::arb_common_keypair; use namada_tx_prelude::key::RefTo; use namada_tx_prelude::proof_of_stake::parameters::testing::arb_pos_params; @@ -108,14 +107,12 @@ mod tests { let tx_code = vec![]; let tx_data = bond.try_to_vec().unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.data_sechash(), *tx.code_sechash()], - &key, - ))); - let signed_tx = tx.clone(); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(key); + + let signed_tx = tx; // Ensure that the initial stake of the sole validator is equal to the // PoS account balance diff --git a/wasm/wasm_source/src/tx_change_validator_commission.rs b/wasm/wasm_source/src/tx_change_validator_commission.rs index edbad6efaa8..ee3685b1911 100644 --- a/wasm/wasm_source/src/tx_change_validator_commission.rs +++ b/wasm/wasm_source/src/tx_change_validator_commission.rs @@ -21,15 +21,14 @@ mod tests { use namada::ledger::pos::{PosParams, PosVP}; use namada::proof_of_stake::validator_commission_rate_handle; - use namada::proto::{Code, Data, Signature, Tx}; use namada::types::dec::{Dec, POS_DECIMAL_PRECISION}; use namada::types::storage::Epoch; - use namada::types::transaction::TxType; use namada_tests::log::test; use namada_tests::native_vp::pos::init_pos; use namada_tests::native_vp::TestNativeVpEnv; use namada_tests::tx::*; use namada_tx_prelude::address::testing::arb_established_address; + use namada_tx_prelude::chain::ChainId; use namada_tx_prelude::key::testing::arb_common_keypair; use namada_tx_prelude::key::RefTo; use namada_tx_prelude::proof_of_stake::parameters::testing::arb_pos_params; @@ -87,14 +86,12 @@ mod tests { let tx_code = vec![]; let tx_data = commission_change.try_to_vec().unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(tx_data)); - tx.set_code(Code::new(tx_code)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.data_sechash(), *tx.code_sechash()], - &key, - ))); - let signed_tx = tx.clone(); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(key); + + let signed_tx = tx; // Read the data before the tx is executed let commission_rate_handle = diff --git a/wasm/wasm_source/src/tx_init_account.rs b/wasm/wasm_source/src/tx_init_account.rs index 2e85b70ae91..346afb2bec7 100644 --- a/wasm/wasm_source/src/tx_init_account.rs +++ b/wasm/wasm_source/src/tx_init_account.rs @@ -7,7 +7,7 @@ use namada_tx_prelude::*; fn apply_tx(ctx: &mut Ctx, tx_data: Tx) -> TxResult { let signed = tx_data; let data = signed.data().ok_or_err_msg("Missing data")?; - let tx_data = transaction::InitAccount::try_from_slice(&data[..]) + let tx_data = transaction::account::InitAccount::try_from_slice(&data[..]) .wrap_err("failed to decode InitAccount")?; debug_log!("apply_tx called to init a new established account"); @@ -18,8 +18,17 @@ fn apply_tx(ctx: &mut Ctx, tx_data: Tx) -> TxResult { .ok_or_err_msg("vp code section must be tagged as extra")? .code .hash(); + let address = ctx.init_account(vp_code)?; - let pk_key = key::pk_key(&address); - ctx.write(&pk_key, &tx_data.public_key)?; + + match account::init_account(ctx, &address, tx_data) { + Ok(address) => { + debug_log!("Created account {}", address.encode(),) + } + Err(err) => { + debug_log!("Account creation failed with: {}", err); + panic!() + } + } Ok(()) } diff --git a/wasm/wasm_source/src/tx_init_proposal.rs b/wasm/wasm_source/src/tx_init_proposal.rs index c0da1d9316b..e11ebb7a61f 100644 --- a/wasm/wasm_source/src/tx_init_proposal.rs +++ b/wasm/wasm_source/src/tx_init_proposal.rs @@ -8,22 +8,26 @@ fn apply_tx(ctx: &mut Ctx, tx: Tx) -> TxResult { let tx_data = transaction::governance::InitProposalData::try_from_slice(&data[..]) .wrap_err("failed to decode InitProposalData")?; + // Get the content from the referred to section let content = tx .get_section(&tx_data.content) .ok_or_err_msg("Missing proposal content")? .extra_data() .ok_or_err_msg("Missing full proposal content")?; + // Get the code from the referred to section - let code = match tx_data.r#type { - transaction::governance::ProposalType::Default(Some(hash)) => Some( + let code_hash = tx_data.get_section_code_hash(); + let code = match code_hash { + Some(hash) => Some( tx.get_section(&hash) .ok_or_err_msg("Missing proposal code")? .extra_data() .ok_or_err_msg("Missing full proposal code")?, ), - _ => None, + None => None, }; + log_string("apply_tx called to create a new governance proposal"); governance::init_proposal(ctx, tx_data, content, code) diff --git a/wasm/wasm_source/src/tx_init_validator.rs b/wasm/wasm_source/src/tx_init_validator.rs index 0cd37da1111..eb80ec444ec 100644 --- a/wasm/wasm_source/src/tx_init_validator.rs +++ b/wasm/wasm_source/src/tx_init_validator.rs @@ -1,7 +1,7 @@ //! A tx to initialize a new validator account with a given public keys and a //! validity predicates. -use namada_tx_prelude::transaction::InitValidator; +use namada_tx_prelude::transaction::pos::InitValidator; use namada_tx_prelude::*; #[transaction] diff --git a/wasm/wasm_source/src/tx_unbond.rs b/wasm/wasm_source/src/tx_unbond.rs index e453d48b149..90b22734a03 100644 --- a/wasm/wasm_source/src/tx_unbond.rs +++ b/wasm/wasm_source/src/tx_unbond.rs @@ -23,15 +23,14 @@ mod tests { bond_handle, read_consensus_validator_set_addresses_with_stake, read_total_stake, read_validator_stake, unbond_handle, }; - use namada::proto::{Code, Data, Signature, Tx}; use namada::types::dec::Dec; use namada::types::storage::Epoch; - use namada::types::transaction::TxType; use namada_tests::log::test; use namada_tests::native_vp::pos::init_pos; use namada_tests::native_vp::TestNativeVpEnv; use namada_tests::tx::*; use namada_tx_prelude::address::InternalAddress; + use namada_tx_prelude::chain::ChainId; use namada_tx_prelude::key::testing::arb_common_keypair; use namada_tx_prelude::key::RefTo; use namada_tx_prelude::proof_of_stake::parameters::testing::arb_pos_params; @@ -127,14 +126,11 @@ mod tests { let tx_code = vec![]; let tx_data = unbond.try_to_vec().unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.set_data(Data::new(tx_data)); - tx.set_code(Code::new(tx_code)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.data_sechash(), *tx.code_sechash()], - &key, - ))); - let signed_tx = tx.clone(); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(key); + let signed_tx = tx; let unbond_src = unbond .source diff --git a/wasm/wasm_source/src/tx_update_account.rs b/wasm/wasm_source/src/tx_update_account.rs new file mode 100644 index 00000000000..c2553759e5d --- /dev/null +++ b/wasm/wasm_source/src/tx_update_account.rs @@ -0,0 +1,45 @@ +//! A tx for updating an account's validity predicate. +//! This tx wraps the validity predicate inside `SignedTxData` as +//! its input as declared in `shared` crate. + +use namada_tx_prelude::key::pks_handle; +use namada_tx_prelude::*; + +#[transaction] +fn apply_tx(ctx: &mut Ctx, tx: Tx) -> TxResult { + let signed = tx; + let data = signed.data().ok_or_err_msg("Missing data")?; + let tx_data = + transaction::account::UpdateAccount::try_from_slice(&data[..]) + .wrap_err("failed to decode UpdateAccount")?; + + let owner = &tx_data.addr; + debug_log!("update VP for: {:#?}", tx_data.addr); + + if let Some(hash) = tx_data.vp_code_hash { + let vp_code_hash = signed + .get_section(&hash) + .ok_or_err_msg("vp code section not found")? + .extra_data_sec() + .ok_or_err_msg("vp code section must be tagged as extra")? + .code + .hash(); + + ctx.update_validity_predicate(owner, vp_code_hash)?; + } + + if let Some(threshold) = tx_data.threshold { + let threshold_key = key::threshold_key(owner); + ctx.write(&threshold_key, threshold)?; + } + + if !tx_data.public_keys.is_empty() { + storage_api::account::clear_public_keys(ctx, owner)?; + for (index, public_key) in tx_data.public_keys.iter().enumerate() { + let index = index as u8; + pks_handle(owner).insert(ctx, index, public_key.clone())?; + } + } + + Ok(()) +} diff --git a/wasm/wasm_source/src/tx_withdraw.rs b/wasm/wasm_source/src/tx_withdraw.rs index 20b202bdb62..dd40e044b35 100644 --- a/wasm/wasm_source/src/tx_withdraw.rs +++ b/wasm/wasm_source/src/tx_withdraw.rs @@ -22,10 +22,8 @@ fn apply_tx(ctx: &mut Ctx, tx_data: Tx) -> TxResult { mod tests { use namada::ledger::pos::{GenesisValidator, PosParams, PosVP}; use namada::proof_of_stake::unbond_handle; - use namada::proto::{Code, Data, Signature, Tx}; use namada::types::dec::Dec; use namada::types::storage::Epoch; - use namada::types::transaction::TxType; use namada_tests::log::test; use namada_tests::native_vp::pos::init_pos; use namada_tests::native_vp::TestNativeVpEnv; @@ -34,6 +32,7 @@ mod tests { arb_established_address, arb_non_internal_address, }; use namada_tx_prelude::address::InternalAddress; + use namada_tx_prelude::chain::ChainId; use namada_tx_prelude::key::testing::arb_common_keypair; use namada_tx_prelude::key::RefTo; use namada_tx_prelude::proof_of_stake::parameters::testing::arb_pos_params; @@ -171,14 +170,11 @@ mod tests { let tx_code = vec![]; let tx_data = withdraw.try_to_vec().unwrap(); - let mut tx = Tx::new(TxType::Raw); - tx.set_code(Code::new(tx_code)); - tx.set_data(Data::new(tx_data)); - tx.add_section(Section::Signature(Signature::new( - vec![*tx.data_sechash(), *tx.code_sechash()], - &key, - ))); - let signed_tx = tx.clone(); + let mut tx = Tx::new(ChainId::default(), None); + tx.add_code(tx_code) + .add_serialized_data(tx_data) + .sign_wrapper(key); + let signed_tx = tx; // Read data before we apply tx: let pos_balance_key = token::balance_key( diff --git a/wasm/wasm_source/src/vp_implicit.rs b/wasm/wasm_source/src/vp_implicit.rs index f82c573bc1f..9da84d17767 100644 --- a/wasm/wasm_source/src/vp_implicit.rs +++ b/wasm/wasm_source/src/vp_implicit.rs @@ -28,14 +28,14 @@ enum KeyType<'a> { impl<'a> From<&'a storage::Key> for KeyType<'a> { fn from(key: &'a storage::Key) -> KeyType<'a> { - if let Some(address) = key::is_pk_key(key) { + if let Some(address) = key::is_pks_key(key) { Self::Pk(address) } else if let Some([_, owner]) = token::is_any_token_balance_key(key) { Self::Token { owner } } else if proof_of_stake::is_pos_key(key) { Self::PoS - } else if gov_storage::is_vote_key(key) { - let voter_address = gov_storage::get_voter_address(key); + } else if gov_storage::keys::is_vote_key(key) { + let voter_address = gov_storage::keys::get_voter_address(key); if let Some(address) = voter_address { Self::GovernanceVote(address) } else { @@ -62,18 +62,8 @@ fn validate_tx( verifiers ); - let valid_sig = Lazy::new(|| { - let pk = key::get(ctx, &addr); - match pk { - Ok(Some(pk)) => tx_data - .verify_signature( - &pk, - &[*tx_data.data_sechash(), *tx_data.code_sechash()], - ) - .is_ok(), - _ => false, - } - }); + let valid_sig = + Lazy::new(|| verify_signatures(ctx, &tx_data, &addr).is_ok()); if !is_valid_tx(ctx, &tx_data)? { return reject(); @@ -196,7 +186,7 @@ fn validate_tx( mod tests { // Use this as `#[test]` annotation to enable logging use namada::ledger::pos::{GenesisValidator, PosParams}; - use namada::proto::{Code, Data, Signature}; + use namada::proto::{Code, Data, MultiSignature}; use namada::types::dec::Dec; use namada::types::storage::Epoch; use namada::types::transaction::TxType; @@ -207,6 +197,7 @@ mod tests { use namada_tests::vp::vp_host_env::storage::Key; use namada_tests::vp::*; use namada_tx_prelude::{storage_api, StorageWrite, TxEnv}; + use namada_vp_prelude::account::AccountPublicKeysMap; use namada_vp_prelude::key::RefTo; use proptest::prelude::*; use storage::testing::arb_account_storage_key_no_vp; @@ -216,7 +207,7 @@ mod tests { /// Test that no-op transaction (i.e. no storage modifications) accepted. #[test] fn test_no_op_transaction() { - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let addr: Address = address::testing::established_address_1(); let keys_changed: BTreeSet = BTreeSet::default(); @@ -240,7 +231,8 @@ mod tests { let addr: Address = (&public_key).into(); // Initialize a tx environment - let tx_env = TestTxEnv::default(); + let mut tx_env = TestTxEnv::default(); + tx_env.init_parameters(None, None, None, None); // Initialize VP environment from a transaction vp_host_env::init_from_tx(addr.clone(), tx_env, |_address| { @@ -249,7 +241,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -276,7 +268,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -308,12 +300,16 @@ mod tests { // Initialize VP environment from a transaction vp_host_env::init_from_tx(addr.clone(), tx_env, |_address| { // Do the same as reveal_pk, but with the wrong key - let key = namada_tx_prelude::key::pk_key(&addr); - tx_host_env::ctx().write(&key, &mismatched_pk).unwrap(); + let _ = storage_api::account::set_public_key_at( + tx_host_env::ctx(), + &addr, + &mismatched_pk, + 0, + ); }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -373,7 +369,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -414,6 +410,8 @@ mod tests { // Initialize a tx environment let mut tx_env = tx_host_env::take(); + tx_env.init_parameters(None, Some(vec![]), Some(vec![]), None); + let secret_key = key::testing::keypair_1(); let public_key = secret_key.ref_to(); let vp_owner: Address = (&public_key).into(); @@ -425,6 +423,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -449,7 +448,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -461,8 +460,8 @@ mod tests { ); } - /// Test that a PoS action that must be authorized is accepted with a valid - /// signature. + /// Test that a PoS action that must be authorized is accepted with a + /// valid signature. #[test] fn test_signed_pos_action_accepted() { // Init PoS genesis @@ -505,6 +504,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -517,8 +517,6 @@ mod tests { ) .unwrap(); - tx_env.write_public_key(&vp_owner, &public_key); - // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { // Bond the tokens, then unbond some of them @@ -530,14 +528,18 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &secret_key, + &[secret_key], + &pks_map, ))); + let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); let keys_changed: BTreeSet = @@ -565,6 +567,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner, &target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -599,7 +602,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -624,8 +627,11 @@ mod tests { let token = address::nam(); let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); + tx_env.init_parameters(None, None, None, None); + // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner, &target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -638,8 +644,6 @@ mod tests { ) .unwrap(); - tx_env.write_public_key(&vp_owner, &public_key); - let amount = token::DenominatedAmount { amount, denom: token::NATIVE_MAX_DECIMAL_PLACES.into(), @@ -660,20 +664,25 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &secret_key, + &[secret_key], + &pks_map, ))); + let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); let verifiers: BTreeSet
= BTreeSet::default(); vp_host_env::set(vp_env); + assert!( validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers) .unwrap() @@ -696,6 +705,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner, &source, &target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -731,7 +741,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -760,8 +770,8 @@ mod tests { } proptest! { - /// Test that an unsigned tx that performs arbitrary storage writes or - /// deletes to the account is rejected. + /// Test that an unsigned tx that performs arbitrary storage writes + /// or deletes to the account is rejected. #[test] fn test_unsigned_arb_storage_write_rejected( (_sk, vp_owner, storage_key) in arb_account_storage_subspace_key(), @@ -787,7 +797,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -795,17 +805,12 @@ mod tests { vp_host_env::set(vp_env); assert!(!validate_tx(&CTX, tx_data, vp_owner, keys_changed, verifiers).unwrap()); } - } - proptest! { - /// Test that a signed tx that performs arbitrary storage writes or - /// deletes to the account is accepted. - #[test] - fn test_signed_arb_storage_write( - (secret_key, vp_owner, storage_key) in arb_account_storage_subspace_key(), - // Generate bytes to write. If `None`, delete from the key instead - storage_value in any::>>(), - ) { + fn test_signed_arb_storage_write( + (secret_key, vp_owner, storage_key) in arb_account_storage_subspace_key(), + // Generate bytes to write. If `None`, delete from the key instead + storage_value in any::>>(), + ) { // Initialize a tx environment let mut tx_env = TestTxEnv::default(); @@ -815,7 +820,7 @@ mod tests { tx_env.spawn_accounts(storage_key_addresses); let public_key = secret_key.ref_to(); - tx_env.write_public_key(&vp_owner, &public_key); + let _ = storage_api::account::set_public_key_at(tx_host_env::ctx(), &vp_owner, &public_key, 0); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { @@ -827,11 +832,17 @@ mod tests { } }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new(vec![*tx.data_sechash(), *tx.code_sechash()], &secret_key))); + tx.add_section(Section::SectionSignature(MultiSignature::new( + vec![*tx.data_sechash(), *tx.code_sechash()], + &[secret_key], + &pks_map, + ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); let keys_changed: BTreeSet = @@ -869,7 +880,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -899,12 +910,12 @@ mod tests { None, Some(vec![vp_hash.to_string()]), Some(vec!["some_hash".to_string()]), + None, ); // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -914,13 +925,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &secret_key, + &[secret_key], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -947,13 +961,16 @@ mod tests { // for the update tx_env.store_wasm_code(vp_code); - let empty_sha256 = sha256(&[]).to_string(); - tx_env.init_parameters(None, None, Some(vec![empty_sha256])); + tx_env.init_parameters( + None, + Some(vec![vp_hash.to_string()]), + None, + None, + ); // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -963,13 +980,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &secret_key, + &[secret_key], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); diff --git a/wasm/wasm_source/src/vp_testnet_faucet.rs b/wasm/wasm_source/src/vp_testnet_faucet.rs index 5905c3cc4cf..f41909f0c5d 100644 --- a/wasm/wasm_source/src/vp_testnet_faucet.rs +++ b/wasm/wasm_source/src/vp_testnet_faucet.rs @@ -25,18 +25,8 @@ fn validate_tx( verifiers ); - let valid_sig = Lazy::new(|| { - let pk = key::get(ctx, &addr); - match pk { - Ok(Some(pk)) => tx_data - .verify_signature( - &pk, - &[*tx_data.data_sechash(), *tx_data.code_sechash()], - ) - .is_ok(), - _ => false, - } - }); + let valid_sig = + Lazy::new(|| verify_signatures(ctx, &tx_data, &addr).is_ok()); if !is_valid_tx(ctx, &tx_data)? { return reject(); @@ -117,7 +107,7 @@ fn validate_tx( #[cfg(test)] mod tests { use address::testing::arb_non_internal_address; - use namada::proto::{Code, Data, Signature}; + use namada::proto::{Code, Data, MultiSignature, Signature}; use namada::types::transaction::TxType; use namada_test_utils::TestWasms; // Use this as `#[test]` annotation to enable logging @@ -126,6 +116,7 @@ mod tests { use namada_tests::vp::vp_host_env::storage::Key; use namada_tests::vp::*; use namada_tx_prelude::{StorageWrite, TxEnv}; + use namada_vp_prelude::account::AccountPublicKeysMap; use namada_vp_prelude::key::RefTo; use proptest::prelude::*; use storage::testing::arb_account_storage_key_no_vp; @@ -138,7 +129,7 @@ mod tests { /// Test that no-op transaction (i.e. no storage modifications) accepted. #[test] fn test_no_op_transaction() { - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let addr: Address = address::testing::established_address_1(); let keys_changed: BTreeSet = BTreeSet::default(); @@ -192,7 +183,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -229,7 +220,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -258,8 +249,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -269,13 +259,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key.clone()]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -341,7 +334,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -365,6 +358,7 @@ mod tests { let target = address::testing::established_address_2(); let target_key = key::testing::keypair_1(); + let _public_key = target_key.ref_to(); let token = address::nam(); let amount = token::Amount::from_uint(amount, 0).unwrap(); @@ -401,7 +395,7 @@ mod tests { let mut vp_env = vp_host_env::take(); // This is set by the protocol when the wrapper tx has a valid PoW vp_env.has_valid_pow = true; - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(solution_bytes)); tx_data.set_code(Code::new(vec![])); tx_data.add_section(Section::Signature(Signature::new(vec![*tx_data.data_sechash(), *tx_data.code_sechash()], &target_key))); @@ -436,7 +430,7 @@ mod tests { let storage_key_addresses = storage_key.find_addresses(); tx_env.spawn_accounts(storage_key_addresses); - tx_env.write_public_key(&vp_owner, public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { @@ -448,11 +442,17 @@ mod tests { } }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key.clone()]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new(vec![*tx.data_sechash(), *tx.code_sechash()], &keypair))); + tx.add_section(Section::SectionSignature(MultiSignature::new( + vec![*tx.data_sechash(), *tx.code_sechash()], + &[keypair], + &pks_map, + ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); let keys_changed: BTreeSet = diff --git a/wasm/wasm_source/src/vp_user.rs b/wasm/wasm_source/src/vp_user.rs index 6d6977997e4..d68801834a3 100644 --- a/wasm/wasm_source/src/vp_user.rs +++ b/wasm/wasm_source/src/vp_user.rs @@ -28,8 +28,8 @@ impl<'a> From<&'a storage::Key> for KeyType<'a> { Self::Token { owner } } else if proof_of_stake::is_pos_key(key) { Self::PoS - } else if gov_storage::is_vote_key(key) { - let voter_address = gov_storage::get_voter_address(key); + } else if gov_storage::keys::is_vote_key(key) { + let voter_address = gov_storage::keys::get_voter_address(key); if let Some(address) = voter_address { Self::GovernanceVote(address) } else { @@ -60,18 +60,8 @@ fn validate_tx( verifiers ); - let valid_sig = Lazy::new(|| { - let pk = key::get(ctx, &addr); - match pk { - Ok(Some(pk)) => tx_data - .verify_signature( - &pk, - &[*tx_data.data_sechash(), *tx_data.code_sechash()], - ) - .is_ok(), - _ => false, - } - }); + let valid_sig = + Lazy::new(|| verify_signatures(ctx, &tx_data, &addr).is_ok()); if !is_valid_tx(ctx, &tx_data)? { return reject(); @@ -184,7 +174,7 @@ fn validate_tx( mod tests { use address::testing::arb_non_internal_address; use namada::ledger::pos::{GenesisValidator, PosParams}; - use namada::proto::{Code, Data, Signature}; + use namada::proto::{Code, Data, MultiSignature}; use namada::types::dec::Dec; use namada::types::storage::Epoch; use namada::types::transaction::TxType; @@ -196,6 +186,7 @@ mod tests { use namada_tests::vp::vp_host_env::storage::Key; use namada_tests::vp::*; use namada_tx_prelude::{StorageWrite, TxEnv}; + use namada_vp_prelude::account::AccountPublicKeysMap; use namada_vp_prelude::key::RefTo; use proptest::prelude::*; use storage::testing::arb_account_storage_key_no_vp; @@ -205,7 +196,7 @@ mod tests { /// Test that no-op transaction (i.e. no storage modifications) accepted. #[test] fn test_no_op_transaction() { - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let addr: Address = address::testing::established_address_1(); let keys_changed: BTreeSet = BTreeSet::default(); @@ -265,7 +256,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -323,7 +314,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -350,6 +341,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner, &target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -362,8 +354,6 @@ mod tests { ) .unwrap(); - tx_env.write_public_key(&vp_owner, &public_key); - let amount = token::DenominatedAmount { amount, denom: token::NATIVE_MAX_DECIMAL_PLACES.into(), @@ -385,13 +375,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -435,7 +428,7 @@ mod tests { let mut tx_env = tx_host_env::take(); let secret_key = key::testing::keypair_1(); - let _public_key = secret_key.ref_to(); + let public_key = secret_key.ref_to(); let vp_owner: Address = address::testing::established_address_2(); let target = address::testing::established_address_3(); let token = address::nam(); @@ -445,6 +438,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key], 1); // write the denomination of NAM into storage storage_api::token::write_denom( &mut tx_env.wl_storage, @@ -469,7 +463,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -525,6 +519,8 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); + // write the denomination of NAM into storage storage_api::token::write_denom( &mut tx_env.wl_storage, @@ -537,8 +533,6 @@ mod tests { // be able to transfer from it tx_env.credit_tokens(&vp_owner, &token, amount); - tx_env.write_public_key(&vp_owner, &public_key); - // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { // Bond the tokens, then unbond some of them @@ -550,13 +544,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &secret_key, + &[secret_key], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -612,7 +609,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -668,7 +665,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -697,8 +694,7 @@ mod tests { // their storage let storage_key_addresses = storage_key.find_addresses(); tx_env.spawn_accounts(storage_key_addresses); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { @@ -710,11 +706,13 @@ mod tests { } }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::Signature(Signature::new(vec![*tx.data_sechash(), *tx.code_sechash()], &keypair))); + tx.add_section(Section::SectionSignature(MultiSignature::new(vec![*tx.data_sechash(), *tx.code_sechash()], &[keypair], &pks_map))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); let keys_changed: BTreeSet = @@ -750,7 +748,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); tx_data.set_code(Code::new(vec![])); let keys_changed: BTreeSet = @@ -769,7 +767,7 @@ mod tests { fn test_signed_vp_update_accepted() { // Initialize a tx environment let mut tx_env = TestTxEnv::default(); - tx_env.init_parameters(None, None, None); + tx_env.init_parameters(None, None, None, None); let vp_owner = address::testing::established_address_1(); let keypair = key::testing::keypair_1(); @@ -781,8 +779,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -792,13 +789,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -817,7 +817,12 @@ mod tests { fn test_signed_vp_update_not_whitelisted_rejected() { // Initialize a tx environment let mut tx_env = TestTxEnv::default(); - tx_env.init_parameters(None, Some(vec!["some_hash".to_string()]), None); + tx_env.init_parameters( + None, + Some(vec!["some_hash".to_string()]), + None, + None, + ); let vp_owner = address::testing::established_address_1(); let keypair = key::testing::keypair_1(); @@ -829,8 +834,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -840,13 +844,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -874,12 +881,16 @@ mod tests { // for the update tx_env.store_wasm_code(vp_code); - tx_env.init_parameters(None, Some(vec![vp_hash.to_string()]), None); + tx_env.init_parameters( + None, + Some(vec![vp_hash.to_string()]), + None, + None, + ); // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -889,13 +900,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -927,12 +941,12 @@ mod tests { None, Some(vec![vp_hash.to_string()]), Some(vec!["some_hash".to_string()]), + None, ); // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -942,13 +956,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -975,13 +992,17 @@ mod tests { // for the update tx_env.store_wasm_code(vp_code); - let empty_sha256 = sha256(&[]).to_string(); - tx_env.init_parameters(None, None, Some(vec![empty_sha256])); + // hardcoded hash of VP_ALWAYS_TRUE_WASM + tx_env.init_parameters( + None, + Some(vec![vp_hash.to_string()]), + None, + None, + ); // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -991,13 +1012,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); diff --git a/wasm/wasm_source/src/vp_validator.rs b/wasm/wasm_source/src/vp_validator.rs index eb80929626e..9b0de80f3e9 100644 --- a/wasm/wasm_source/src/vp_validator.rs +++ b/wasm/wasm_source/src/vp_validator.rs @@ -30,8 +30,8 @@ impl<'a> From<&'a storage::Key> for KeyType<'a> { Self::Token { owner } } else if proof_of_stake::is_pos_key(key) { Self::PoS - } else if gov_storage::is_vote_key(key) { - let voter_address = gov_storage::get_voter_address(key); + } else if gov_storage::keys::is_vote_key(key) { + let voter_address = gov_storage::keys::get_voter_address(key); if let Some(address) = voter_address { Self::GovernanceVote(address) } else { @@ -60,18 +60,8 @@ fn validate_tx( verifiers ); - let valid_sig = Lazy::new(|| { - let pk = key::get(ctx, &addr); - match pk { - Ok(Some(pk)) => tx_data - .verify_signature( - &pk, - &[*tx_data.data_sechash(), *tx_data.code_sechash()], - ) - .is_ok(), - _ => false, - } - }); + let valid_sig = + Lazy::new(|| verify_signatures(ctx, &tx_data, &addr).is_ok()); if !is_valid_tx(ctx, &tx_data)? { return reject(); @@ -191,7 +181,7 @@ fn validate_tx( mod tests { use address::testing::arb_non_internal_address; use namada::ledger::pos::{GenesisValidator, PosParams}; - use namada::proto::{Code, Data, Signature}; + use namada::proto::{Code, Data, MultiSignature}; use namada::types::dec::Dec; use namada::types::storage::Epoch; use namada::types::transaction::TxType; @@ -203,6 +193,7 @@ mod tests { use namada_tests::vp::vp_host_env::storage::Key; use namada_tests::vp::*; use namada_tx_prelude::{StorageWrite, TxEnv}; + use namada_vp_prelude::account::AccountPublicKeysMap; use namada_vp_prelude::key::RefTo; use proptest::prelude::*; use storage::testing::arb_account_storage_key_no_vp; @@ -212,7 +203,7 @@ mod tests { /// Test that no-op transaction (i.e. no storage modifications) accepted. #[test] fn test_no_op_transaction() { - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let addr: Address = address::testing::established_address_1(); let keys_changed: BTreeSet = BTreeSet::default(); @@ -272,7 +263,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -330,7 +321,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -357,6 +348,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner, &target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -369,7 +361,6 @@ mod tests { ) .unwrap(); - tx_env.write_public_key(&vp_owner, &public_key); let amount = token::DenominatedAmount { amount, denom: token::NATIVE_MAX_DECIMAL_PLACES.into(), @@ -391,13 +382,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -441,7 +435,7 @@ mod tests { let mut tx_env = tx_host_env::take(); let secret_key = key::testing::keypair_1(); - let _public_key = secret_key.ref_to(); + let public_key = secret_key.ref_to(); let vp_owner: Address = address::testing::established_address_2(); let target = address::testing::established_address_3(); let token = address::nam(); @@ -451,6 +445,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -481,7 +476,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -536,7 +531,8 @@ mod tests { let unbond_amount = token::Amount::from_uint(3_098_123, 0).unwrap(); // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&target, &token]); + tx_env.spawn_accounts([&vp_owner, &target, &token]); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Credit the tokens to the VP owner before running the transaction to // be able to transfer from it @@ -549,8 +545,6 @@ mod tests { ) .unwrap(); - tx_env.write_public_key(&vp_owner, &public_key); - // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { // Bond the tokens, then unbond some of them @@ -568,13 +562,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &secret_key, + &[secret_key], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -629,7 +626,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -685,7 +682,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -715,7 +712,7 @@ mod tests { let storage_key_addresses = storage_key.find_addresses(); tx_env.spawn_accounts(storage_key_addresses); - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { @@ -727,11 +724,13 @@ mod tests { } }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new(vec![*tx.data_sechash(), *tx.code_sechash()], &keypair))); + tx.add_section(Section::SectionSignature(MultiSignature::new(vec![*tx.data_sechash(), *tx.code_sechash()], &[keypair], &pks_map))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); let keys_changed: BTreeSet = @@ -767,7 +766,7 @@ mod tests { }); let vp_env = vp_host_env::take(); - let mut tx_data = Tx::new(TxType::Raw); + let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(vec![])); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); @@ -785,7 +784,7 @@ mod tests { fn test_signed_vp_update_accepted() { // Initialize a tx environment let mut tx_env = TestTxEnv::default(); - tx_env.init_parameters(None, None, None); + tx_env.init_parameters(None, None, None, None); let vp_owner = address::testing::established_address_1(); let keypair = key::testing::keypair_1(); @@ -797,8 +796,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -808,13 +806,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -833,7 +834,12 @@ mod tests { fn test_signed_vp_update_not_whitelisted_rejected() { // Initialize a tx environment let mut tx_env = TestTxEnv::default(); - tx_env.init_parameters(None, Some(vec!["some_hash".to_string()]), None); + tx_env.init_parameters( + None, + Some(vec!["some_hash".to_string()]), + None, + None, + ); let vp_owner = address::testing::established_address_1(); let keypair = key::testing::keypair_1(); @@ -845,8 +851,7 @@ mod tests { // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -856,13 +861,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -890,12 +898,16 @@ mod tests { // for the update tx_env.store_wasm_code(vp_code); - tx_env.init_parameters(None, Some(vec![vp_hash.to_string()]), None); + tx_env.init_parameters( + None, + Some(vec![vp_hash.to_string()]), + None, + None, + ); // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -905,13 +917,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -943,12 +958,12 @@ mod tests { None, Some(vec![vp_hash.to_string()]), Some(vec!["some_hash".to_string()]), + None, ); // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -958,13 +973,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -991,13 +1009,17 @@ mod tests { // for the update tx_env.store_wasm_code(vp_code); - let empty_sha256 = sha256(&[]).to_string(); - tx_env.init_parameters(None, None, Some(vec![empty_sha256])); + // hardcoded hash of VP_ALWAYS_TRUE_WASM + tx_env.init_parameters( + None, + Some(vec![vp_hash.to_string()]), + None, + None, + ); // Spawn the accounts to be able to modify their storage tx_env.spawn_accounts([&vp_owner]); - - tx_env.write_public_key(&vp_owner, &public_key); + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); // Initialize VP environment from a transaction vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { @@ -1007,13 +1029,16 @@ mod tests { .unwrap(); }); + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + let mut vp_env = vp_host_env::take(); let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::Signature(Signature::new( + tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &keypair, + &[keypair], + &pks_map, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); diff --git a/wasm_for_tests/tx_memory_limit.wasm b/wasm_for_tests/tx_memory_limit.wasm index 3f8ae1b079f1c308d4c96f03d7a1f3fb5f9d78b0..a6e413f349827e539fe5da233ceb71ffee891f13 100755 GIT binary patch delta 142043 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%0A(^rLytG9}> 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 delta 132096 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 diff --git a/wasm_for_tests/tx_mint_tokens.wasm b/wasm_for_tests/tx_mint_tokens.wasm index dba64ff70a1fe3ab7c081371f2baebc267fa7d3b..416ab231ace7a51746d3945abf0f1b19ccce11fb 100755 GIT binary patch delta 121366 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 EKWcfk0ssI2 delta 123598 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 delta 103423 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 z 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 OJ#95wPX})L+WU diff --git a/wasm_for_tests/tx_proposal_code.wasm b/wasm_for_tests/tx_proposal_code.wasm index 3c937a2eccfdf961d166e8264c443932bc24c734..89bab50905416274cfc472bc7bc9f062817812e3 100755 GIT binary patch delta 140094 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%0AA4f72x!*gPFgM0{E=?8pozmC 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�)E26q}WXZO|&sbK5Lr7>r zb3zirV#FSADIbz_1G+%A3wDbj)5GxKf^Cjo;E<|YV0(ss6x&W48L7w7;F0O$3ZiU@N=w-5h%kgd>v&T;gXOH&dS4Z}2vq$?u{P{iG z-_LuZd$c`sqb?jtFPV!kyiu20rCfcZuARN-N|ENp)~03Z5b&Iar3-T5wQwR<%(-1k zWl5banWI<6FzB!?r(PD}RXX1^7Wc&$Fk-Ccx@iFerusl|XF}K<5a< zDOxh`lrudrQF_;iG@k5?L9#Pft~Qp4uuey1vN>x`sjVzl1r!BNF5hG|Ix^0eH2dv@~icok(Zq8q7N!G+{V|_y^>~hMz zPC-}5bxzt@Y(6z%1eCERA+ODKaKH%^Wpt{t?B>9W*e0B@Gw?R*o|Vko0ZP8x1dr>2 zXbct_ubYuN1w=WNCsHWdWcjmJ`3G$CD*u&bUj(h%dYuKv(ZnFg&DC@)(zAXKTW)?E zj!-3RTBMdjyP$`;#lX*Il)S4h?<&u`!d3^1C~>iduMohHs{=_?U;UcX%>+(@yPC+B zz_{38M5vY~K$QJVqk_g{0DTUS_v1Ueu^%fJrd7-s6SP(*>iKpMpi|5dH4ve^3E_~z z#lV|*Aj=C@W51FdW6ccfeq0bP!@7y8g5ewshBHHDXT!N89t>weG$ttXf+wY;g)^!x zWfzX)ChBIGH<@9sNA>0$hzIy^h-BAeyQQ%B?3RFa$iei2$_0a&ktB+YTTx(SkVeLB zsOLn+?KV=$AdQUMtx~@nDv1nSp#|9tS~zeS1okto84wVkR(Fifv6)ag^d1>|99IwS zGuFckU-&2!!vtTK=8{{6w`ΝR}@<7!AIWA#;+ED2hv~00HaxM82pLTLb_5^3AY! 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 delta 149140 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

8%OcoWP5igzT6`e388P7TDJ4Ar{jpdb^ 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 diff --git a/wasm_for_tests/tx_write.wasm b/wasm_for_tests/tx_write.wasm index edd28f97ecf2866e4b5e7160898fc7c00bf96b00..46ae3e95a00abd4417d5e67fd01656bb40770a35 100755 GIT binary patch delta 126799 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�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/x9rv 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 P+&It2L-Tx5Kfm^Gg_fWx diff --git a/wasm_for_tests/vp_always_false.wasm b/wasm_for_tests/vp_always_false.wasm index 992f4007a741e6b6ce2f397cad55d98fcf44cb08..7fa0714a4ed2015739750b4beccaf2ea3a50f66c 100755 GIT binary patch delta 149049 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 W=_gaBB9SxF2x?Dt4jO69^8G(FyZyZY delta 140573 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%0D9ZnI{HKLGEeEi4k#nb>|r~^ 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 Yt-3_h6y-coI}?l4#@4%LYBOB_A5(ntEdT%j diff --git a/wasm_for_tests/vp_eval.wasm b/wasm_for_tests/vp_eval.wasm index 2ed4af1c95975381e8a56966d6b04b917210845f..7ceeef5c810ada1204f721605fb8d850e5c41c47 100755 GIT binary patch literal 492706 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�Vcj_U0*?vkH0bvzG#Pp|`9ugBZ6=2E0BNOo{=t5LS+72rsvlCk3F zcE&0SpEgIl7;DW50=5#95nJ;`6xe1>!csyx!Lp0&s68SI&pM1e;!?WpGu1BUD znx(nv%VWy4a@_LFXg!{~;Tg-Jc47X~;^}DbmC=QO7!Pn3;BZNQBFch3DeuYxuTTRA zS&N5V{(#}Y!)5+}%Z7(}_=ZM(3hgl=YTsNdO-Bw`^?s1VVzSx-TO%;XQgS|xs#H5~ zHBMG(WNA>#JsJXJNr(HT({KB=yWaFSzxz1T-9dNt885E`45|*z!kS^m7nL_zYEY?- zRddN3)TuDiv+A}{J(k0JB|kTq9-YIRpHLnuZFV?=N5;35C$bt%N{(v&ZB&nCHWEoj zHnJ-lte;F~sK%PYkijdPYBEDA=t0I5lGGkFJt0X^97%U`%I`543=cA`reut%ua2ZB z!#@J?mzs^|eX!pLtOk!+8264 zv$eX}HK;@ym(n~K@r?m85)mMCn6i$6DMJi;yGp7%3~lMQ0&W1!0AJ4jyv>8m;t9^^CcRZzgm80KN_iUB)J`)E3b z5@HtB(U^fk8?BS>!$-&C(eQ{8pvU{dBR#CgBRoo6@q3ntslIwxVX$<3n8XxP%&wiz!5WUNtZ{-H>jr?SZ)B4PF6&cHs5u;X*U zTTBkzz4*Zo{P`cH%QyPGgj5bIN3{g-XPlA$knntR3bLC%f~xs*aV2dle-$g2 zZ!J?rre~=G2Ea6BNX0c9?(nfTb5_tCfk~KT2(02HHD$%gyKSb}8@fW$uvlp(oggVM zPBfE_mk-B@exa)2hD;C-H)aBHI9p_LLJ7vrd~H`kejxn9ywDM9Bpi;5D7!!l%J*cfJ$U2ZEPkV!C-KZLBq41`qAh2Bi|6Vg8a(-%Ab+XJ|aU=<2~XmS5UjWwx0n=bJ-ow$qvysmSGQ z>=5YfP_!!8zD%n?^F;RI@_FJA=x%2(DWBVi)KQp6(4pb1ez{g+?NxvI~t$jNa7HijcEFw1aFI?lxt4xWf)8hg3<#xs*x`stXV$ za}uVC7OlG;h7aXxbgZQTLw#wQ<> zxm%Z%Dx8vTX7^S+aO8d>snab;M9Pf0P|qfLi*j0r@@;6Bv0}xF;~FIy?j@keaRNly z(8P(1i73mnO-c_MpFoLCp%J<*^9wyn<-$@aq=R4;Dp)LF9(--KqE#3XLlmaF*oxI% zCCiTxJ5wau%K&du5nrz@?_$mR7Vt2kKiOSD2u>{x{-rd7ls>RDxYsDe#11=9d0U`<8-@Zjk>)~kXEgk0#C^& ztC?g$W_lP=(#yjBQF1bJX7Qi}9c(Py#xe%OY7f&07yXWiu^#WuUP^ev8{uv&x402V z+WhS0+6vc>U*Q3Yx1kvedjj?qk;AhsaZw+bnV!~DT1MaVGT<3vDpH{cCG5#Kmv`O zRAa$!#`Vew4v&>8>vt*UJ;)Q9xdzPYb`X%w?Oc7E>D9u|D7ViFa>XX41kzN8dVnXc zZh%(FzU;_+QdMp~=zlrYPKvb!t*P6y_`8VMHVKDA$JFy!OA{g+V~KfwVnVj61otel zz#-&7pzH2NJ|>jM=8M>F`!>L;H1q`ry{W$&&`llRz-`(AHk*BI&dl}Ec!XN;RNx{r zO21tg2Wwesw0?^}qWKuL-|UaLVDMj95Sj+A0^r-hb>Y3qJFp1oM%*u9q5HfF%C{#uN!HdiLlsP z8Yq;;+;+Gl@F3h7j0;|8k%2ZU1DTnsg$arsGxsdIjPPQqUzUjc*mtWuS&8Hgy?b_S z{pDk$elhvPR`7|HBU({!^w!9LwtfPwt5z&Pt5an@%|z`^uPO@ep^a*7cylaXk^E9n!|r@esnU$JfsEwLI2? zNGzqP3hhj<<=KXXx#dxeYYD;#r=xENg-AXd{Ne>^);7Lyv)#9hW!%I)S%qyz(SQpS z2bH=^N57~cT0QH}#4Fb=Rv#pd z<{4XWz^*u?`u;>CeTAW<#ovg&OteYKXH0bqvQQ*S8fGmwAx)G@nyYx8 zwwKSPo|vcsIFr|plwoCzsU-rOY*uKVJprO*fxmNZ*YFb&(v(r{+cgl7HB1UVfv&XeM<_yz^0)tfa~dAuw5 zcF*9a6b}XiS+~BOwD@_hZuM3TVx{#~4I@vFj!jmgY1Ew$`vNWTe6*bg&g}!rrKi%p zMQ7iw+;(oWC+_BMyY<$5+@y~(&pmtQj!P{v&pvzR?iGnR0GWyBdp0n7S0v2b%||V| zh>HdI%|{b3JDxf?1R~VwzJBRJnuLd>Y!boFp-H?^lO~EguNiE+RRsTR)lODf;pW6d z)}_L|L#ez`sZ&+fma?|$teig-vhqe*IfUUl13--_?!*!Yl3R9=PX3qo}DKo$In>^Ti>5=A@`oM5FJ2ro{&6&`l`_1MC!4kfh9ivvHQH7 zK4&4x`9t#Qa~7gd;PY(Gv2ztNvd_y$TZ6!|OAT|)RpSU!r&|47gxK1A8^d#K-)=o4 zoQf}uzd0oz6?KS!EaVplm?X<~`vA+e{# z?fRKxV?Sjd*l!ZvBL`U?LNDpnWJqM}6&RD3=%Pgps9Ac04`kBv34HXFfoEs78-E1; z&%N3B-o516Yw1^qkFMUEO^1wa4#P57ISk?p>?vpfVPl0RT)+2L3;Xuw;KT6D3j3g1 zG=i$B2oR-o>J){HkkYMFv}}l!UY*kO6uAyV$>QYX>DMU`hf*f$6eO5ZQuGm_pq-_C zt#EAPr9gEsMH5nbqQP zU0C^~M24-h%;;$Xzdujg@%!`C8FF5xie}}KDkA<@)m{L7u)AM_OuE_TJ2F<5!{W!Y zS$=Wh@k`YB9n7I$!0lAFk>81IhTmQ`&2J~0g`DKOe9r!zyof&$5St-dcQ5^hESaxRZxF;f-Unq*-O%9_z+GsEm7|H!~HsF`g z4}J+U;g{u`{4y)RFXj#UCa4Hr;CI{*ks2cAtlSATXv!MI`c|?KUdk^^y!lIy=9iEzeu**Vm!-Y@61B)Lb}zqWeHYvjuxD$^q10BOCGV$p zMG<0UDSgM1ZV^uQ0w*xV+laK=)~zke9z#H4fa&7Y-Mrq+m`E4DFn&i#lmu*4#Y!pM z?nRYE&39vz*s>B;<^ES1drYg3TK&5_+n<#^x_`DQYmI@fVM<8*iG0I@IU)jCn{Q$V za#q&dp{EY>XGE|`AILATbYYOkxqR+H++%&%mL(gDWI3h39ps)07uMR!Ef3~WUAdpl zw_0{2mR38)MEvoB&=%N~y}(CA0)7g9S%GFRCpiz%dJgZoy;Sm6;`ps=*_=V|HRg%T z~|vYg<0!0EaN+}Ijecb>SWTBA|^(%mfS_`F}vVF!rM~v3_?Kz zD`+-Q4e_gYWE;b))LsR8*%Us^4H`ao_Tx~^T7@sDI#@!HBf#!pe9Ii5b5!ttC`Gi^ zV$joA;Rv4yzYecOcSFHr0T$=R6IG$&G#YG_EIj#W9}9S(MBD*%Jh4x_baF0BoCzfc zyi_HMqp(~`CAtt$xjpNanNaSShGt!2C!nT1QsP)uqNxZfkq9u#B9x3@7dq`w;ue8P zm4>p_8O-W{?%hi7ggXM$0KrQI?wKrb!$0VOW}#t35aMjE1f^w%E~fS80|_km#%a{~NbT zJHh7-a6PL@B23gxRz?@5?6Z#3q>W|~PL)eKnLl6_g}ySBp^Zzx zbc!6yu2rnySoL{>R1+Iac@!rbN%IO>Bl5hFbQz`~Nsq<5FO8zBVw%9y2}q@F1+gfD z=RaeLef-k+cVfht_UzX=d-)p%hoNgU*P^vgbu-nJM(FpNWkJ7(S7-(QZg#2XJyv9E zU--aQsJE}8I027+Ve~0e6i;LOhRI0J$wD?hpB#^kWC6i;T^}zV0?wEfXdL=ut4H^DO?gNF|DCMxO*i*0Ia>CvmSIR;5tGyyQ5i%X)O5!dY zK1>1V_E^mQF0Hw@QkIm8$#uKXcSUjw7rdiy@TZ%(0Gt?cTs#y`2)!b~XQ&2XbgSXJ zi@u*f!kiY9zlXHzfmO+mk`QHsyKTv_RrFe~;b*;u8~t)E7duh{NN(buN?)f7$WQj| zE{<1K|MdD*Gx0~&Z&q6{Ef*RP*c*pHV9DfM(3M7lI5l|}kMqd_b|IHt8fEjzD{}8b zHX)Grfi8^Gg{*Ca1U+zYK-RWC?y5KSUb_l}F7BykyU%AAKT5-%wT~Gtqn&&*p1{G? z4IPK2n~H3X1|;3DE5^Bz1!Q!up254wOQ!fe;TbYxwUb&?b@X9wacS&PUn5CU4PJha z#?DVg%Zx*Q@3YwwO=eo?FTc#BGRQ1NF(`^S4I~O(4yel{kzHDOdoq#KL4a#n`i2H6 zs4>}wb2J9vM;b%p&ZjYNb{c)|jghpoaTeNxCtuB)pgq1L$e6^aJV?k0ETu35PxOZH zV(yS#NGF0~JOK}o$d*^dE8u2+m$61AVA7`1H9uvaYxcYhhcv;f*(~n@xTj892RQZM z3Or+g-2G^8%Nj0jyxS}c@pPYPDW_ZPD!xv<$GD4VSYD8(dCSHK&K2g@i~eg|D`6l< zVP69uLkTb7vmIllh}(?*9SaW(r#(z(wD#qjG*{)!8N+~P;E{>g^*|DLn!7o>+iVgf zG1fnT^~1s2_OO8yLh?7{7ceW2NI^*8t$l2iwG*rw1VLMT%AK-0ON zv15h3R{qiwzZepW$4>G5-xv3k&r4_Q{V^`~ksu0U z2U0@#CEmG5Dhx7%l^|~s4 zD2AgUcaYZ7g@!S;AwZ;?N>gH<7XKP?!Nw#~-WNzvow6sOROBc4C_x-0#l#+!D&KCp z#|mZvk`)Z0RIifNuUgfsc-5;=+Nz>Bf1Y`H12%_mv~)0yoovj0KVX55ZP9AMNj{Eh zKpOz$7RTi586rCkR&|p_;e;w#`C@>UY=d|XtF=yd#ae+o@$OZxCT!g6RkHdOuu?T| z=roR9_IO>2;P4t;ypraI#kT1b!w4)IWPD+Dp!-)~QBdd@<4Cc!dR*Z|==4A6%&uXY zqw23e!AN11mk~WGP6>x7_jj3cUBa*`+_;j8|9P8OYlCLzy1Qa$h4Gu{cFrCn=mORw%RWL-_RY@3YvYMKBJ0@IJgL{=ZBd0rV993`;*7W5f{wUji!gfyl#c*l&;0Z69R^o*=P;vP;z@lmfMVd_yYAj(ni=Lw&4)U%0JHMCcadhk)bS~coX zWQ~Uyq$LAsLjZtSkNVU{Ja=g%8KqWUwFD0J8aQ34J21+Y7^TQsnmGLeqihE*WQ-C9$om3kE>lzC z1T`yFyfUU#hMlz^_g2X(S)mp>#j&PW0c-Uu$C_SMj4OO4FiAHs>-=C1_zd10Rvoa0 zuc_z^UY^nV0RMY&$Sl-S9dmV!v8<(YBkG!)Tw}(jOkIQDN=-w(!1QAh z%da-rvE^-;;$bhjfI3S<5dW;kmJDu_aJT@p$(txh$^eTBLkZH=@DlNxZ(u0G)wBY| zhApXRgR@Fi8ZHrrG9u2*_BEQ}rffaUa9XMy+okfg91dyF2=(k5A$!RNjSxdnWk(80 z)B>9|8X?OGh*N_-c_^c4iL6{9XwA|pjgW#$MQKDM92YOt0fdC2+YXu8-?w2D1rlTGtALj?}%w-vwTx(fu?hszJ}M0af3W#uQSuvj(!u; zera)%i>Y2oLti_Inx@3!p!Bt$EKZcqYxK3Ij)t5NTds67oyLh-;W`AekKozxfMbN2S)nD;xiHx@#@=iK`~{E7w}|DrhbBE7Mvu zC^Uy(YAvdDh-XqKwCW?10&vz^YvBv49-n1XYvDt2A((7=u53GKEuZLY9N`@6X)MM+ zTxaPKxQ&K^A#Pm2kS6%OB@>ni5lRSd2v+xbwM7oG{ldfe!nDQ*$1ioy#iPRutL8W2X4|PM- zNmDm5!UR6@Id{s)>YM>!l4Ji5Fk+M$aRU(~(r6Hl?vh{_u#1%SMS`NK!z$Qt=6!?7AmB`8F^=JeTK&o~rdJhfa)=CLqzAqf5*=eQ6h|;d z3`o#RK(`c;ffSKmsfeu7JN`N*TF@B+WMHnHg85u#jKco6bGwT_e9OZTjt^J%2fK?; z@*D)HMndti=JQ9YhXOfIIkp2Pu~t%!U~YoRp3qk8z10&H6d%)+*()Qp=-5}}6^F0b z6cdfG@1jCGRKlrKJkZ=t_vLIWT1pgdTYLN)v&)4RbF0z1NQL!(t~_cq+7VF(hZ9Q} zv~p!P6mXqs`E4$1Q-mtJ-!h04OcD%UPNjTj@V~s@zq{oJN!QAn=I-pfVhI}RB@5-B z_8~bHv!^YEroJC>N}h}pLZQNJoM3Nc0UVA89U``<-S9#q39`acS1InopcXi)&WHiM?(;%L;M+fj+y)zwm>R`kl_L04#=Ntr zlde!0_y~aDma+`ltOD(Vwf`C!DQp9o_nK|R(w#U-Ud>D-kAhMljMgaiqpq>8B}>_o z!)tLJrLIM#s5LZ1t+A#K$K*gpX)GQ%h%zw?C}YJ^>`$9`0)XNnz2bovyd{P$XWa|P z*)|(>q2O;knGc?C6Zf2;-5l%JI%@K%2y>6A8NHLK`aNssWDq= zlOJEA$n&t7|{M1ulKl#9CS@k7-l}(_u z4cr62d-(T%`On_;t~))IWnX!^_;-(g{A=(1z>hxgK2KHI^I4(`e)(ka46IpInQ*haUgxeEg zg$TFDxmCLXF&W(MHJyxMSX9HhQC`~QuXeRP(xMeOj3`11h{;$sk3Z@fqrt;`Y|LiN zNpZwvaBBBw37GVB$b0a=iGW&nEJk=J;Q>~4C}S~}%U9FFr^ZT0{7O_jdC19+bWPl~ zy?A~>z~HTM)c^TrkT&V%N;;HjF)j1VHrCH+?wXch!6X6E<@!1L?5ivK09_#5HP+8P zlr-4;h5u~q{TcZBgNxbSi|N6g5>+;RVoY5`ml-#YilH-m@r!vFGE`aebrVW4-%Ws= ziz9RBOO4kW}00@$U@HDYFAcEfx z)27rS%|pH|R>Gc2sTQQ(CW*785@#m=081Nvhi01)JKWh+v5rywebnx^cfsyYOS?Z= z@IPFkIBAbF^$pZ4sj(Okk*o9xRB*J29|7Ep0F-56icUK!1AANcd zKOoFW+e=UqVMkqPC?Fxj%?MQ6IUm4rVY|Cik&FQbp^fz(!*Qb1FY!uN_DBr4;VN7d zjQ{>MNIrMGw2R*LctH>}U?!gkt`&1$vOTO#qHutS=^*c6326zaBf;@9+AkK#sqOj~Xs^j4G=Gfn!00M_&Fs%{ zq7Nof1*$HTw4n=S`f1_-vcZXHs6&tk)aj*6E@I$haz3oUW zLiNM(WFcM1I)-BT^oFc2GhYcIFT7w!GpWQq^eg67n8@AD)U3R^P)th{(<-nOSk3@B zpc%X+VeLkA4bRcF+ql)q6-4GrR1%!V;X{-~cgdt=v%u0=6C66eL!lMmzdrFh8sQKcB_6I5+U)IXSpZ8B4`+&&LVADz9Xe8;Y>c_B_MWLE zK@O8XzQ>R-Q;eBLjwU=)v}r6FaW(8GUp>h#VPSx9wE@DGbxy9JN3$i^XHaHa6Y*G` zV2Q{m5Qk^7SJQf1;S%QW2(4)=qJo5K#4w3qua?AgCvJczvs(q-kdN=lP-UjGp4vR6 zO9n&5yKi*AA&izy*#?c4&43FC8B5#+0!0O122lG*A<3K&EPJ4g0Q;E;-A*kC8eQ9V zPc@*c6!cB<0CkxnZBQG7-b6v{wv2jht=D25svi2>00Yzcmbdgt>~5n8`{!a=1fz+w|d zUg1Tk@xVC^ixz(W^z}Hp$Ocl^XPeFZUy|&y*94{+dOk|;s6B_V?3jw@jlYu=f zd3v6q3qCMIuAm!K&(;85u?NRV^me8Y2OB&eFI&EG+0q+8IB(M z?vw9RNK-{`vq7R*Br9SiG{)vdt|_t7QWjCW@fw&fHY zsyCbvYYfp|!>;iOJOehqiFwiVHyalOUec|3Nw>*My5c2W3h&pvq#t-mw^Fmci4mkbQ~CV)0lGH@HSW2t?%Q9#c?B6Qn{+HK z;;qaFW`a#YV(pVLafnx5Lg{N`*I`^|W3VR^Pa;cJOO=2b>CRT$emQwxP;CfS(`n35 z?3X-Hs+ZUj`>u&4Ay=(c)8c`Q18ooj4}`^w2QsH29ysPaZdb|kq_r8P3l!yczB1q7 zfngdyRHmtPiEV3n*Tb^Psu;$qiV>!&Sm&*xtEx;x(x3`enfj!0<QtNfkZ5~OgxMf)rk1TULy!l3 zP>QxP?1PzTbt*H#>QpxxHE3|epvvnqA#pA(Uwz6#BD)G)ZoF^HMC(w3(n3cw42Ztc zD7VJRhEUf^FIMek*IGXaZ4;UY$J9l83q7D-qC&b>>IPlgv92BW2>~V=c~93)OW9RZ zRiwJMPuKQC*CLh6t}P4hhuHwV3SC>j@~+jZFdI<4au}Wbszi7Mz)1_DYsW&@iuw?m zxP;4C!AfY>d~KfH@k=JBQ7ECA4bTc#3CIkGunSUayxA7!GBD#}tT^pn1RM(*szRNd zZ*Eg^HB>TOWjeK#42Ip=5NG0P@*;4}X0Dlph>c6OWJyciG4mL{W;)LQG<@6qFK5WEG zbuzput$Ijp4YZDp%qFJCTu&{8Ow@aE z>BqQ5#nPuP ze}q9?twplwaGR0W>XnV*E*jE$DW${BQX=ZVY<4P*Sfr)V9m7Px&K~k=@c@Tc%D6@G zV4iX~%QfyNOf86|wW+fd2fx<~=$~2%9`S&D& zNi+_F-UBNba@d;`F0m!^RcbC4K9q7gTn>2Dmfn@f@=;rudp9F5Q@ z29MTan(+)Rg73;&6f9;c0S-J;Q)I*}HHo7ua)gZWYfmT0JK>f&HSKUg{IAwD^G=&O z*hYK&;s;|dsNI8uu}Foqll+dJQ= z=}ji@@KPeRJv4INZ?PLq1T=~}za*mxrc<3vt!f;lPR-ph=cSYU$5VySFmB{Y~M ze9j6%t}Rw==BN;F&EW+hnaJxrP7($}l|&qjT;Q0uWs)YXu9Ya&-n)dc@^}mD4)DSs zWL8Y{q5H!z7D+1h;NuW~^zqoIvdANnNyQvA_X(w7JjjBvW;lz`#)88w7UhLYsH-P- zvB0d*eizW0graTfoe}kC-c8@MeuE4N-0tw%DZdp{-r~2=pf3wh39NvsD&MP zq|rN~X@&>Qv2o8qygpLkMKJ+x#!z%_Wt6Ex;XZ=mT^-=)4=D{VmxDbxQSbYU6?dAR z`lA)*ev0pLkrP#9zDH#43ZMkCm|x3$*X73#9DLY64uyU1E`Roc&&C=)ur;j37dUwS zKt8#6=fA;gh;7h}TFbm-nw-JIsva^uEChr>b4jtp z5N_GLDi1Q(*;-M0q-}wjcfx}%H?!~E9YIjup}7?a0RLZ67OlKnWLj4!i^`|>Vu4Uk z>M8c4!X0X0jaliEHQuw>uzE8v;H%`95j$W(7?giFW`E$xq+q)Ok75ynC2Hkf2&;-> zVT$w~o>fRBay(c)g!w(FR|_k#Boy#zx{W=R^LuDVD%a-sn&B#1a=XY@tEeg8U!jW^ z#q>4VcThnKN%1)7!+zZn*`9tzF2+l~OM0W}N%5y72pf~-TxFuDwwtetUoSouXlh*y z4;0jpTpZ!nros$U;8uFtxRKfl>IXKn8keXaSdS|{*7%6?fJyA;fF7&)^;gBasCjH> zbQPD@jtGfzCGc5qNg$IM1%PUHsa|TfJ&wZEYfcJW3#~un&3)Eo?qo1Jl1n@ZYPu3s zOr{WpA_8p;euxlsYI!F#f2Bacf{0$uCAl&JE^6&lZ5yyWum@e|9DzNA;F%*xj7qcz zM^V$cQ(zBtPgD{&tc7F_ut@q0Qzvu{1pqDiyN6wnMr*3Hi>!BxF)a($ET*+Y3nHOZ z*nP}=aYh{pM`%k~0{Bc~Hquh7c`od~DLzSih@$A|j?Ff%h;r^MK!Rx{<_gq9wxezt zcVVjqG2LufM#W3;eK@xl=Gc9m#VvP_mHYqJ3Uath7R0eR6j_R|scfmnux>eSQyN2R zYAuplhq9-465PZ;@ndjeN+lZzFxzRWD3hXnP8HT7RWfw>2tmfSm67SduBTn5xLYP0A-wKmK0ex`aNTGKUK zna%N%R+}b(0izezgH} zt1K9eIABKCH)fEljZ~~6DYS_7AqV)-cr8qh&}dA7(7mVH)?juFe5C{2d(g!;J;`Ei z*+)=PyCSv7I07iA%Odiqw_}V5?~Vx9D`Lwy1`58~|qc3Zogmw#>yYBz%* z7}YuK8)Cw$T?#91@Hz|2v7s|hVXJDPX^-L_;*?@sGVaq_XeH!>4#IK-%fWoL@}f6s zwj$x%Ah+iKedA@C3c2Znk zeb0u)(M!ojZlT1MR76sGIzkEQ3SccU=He<+kN_xD>8VFC1^PeF++yFjLd3q?b&zQw zUd{cZ(WMtfwT40{tn?McjQJj*JcK4*1#UVZD6>1o#csDdjueq8Wbp_5vOmiIK^tuI z;&exJBa>cB3}MtLjVQ@U>>GwOYTSw<=!T{*UXffzVW>!#kb%CN=W>!M;uMU-4Ad0_HKEX|_h=MUjRoZxIuO zKVEO!tr!bKy6i)BVnQbCu-%H{NVJnoyZF$b{zm&ch^bAjZ%|mS#VBAm3kR|*NS2)_ zXT9kNVH=s2kjOSNFxgBqNxqGY_@ZPZS8YRRi(JJYw2$8d$>p*rZ-;UT6?J>PgQ|`9QemxK1-+HW`SMCm7Zj�sb_`WpA2#_jUk78NRV2<8=;sujmK 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

!Kr4Hl0Q^>mzbmh$lpoT|5uwZ5Br z-GoaQs`yqSFrM=KXaq+lrA9#~KyiE-afpR@#j#3+%WF8LD2xQ;1wz3XqmSG$Y7X`; z097XM(uy09cP6@4I+fC?Moz6lC+>RwNmbJUduo=U2Jh3=`>0RR>r#m+G4vB~1iJ{I z9g%hTP%tj5*xPH!iWF+eht8#BRwFcgD@PPO%S+;D4)lZFn?t9>Y5JyajAEKHdoe0| zF>|=WqJBMdh@wTyL72=D3O|Ca2lB?lknSbu?n2x)W?k!mL$nCYM_>-*5(SbXNV%b^ z#oH*?%SZqkI2q_ZNl?Uw_3~=vk4UHcYn2Xq$_kYY@|B8F{zR|D39KG6f&NqHL;NF5 z`c~^hE$;A63fEA2J&X5>*hCQ+D4SWmw^u}m8Nr@r^=hw(wTLjbV(LQ!=mTBorZe%@ ziaCrTu*^Ru*~Rs3ip-# zR8mcCQ|lSx+bEut1iDSrBuBTrd=4;@hLOt*T?RQ4R}nzLkiY{KLF-Abf(V;WMSo!Gm5_s3hk#X4Rf~f$oi4q_vGFCopws7Uc z%0A+-)Oml;hHMY!>F=Q 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 ~*@A1CFc;jbm- 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⪻U>OtQZRJlBaeDs{+XPg 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 M%i|a8jIG9h0q8IB`Tzg` diff --git a/wasm_for_tests/vp_read_storage_key.wasm b/wasm_for_tests/vp_read_storage_key.wasm index 202f5bf008463011375c2c4c09da88e846aa094d..3e21d22cb2a7619f030c6455d76d50ff70824a01 100755 GIT binary patch literal 475686 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

`GSEkcoxNaMWqC7CVW}fd^7v98?QCfxMmOn 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%0DR6XG5}u&g62E5|YOjd#nIbrZ|FDK4wP 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%0Ak+)|Hzs%k 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 z⁣-gZrP2&kX+We6FyZW(oCU3f_#3?eONCiF+=0Vnob3ddA*H>F-4Rb}%-7*YOl+LgN!H8YW_n~G za0Bmu08}eOzX3narBZg4{295Y?K-$}T}0TKz0bp{t%rEXIwg@xT#gK;U4mJmMAEx4XJ_~vf9q$3uP zN8Hg28d(tVAn*}TAm`bHlRU#9C3_KgkD*@a0S#97grqK>6q}>)q^nGz!x@Ns$ErYQ zEg3Jzp(%u0Qe>LMSZ)GEyPbf|A}s^m#3CE32?yP1;(~-3OHR`P@oJX|*h7RvFtmIx z{I*}BQT498v-fF_czL!kPk$lbcQ7i|zZ+B8&Nx4oL z3Zig;O)Dbt2IQYWZXNKp5EK;+mn{Yw@C9(#7=z;27ai1AS$$6Ev(kMB`;^?r{alPW zK;#`@QLtevf3hG4K59DOTH1kF=Yu)&)5Xc>*A7)b!3bRkWIShIUVouqQOQN3t}Is! zo2XiumpLSEghzLt-`0;-Xc&cpaWy;Pr4`Pbq7@!2Y(xL*jQ-|NpDURE%jX-47Xt@0 zd^XK?(;rg{EyS#W3}Bfvt&kKVzRwG(|4T5S9&&BMX;5-nVM&`Gj0_09sKOd$S|MhK zft={J`M((0G7HaRh;gAmz+SLC$24xl(2D3Y;K9@}TiV>Wt9KSm%~>pFQk7(gWd+TTa=??}XMDV# zEblt9u#z1sPg9Bt!-d}lDu7qo#5xNF^_?75D?`B4aWI?8*!x(z;i=ab14IlphMF)J^ z89I2r5Frj$`Gx{1Q;DXd0C7-`8$g8l?MQBLSpzqCUCIqGMv5DV{+9spIts`VCTedq zTlBZW?IJ5A<+Sk$k$dXQ9jboZP~b9ggoDRUK>>7#(2quEHE@Kr?pvqm%f=rPSnjWL zgp@@j+5tVm4mcMTf|eR^z1zxFTF0Usn*=?lDwdqw1t4Pj zfqm)pArmWgg>*IPC?|-Rn6QbgKy~etK~pcH)zS6}N`y$7;q|DX9eOGYbutp-YAcNu ztT9pH0)6BI(>D)FZ9$gGXAyb?uz_3l9tgcMiU z(VVP^T?ZZJ)zP^-t}T?q4q1W1`IZmF+LyYgle@z(sb(m$O}&cRT0} z%VHG32zUp5NncZ+{WabuwiObk5cDCzrz3{6S8o@&&c=&s)h88dttd7MITEXO7E*GW zqjdU>5Gr1n>$Vlr`dp4Yk*yIiLRp4nUQag@V*KpDKV4WPkwqxSP86vS%gGr7x@3C@ z*+miR(D!(y`W<>Z-3~&M$4ehAXb0f}?I859fZG0w1=>N#pNnk+;c}Em`mHZrK(`Mk zyil;jWZK-)xKqEafQhBR>E|l&`_|>QGfoagTF25;;C2$ek(b2)-HdVgs5TNZ2b%(4 zmo54#k#S`cR@v#svB5q<6sJV{{saCT=b9j~f}o2(1U%2tKEgSQZYo7 zC18l#PB_y#LrrACO)*65o}I`J#H9}UDOOmVXNnIJS^N|eSbtDqe)bYLkU>8}E@;Hu zZqURbNw__Q4iKeRJ2;cV-w2Wd9xUn*t3qNp5A1;Ac83>QzH2Q z>i<$CpY;1*5y>Y9a-Ac@V(^ktUV0>-oQp@&#x#--04X5nLl%|K!AwR(uei;mMDjsF z4GQ2tgyEPEps>?7K+wV?kXz0M^h2|}Fx{pKGF5;)nSId%WfCDbZ*(`-z{s!ODsP*Y z7(C#FFkNbQHo4m{vEGFpG{tX1K`}mU-ZbYJXIrPP1D$?>8CXID_Arca&XAu79A)B@ z9MP7Ez+?jTaer%cKpm-6?@et@T;;yvuRA=;Z89|X6=fW;MUYAyTH0g zE{v-jJ!Y;_`dW^@&27PX0G{O5rqz1)3u zuB%8g+}PnKpPV3qt9@#ZaV=13YLD?eQRaG_b{K~PWm7wR4};*#>hQhXCLO+C76rjU zLx(3=MNM0*9`8c7(tCF_rc^5v#mr`{$S0<#6=y9lKhDFnT*ujMB`PVRo8SkE=`j2XTWmE2yaa=4$JY=|Frfq?l z(R9nkVvMaA-Av|e7ylpzN(Z)cC`eY)uackU>IG2nV)Vm?0w`B8db*(i;#G{EXeeM! ziqYd)L1u)*k~*^yP7$2Eauh2ZzhL;&Nnj1VmjyiHXmyo3@nFUi1}f$A7iNV7o&U0VAq5heoll#p}LvV_2xt^R|iXI-e)d} zelt^??^EiuuH-o3B%e{;5Vr(J<59FOcxYmV@_lD{ARiu7KppC+TjJPc6Xd2^;_Q%g z4X?rE11fdV`JG5sANu(Kc2XJA0Gaq>P%Ml|(!qByaObq@Lxvma}TxXPg%T0S!@ z5?50nkHjF7ISWxb#i=Yx!jez`OSwpi+66d9s8i*KwK8fgJ={>zH(wqyi$lheLl}pG z{wg804rRvdCsdNzPn0VDEs&CL?qvgWbdbHjFbUF#waUcUZ$vKd6xwu;;EJ<<-J@p*5L-&O1$c6&-^<3Z% zQGo?_NAe_#;As`z=wJkCyH0YoIdE)(kP{PTZ4zAb@JTDOSqS4r_Q@#7!jJ~C&zzWj z`qUxvY%vS1iedHX6}mkLiX4!@&Oa0X#M5`1HCJ$54B9CVQ~U5-D{&mml?;O?M^?N&}?arySqzGs#sBPwlI*lMDNd zK%!>eVXgQp*afqV$DMkd=lmEvPU;cl75^?aQB!ml6fHc^jwf zCMa?r(;n5okv_my`WQz{XtGz^q0n9EY@xa8M&ok z*b!h6gj^@MZqPHQ!-#c`@w}YtL2^!=tSj};*YE9^&A3i*+T#{oF{5qfI#wPEI^mT| z{IhWO`)6*v3L@8;@c}eek?FM=|F_IR4Sc}T1~u>j+uGT{2W)p|10S$FmJNKsNOdD0 zupp~$e+jd%C{uqkz%X2h?cM_P*mtzJ?k&RO)x>XP^ExO2%smN!Ch#iB9cC{sW%0FV zL9Gr2OB4|V?GS>6(zE7^)}_zzsrjOY=`)BlUlHs{fj%)5Uf^#@J7_{vyI7@r!(^s* zamw_$AGQ?r*Pr2(P{8^#J+MsvX?=QNiTu-NdJt=mK-ypyo^n1TOhU7lYaA!n$FZCt z@SKffIq&nFHL~2!7}pGJ@Ry~Hbomzmv&Z6)T3OU95o(XiB9q z&tI#6$aMhoM)uCveS4=;Qn-)6Yj8S==`%x!DK%@ri$wAe^BC)t2308MvYny(NnUOl zQj8pl%0NwG&&UkEIguG;u@lueL_yR>veI+9;{G$LgSux_r`KP_&{WL`3B^W)qJ#)R zNtHEB1kH{a44umwCj~}RQIU$HBJ5~VIEno)GEig=xWI0=(){IwV(~OLT%yY{VbKu| zIa9l#5y~?HZ77L0bVuL%?6(S{4ZyUwEd=RB8@i)^q}XUf$-;c+v9qom!2i)s^Gri9 zpF`G? zl8^l*7@GV@p0K7 zTt~@*h~+ujJ9j8pT8GA^DKx^mJEGleLXoj8Ht(F%TMiUO@Hx5*Ne?MaPxH7LnWx93 zp2~Gfu4s_`zLMV(*y<9THe|}^5}fLIwFHipFSId1hSK~ae+p!~Ij|tPQzbjfAbqA0 zJL({P<|B3#f_q-&N70kwRA3Htb-#;oFF`kL0O~Ga-Y+Qcw;6CyjRgJ>q0|PQ_C1 zB4p;}g!r$^>G*5QwiPn>Y4`2;bTP-QU_alek1jMRcdSHH?RKjp)M@8?&29t7N9`jk z@{@?h>9O=oM`17JeIJ-@AtHhIrj$)Se$+wx7||g>3|klFFk>gkif)!>uZrz~C}C z{?Y$?=L`FOy7PM!49olrF#m(DV}j<9MVmZTRgS7w7t30&dX$>lzQz2{*oAs~Smd=@N7Ra4Pt%I7k3??$FYr1>G^>JSQ!&?&`Qfj9_Ky!FyL=Pe zP0<)kY(V3^Ec+BR9uXXX#{Z(L(D-rPjKIA+B#ncnor;+aN(eU42LY%CNFem0p~wfb z1u&C_rtB32ngUArHG$#7dIB;Jsa1%9dzo!m^s1V?4b+0<#4t3rj)Ux&DXq8YKwIox z%y5aT9IJw9(TG5BJr24_gB6Q5`UR9xu(DntOm6U-I~?w)>#q#kYGiUhXm156hRSv= zBsQyK@)>y<`5@yv3U2-uI~E_cXD`+REV>IBOMFR*i zTn-G7pn)pm1+C_QH&&4Ti0n8@0FDZF71+(eb%dq=SfHv>bD^63 zxo7gLb5ADsPjmkS_fR7C(_4y~+39|d5+WG5wD&)3gNx$H%!)n1b0WGDb)G#W`wnI+ zf_`>1TQd4=2{29WsUg@v?M@Fih<)A=*Gd!9iX&;~TLbD>qGOa&D#dMw`!wUS+RzUKLtpGz17QpXV z(mG2P(Q_>MA5+Hm5=UrId(;8eV~eKJtrr`i76)>!$(}|Rrcnh$YGB!r{2X0D`ipgi z2%N6#uDB3v(hXGN<+_d)g4gH@8F>X7`wgNyA};b7bVonKEAa}cW!=$_xP6Vg{T{b3 zcely~w#nW8Gq&XtH*6chT_YM3QCUbO0_%@JK^fUer zbFgrtm2y;B84ecncXYGyg)QDzh81?e?))?G%tUz|maJBh$EV0I2sp_qC-O_S%;VWI zYZe3zlMT=So;zsRGo@O+IVTNet?f;!<&2;sne1o7TS-}oOe#SMx&VhB8k)FP*pGNp zbmEBw$~xICnLu*qu1CjesX$UPrNac0$3OK$CyG;3Os2yfQS9&M{)DK>@>9?-<1*67*O}G8PC!A!jE`GE!;FtvLBouXT0tUBYQkesi5cJ3 ztQlujH5iC9$}`4h9dKpSd}kfDIpgYxX(ns!5!1{$KSxaSIAx96GabOPOX1WRuRZ!I zq;pn^Ure+p$z9bj$(%klb&~Nx+9ZEhS55L0x|!5V^}&o4Z7`D!gBhhLLDURpuuEw$ zaf2-Yq@i#+&|u`6J{pI>bMG1%+6*ao3k@b>YQR9khb{E#~_kT}SPt7Dj-Ot@;zvuY|I(5#eQ|J1g_q@0B zp6zj1+w8VDtettQfK*Pa#?lf8SzvHCoLq?jpPK-eke`~O`AN@qmA<%vUt62*3LZ2l z1FK2;o<@}<%YL>tmYXagjVdi6HT)YaAvOH?R-lXlRLM=ZmXgAi9MTc0WW4ZMl}`=7 zfSb;{jzXX*%o2}>|FhV8zzEXIiQbcZc7(T1rls_GD}7!Yhc^>m6Nlwuqq;hdY$SrD z(>{>D4P*coUPpLW99~O!XB>6|nHv7hh6&v83qX?L-<+TVuD}iqi=_7;QUC0HwqK-2 z))LYqYYFL*wS@G@TEf7{R`%G0l067~Ac$_)PE=Kc6WC^~w6O|X#Dn?)=*MJG-ydjD zH-IQ@P_cJi7l$_!UK@uu>9}|t-bi?L9Ns{9WgK2dcsGlOa^TL1>~azIM^Pp5ppKy> zZa8gZZT4f3-jo%-tgjJM#;s#KKNfafcdrRD1lXxE4#F}K|J@TQuC8aN`U8t+R# zlXO^9v6{reB5KBiw4vJ)V)s3^rCp>A-eW5}Ng7JkY@oQfwvE+ndS6-xRv$#x>;NLQ zZ+%+mUOVoihW9y_i@549LD4vZu<~CZX%c9Xphjoa_ewn8^33%=u89yqDbRR>2Yeh8 zMdHvA-wX8^Z8_V>mH#2qaW5p=E!(fZEZv(FjaCDn{|g%Jf0jhM<%ff2CPkvv`ttt( ziPj`F8+vWqtxU)&5)Fx=k^Zu*GSUJQON_g4bS<5m5mp1(x?CgL9H!Qa8`w&@>|IOL zWX8!}iezPQmR;nSlHP4OZj|Hzj&R_xKDQXVk3m_)pFs7{v@S8XM#Q;R3Dc!o#o;%Q zooI~#+L00=m<}FPAjox4j&)glpm?b)A_cj2TFUNn{`h9u#5f|*sDiyxZEI0KR80?K zNFN_T`SzJ@=b&u+Y~1ca*#=58 z0ZEENU7e_8Y)EuL>zW`nB(QcSF58-Du=o@bN2Yu=!fCT5r1yJENbmQSVEcW7qAex8 z;afs_!?%PKCFRaJIZA3ZySHuo0uybkDN5>%H~nggk`*bHP_iPW5=vI2R6@vZ6qQ8j zf&@`g2_Y*=Dj{S=NhO4=8|iq{A4%)nDi952qYm#L1FO{|BMkrq!QHi|=f$|`pOd~poC);QVY0}jah74$mCvyW@W63!DmGERk zm;#OHpUV^^JlUTP$&CMB3X}&!vKW3G4`=sa3I_88vGEhIY7~ANRxKetvX+n@SxZRc z2un!eh=h!bnF73T8|j?l394C7i7AQtV1c@= zqB+fZ9Sa4XZUgWpdr=U>)186fX_XEG8%o(H?XbN@I}CzJFi`@Os~Sr}i){~wp1fgd z1P5pkaH69@cGk)f2HWS3xv92ezG1el)i~cCw+Mak)-C9LYPSrzS=4+8J5#fCCeosDE~em4f+@`y4J*j9he<&`n$njJ)}A(2?yJKLb0lpxGt$P&Khn2OE(20j zYfZ{6iB~a=!xp-Na?j;u(Q(<-HF|t z*x@0tqJKG&z z?Pr+stg}*U8yXhJmQdT!P~#hEvc?D78cH5fStUtO*xFmhgZxZRaBlJDSPPNOsM%TQ zm9SMLCVJkT8MhgjDtsp**)=uMc%f2VlL$*UBnu0l*)ovT!BELzDMKQkq*&6R3{yoP z&z`^6qH85@N=n8=9`V)n$l&Ff+G5pOl$NdxK=1!8!@SQ?9yo?GFwAT^GB&`hY|!FK z#?{O=v5|nx5FEu$nKjba21Z3N8WVvZ6PKH1h_D5;ZXDiB_!>84oBVU8XP3FK+`V4v zf*S~4;DYN2&U3-F1W$9pH3Uzfc{O1mgN9UY?fUQScs2Uf2Ol&3st~m;GF!Dxyc#Tx zqAR2gU1=Lg8@kfgkv3$dp~Ki?rEMoIUTKIUQY&p+73dfw|3g%5EA1ckG>uy(Q9o(i zW@3~w7@C12dfk))Iq8+0l3)NhEtd!+N03sI!F_Wz%lg&LfNlx1G^ijoZZRH8>FoZp zXh^ndLWzSE{V9}KQ}pi(U8QY(g{2bwwI{Yh~cdQqKu6Sn151R217+9 zgaj!>r!L8L3M-MJxCb~OfG>9q1qf)*a?enZ7&Par0|6@|v0B>iW4wy*7D^>V`YxL* zXS@edj*0|i2mG#8*m+IHik=f2h67hC=v4hH73{Lq-NHcb90iu%hKyE=!p?v&HT+;N zJS4??7Y1(=sT9$Huv?EZ&?^3Q5TwlcD!>NVka2a8*hudLshX)GU)GpKCX(bqTflZp zNNoYzEFrZ8Y_){i7Qi-Q38@{xR2Vgil7Wl2fQ|HdqPHVM6P*3=;O)KE^Nrbrax$b9 zYs0<|;x)4_>nd|?8wF?#vv@4U&Be9Ke>sEye`kRBV^yVb8lhe6_~zU|xu|?98z{1} zDJd79{VDX$*{D>kwnOZ-X}gmhBF@JA?=|1*q$(P{IqPg9H)YKxk`FM6OHC0}6210CEEsyrDB$ zwKTSFgq@s!8A#JvjtvOV!1i|V1y#*vHlS^WF*T$klA6VJQ3XF*4|*W!0tAFWY; zNZ*#_a3Bep7qi%Q@_Z?a4JR*tlEpU!&z;%QRHeU?EzQ#N)of{;(qGGRdWtjIAIa*7 ziQRR|$&$*N*m<)$wi0K#t$LTbM*#Uzc`RuUk(MzW&f##xd*xF}d_0vXUr&jXAPldG z4LCJNQ5A!zs@Xw|d2of%#OzA0B0#Rjv5|3^_33K~YvI9fVVDbpaAlUzClBQf`FV3~vUa%^~T z>I79qNh3I=wT@Er=4*$O*`7{hBePGExQ5f6;K3=hTzic`3D%5!s0cmRl=7X7=VX06 z*md$q-2#GOJ&z~%aD@55D*3vdhdBVJ6^q{nq(B%!GrJ%NjXMByEa<^k2Z>1-auHfp zrmAai+TztrQxVOtNyk^$BC)9|t=45D=6b!!nW|bWF;z7oK<%=T^<35}YgYDkELCxf zB-)lK!Jz<#%tZ>|IuB*wuFB}gpUZYuN3egxk`(OvP&p!pHe+=0;_ll;c!7M6n0qdE z8u$};)|c+cg+cfD;NyiodR8;eBdK>K z5e`QpA(5w;uCRgsx~d%fC19Rn(B7_G8O}k@(NGCilzN$1o&PtVH*#PKh?}PvVfej! zZto4b2AVl8zE9hn+=!UaMdv2$?s{iEjOUY@=XSY^;!sr0XEW2;<_U7lKPR191*l?eP-9z34NLcS7YUwf$Ej_DT>={IC!l0Z*|i$o3$qJZAC6!#qmX-+YKCk&`RSb zDOMA9RSh;9mFhYcyujL~=g-CtfJ+0=xX+6j;)-Gi`w4acfCY)NVz0_sp5chGnN4-t z8^&g~)|Je`&I@%VTwt+t)|Em%U#u%}iRjqO_PUZ?D*95LyyIZ_TUR*`BqvLmx)*O$)H6L-99j@(vSUt;GR zn^{wjAcP85*O%U|_^SHScs*CvvlHWFICgz%_wFKV1(MY*RuAhyT;k3G7fRU41;f($ zmW=OVt#3eWr@GhVE=`*l+cZf|IxtOQh=w5XKOcwVY%mku^f|l#jTupyd(4Pk^3_tw z&hX{X4^KTF4_Ps>yH4{J;kG&=S3i7|?`gugNPW-#mvzrBc+Ezj>j;lCPRV~^S4#%@ zu*s*}pdsgi+Em6Cjv4_!b}s@E8^RtrGpK>8tZe=gV^9}HH-9cWf=loi1PXONyN8a2 z&duSvG6(ii^Zwq8_p7|bWCpeqy^2Y2KLpC_blZrTYgXaBr9SSEp@9W+Fy|o2Gkr$sjI)ks}Sq3PKZb9%1`78&frys?n!X-Dw zMlJW{;uXV5`RHUVyIM2uzQKu3?2O*7)B)TsqqeN8r>|a z6%xXB^Ldv_|HI&_U#IF0ZCBcIP+qdDoEB3+!Cz=w2~u0D%G~SLs#ALLZZ~AFYl!i< zfop9$`79*0+k_e_ud|q?VI9~44CL|^w@J83ssfVvirYur99n|gX)HnDpRc&h$P%;w zv|W{rBv+E^M!E$gPuO)5706Ym=wQp9gw?5Hp&sDsVIB2l;9kLOIeqgDyebI;kAQb|F z?e+#oB-3vy*|aA zgwx{tEAF&l7C%sNCnL4^6vbyQQD=3vYKv(_)uXsSxRE=;JC6FH1bHpOMa1P74GnZj z7v<7vXvYk%;+kBX;msn`vzDnn&SZLMT^^Y1(%cc41Yfys3p;gHX7k#zZC>#Wf=`hK zQnu+H0cT#1Q*d(?0*(gq9TAhQLMIjbt&g4ZMO~4Q+x4_yOmfSP;}GDoyNL>~&Eo8!RQwhf269$DPRZG)yYI7}1(yF%Zk#%>9s1+5t(@e zGOy$$%{75%SJDa-cqXKqYZJoLnPf}tfQ{M#9mN(mTxS&EOIfku$fPLMB|&I6j4Yj? zGqoEf*EPtE{{D6aBoDhSQc;AFBf}Z?JSCj*08;DY9w<$%WD%cA!YJv3G34_6DStBp zK>*Y(H+ufBqK|iKfO(peG6YJm;dh#kE4y`vg}K%vr|zwjw9G_bdLoT0w-${fju#XH z1g8ec*maPC*jc^8>>kX@Np@*P1T(4CyNZBKp^=MA|d=*q(nlxV0Nes zRT3l#C29H$6;&vY>$8Ngz{YFyeXI#XK?h@}e3qMiWpA z#t`tBvS4T6lm$qt8$=rH(I(omN1M{^v9?<6aeH(+$AM+sp#O4vu=~mj-|o>SDj3qH zZ8SrYIOdS6g?HM5mcUcODxil+OuFfW;j$%@ZJC2IhR)47+dKRk3= zW*LuhQk?gT@;r?PTlNV&$Tf3%W<}T!6Rjq)*|7cKcb*jXCmRBnLIN9y#q1`@X)g_ER|{c>ixQBQo{B5dmqC+U_R>JLMC(&vef zzZdkJ%yy$EzW-j-^Tg?y?Rw&ca)+J^arUR@$*dLV$=lvL9&qogK!g+z#V`iFV~1=k5Q8-0d1A$lfeMJ z#=V1)q-$n0InGF@3?%_H{vJ4K5G7D`ijS0NQ<6v8pt+!lC!6j zsl_ZQ&EqmJ2o*IW2MsXQ;q*f$Y&NmW^2&PWq?UK6#@o>~@MgD8SdHRJQ!a|k@9&wU z5$`06%QzYFP&}B*!7hl!o&}wNN znv}=x6WFKP0TWh9wM_3YSnHtsVq>2rfL_j7t{HZx?pW#Ihia+UXx)z$5A^W0OsP+! zureEj?NAk&rD30_69X|EUTI9Z<6^NJoJutr8~2S30E(e(*deV#hqMaKC>Aq;DVm&i zp;_KRD6+Y-vSyXlEE5_u$jz12sWdSp4Wx0-NDB^J+g#a9S_erxpZL7|qYER`k-YB*`T5&|=9w)R20K&)EWOu97px008ksQk<{R$3f1j zCvLGJ;-=W|&i2(}EOM*?BQ(xqRa_FDM+>unaxY|(=9JBb>N!%tpCMi)&> zBnt(M&;Xp;Tgk}kYl)Khm$y`RbEg1UOc zM0A6+auhh{w8i4wq$c&j)BwuQ0{gTZQasQZc4)3j?fT? z-9y#kMM`VQkQe-RcP#=rW2gD;jX3T2Od*qAaBMZ&S5P+t<#7TaRp1N6;u5PO zI2rIpyo5bA3If%9#c8Uq$C zswrz%)kTxS2K<-iD^O!rn2r6)q%0g@*Q#3`S7$kHPIA;7m{LAceciFe5|uqy5yC4U zZ{9IzS6@p$%dCiRNXl1MrDq-FN;Bw1Dg$irK-2EnO9p7jfeZ|{D$3xN?%ASwK}(%!Aw=? zGhcZru9WRX9nqjz4-px-O4Z$!IYU6g7fK$~CCRV#C2AD#q{aZ?$|a!E8n!!+-v#(( zEW?auGT*od>2`wzk2Z2BA-ti)I^Gw0k52hmZcMd?ysfqx@q2jp zifs885$?_p_&E&g4BTW>`&8C{U45Y4gay)Lp{^%60`0DAHv-x~D;@Hiwr; zQ`j7yH!ZUu3?A6SI7@5%&(LXCJwf*###s=~P|wc%qUJ{sWqLx-bm)DD6P$EZ5_+b? zNb+OsHlb#Ul|>d@VRM*MJ9Dr`>oORP)pjGBH%q=!`F1Akpww@(xs$(X zDM+-j+(%V#_kgyB}dZ9VEtYnA` z(OwvO$oHJlMVPm3@-=g5%z3`6mHSAWt^-hoae_!Qhy7t)7(%s`4rKyc`Sn(cr728U z7`B#+e6zSz?Mciyl4poMOO7Tpr&33cqocqva&&J{jgx>Zok>&YOS;!k4qIO_~I7Z z=}C|wm`E|V54b0ExHX21aY&Kb1jAgeA%?=6-3Y1N&cXza^G3l7 z-LqR&iO5PigB=-t#$OghR1$+jZ=@G}C6thSFVCxt84Ru)3bbl&FviA%0q>n2f(hAF4P?pHr2(;5^ zHxV$=X`b5xHjUP>V~&jjrjTLBlCZ58l>jd#bkI$`t*DABnX5H3t#tlm1_&14go-d) zaMVV2aJ$`mL9ZIA!At86-t^qwVtW#h^J0C%$uzpmJ4xZfTFUYF|ccZ%B^It2wRtn zk5i*KpGgClRq&!~qYkeUDve>9!!gR;Ms6-0Q6dLlb;n6oeGH?=p3V)gx{J~(8D&x} z)}z*0R`+s%(B_A}A|0}B8K*_1Dj}~mtPfGOFkoT7%Ft;(azbmaUWfgY?q?eqX1c9r z+90df(++gC=IvWo3X}sdIszzW_<77OjR4ItmusU(AI$Y}BaoHH-3PU4%MY2hVOoi9 z>U7h0JawMC6V9g236}DDGh8b*9%B?)sS)SS!$Bi%w}wx#5gIh)!-o#}a2s-EFAdkk z4UazgbZ+DxV{O$l)~a>zSaZ-85PGAr=5V!*wWz;6#@fbakFkbQ)(mq27vHAFx>ChL zxxY7!EF78;$}mg;hh@gUU<*fuHkB|&<%kPRxVBL62;&VV;VzziqmBv)_0Pi{CSgnA zj_Aktb5v|^ctdpN|Lb@|0+Ig|e34tom6Yjr;b zVnvA*!7*1uQ|WRgQEBaAkFn0x4(tL-9#nd}3kl!lW=x$9UU zD3?%92fHrpHYXL9lv^Z0u>GMmEY7hOm`901rNLrzuh4c5HCSqAFRMIt;}$F&53KCG zaf@fSvlX!%h5*qn*T`uH6#^lk8=4>>5$J*z>Bq^v#eV|V_J&jB6r&d>3`U%?ZDe(E z`HIpMzV9NKT~RJ@s0%_17y9H`4J%dZ;uwv+6F*$!4$7Q5ukMNFD)(Se-lHMQIp-JF zo35~@%v-FFDUU7E3))zyK$AJ72#Ez~huxWq=y*w~#YUg~q9yF5 zK+TE<)WSONq1KP3*&+XUW&FG&;q4-q(z!c2R~{i6ozchsjWclwQVt43*1d?-2D{L< zJcdZQLykN`3KT41-X4zN_MC7GlN63Ql_@)bjoBEE4#vOSO+T1~F%|D5B(Uvz)Mcp# z09wMy3`hG;f_Q3LQXU^iCvseC(%kawm=GQx6T(xuFwl|2CyOgEFaI^3fc+Fml!scr zon10xzV>jc;|EH^lO6741g{fg%GiA}T;#E&9@^%b2FT;W0C{XY802wNOdca&iOJ(a zLLLtXJRy&V_m(EdzbxKQ~+)#zgmC<)@4Qgl}T5ISp`qp?OYQKF3^F8dUw zp2uv?#MtQQY)rqS-Bgw6*c$CtfEde#Y9r)5t>g&U0JY31DPHJ0(k9NkK`o1PL;0iZ zqTNQ(W=Af^970nZh1j`51+m)I`x^ahT`tVB)`+GvHqYp1`3wM2S$0Q1GZlmAXB6f} z(^ZwVM$~B~*Crya&JoaDzM(JZZIhJkX_}6EBB7s0=`p)BnZ+jhIcvHaB7>*f*VzRa zSXI)e+2&#&Lmy2;rn`TDtd;~So^tRu5w1z3myWD%(wjb!)$wF#um)m%VP8yEyQxuG z<-XL^K&TQ!q%dS|`i!hr_EMi_xbM%K8fz9)qt*21{06yMdico-A}Y+9I92?9%_>z=m)r z`U?w}hht9Co(TSvvA?EgJhEyR8pWCzKes$NMtUg9l%X_@tS&TrUr28<%Y|=iNN?Iu zq&NG&9qCQ_3n0CT4(W}i*YOJYUyJnA#yJKiht17@8R_ZU6eG)R+918r zddx0O`u|AJb_NHd{|k`bq;T|JkX{3*3))LW#}$yz$R*2#0gPu($x;{(`(`dr5{3hJ z{=uJZL|?ZE!3KOGqwv*n}t@MtTNY_IrB->yClIn;0J2{eu-W~(%d zYYJ(NFK(l9vy*@$rG$g2aJKsc_Ef)`!w{=I>AaL(BZOXMo5f>=U6q@Jw+7THt47FR zIF!~>F{_a^1s}GZSop|15&<~Rm$3DexLeCiw8Qp5)PYe5E!z5fLL6~O4TCHm`rc{@ zMZP1T&xC|Lk>|P!5Aj)v+u9&wn5M8(8R(2x>O@wqQYfsQN$(Lj?^&D)+Ig=JLKBo) z*$u92_?N~~$Y)3uxrw-0*GFUI+bo;Dmw3wTZhH`R&I%!VhRJ|g6xr)GjC}85M?F0?Jq{drTn}Ae2&5B4uN3Rvht!NuW56E`W8oqy~Uxd-UB(LZwiw;3>@d&ZFL+^- zzsJp09<6bSk+t-joaI4{C9!7VI#aC?-77te8ZEm}%}q_r9KGqmT(E!NAf5zcU)!FQ zb%5@T)_g280yc$Z?Wv;$83o5%F?v#gbWGYxA|Z1{`QPN^j+>s4^C>xIsI4+yyhoSg zJ+q9!uM6gKo`Y(3_%{ zpU#c0f-zJeBZXLrW!Xh7-AgO0)=5R8M)1;k_#7m*H!Zk~Yxy8%C_q0w;4L&`z>Xuy z&C92e>BE;uc^b0A4TsSNc@IZW1h(%7fgvdA6z7#McQ9D804Vj^I_b4_QboRFWypLL zSh1o@c^mcGI?<-98B43q9N$xJ7_w-JHe*slmlGX~l^joRZP7GnE||Znu)N{#2DfVB z*uVs~+XR{trb{204kl)&nLtx}HHqgDj~-8;>0n@V+8A6nfpK$(E}C}qvVw)$1X{b= zXN78wR!w_t)ubejG(!_76r5IsVWn-0MmcMXCYfcH9Hz}_MVQTU)fQ4-_dv%BNfRy{ zg8sHw_%L2b%qXa_M^ovU1(2qa83CL`Ni=HDbXpqFjmtqm)>jGf5RQ?KycP61rqma2 zV;$8=kPBs56LdgGNR$Sj?1X^$zvWeXB{&sVun5N_N7HLsgo@JTX|g;pp29!fNNUOr zMt|UtBz^)2U^YRc^x-^3T9LJZ?v&e>RAqBX*|VDw)Ka)*N8CnsY%rIWJ0&G80{OD^ z>C&#DcPwS73$0zv1KYg5Gk#eXJ|G;+Br=jLARw-(iJ588s6OEcD1GI9Rfxh$LC9uS zH@pQGO6Zo4M?|cDS#C|;yyg~L7Z?gwGvlCKp`^Jzn%$c4a@axrOM!Syrek60xbUmMa-6g$xa7H31)oLIC$h zN%Oc!Sk_8619>sg8;dTD24)mmoid;a@Im>zxICuRStFKPB$0>YolzCFOh9cjX>Fe& zP;ApTY$1^o3K)cce2Zs5venPbtV{x4LB!0t9b2emioavZAqADq1PyY>pn)*sm)%^~ zZXd5TFIN=sWA-z?MW9=G<(~E}Y|3#7?5C2~MK63Qx4*wO`puVeUDdVO!TICtY^W}C zRt*Qk!tEHnzLm;_e`q_)iomL`;1$Bq8|`6UxB7eS0mSW~_J{45aO4|xS*ghosfIHj z=^h#Z%VJ^z4B#0@t5&q4gMZe$wT=Z?12MoO0Ul`q9ITYvhd@gWMyduRDrEqKiqw-V zJ6p`uV_@H6SQM(Bf}2XMfDN$P$p*kF5|TPgEt-{1uy?6N02hN?To#iAq_9R&6^L>n zV{T4sttj_F^yIU-a20-*&z!*fcQ1p{*3|Lc;eb812oYPcSt~#^q@lmwuamp0W9it8_)x$*bT$yLXMz+wsH01m+R&26tHJd!07s#>~L)W;p*jALu)&?lEQV|W< z_=|{gO|b%nLV*s(phlGFgWdIwB`^>*vF~+XhBGT{kyk$eOXpP|D4FiS5%H{~_R4P4 z6&@ffK0cUexE#(qvEqY5(b0$QC9E33PieI1UVaT2^9^GOVweV#z^794x%~)fHUf0^ zXl+K2*EGDi#TRev?A{2EcFj$z;Z;*jV$mfeP!R8h z&jCm;kcW!ONRc9w7ruYKl<3_$6RIf%21J&!z?hIe@F5e@2}KQt>=L!Wp3?+bYBDiNy68(y zK&H9DVmUL~b&Z<4ybovG!Ax}A*DF}K+li~<9u zu|nPc&%Tg+LpV(GB0LZ}g*z%qANTdrxDR8X#_$G>d#h+k#afMIW;!sJbMF{OQ45Il z9R@V&v={M{9ec_+YT3FoCdAjFhCqsSr`MyQZ1GSt2M8)uRX9eDoU2abPLa~MlkPO` z4KnhxYGsv3Axsq-ce0tnolZD~yXE6@O;fld8bRS+uMJEE(Y+xhh+jo3ZwhyqmnEgv zMjL+{omO#gIz2^G8?^6^VS3ekj^O9)9DaGShCoB3WGUjE!W|Z0U^;ssz z*0l6M#L_aNS^7^1DIT8prOWCRtI&CB6&h{0;LEZx_~j!*a%%;3qG>1HJ83y1(-ww{ z#gTv-rR4_pQMM1Lx>>4A%A;a^H|C#);4uFLcDjY@un=W;G7C|)0396AA`{DMX$n>G z2IQ;bYDD&;0_8dp0XZr!EP+jig1PWuNf1f}zBT3qQ-nnS!xGfYu^ti)Xi@yBT@g|! z;RO^&twqPwT2$;PIMt*QP6evMoGmBxGjyygn{gE7D|3*d@vpHhr*cc6U8b#$sg0Yv zFXeP~IUN(kSi4Yxsx^aEpc0%9)lS3V>BE>6n4~gT>B?DSY7-5p4cb05plxAQ-#SGN zYYPN11r#);w^Vks@`j3O^UL6cjhdC1cW)aqD_u4#CTh@lY3!i~I2J^t3<-7xXY?$K zSOr$24ob7a z2DRs`B!ed2(v6wE*BA61nGzv4D^AqVC-rPtMu{dJjL{m@*vD2um+<@Tw9uFcD9-6$ z7jNO4LN7b(D6Mdv#_o{0P`p>Pgh$TBQ7{{5J60c1kKmECO1dzhlJ0J7LP0Z}4X#Nj z0`)&A!XXGSi6ID_87(f2uOW!`0o>3xfELXB1+>t%1Oo^|3sVsoIJ_XN0C^R*8D1!9 z%W!A`K2m6bse?%}JMnHO6Sk$Q1EGU40ia8E>AcGc%&7>6HUx7q$aM=E3yu*n@g&Fa zoJ`na2GIs`P9|(1SBN2)eJ+s+7o2<&m}B7x=7cw5n8Wr(+q;9YxVcFbpxCQS*qYTe z3-EG?z>JMznXu+I5pkSoYjLkx0l zgam}6!p1j31X&7;e)AMGe644LC!%{`A{yNSl}sR>h~mIR*r1x6I2OliXjuDkY(UKD zCPHO_(QWd8=GsIchviMFC_pZ1BAlRD*@dTBRDa$?ShJW2wMJ`yU?RF~k=5*loKec) ziQsUSO@vGb_dv-ePTvPgM%+DQA`t$td|CUal$(0X2_e{_wJ*wX97a)zZd}AS1Mb_7h<*GGn|Hu|hb*WwoQcNCBMwb(+(^j>PZ%WK+M6#h?%Dq7xK@ z)US|V&~T=IMV1xoNguj#i!;d-?OD^Zims$WC>ZRyVlC_NPz;8&thJACPCo7j1~`5| zV=apmkFETs2&uMLMo7b&2W9zHQJA=oGEM~*Yd{;3Zrlp5Ai4p6B6c*)bgcS7od@ns z$Lh47xCD`k72@W5aEh@hpEyN%Q@AxRlDfHaGfzo5an}I-Z>}6TT+~`>;j)98S{D5l zuUe1r5~VAo5^N58Rja69#L;>b+?f<(pWyu2R1nwN$)Z@a-dwp+gN>h(aZY^DM}(;* zB9{<|N)>{?Y(Ym`%|qQa+4m9wxGw3;k$63d4-2Mo04Z8c?8fj-X{{)rCZaM%)kTE7pBJPG&%!UjQ!feNEIT>=2an)WlK)Yc3@R?NSLHN$g=ghlVw9Eb2-}#zsgLTFk4T?iTPEh zd72QoT{x2Crm_Ksc|eSfHky)$TSnuGyTx@#fS~iMS_Lc~kki>h?3*6$l7l^!5FHoVyz6=1ZL2ue|Bolvv)O+9)R`4GedmDuT zoOKFGIeobn0OOjkw8`hVOw22tTn0#x!#3kQpOI#6E5oINmgEG{-wYq^os%;6G3K^< z>?E&fM3aq3ItP&~zi&1P7HwTz4w-URA=DOYjl||~_z_&TVPMQC>U^Li6eW&}Ndv{a zvw{)P=m3r>DiFZ&nbvKsV6AAJCBy|*T7)NrfZHpDxNq%o-+D=-Z*&cjK+?7Lbl19F z*LsZ*i2K$c*N1VP*66_%hE^d<9}SIj93t_v3?lfK6&WW&Z7Wedq&Kurea@)6HM(sC8T|%*t=I0}>k5Xr=M{|}l6J&w!G%2h5hW2Z#VZ5C~9&Gguk7{v00y089mrRWa zBRefGSEF*3^(rXoA!NTvBa#09zOsT21YocpmFNwc2RSP*yjaV3@YuPE;=ri}lx|ZE|Xu*Nm z`KBvD9L>9(xXY|*Ta;0=u)AK=kcM5cog9e;jp(el8`R1(Q&QTNw6evW(H^R7*;{t7 zcYL6ms?y39)jdervgVsUO*9(alr6jK>B3%mfVO2&`&DRDQxyOlsE9if(p`kM;b^$c zf~i}Wb5pl4mNvG`g6Ug`w}Y|3ypYgfH)yW}s3iE=D+EdZLV29H_~SriB_x}`fcnL% z$J$C$E4HUQ(Z7f*cKR1C64gA3vo`$;(ss2h*-^%3${yfjd$Lo&u;A2WS5#JQ?}$$N zG5VKtevJNwe>$+<8qmKeANm(=&w&ve(7(_rt}7kTzZ6pX7aZG}{^bQd(Z6hULi9oU z7f~JmCH;%eleE8q{zV1v;iQQVgfUPr7Jrk{zhDt&`WM{jnf^uIqSr|OBF{wtJSWTz zjVAw6gmZpmLyu5 zaVDg>vWZ(7;=VslP^W=Os?~`fh^Ijt(v8;uR-WZ`Q3WZuhoqc*}K{%vcPMfHhK$$s{&Lh1zJJ42#71rVG~i# zo)MMjnRa|BiR8frrCAe*>;PE}ERT3yv?00G@qAklxHh-7066V!Er8{eJu7kv4o{+t~^A{?uN2=>xtRYR7|zu$457BG;8nPr6aQuYanXCwB%H7D-keN(9}5CM>t6yS?|tTR`sB28*}%=?l!AcfGfKe z@ITa*_%wTYQ4~6Dr28q;QL`)#Y4s;tE>^=V}Co=JvEk-MmWe zGwR>8U2z+oIg!@icAt5xQoDxM+TfSHW2&c{W1g4X1Is5Vs;( z?VNUK-sKQ}BlB?Lxnr^=cp16KhFb@iy$2FFHkuMj_yj=GjSTz-G+@iaMaR!c%|r`r zW@|G@9u6+>LF%?agi^XOTvjX9o3?nc$GT5U$R&N-pzu%nwm~jvC9`AgVh5eDOfW>w zY{jJDITuT8Z&*HftJ%|`mC1E&u&Oz5ul6|>GTgroRkG4CqACs7YDbzX4KRl{e~VyiV515Mn;!9Zg@O1T^@RPIy%_tqtFj+jCA0CkDjkS-a} zqE8skPiTg|jkb;F{NC0-676l_YxA+Wg;*u@2eaH;dO3hQaWyuCD_-rVwG zKoouUSGf{$)yhwxyebnY0=!dM2jZ+e#XoinuS|6{TOnY@X%;${%->&VAe{fwKRyzF z{y=15u6@i^Y%p+kwdY`h#eU<8~?>9k9TaFvAOMYdy zi@M`7*c??}a|!WgyDKmElYVPWk+L%$lw^?ZzA+vont_ocq}x;(KRSN89&0cyrhI%v zr{hoYG~AKa6~u=DYXcoCpqS~zT9bNr*Rv@wMH0!>R!W~%bm*^Y6wQk!nkknesaly( z8PaCysM>Yvj-uE!q;=3h)Xe9-*e50!Rb{#o8~3t`b|y)&Hb~Cl;Nb zJth-%{5E&`fvz!QL-_k?nf-ZeVk4NA2?_DQ6>FFcJtEzUi%rpoew&-0dFs~Nw{0Gk zS0a9Do1*a5+=p6rZJ^*c(Rk2Oeg!nmo=X=Pk3XdgKOK(Z@UtqWo*Kf% zmEPiKf3Hf@v<&J1$ zcQD02B>HK0FxP)Enmi&HRrjc>2%=I?Ft#slwGAn)uEf=Ql|JgeXGCy#{~mRN9gsA| zwZA$d7~?+>_4Nc3_ZwQ)!*{A4y2AAJyW&Pf@9PP|y_N|R9GCg|o}fSTojal*^aK|N zN0z*%T=c@Re$VZ5zB04xabS&+$b`AY+SDq{>yqM8(Wc(uys3MC$M?{9o~%b}AeV|o zC-w#VHEsQv0|xS~kFM$q&d)q^YxJGIV0`P!yWE>n7C?RJBTuyU2cNG4z`iyr_$H5! z?;o7Y@c!ri!AT77+|fagT7Jpsp#SjC-s{&>5vM8|pKF+Z<&_JUuUK^XW#Ps17cE`5 z;D~VP!pp*=!-GA~TYqTLJBQ~&-}4GQquWLYCloI5ie4MBG2TS~I(J2Q6AIx}% zML#+qI7QD%V}h%X+3pv;OUdl!Jo-819JMCn z%J~p!D(A(CuAKYga+3I$<8qSt4^&Qc&)DD+|C*?7TyTHsdoVIy zuL-BW`qv@x0?kg>GLraseIK1M0bcyh!=sxg1XufqMcD&`Nh3Da!Q=6E#d79u(Pfu} zi!NJs)e6ts9?d;4*w5b;EjcilkSW$jYYz+#@sEtY!bkqH=s)yw-4neNgJHSS`He+y zF=c3Sdif=BjlpQepEz}L@JJn1{$YCX?$Sf;MQ;(wUdHn@1PAdOJFMu@PVXQhQ=+>L z3+5J1BPk?lS@i3}f@4qrFwqf2AK|Il-omqq=T~`Vd0xP8UwL+sN2MPTdfw7gi-bI{ zqa#{%cyNk;))U`4JZSXWF6b;;<2L}NBYA&8^y?#nL;ZWAQ8R*L3)^_BT3?PXpAif% zbaWK~VMRYUBbZQ_LbQwMiP0Bl1hd;NB`QGsYn~H$o*nfb8N9#l+DBL}henSc84Qm$ z9~sm~TM5-~R_gteqn{la9O!S3h8-0g+VJY|qSwQRE#1*+M+FD9P3E2Puz8M@NCfT?N`+97R% z9rU3v_L4Ur=8bAj$B$0M|AY4jr{bf4h~`urH<{k7RD2?F!9Y^pm+7^dn#8|G{CELH zlJIpBG;K-z`^1^wTKtE^)!*d(Pl>l$Ji1{{FtVJa|I3i?TIsJVC;IZ7;MV@k=%OKn zIhS2Mf9awH;gyRnxorN5tClY`aK7S1Hj>k#kLYntwB^KLRQ)!Yi+wf5}2G zKc;9cPSTezyy)_)7cPHSIOjNgou0?1EZTSR=$}VUjYX2P)<)7+M30^n96EXpS%fMU zzGK;ncYz63EL?us{H5V#moHf8J;S?Uyjvd?PG()KkB&MyIJP0d@6QF%4^IyIqJMd7 z(B76LKF=s=I@d?Hk(W=teR43p_O<{Fy0`tO1o!iH%PH6~tbgM5Q&^7Ghd}mA`1UY< z0-+>+B4OdtBtDn0Kq!fyL^z#)KJjU(_rg(!q~Z$*Pff)a5(c$bYXvSMAzgtQb!h5? z_YqbjlLlNnBz_(7bc3%aj_$ga|3<>;@>df-jQVRC-cQ2h)CV^co|KB;G9-TMkoW_{ z(+&Ovalw4j;7<;TKScaMt>PrZ!-Ug4*hDeKs?>!5nzD{ zsr)^}1IrKnQqa9zWLY}Sx=eg2G~oEdg#^zs?O+xt(P z?zY`6e6JBs;#-NoIci-HjL9sU6uq)2SRCy-Gssi!znvLO=P~)LVE_8vJHW%g^rI~Y z2VmXPgPGCeX9Y70yACdT`%&06(d%agC&QM$OtxP^^zd7P`0&f3(djM}K!-aBuU9sgAfgmrq)v(s^wAuS|_jIWHLB(l@OL2~yei3Vr|dq3Zhx zVM+b{A^wYgGcM?eK74*~bN@DSpTMh){M6(m{t?0rQT_SByQ2%<7L1LqzAy-b?MzyK zwB_{R#OQYy1|zB-4Ly&HU#DdPDm7G%)bGe4@uT9jWqhM;96NFa7N?L*mC0 zSK34Ix5p8l<*_f?$7)cogMxpZ9~AqO;S;5yojr*M8qR3RML{IGDz_jwq_g7)x7&^( zo3=|KqjAxd3xWy$s_5PegR`O?(}Q8r?-vBEnbk)``Gvu>Xyiq~%;s@39HgC~XY{5E zg7c#9ToAN3tR^lDc84E5bwSV*wagEiYKfo8MElPV$~{S@-!gdu*MWF+!TjK$sY(3( zG+2wsQR?A}%fpKoEnOPE^U}+gE(|Zc>f(zRF89_R=_sMm(RptRCbT8cojgY=`Q5Yj zKdR`RN=XlZ$+ z=avS&*&6)LJ<$=-XGcH3JQ(FKd!lh!@LSGEkzC~WpL2@dulW6t-&goO$?qY4_wai^ zzrW_UoZor;PT+SqzX|-h`TffYMenoxKF;q0{NBs&Dt=4&ox|@qeiQih^DFXuZFbRn zmEZSf7t7vP2z-v;-|$<*?|Och^ShAWTlgIp-Fs#5K=tX9ir&Ng?&fz3zxVQ6%I_S0 zr}8_V-!y&`_?7r|@N3}r`rM-T8-6?ZeU0B{eh>1yhu`h|ZsK<>zjyLm%I_?GbNC&_ zZvwwj{5t2-&H{mdXP|!0?A7ov#+={R_&vq%D?jub4_dJB!mBPhf6-+ZUp}wVtvLSmkN=Ly{Vx91 zU$5qzznRd{neRiYhyH z=$PJK|4=HPyQ994FOhH>pX6@Nw$~q&6R8*f`TP4#g_mPIs5Ji_zP68o)_wAqyR*K# zen&dt!}Z4&W~38#=i0scW_q9e~OCz$FfBA?+i-SIgH{-8icPm ztWOWZwu0mB^kMFoUgq9@cHIVL{8qzRN%=f8FKUTqj%B(sH`ejbQWkygs(Yaj9`?NY z_YjL;TtibcW0d7^{>d&s(DQbGoCP05Vm)7-=ldESmE z7>mh%<`z>HnsNSgtCXO^Ss|te%n{=g;<@;e*h_}%F7=73AO?XY~K!W{)Bxb`#k+`|9#fq z+bj2mOuq+Je}T`s-Wt%S7bq@!E;QB6Bn_L3L^-9jLz(I@#(x0iVU9~Fu!Mj*IKjKa9 zNALB#&p__^KlJw*{^-H%i;t3LgP;5Qe9!x>^1si|?qtTlr1UNZB?;Fco{rg1om(ryK%_qI{{-RiZ|33xIM{}z|Pxa6<0AWq% z#6~}R?0!&}po`$pMnEC+Re{_4X<}xbaF{Sgyt^_QzqA3mciaZ3INoNzm#?2kImuu4 z`}wx|=2SwkrZAy?NqV{}4HFC1pQgq+_g%Iq{bfG6x2iTC>L4@wqkR4KsgkohsA^#< zA^2{-uf8Xppt`lgB!4;8{Tr$tfD~7E%WXA;#xQ(04>-H6V~>u1b#&aCpXKY1sr5f6z=MqQ5*Y~mLlRr!?_OG9sO32^YT&P=^N+=xCR@a(}x4frNe1(bB zU;fcTfBv1k3>A5-(Ajo85jGVzUV5g#`cK*zCG}sF>8ZarHD$qX{o(Z=N+sle~gpaRNpYShcVaE#|k z9p)b`$S}%y0-M)ozeUpBp!kGL_92sF`sJHs@3{J8WE|gQrY7e7j&H1mgZ+B+)OEpO z6Q&>R>Zl*i2eqyMVA*@`qOKkK=38w&qdjk3wBM>=Y+c(J!keO#R|OMWw$aM^*Jl?e zlqubdR<8<Q@&LXipdT~`yX*pPFS$|~le9}&cMqM9F9##Y91RXu_;pmd< zgXz`lK9p(^^l64A^yU^Q`ma*Rv3_pm-+12XF6?1WMCYD9GXCPD^qGa^b$oFeQZT@& z{zg)+RUZG^R34U|*KzGdsXPK**ZZjdh9IAL_Tp&F4Z*1+E&!+0f3CA@HLbWt;k(+} z7L4+|HPHue2){B4+IN(*YL)l613+t6FhGNk>azN zLUAR8&E{z32ZEO-?NRE57kl1ERsTytelz<+H>2bKFc@C^G?9a!xap>##~;@At^ z-ZURRtnGTj7i6MIkE3t<`pv<`b(V5XG~<@w&An^M)Ys)VbsakvNhOiqm-Z_@c>wd0 ziN0|!BH%CF5*+UDi2m)C;MPUEd9QwSJqa*(vzatbnA)|jOuY)9aeDD~!Y2@J5MRX% z{`GjOCf)@8>-r>-HAIG;+1GVF-Q7&MS_B7>8qnB*95mL+CWmR<6DU&9p9mF-0|In(;Y7YNVUe!6ja3> zUq(1->^i~&jolVKa$B%skyoFp?qDKGbtfnsS9by7bamJ0qhxG$5=p9?$8MTbx0Ucf zb%#Yae<)ZwZk-@FsO!v^>G38-5{TSRqy~|@3sLFzU}E*T1IWRA`M>vv{p||)M4-ao z#L~DDmiQ?}o+9$@zj0)ie@7jR)-2Dv^FiJm8TiBM-~e9M_n)luyYIaOYD!h!n9usd zW}gqY%7pnpt@pb-?()1JH4v%ts{6g~M8>C##n-@zu*8J3Gbn0x^n=@jQL`o-?|C0m z<+n2pJe@>P&l=_SI;(xxV`N#**{}F7L8Ctdeg5Wa(X2aygHD=xuEPiZah%&&1di)s zH2qxQXCEBrd0$l1M+AQ6s26ELG#VAWnzf9Lpte|TBUrpdjr+nKLEqF%)r}wJ`rEE0 z`${6=q&6@Ajq#qhR&RdEn_GFaF?n-#8w)Th-Wj~Tu6PyU9np$AgY)Yxyt^U#{++=Y zEyYH@d_8wS{s+v**l5OwgEKO3`rByDhl8n^$!AB;emHp3EVbx>d;CL+JIAnKiHv-U z4uHx%umP0f*3jVJ78YNvZrtKY+wC0KC zwZZ%R6P~3Bx#`_*Zyo&}W@R=*k=r#jPWdqiEpr_6nY*8*{TpJVcly0a%?wg-@57*- zXQS_YB$!>-hVabW5RLk1Ft>R#wT-^6-1Qccwny*&Xz=#x@a4#$DSq^isOKt{P42p- zp7#p^qdQ3v0i97S_o1XgQlJ_0m{CKsH_VEgHC3CuipnmzI!;e}fO}*S7 z!0EYPcCxkC(+d?fdWxUF^ALckIeN!k!4Y+mn}SsyzAHGWHDu2neI#S5rXSW4z2~FB zxM_ZCDW!0G5=u=tbNlYXMeS+wld=*@Qr=e4f@gB~VUA3;Iu ze3s0oqRn>)eItK$A!uFcUkOqpnYs6>4=R83?{^3D>VAX#fc*157W9pN*AAyT7h5yz8eE;OvQX-8`b}EYS06g%50R6GGn560Ny8 z=xnz=W-~96J!bn8b@v2k`A6?kDH{qSyUw4;sI;=b9L?@dI8^u-tz9ou;$aGZqG;RB zX@rw)=hA4~y}^i)mS?5%Jm~VQP376BJPZ4_lH`A)(34*Z*|LMk_?3Pke=m{Ut_y5-}+`+HZiyZB!yv|B^g5~($0V>J1`;LHPS9~uYp7^F(e(i1QbIQ{87pFS8-+{B+!ex?>Q_JsvmV<%8J+ zz8b%|{8ZMpB5K^e-)tdU!>8hJ{`GiNlZxD)Mcg#vSkL?Qmy_by2j)E+7q{=eUe2f; ztMNGqT)yvYfBa4L&l%y*{52Hg3vo*qT<>|0DWZ-~fMnbFwfN1K4)VNjEAl7IS2daB z=azZib(-X#$@(ZITYdaa2MP_6tv(q#P-u{7^)Kzy^>s~>c|(>H3& zRL^_v5dv2rESy8+%W4qe*k13a!$hna6|HU$aw_?GtW2i&+oMqGqfr9%wHj| zt{X)m^!I!8{-}9FFuGdlVQGB^t{*6K^7XflW+4;HBVW({ zX%TOz4&n+%M$14fstAs1OgW&)ty3uwsa$d#QrA0^9|N%=MSV?8S?e3r;R z64~$lun=mZ-b|kiv7`uZ;!>b^rb(N$q}4;c5~&@gTJBpLH+N;jQhUhB$rMM9+JV z3p>&+o4qHl`)aCt<<@w3E+nEI+UnMuU)>V7DjM>}t7cABhhAjaTeDI80M@1q+IoTK zolEOS{uB*J8@Of(P(ShvN*MM&07sEuH2c{L{+c&zV z91a@$E5>}2zPXhG1|n5rA7ZGpf5$78-8ahf{y-o1j9kc@_o_VsnvAoSW53J{jC_H} z{1EGetwct%0N?ismUdiG=CTY$-+c{mrq|;k7qZXYh$bfK$;j$kp#Q$cJ9RSMG>DUgqa~nt7Sha^GDKulPJv+35+~>@0cSqt8dX9t!%aUk9w7 z|01|wy3le6o5bKXp$pAkjnFE3n8;fg$sH#lMNs4>pwCNbNf*-R13!{|$L81B!P~&-<;iGG+)3rB1ApX5LYgM;W zowygKfQ!n zHd&b0FEO4j&yCd{&%22cnmoo@W*e1i%bqjO^Iia97MB9a83_rqkGp(JX0N;yz*W-GD2=_$ zXK8M(??OhGwl;VBx$Re=umr_5@9*d8uVWQ7REf0txdX4pu1lF3lNT=CWpd$p#~`Pw zCk$PB*;q=Z)6LEBbvr)}nNIVX-#IAkI-GqPWPcwG>1}~5+cFaKR7SsdHmm8eHt;5= zd%WIn`Ppd)qV@ox_M(f=emVj{(vRK?!8j|==e&h-Wqd!QK=#-N+`RM_Y(GfEP}pJT z+^-nvN5Ex$NBKF7qrGjkQ{nN~V1^%uQ|Ynx_lgm5WpAS~%T9?K^H)UP(i_)ynIE-0 z8jL6&3!t6*bS0KUQ-qWN1cr=(aeiw7lIK}TSPCJz4!5+n!mdV)l zacVkP@k=_oW)eOjI`grh(sO~5-rZ>&?KKL=g48wbCP=Mz<;lB2FaEkK|J)cbm%{aa ze^(ih*+HaxSfQ|CRMHmWvobBk|I^!*z*SXk{e8~4=bU>PE^xUZg93^&h#=quMv7^M zra4eKCLn^Ez~x;awSIb`;pKDa%Y3;lEvc8&BR%Bio+u|y%`HEDfi+F;sOem1;% z|8<7Ty{3J=zTy0SUiR9<+H0@1_Fj8fdn+Q59L@otb?QdU#LSNhw&*pv7sSqm3Y_)mJcl)}|$yly@^pvB@Bs8ZT9AEp>k*sbIULic^7 zchPl^U_=S)PEqJmOtRmP3;bS0wP6k659mi6(w6=hYRE8!-AzM-6f>Q%RnGz3WD!I+ z#$##zVC+jjkC^`Gr~UwwIxrS%NvqHu{Q<*02HlZKxUt8^Z9&FYabyqxSh_Iw&=%CM zB^i(g1Q=#{{SBDwkk@6zYDF{5`zXv6%+@pqoGkRAd!I(sV6^c8G+>|!Tnp3G{-lx8 zo(?bQr*r^J^!e#{q?_|FtN^FuQ*^=?Mq%EIj^X$OjS2wzHS7L74*2u%;*6aH zQkUDYE94>Q4nTh!gWFqg8A;O@W1T?&rEJ**Gq44~LDYZ7iL*lj#$gV4(@ad$_X4;Y zJh^K*TD~8^pCRh6P^N-_=TK&ODQ4SffCgMdLLz7|NC=R-wEjPbVjn1&ukgw#Sz5<9 z1-4pNhoMDG^VAYM5R%?OliCk3mOKqD*8%>K7Z(-lT>Kwid5`DzLf!2t9ga{w*QRv1 zHt7@L$V%N2Djkkc(v1r->4R}izaPl941;Myo#~6whV#W32+$+a7b7JAFx{%sG1OXq zY=)d6ko3>6Ser@}L%@{cbGV{CmLNo~ zn+0|fkU;6s2^QIVrICI+(!VG-(mj}i>o(W9@E#+s1u?}aY1|cnkVA% z5oYN*o3Tj;8Ot0Zh*NBcsG0(21B#$UCZ-FS6rLnttq=Qg9#%dxU$Cs~3(F0fGY1Ib zqre4B_~_R(J8w?oV_ufeglWszvdV zhvfl0cZWPWasfre#75Hw@4X1;q}k}OasYpQha468IHks=X{oIjrH1pIopO|?59}92 zj?eT@{rqiA4KS>lNA)oYXi70yB2Gd^aV?l6rr@XNZOu?Vuus4ZP0@=q%ZBUGalrC$ zI6sPXH%;7tbn$8YSnNX>YlcGhh=jQCi5{efc_yKwjD3<7S#L4t?6%xfzge)VVAow3ln9_?xzXr5PNh=t8N5=LH7IC^x=@LXum>h`fYatNL zS?n1p97cl0!1&26k|)eM22deETcw2P_aMnq0O9to)_n*!A{^8+$YyN;&`iM8px|f@ zU^jrUBU#ov5k7&ieUN0g&IdrZ1MJO$-C6-4iGY`INNb9p0 z6BYmng-=NI1_1Z+W4q*hM0>NTdwHp(&4*uwFIm><)x#5B%SU*E8R{r5`c}Q;f8_1LtgVw(&4YpHe^Fu^h zppTJP%Cdzx_;s(!(NRmUG1&Pa&DtJ;7@RiF7ru%$;A)Jk8mC7o-5^-=lSkV$#^+IG zYo##9d;XQJlX^NDdYXA5vy-YVb)#Pn#}u?jlT|4pXqI|vvRVMZl-0cm2lezA!g`z_ zpRfR!!sWC;2Y?m6JJ`iDKYnVLoO&7Q z74fLoFl)MmoE*WvfdZ`qH`0R9UmAhl@lm|vo$e-f43!0Pbg$3-A{-w(Qy=h?yyLWu z1+wnrq5zn0e@)H|TLauaZD@(*$9KzDdK{IHO(p`L!EhkXz;G(Pf$70245ISCQD??*-+9ug zjh(x1);%ZXUHaI$n?L=AT!44tjZe#zQi$mk?3%n!&vXLy$or+Ri*OaeL}XB1NAzqL z;(6b_a#Gi=7~JDN5hX|I6ca5XJ{4nAi>L5;d*yESTTp5%$c?j$_8EQo>b-KJWWTvD z-?mroC4TAQ$M?!{L+rQo^(#I?oER7}T7&|Lha^b(k*f`$aUU(IkRz^G=o@|%Lv0$rW1rj_KMF+n`kraG|AMai{ad_dzZ^6AVKP#8kkz{b zvu4Y899spLA|{^~ESpepBZW^0pi$gRIXms+Czwob+lr&)R!W6)9B9 z+LN{r&4@u$ojan^&Y~IF6gHYsMBz)cBJZMBeD~k9BD4@w0m6k=d_HWlM5NU3rLdcLj>_0=0DOPl&;{}Z(^dl0Ylh%)ZLw2`-ewj zcL_PW<3^M;cpQ$xC1xUG}J-3zq$3u@i)$Lj4x2hp19aQ$e;`gS>RXMAYt*ge}1;>{(0;;QleNO24UL zZ4xXAAR@8_@m~v;+-vpwCRW@x@e3Q9QTG#y_k-Te3-$mzC7 zDBTwE2aNrb0}u&a)d;1l8vX!q4oBw`-=I-SYvk}hV?S~$<~W$hSsMEp0JTdyZW)Bd zn`Z=2*>QtN+PxMN)&l_GfNNBxcE?*X&>8zcjltSxw08O9zKz&PMqObvsOfheh#MHoLc4>;N@Y? zU8@TG^}}*_pOMGVxtJ5{vc*uo3r9_iV5#rkpm}X@b*tPP57lI}${87Yxh*L750sygD=QLYA}Dh(n3uU2_jxL(cYt&FYJV~dW+!{+I+Rfs)s$;v+@(l-IQ z^dq=h5A6|0LmeNu5z_(!#*;c8pwL_Ru}nsD4?s;VV661`Xq=3LZvwU##IKL?VH@Sh zI4xqSpv(r&#}kmaOo&jY0@%&FAC;Tz9f-5U+JbL_l|7rlTaL>6=D5)}KcIf2?ZBhE zu#guDu|WimiZo`R2n*S>T;GQiw-7^g8EJcVbmkK})JT=~T7&>V-zo{+H5~Z(i8inu5W1jm@Dps1az?eZ|gqkaxz$)DJiQcNXZ`gwn|?=imebZQ|u~;^jAuRa6(`L z!~{Y5=q~IKQFx#rJ%dU63JRy;oY*gqf7s0L`HcchDqM>58mbZp{{GcdoOC7+ibvHn z3Q{^~tD*23L2|B#1Sq@|dvu+7m~>$fCgpk zwIQEkXlX%MUZWiZNUx1xtm&YZf5@G%=R?|nc%7hl(NgnMmfLJ0z}sQq_=Se2q)r@7 zYjE6lNU!r<)H&-Yzxe|>E+GwhsLoiF9q*U_nta3?`5$k>aDABXME=1GjQstOzu7PU zOiX@@(FK(oe$9-VZ-qH*=Z+8M0?$4wUp_8mEXtoX%iHP!#dJr?P2)mlBV35E+4`vy za6WhN(wH}O!5)gijp0Ge_bHFqZ1(`q9Kwm(nh?I1a1JMy+GwwAn^E0bgggAIi|&nV zZ(h2(>qf(tALZf4<+$rF7^q)B`J^5OxwiKK6#=4#97cGKnF4*TL1!O-=+c;h z!+bF?=PjY~Ao?`Qx0vN^bh<^}AcR>$_=1@N%qQpJ%-{fTJr0E`UIvexHvZ*t_`Gf$ ziB-r!Ek0Qs!`N({Ro2t!pysE%2#x#**7w9A9l<>8l&(0+n@-4Gl!sSf1*gY*RG6=| zFc;7~>og2T=BMn0J@6m-Xr#3CYt~O8B%DH6-YkLh7;;HvvJjZ^JF@|S$A>}RdA1aw zC(ylR+{Y3u1$XK-sMpc?kmifo>1byOUaULXS>R}AnY09iKvOO7a{G;x8|rl@Nv+Ix zb5K8dNos{IPWnA5e}sg9GM+z3_wOO@@(t=F0o(JIK7({mM$2fhyff+IlmK)s8{iB= zoTDCv@ThUe+U zN&hb?9?Y16ZjLK>WFLDSUk}(rT=W z#dt>EyjseBnD=vLnQnEM2AE|oVz*yCdJ6b&NWw4a@+4e7@)>#+$Fb;Puf8YL11?5xFN) z>BVP}2$gRnX0c9rA(MM?qGfQJ%Gs>{mVE}@R6L@LRG)jK*;sR@8!nw3jx!#*IS#j8TpGGCj z`%tBF4Cg{FH2mSm6vey0R>@YqS1(X*%Jd%Gpgb4k?PyU}sp5cq{>U;V%KObWCBF+F z8>RO2u5VT9L|)LQe9KGQm5JW>+LdVncO6smyjzbc&-ch&xk3mt9@?pGm|0VX7bU-e zkaUG2)hMXehs6Ie>y--fhB9@AjvRShV8uErPdck5geu*xYDO34@f=xwK?-Ua!f<8Y8}gwNAq1C!QbLatOdj4#aR%=JakUNbuC3j&%^M)zZlK91&sIrP4V#!`)tFp(ebq9&r4 z`oeT|n2<=1a#Ylm$d?XDWldmvO$Gj zZGZ5AUR==ij(ilg0kee054M_GKx#;)iaApKjb~IQ=CVzVN~Cv!s-8=U_&bV<%rvBl z4#t0MS4#NSEHz%VNASa0>OxU<@X>wMTZPknPhWLF_Q%-I(y8c&&WlBQy{p7EzotU( zi{xN{2=pkeP1s}92bD3|c#1yG!E3VBxL(&G)10#Md2A;F#`rEUy!Tz5#J8e zdKP~pSA8#(wpMh)(MNc5KeeB*k+=6#`%2gv)%2IA_E(ca@Wh;Zi zJjS-4_}czzX%zWbm`&H7EyTUAGdz5Nx<`1A9~+>K7K**y2dWK%N*)Ze+%BHf1~dE8 zAhnwW&kMf1P3gsd9;C*KPfX^qd0=$L6#myd{D&&@rtp=6)nxudp4vs+K7~i-tNCK+ jR6X)f`D(N{W2*Nr`6~RX4o#=ne6ib2-a~`csp>xg7 TxResult { // governance - let target_key = gov_storage::get_min_proposal_grace_epoch_key(); + let target_key = gov_storage::keys::get_min_proposal_grace_epoch_key(); ctx.write(&target_key, 9_u64)?; // parameters @@ -127,30 +127,6 @@ pub mod main { } } -/// A tx that attempts to mint tokens in the transfer's target without debiting -/// the tokens from the source. This tx is expected to be rejected by the -/// token's VP. -#[cfg(feature = "tx_mint_tokens")] -pub mod main { - use namada_test_utils::tx_data::TxMintData; - use namada_tx_prelude::*; - - #[transaction] - fn apply_tx(ctx: &mut Ctx, tx_data: Tx) -> TxResult { - let signed = tx_data; - let mint_data = - TxMintData::try_from_slice(&signed.data().unwrap()[..]).unwrap(); - log_string(format!("apply_tx called to mint tokens: {:#?}", mint_data)); - let TxMintData { - minter, - target, - token, - amount, - } = mint_data; - token::mint(ctx, &minter, &target, &token, amount) - } -} - /// A VP that always returns `true`. #[cfg(feature = "vp_always_true")] pub mod main { From bf599b444b812575808add2a3634df0af93204fe Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:00:05 +0200 Subject: [PATCH 024/114] [feat]: Refactored the masp integration tests to no longer need the nightly feature --- Cargo.lock | 10 +- apps/src/lib/cli.rs | 2 +- apps/src/lib/cli/utils.rs | 51 ----- apps/src/lib/client/rpc.rs | 5 +- .../lib/node/ledger/shell/testing/client.rs | 12 +- .../lib/node/ledger/shell/testing/utils.rs | 197 ++++++++++++++++++ shared/src/types/io.rs | 9 + tests/src/integration.rs | 1 - tests/src/integration/masp.rs | 3 +- tests/src/integration/utils.rs | 83 -------- tests/src/lib.rs | 2 - wasm/checksums.json | 38 ++-- 12 files changed, 240 insertions(+), 173 deletions(-) delete mode 100644 tests/src/integration/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 3a069b0956e..339380655a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3370,7 +3370,7 @@ checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.48.0", ] @@ -5674,16 +5674,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.13" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +checksum = "d4790277f605573dd24b6751701e0823582a63c7cafc095e427e6c66e45dd75e" dependencies = [ "bitflags 1.2.1", "errno", "io-lifetimes", "libc", "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", + "windows-sys 0.45.0", ] [[package]] @@ -6446,7 +6446,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.45.0", ] diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 31b28977f36..db6ef2679db 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -16,7 +16,7 @@ pub mod wallet; use clap::{ArgGroup, ArgMatches, ColorChoice}; use color_eyre::eyre::Result; use utils::*; -pub use utils::{dispatch_prompt, safe_exit, Cmd, TESTIN}; +pub use utils::{safe_exit, Cmd}; pub use self::context::Context; use crate::cli::api::CliIo; diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index 4ae8e4adbc3..26cc38ff7fb 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -6,7 +6,6 @@ use std::str::FromStr; use clap::{ArgAction, ArgMatches}; use color_eyre::eyre::Result; -use lazy_static::lazy_static; use super::args; use super::context::{Context, FromContext}; @@ -363,53 +362,3 @@ pub fn safe_exit(_: i32) -> ! { panic!("Test failed because the client exited unexpectedly.") } - -lazy_static! { - /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); -} - -/// A generic function for displaying a prompt to users and reading -/// in their response. -fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String -where - R: std::io::Read, - W: Write, -{ - write!(&mut writer, "{}", question).expect("Unable to write"); - writer.flush().unwrap(); - let mut s = String::new(); - reader.read_to_string(&mut s).expect("Unable to read"); - s -} - -/// A function that chooses how to dispatch prompts -/// to users. There is a hierarchy of feature flags -/// that determines this. If no flags are set, -/// the question is printed to stdout and response -/// read from stdin. -pub fn dispatch_prompt(question: impl AsRef) -> String { - if cfg!(feature = "testing") { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) - } else { - prompt_aux( - std::io::stdin().lock(), - std::io::stdout(), - question.as_ref(), - ) - } -} - -#[macro_export] -/// A convenience macro for formatting the user prompt before -/// forwarding it to the `[dispatch_prompt]` method. -macro_rules! prompt { - ($($arg:tt)*) => {{ - $crate::cli::dispatch_prompt(format!("{}", format_args!($($arg)*))) - }} -} diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index a49be3f89e9..2f01716ec3c 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -50,13 +50,12 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_line}; +use namada::{display, display_line, edisplay_lin, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; use crate::facade::tendermint::merkle::proof::Proof; use crate::facade::tendermint_rpc::error::Error as TError; -use crate::prompt; use crate::wallet::CliWalletUtils; /// Query the status of a given transaction. @@ -457,7 +456,7 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!("Enter the viewing key for {}: ", owner); + let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 0f27a2f6f12..1aa35ca3213 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -3,14 +3,14 @@ use std::ops::ControlFlow; use clap::Command as App; use eyre::Report; use namada::types::control_flow::Halt; -use namada::types::io::{DefaultIo, Io}; +use namada::types::io::Io; use tendermint_config::net::Address as TendermintAddress; use super::node::MockNode; use crate::cli::api::{CliApi, CliClient}; use crate::cli::args::Global; use crate::cli::{args, cmds, Cmd, Context, NamadaClient}; -use crate::node::ledger::shell::testing::utils::Bin; +use crate::node::ledger::shell::testing::utils::{Bin, TestingIo}; pub fn run( node: &MockNode, @@ -25,7 +25,7 @@ pub fn run( wasm_dir: Some(locked.wasm_dir.clone()), } }; - let ctx = Context::new::(global.clone())?; + let ctx = Context::new::(global.clone())?; let rt = tokio::runtime::Runtime::new().unwrap(); match who { @@ -47,7 +47,7 @@ pub fn run( NamadaClient::WithoutContext(sub_cmd, global) } }; - rt.block_on(CliApi::::handle_client_command( + rt.block_on(CliApi::::handle_client_command( Some(node), cmd, )) @@ -60,7 +60,7 @@ pub fn run( let cmd = cmds::NamadaWallet::parse(&matches) .expect("Could not parse wallet command"); - CliApi::::handle_wallet_command(cmd, ctx) + CliApi::::handle_wallet_command(cmd, ctx) } Bin::Relayer => { args.insert(0, "relayer"); @@ -69,7 +69,7 @@ pub fn run( let matches = app.get_matches_from(args.clone()); let cmd = cmds::NamadaRelayer::parse(&matches) .expect("Could not parse wallet command"); - rt.block_on(CliApi::::handle_relayer_command( + rt.block_on(CliApi::::handle_relayer_command( Some(node), cmd, )) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index e66ead21e7d..95da7efb856 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,5 +1,7 @@ use std::path::{Path, PathBuf}; +use lazy_static::lazy_static; +use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; /// Namada binaries @@ -46,3 +48,198 @@ impl Default for TestDir { Self::new() } } + +/// The max number of bytes that the is currently remembered from stdout while +/// testing. +const TESTOUT_BUF_SIZE: usize = 100_000; + +lazy_static! { + /// A replacement for stdout in testing. The maximum number of bytes + /// it holds is limited to prevent memory issues. + pub static ref TESTOUT: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(FixedBuffer::new(TESTOUT_BUF_SIZE))); +} + +lazy_static! { + /// A replacement for stdin in testing. + pub static ref TESTIN: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(vec![])); +} + +pub struct TestingIo; + +impl Io for TestingIo { + fn print(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + testout.append(output.as_ref().as_bytes().to_vec()); + print!("{}", output.as_ref()); + } + + fn println(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + println!("{}", output.as_ref()); + } + + fn write( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::print(output); + Ok(()) + } + + fn writeln( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::println(output); + Ok(()) + } + + fn eprintln(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + eprintln!("{}", output.as_ref()); + } + + fn read() -> std::io::Result { + read_aux(TESTIN.lock().unwrap().as_slice()) + } + + fn prompt(question: impl AsRef) -> String { + prompt_aux( + TESTIN.lock().unwrap().as_slice(), + std::io::stdout(), + question.as_ref(), + ) + } +} + +/// Test helper that captures stdout of +/// a process. +pub struct CapturedOutput { + pub output: String, + pub result: T, + input: String, +} + +impl CapturedOutput { + pub fn with_input(input: String) -> Self { + Self { + output: "".to_string(), + result: (), + input, + } + } +} + +impl CapturedOutput { + /// Run a client command and capture + /// the output to the mocked stdout. + pub fn of(func: F) -> Self + where + F: FnOnce() -> T, + { + let mut capture = Self { + output: Default::default(), + result: func(), + input: Default::default(), + }; + capture.output = TESTOUT.lock().unwrap().read_string(); + capture + } + + /// Run a client command with input to the mocked stdin and capture + /// the output to the mocked stdout + pub fn run(&self, func: F) -> CapturedOutput + where + F: FnOnce() -> U, + { + { + // write the input to the mocked stdin + let mut buf = TESTIN.lock().unwrap(); + buf.clear(); + buf.extend_from_slice(self.input.as_bytes()); + } + CapturedOutput::of(func) + } + + /// Check if the captured output contains the regex. + pub fn matches(&self, needle: regex::Regex) -> bool { + needle.captures(&self.output).is_some() + } + + /// Check if the captured output contains the string. + pub fn contains(&self, needle: &str) -> bool { + let needle = regex::Regex::new(needle).unwrap(); + self.matches(needle) + } +} + +/// A buffer with a max size. Drops elements from the front on +/// size overflow. +pub struct FixedBuffer { + inner: Vec, + max_size: usize, +} + +impl FixedBuffer { + fn new(max_size: usize) -> Self { + Self { + inner: vec![], + max_size, + } + } + + /// Remove the first `size` elements from the buffer. + fn roll(&mut self, size: usize) { + self.inner = self.inner[size..].to_vec(); + } + + /// Add data to the end of the buffer, deleting from the + /// front as necessary. + fn append(&mut self, mut other: Vec) { + // if new data exceeds max size, take the tail. + if other.len() > self.max_size { + self.inner = other[(other.len() - self.max_size)..].to_vec(); + return; + } + // check if appending the data overflows buffer + let free_space = self.max_size - self.inner.len(); + if other.len() > free_space { + // delete the minimum amount of data from the front of the buffer + // to fit new data. + self.roll(other.len() - free_space); + } + self.inner.append(&mut other); + } +} + +impl FixedBuffer { + /// Read the inner buffer out to string + pub fn read_string(&mut self) -> String { + let mut fresh = vec![]; + std::mem::swap(&mut fresh, &mut self.inner); + String::from_utf8(fresh).unwrap() + } +} + +#[cfg(test)] +mod testing { + use super::*; + + #[test] + fn test_buffer() { + let mut buffer = FixedBuffer::::new(10); + buffer.inner = (1u64..=9_u64).collect(); + buffer.append(vec![10, 11, 12, 13, 14, 15]); + assert_eq!(buffer.inner, (6u64..=15_u64).collect::>()); + buffer.append((20u64..=40_u64).collect()); + assert_eq!(buffer.inner, (31u64..=40_u64).collect::>()); + } +} diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 93d45a75ffc..13798cc5b26 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -121,3 +121,12 @@ macro_rules! edisplay_line { <$io>::eprintln(format_args!($($args)*).to_string()) }; } + +#[macro_export] +/// A convenience macro for formatting the user prompt before +/// forwarding it to the [`Io::prompt`] method. +macro_rules! prompt { + ($io:ty,$($arg:tt)*) => {{ + <$io>::prompt(format!("{}", format_args!($($arg)*))) + }} +} diff --git a/tests/src/integration.rs b/tests/src/integration.rs index 8642e0e03c2..1a7c84dbfbd 100644 --- a/tests/src/integration.rs +++ b/tests/src/integration.rs @@ -1,3 +1,2 @@ mod masp; mod setup; -mod utils; diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index d024f84132b..659c7bbaa77 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -5,7 +5,7 @@ use color_eyre::owo_colors::OwoColorize; use namada::types::io::DefaultIo; use namada_apps::client::tx::CLIShieldedUtils; use namada_apps::node::ledger::shell::testing::client::run; -use namada_apps::node::ledger::shell::testing::utils::Bin; +use namada_apps::node::ledger::shell::testing::utils::{Bin, CapturedOutput}; use namada_core::types::address::{btc, eth, masp_rewards}; use namada_core::types::token; use namada_core::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; @@ -17,7 +17,6 @@ use crate::e2e::setup::constants::{ AC_PAYMENT_ADDRESS, AC_VIEWING_KEY, ALBERT, A_SPENDING_KEY, BB_PAYMENT_ADDRESS, BERTHA, BTC, B_SPENDING_KEY, CHRISTEL, ETH, MASP, NAM, }; -use crate::integration::utils::CapturedOutput; /// In this test we verify that users of the MASP receive the correct rewards /// for leaving their assets in the pool for varying periods of time. diff --git a/tests/src/integration/utils.rs b/tests/src/integration/utils.rs deleted file mode 100644 index f626a001ee8..00000000000 --- a/tests/src/integration/utils.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::fs::File; -use std::path::PathBuf; -use std::sync::Arc; - -struct TempFile(PathBuf); -impl TempFile { - fn new(path: PathBuf) -> (Self, File) { - let f = File::create(&path).unwrap(); - (Self(path), f) - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = std::fs::remove_file(&self.0); - } -} - -/// Test helper that captures stdout of -/// a process. -pub struct CapturedOutput { - pub output: String, - pub result: T, - input: String, -} - -impl CapturedOutput { - pub fn with_input(input: String) -> Self { - Self { - output: "".to_string(), - result: (), - input, - } - } -} - -impl CapturedOutput { - /// Run a client command and capture - /// the output to the mocked stdout. - pub(crate) fn of(func: F) -> Self - where - F: FnOnce() -> T, - { - std::io::set_output_capture(Some(Default::default())); - let mut capture = Self { - output: Default::default(), - result: func(), - input: Default::default(), - }; - let captured = std::io::set_output_capture(None); - let captured = captured.unwrap(); - let captured = Arc::try_unwrap(captured).unwrap(); - let captured = captured.into_inner().unwrap(); - capture.output = String::from_utf8(captured).unwrap(); - capture - } - - /// Run a client command with input to the mocked stdin and capture - /// the output to the mocked stdout - pub fn run(&self, func: F) -> CapturedOutput - where - F: FnOnce() -> U, - { - { - // write the input to the mocked stdin - let mut buf = namada_apps::cli::TESTIN.lock().unwrap(); - buf.clear(); - buf.extend_from_slice(self.input.as_bytes()); - } - CapturedOutput::of(func) - } - - /// Check if the captured output contains the regex. - pub fn matches(&self, needle: regex::Regex) -> bool { - needle.captures(&self.output).is_some() - } - - /// Check if the captured output contains the string. - pub fn contains(&self, needle: &str) -> bool { - let needle = regex::Regex::new(needle).unwrap(); - self.matches(needle) - } -} diff --git a/tests/src/lib.rs b/tests/src/lib.rs index 7e359474772..1d9958a30a3 100644 --- a/tests/src/lib.rs +++ b/tests/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(test, feature(internal_output_capture))] //! Namada integrations and WASM tests and testing helpers. #![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] @@ -13,7 +12,6 @@ pub use vm_host_env::{ibc, tx, vp}; #[cfg(test)] mod e2e; #[cfg(test)] -#[allow(dead_code)] mod integration; pub mod native_vp; pub mod storage; diff --git a/wasm/checksums.json b/wasm/checksums.json index 71b5580e4ac..adf06b5afee 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.0967203d10b78f7f28c3e1d674c0ff3ec25ec00e9b3a4010648c5cc381ad52ec.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.c6dd30e79edff950016f495cee946bc6c0d6847f89322fbf733c89bb768c1fd4.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.1e89cf7f091a324872582c1092f2bda662be21040ac796d8aca08d08e9332a3e.wasm", - "tx_ibc.wasm": "tx_ibc.2b35a3a35049fe267121906176bafc0ea2b221a185fe31652216f93da66209e7.wasm", - "tx_init_account.wasm": "tx_init_account.6e77218b385a386f49c65c13b6112c75dcb06c50cf7bf7a5a479e7e8b7b458fa.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.d0c969c6b7a3d262d82586c630f29a00e587653fa9df1cf17021914764d4d3ab.wasm", - "tx_init_validator.wasm": "tx_init_validator.df780e2cc9ab4a5726931b662fd75cad907e495745aec1c466877878cee1ae3a.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.062b11c679a35e50f7fcfca95e3ada01bc89098591ae92526cfafaab5adf954e.wasm", - "tx_transfer.wasm": "tx_transfer.5f9e5a2f85fa5c1ec2bbb0aa9bebaba6bddc7e777ca956f5d980ad1cc9af3e7e.wasm", - "tx_unbond.wasm": "tx_unbond.dc169426d36f2bcfd82d976e77e2f3beb85ac98e75652ddf8367fa081fb17b3d.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.23d1b075f28d5fa3ee413ee4db31792a2714d9b21929cbf1ba59832c3adec886.wasm", - "tx_update_account.wasm": "tx_update_account.88646c9fb5d3327701d69b12ce49ae35431ebe2ea3691900874cad66791f1ca9.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.c9abcd6f37d59daf9a39e30dcebd9e0789d5bcd679f5931ed7899073d0a5d36f.wasm", - "tx_withdraw.wasm": "tx_withdraw.02ac0399bc5b745346641facd968607931bf9abf67d7ed336b6b0540360f2d43.wasm", - "vp_implicit.wasm": "vp_implicit.1d212280efc3fccc16de9497dae8cc1670f21f0e0ce4c3bd9fc58fc816037cdf.wasm", - "vp_masp.wasm": "vp_masp.1d264f4ba602df546011ae4040da00bd0b103c6bad62ee5de985940e8bf0c2e7.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.d279129573a4f0625f411c7b147ac94bc40e0db2ea04b777f29e57be33a53522.wasm", - "vp_user.wasm": "vp_user.788b8039744b73bd6fe2b67b273802bae4c26cd117092eb8437f455d5aa95dbd.wasm", - "vp_validator.wasm": "vp_validator.98457b70476c76a16b1cd28232bacf043438bfd5e054bc9f7651ef1747e48594.wasm" + "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", + "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", + "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", + "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", + "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", + "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", + "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", + "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", + "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", + "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", + "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", + "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" } \ No newline at end of file From 7198560a672913c12d9a8f113e0ec034c3b06d1d Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 23:50:54 +0200 Subject: [PATCH 025/114] [chore]: rebasing on bat/generic-io --- apps/src/lib/client/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 2f01716ec3c..c358582f6a4 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -50,7 +50,7 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{storage, token}; -use namada::{display, display_line, edisplay_lin, prompt}; +use namada::{display, display_line, edisplay_line, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; From 46fe66b4e049a19264687e87516eb2931057286c Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 26 Jul 2023 13:41:01 +0200 Subject: [PATCH 026/114] [fix]: Fixing downstream async io changes from bat/generic-io --- apps/src/lib/client/rpc.rs | 3 ++- apps/src/lib/node/ledger/shell/testing/utils.rs | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index c358582f6a4..cfd361a947a 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -456,7 +456,8 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); + let vk_str = + prompt!(IO, "Enter the viewing key for {}: ", owner).await; let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 95da7efb856..3ff3bdb7d31 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -68,6 +68,7 @@ lazy_static! { pub struct TestingIo; +#[async_trait::async_trait(?Send)] impl Io for TestingIo { fn print(output: impl AsRef) { let mut testout = TESTOUT.lock().unwrap(); @@ -107,11 +108,11 @@ impl Io for TestingIo { eprintln!("{}", output.as_ref()); } - fn read() -> std::io::Result { + async fn read() -> std::io::Result { read_aux(TESTIN.lock().unwrap().as_slice()) } - fn prompt(question: impl AsRef) -> String { + async fn prompt(question: impl AsRef) -> String { prompt_aux( TESTIN.lock().unwrap().as_slice(), std::io::stdout(), From 9208268bd4ce488274bc17c74a0d6f44e4785018 Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 28 Jul 2023 13:16:44 +0200 Subject: [PATCH 027/114] [feat]: After rebasing on bat/generic-io, need to make io read methods async for integration testing --- .../lib/node/ledger/shell/testing/utils.rs | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 3ff3bdb7d31..0161f864160 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,8 +1,12 @@ +use std::ops::{Deref, DerefMut}; use std::path::{Path, PathBuf}; +use std::pin::Pin; +use std::task::{Context, Poll}; use lazy_static::lazy_static; use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; +use tokio::io::{AsyncRead, ReadBuf}; /// Namada binaries #[derive(Debug)] @@ -62,8 +66,8 @@ lazy_static! { lazy_static! { /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); + pub static ref TESTIN: AtomicBuffer = + AtomicBuffer(std::sync::Arc::new(std::sync::Mutex::new(vec![]))); } pub struct TestingIo; @@ -108,16 +112,12 @@ impl Io for TestingIo { eprintln!("{}", output.as_ref()); } - async fn read() -> std::io::Result { - read_aux(TESTIN.lock().unwrap().as_slice()) + async fn read() -> tokio::io::Result { + read_aux(&*TESTIN).await } async fn prompt(question: impl AsRef) -> String { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) + prompt_aux(&*TESTIN, tokio::io::stdout(), question.as_ref()).await } } @@ -230,6 +230,31 @@ impl FixedBuffer { } } +pub struct AtomicBuffer(std::sync::Arc>>); + +impl Deref for AtomicBuffer { + type Target = std::sync::Arc>>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'a> AsyncRead for &'a AtomicBuffer { + fn poll_read( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut ReadBuf<'_>, + ) -> Poll> { + let mut inner = self.lock().unwrap(); + let buf_before = buf.filled().len(); + let res = AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); + let amount_read = buf.filled().len() - buf_before; + *inner.deref_mut() = inner[amount_read..].to_vec(); + res + } +} + #[cfg(test)] mod testing { use super::*; From b6e925fe38770cab311f028dc4db0bfb71cb1986 Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 28 Jul 2023 13:18:13 +0200 Subject: [PATCH 028/114] [chore]: Formatting --- apps/src/lib/node/ledger/shell/testing/utils.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 0161f864160..bfcb7f50ab9 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -248,7 +248,8 @@ impl<'a> AsyncRead for &'a AtomicBuffer { ) -> Poll> { let mut inner = self.lock().unwrap(); let buf_before = buf.filled().len(); - let res = AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); + let res = + AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); let amount_read = buf.filled().len() - buf_before; *inner.deref_mut() = inner[amount_read..].to_vec(); res From 9d06bbd6f43ef3c6b23f728e88b36f0bea5946af Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 1 Sep 2023 10:21:34 +0200 Subject: [PATCH 029/114] [chore]: merge in v0.21.1 --- wasm/checksums.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index adf06b5afee..71b5580e4ac 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", - "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", - "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", - "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", - "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", - "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", - "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", - "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", - "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", - "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", - "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", - "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" + "tx_bond.wasm": "tx_bond.0967203d10b78f7f28c3e1d674c0ff3ec25ec00e9b3a4010648c5cc381ad52ec.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.c6dd30e79edff950016f495cee946bc6c0d6847f89322fbf733c89bb768c1fd4.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.1e89cf7f091a324872582c1092f2bda662be21040ac796d8aca08d08e9332a3e.wasm", + "tx_ibc.wasm": "tx_ibc.2b35a3a35049fe267121906176bafc0ea2b221a185fe31652216f93da66209e7.wasm", + "tx_init_account.wasm": "tx_init_account.6e77218b385a386f49c65c13b6112c75dcb06c50cf7bf7a5a479e7e8b7b458fa.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.d0c969c6b7a3d262d82586c630f29a00e587653fa9df1cf17021914764d4d3ab.wasm", + "tx_init_validator.wasm": "tx_init_validator.df780e2cc9ab4a5726931b662fd75cad907e495745aec1c466877878cee1ae3a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.062b11c679a35e50f7fcfca95e3ada01bc89098591ae92526cfafaab5adf954e.wasm", + "tx_transfer.wasm": "tx_transfer.5f9e5a2f85fa5c1ec2bbb0aa9bebaba6bddc7e777ca956f5d980ad1cc9af3e7e.wasm", + "tx_unbond.wasm": "tx_unbond.dc169426d36f2bcfd82d976e77e2f3beb85ac98e75652ddf8367fa081fb17b3d.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.23d1b075f28d5fa3ee413ee4db31792a2714d9b21929cbf1ba59832c3adec886.wasm", + "tx_update_account.wasm": "tx_update_account.88646c9fb5d3327701d69b12ce49ae35431ebe2ea3691900874cad66791f1ca9.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.c9abcd6f37d59daf9a39e30dcebd9e0789d5bcd679f5931ed7899073d0a5d36f.wasm", + "tx_withdraw.wasm": "tx_withdraw.02ac0399bc5b745346641facd968607931bf9abf67d7ed336b6b0540360f2d43.wasm", + "vp_implicit.wasm": "vp_implicit.1d212280efc3fccc16de9497dae8cc1670f21f0e0ce4c3bd9fc58fc816037cdf.wasm", + "vp_masp.wasm": "vp_masp.1d264f4ba602df546011ae4040da00bd0b103c6bad62ee5de985940e8bf0c2e7.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.d279129573a4f0625f411c7b147ac94bc40e0db2ea04b777f29e57be33a53522.wasm", + "vp_user.wasm": "vp_user.788b8039744b73bd6fe2b67b273802bae4c26cd117092eb8437f455d5aa95dbd.wasm", + "vp_validator.wasm": "vp_validator.98457b70476c76a16b1cd28232bacf043438bfd5e054bc9f7651ef1747e48594.wasm" } \ No newline at end of file From 3df95740d4a07b12f35939b1e5180753b94f74e2 Mon Sep 17 00:00:00 2001 From: mariari Date: Thu, 7 Sep 2023 00:39:30 +0800 Subject: [PATCH 030/114] Create the SDK folder and move RPC to it The SDK folder makes it concerete on what modules belong in the public facing API. RPC is apart of it and is thus moved to the SDK folder. --- apps/src/lib/cli/api.rs | 2 +- apps/src/lib/client/rpc.rs | 68 ++++++++++----------- apps/src/lib/client/tx.rs | 2 +- shared/src/ledger/eth_bridge/bridge_pool.rs | 2 +- shared/src/ledger/masp.rs | 5 +- shared/src/ledger/mod.rs | 1 - shared/src/ledger/signing.rs | 8 ++- shared/src/ledger/tx.rs | 11 ++-- shared/src/lib.rs | 1 + shared/src/sdk/mod.rs | 2 + shared/src/{ledger => sdk}/rpc.rs | 0 11 files changed, 53 insertions(+), 49 deletions(-) create mode 100644 shared/src/sdk/mod.rs rename shared/src/{ledger => sdk}/rpc.rs (100%) diff --git a/apps/src/lib/cli/api.rs b/apps/src/lib/cli/api.rs index c22fe39fd3d..138a159b2ee 100644 --- a/apps/src/lib/cli/api.rs +++ b/apps/src/lib/cli/api.rs @@ -1,7 +1,7 @@ use std::marker::PhantomData; use namada::ledger::queries::Client; -use namada::ledger::rpc::wait_until_node_is_synched; +use namada::sdk::rpc::wait_until_node_is_synched; use namada::tendermint_rpc::HttpClient; use namada::types::control_flow::Halt; use tendermint_config::net::Address as TendermintAddress; diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index b1b46ef7fa1..f39c844f482 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -35,13 +35,13 @@ use namada::ledger::masp::{ use namada::ledger::parameters::{storage as param_storage, EpochDuration}; use namada::ledger::pos::{CommissionPair, PosParams, Slash}; use namada::ledger::queries::RPC; -use namada::ledger::rpc::{ - self, enriched_bonds_and_unbonds, format_denominated_amount, query_epoch, - TxResponse, -}; use namada::ledger::storage::ConversionState; use namada::ledger::wallet::{AddressVpType, Wallet}; use namada::proof_of_stake::types::{ValidatorState, WeightedValidator}; +use namada::sdk::rpc::{ + self, enriched_bonds_and_unbonds, format_denominated_amount, query_epoch, + TxResponse, +}; use namada::types::address::{masp, Address}; use namada::types::control_flow::ProceedOrElse; use namada::types::error::{is_pinned_error, Error, PinnedBalanceError}; @@ -65,10 +65,10 @@ use crate::wallet::CliWalletUtils; /// error. pub async fn query_tx_status( client: &C, - status: namada::ledger::rpc::TxEventQuery<'_>, + status: namada::sdk::rpc::TxEventQuery<'_>, deadline: Instant, ) -> Event { - namada::ledger::rpc::query_tx_status(client, status, deadline) + namada::sdk::rpc::query_tx_status(client, status, deadline) .await .proceed() } @@ -79,7 +79,7 @@ pub async fn query_and_print_epoch< >( client: &C, ) -> Epoch { - let epoch = namada::ledger::rpc::query_epoch(client).await.unwrap(); + let epoch = namada::sdk::rpc::query_epoch(client).await.unwrap(); println!("Last committed epoch: {}", epoch); epoch } @@ -88,7 +88,7 @@ pub async fn query_and_print_epoch< pub async fn query_block( client: &C, ) { - let block = namada::ledger::rpc::query_block(client).await.unwrap(); + let block = namada::sdk::rpc::query_block(client).await.unwrap(); match block { Some(block) => { println!( @@ -625,7 +625,7 @@ pub async fn query_proposal_by_id( client: &C, proposal_id: u64, ) -> Result, error::Error> { - namada::ledger::rpc::query_proposal_by_id(client, proposal_id).await + namada::sdk::rpc::query_proposal_by_id(client, proposal_id).await } /// Query token shielded balance(s) @@ -905,7 +905,7 @@ pub async fn get_token_balance( token: &Address, owner: &Address, ) -> token::Amount { - namada::ledger::rpc::get_token_balance(client, token, owner) + namada::sdk::rpc::get_token_balance(client, token, owner) .await .unwrap() } @@ -1802,7 +1802,7 @@ where { println!( "Dry-run result: {}", - namada::ledger::rpc::dry_run_tx(client, tx_bytes).await? + namada::sdk::rpc::dry_run_tx(client, tx_bytes).await? ); Ok(()) } @@ -1813,7 +1813,7 @@ pub async fn get_public_key( address: &Address, index: u8, ) -> Result, error::Error> { - namada::ledger::rpc::get_public_key_at(client, address, index).await + namada::sdk::rpc::get_public_key_at(client, address, index).await } /// Check if the given address is a known validator. @@ -1821,7 +1821,7 @@ pub async fn is_validator( client: &C, address: &Address, ) -> bool { - namada::ledger::rpc::is_validator(client, address) + namada::sdk::rpc::is_validator(client, address) .await .unwrap() } @@ -1831,7 +1831,7 @@ pub async fn is_delegator( client: &C, address: &Address, ) -> bool { - namada::ledger::rpc::is_delegator(client, address) + namada::sdk::rpc::is_delegator(client, address) .await .unwrap() } @@ -1841,7 +1841,7 @@ pub async fn is_delegator_at( address: &Address, epoch: Epoch, ) -> bool { - namada::ledger::rpc::is_delegator_at(client, address, epoch) + namada::sdk::rpc::is_delegator_at(client, address, epoch) .await .unwrap() } @@ -1853,7 +1853,7 @@ pub async fn known_address( client: &C, address: &Address, ) -> bool { - namada::ledger::rpc::known_address(client, address) + namada::sdk::rpc::known_address(client, address) .await .unwrap() } @@ -1933,7 +1933,7 @@ pub async fn query_conversion( masp_primitives::transaction::components::I32Sum, MerklePath, )> { - namada::ledger::rpc::query_conversion(client, asset_type).await + namada::sdk::rpc::query_conversion(client, asset_type).await } /// Query a wasm code hash @@ -1941,7 +1941,7 @@ pub async fn query_wasm_code_hash( client: &C, code_path: impl AsRef, ) -> Result { - namada::ledger::rpc::query_wasm_code_hash(client, code_path).await + namada::sdk::rpc::query_wasm_code_hash(client, code_path).await } /// Query a storage value and decode it with [`BorshDeserialize`]. @@ -1952,7 +1952,7 @@ pub async fn query_storage_value( where T: BorshDeserialize, { - namada::ledger::rpc::query_storage_value(client, key).await + namada::sdk::rpc::query_storage_value(client, key).await } /// Query a storage value and the proof without decoding. @@ -1964,7 +1964,7 @@ pub async fn query_storage_value_bytes< height: Option, prove: bool, ) -> (Option>, Option) { - namada::ledger::rpc::query_storage_value_bytes(client, key, height, prove) + namada::sdk::rpc::query_storage_value_bytes(client, key, height, prove) .await .unwrap() } @@ -1982,7 +1982,7 @@ pub async fn query_storage_prefix< where T: BorshDeserialize, { - namada::ledger::rpc::query_storage_prefix(client, key) + namada::sdk::rpc::query_storage_prefix(client, key) .await .unwrap() } @@ -1994,7 +1994,7 @@ pub async fn query_has_storage_key< client: &C, key: &storage::Key, ) -> bool { - namada::ledger::rpc::query_has_storage_key(client, key) + namada::sdk::rpc::query_has_storage_key(client, key) .await .unwrap() } @@ -2003,21 +2003,21 @@ pub async fn query_has_storage_key< /// the current status of a transation. pub async fn query_tx_events( client: &C, - tx_event_query: namada::ledger::rpc::TxEventQuery<'_>, + tx_event_query: namada::sdk::rpc::TxEventQuery<'_>, ) -> std::result::Result< Option, ::Error, > { - namada::ledger::rpc::query_tx_events(client, tx_event_query).await + namada::sdk::rpc::query_tx_events(client, tx_event_query).await } /// Lookup the full response accompanying the specified transaction event // TODO: maybe remove this in favor of `query_tx_status` pub async fn query_tx_response( client: &C, - tx_query: namada::ledger::rpc::TxEventQuery<'_>, + tx_query: namada::sdk::rpc::TxEventQuery<'_>, ) -> Result { - namada::ledger::rpc::query_tx_response(client, tx_query).await + namada::sdk::rpc::query_tx_response(client, tx_query).await } /// Lookup the results of applying the specified transaction to the @@ -2029,7 +2029,7 @@ pub async fn query_result( // First try looking up application event pertaining to given hash. let tx_response = query_tx_response( client, - namada::ledger::rpc::TxEventQuery::Applied(&args.tx_hash), + namada::sdk::rpc::TxEventQuery::Applied(&args.tx_hash), ) .await; match tx_response { @@ -2043,7 +2043,7 @@ pub async fn query_result( // If this fails then instead look for an acceptance event. let tx_response = query_tx_response( client, - namada::ledger::rpc::TxEventQuery::Accepted(&args.tx_hash), + namada::sdk::rpc::TxEventQuery::Accepted(&args.tx_hash), ) .await; match tx_response { @@ -2096,7 +2096,7 @@ pub async fn get_all_validators( client: &C, epoch: Epoch, ) -> HashSet

{ - namada::ledger::rpc::get_all_validators(client, epoch) + namada::sdk::rpc::get_all_validators(client, epoch) .await .unwrap() } @@ -2107,7 +2107,7 @@ pub async fn get_total_staked_tokens< client: &C, epoch: Epoch, ) -> token::Amount { - namada::ledger::rpc::get_total_staked_tokens(client, epoch) + namada::sdk::rpc::get_total_staked_tokens(client, epoch) .await .unwrap() } @@ -2135,7 +2135,7 @@ pub async fn get_delegators_delegation< client: &C, address: &Address, ) -> HashSet
{ - namada::ledger::rpc::get_delegators_delegation(client, address) + namada::sdk::rpc::get_delegators_delegation(client, address) .await .unwrap() } @@ -2147,7 +2147,7 @@ pub async fn get_delegators_delegation_at< address: &Address, epoch: Epoch, ) -> HashMap { - namada::ledger::rpc::get_delegators_delegation_at(client, address, epoch) + namada::sdk::rpc::get_delegators_delegation_at(client, address, epoch) .await .unwrap() } @@ -2157,7 +2157,7 @@ pub async fn query_governance_parameters< >( client: &C, ) -> GovernanceParameters { - namada::ledger::rpc::query_governance_parameters(client).await + namada::sdk::rpc::query_governance_parameters(client).await } /// A helper to unwrap client's response. Will shut down process on error. @@ -2241,7 +2241,7 @@ pub async fn compute_proposal_votes< proposal_id: u64, epoch: Epoch, ) -> ProposalVotes { - let votes = namada::ledger::rpc::query_proposal_votes(client, proposal_id) + let votes = namada::sdk::rpc::query_proposal_votes(client, proposal_id) .await .unwrap(); diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index c3a46d3fd7f..55c722878c1 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -13,11 +13,11 @@ use namada::core::ledger::governance::cli::offline::{ use namada::core::ledger::governance::cli::onchain::{ DefaultProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, }; -use namada::ledger::rpc::{TxBroadcastData, TxResponse}; use namada::ledger::wallet::{Wallet, WalletUtils}; use namada::ledger::{masp, pos, signing, tx}; use namada::proof_of_stake::parameters::PosParams; use namada::proto::Tx; +use namada::sdk::rpc::{TxBroadcastData, TxResponse}; use namada::tendermint_rpc::HttpClient; use namada::types::address::{Address, ImplicitAddress}; use namada::types::dec::Dec; diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index 2b2220a5f9c..a7bdfb78f47 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -23,10 +23,10 @@ use crate::ledger::masp::{ShieldedContext, ShieldedUtils}; use crate::ledger::queries::{ Client, GenBridgePoolProofReq, GenBridgePoolProofRsp, RPC, }; -use crate::ledger::rpc::{query_wasm_code_hash, validate_amount}; use crate::ledger::tx::prepare_tx; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::Tx; +use crate::sdk::rpc::{query_wasm_code_hash, validate_amount}; use crate::types::address::Address; use crate::types::control_flow::time::{Duration, Instant}; use crate::types::control_flow::{ diff --git a/shared/src/ledger/masp.rs b/shared/src/ledger/masp.rs index 0ddb7cb6a07..5640deb864d 100644 --- a/shared/src/ledger/masp.rs +++ b/shared/src/ledger/masp.rs @@ -59,12 +59,13 @@ use ripemd::Digest as RipemdDigest; use sha2::Digest; use thiserror::Error; +use crate::ledger::args; use crate::ledger::args::InputAmount; use crate::ledger::queries::Client; -use crate::ledger::rpc::{query_conversion, query_storage_value}; use crate::ledger::tx::decode_component; -use crate::ledger::{args, rpc}; use crate::proto::Tx; +use crate::sdk::rpc; +use crate::sdk::rpc::{query_conversion, query_storage_value}; use crate::tendermint_rpc::query::Query; use crate::tendermint_rpc::Order; use crate::types::address::{masp, Address}; diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index a5b2a06819e..213eb6a99c6 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -13,7 +13,6 @@ pub mod pos; #[cfg(all(feature = "wasm-runtime", feature = "ferveo-tpke"))] pub mod protocol; pub mod queries; -pub mod rpc; pub mod signing; pub mod storage; #[allow(clippy::result_large_err)] diff --git a/shared/src/ledger/signing.rs b/shared/src/ledger/signing.rs index 1753c645d35..7357ae1642c 100644 --- a/shared/src/ledger/signing.rs +++ b/shared/src/ledger/signing.rs @@ -25,12 +25,11 @@ use sha2::Digest; use zeroize::Zeroizing; use super::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; -use super::rpc::validate_amount; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc_proto::google::protobuf::Any; +use crate::ledger::args; use crate::ledger::masp::make_asset_type; use crate::ledger::parameters::storage as parameter_storage; -use crate::ledger::rpc::{format_denominated_amount, query_wasm_code_hash}; use crate::ledger::tx::{ TX_BOND_WASM, TX_CHANGE_COMMISSION_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, TX_REVEAL_PK, TX_TRANSFER_WASM, @@ -39,8 +38,11 @@ use crate::ledger::tx::{ }; pub use crate::ledger::wallet::store::AddressVpType; use crate::ledger::wallet::{Wallet, WalletUtils}; -use crate::ledger::{args, rpc}; use crate::proto::{MaspBuilder, Section, Tx}; +use crate::sdk::rpc; +use crate::sdk::rpc::{ + format_denominated_amount, query_wasm_code_hash, validate_amount, +}; use crate::types::error::{EncodingError, Error, TxError}; use crate::types::key::*; use crate::types::masp::{ExtendedViewingKey, PaymentAddress}; diff --git a/shared/src/ledger/tx.rs b/shared/src/ledger/tx.rs index 5ebc7f52bba..4987744819b 100644 --- a/shared/src/ledger/tx.rs +++ b/shared/src/ledger/tx.rs @@ -34,7 +34,6 @@ use namada_core::types::transaction::pgf::UpdateStewardCommission; use namada_proof_of_stake::parameters::PosParams; use namada_proof_of_stake::types::{CommissionPair, ValidatorState}; -use super::rpc::query_wasm_code_hash; use super::signing::{self, TxSourcePostBalance}; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc::applications::transfer::packet::PacketData; @@ -47,12 +46,12 @@ use crate::ledger::args::{self, InputAmount}; use crate::ledger::ibc::storage::ibc_denom_key; use crate::ledger::masp::TransferErr::Build; use crate::ledger::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; -use crate::ledger::rpc::{ - self, format_denominated_amount, validate_amount, TxBroadcastData, - TxResponse, -}; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Tx}; +use crate::sdk::rpc::{ + self, format_denominated_amount, query_wasm_code_hash, validate_amount, + TxBroadcastData, TxResponse, +}; use crate::tendermint_rpc::endpoint::broadcast::tx_sync::Response; use crate::tendermint_rpc::error::Error as RpcError; use crate::types::control_flow::{time, ProceedOrElse}; @@ -381,7 +380,7 @@ where let parsed = { let wrapper_query = - crate::ledger::rpc::TxEventQuery::Accepted(wrapper_hash.as_str()); + crate::sdk::rpc::TxEventQuery::Accepted(wrapper_hash.as_str()); let event = rpc::query_tx_status(client, wrapper_query, deadline) .await .proceed_or(TxError::AcceptTimeout)?; diff --git a/shared/src/lib.rs b/shared/src/lib.rs index 4bedc091e5a..3036c4cb47e 100644 --- a/shared/src/lib.rs +++ b/shared/src/lib.rs @@ -24,6 +24,7 @@ pub use { }; pub mod ledger; pub use namada_core::proto; +pub mod sdk; pub mod types; pub mod vm; diff --git a/shared/src/sdk/mod.rs b/shared/src/sdk/mod.rs new file mode 100644 index 00000000000..e0b54e103d9 --- /dev/null +++ b/shared/src/sdk/mod.rs @@ -0,0 +1,2 @@ +//! Namada's SDK API +pub mod rpc; diff --git a/shared/src/ledger/rpc.rs b/shared/src/sdk/rpc.rs similarity index 100% rename from shared/src/ledger/rpc.rs rename to shared/src/sdk/rpc.rs From 539b2c00b4e8b13314e973ae7973e13122043f2b Mon Sep 17 00:00:00 2001 From: mariari Date: Thu, 7 Sep 2023 01:28:32 +0800 Subject: [PATCH 031/114] Move tx.rs to the SDK crate We also update all imports to properly refer to the new tx location --- apps/src/lib/cli/client.rs | 5 +++-- apps/src/lib/client/tx.rs | 3 ++- shared/src/ledger/eth_bridge/bridge_pool.rs | 2 +- shared/src/ledger/masp.rs | 2 +- shared/src/ledger/mod.rs | 2 -- shared/src/ledger/signing.rs | 12 ++++++------ shared/src/sdk/mod.rs | 3 +++ shared/src/{ledger => sdk}/tx.rs | 2 +- 8 files changed, 17 insertions(+), 14 deletions(-) rename shared/src/{ledger => sdk}/tx.rs (99%) diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 675c5b4aea4..98c5ce513f2 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -1,7 +1,8 @@ use color_eyre::eyre::{eyre, Report, Result}; use namada::ledger::eth_bridge::bridge_pool; -use namada::ledger::tx::dump_tx; -use namada::ledger::{signing, tx as sdk_tx}; +use namada::ledger::signing; +use namada::sdk::tx as sdk_tx; +use namada::sdk::tx::dump_tx; use namada::types::control_flow::ProceedOrElse; use crate::cli; diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 55c722878c1..879d1a100f8 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -14,10 +14,11 @@ use namada::core::ledger::governance::cli::onchain::{ DefaultProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, }; use namada::ledger::wallet::{Wallet, WalletUtils}; -use namada::ledger::{masp, pos, signing, tx}; +use namada::ledger::{masp, pos, signing}; use namada::proof_of_stake::parameters::PosParams; use namada::proto::Tx; use namada::sdk::rpc::{TxBroadcastData, TxResponse}; +use namada::sdk::tx; use namada::tendermint_rpc::HttpClient; use namada::types::address::{Address, ImplicitAddress}; use namada::types::dec::Dec; diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index a7bdfb78f47..e8f7ce449fb 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -23,10 +23,10 @@ use crate::ledger::masp::{ShieldedContext, ShieldedUtils}; use crate::ledger::queries::{ Client, GenBridgePoolProofReq, GenBridgePoolProofRsp, RPC, }; -use crate::ledger::tx::prepare_tx; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::Tx; use crate::sdk::rpc::{query_wasm_code_hash, validate_amount}; +use crate::sdk::tx::prepare_tx; use crate::types::address::Address; use crate::types::control_flow::time::{Duration, Instant}; use crate::types::control_flow::{ diff --git a/shared/src/ledger/masp.rs b/shared/src/ledger/masp.rs index 5640deb864d..37a464dc949 100644 --- a/shared/src/ledger/masp.rs +++ b/shared/src/ledger/masp.rs @@ -62,10 +62,10 @@ use thiserror::Error; use crate::ledger::args; use crate::ledger::args::InputAmount; use crate::ledger::queries::Client; -use crate::ledger::tx::decode_component; use crate::proto::Tx; use crate::sdk::rpc; use crate::sdk::rpc::{query_conversion, query_storage_value}; +use crate::sdk::tx::decode_component; use crate::tendermint_rpc::query::Query; use crate::tendermint_rpc::Order; use crate::types::address::{masp, Address}; diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index 213eb6a99c6..21a393962da 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -15,8 +15,6 @@ pub mod protocol; pub mod queries; pub mod signing; pub mod storage; -#[allow(clippy::result_large_err)] -pub mod tx; pub mod vp_host_fns; pub mod wallet; diff --git a/shared/src/ledger/signing.rs b/shared/src/ledger/signing.rs index 7357ae1642c..72b1c9ee12d 100644 --- a/shared/src/ledger/signing.rs +++ b/shared/src/ledger/signing.rs @@ -30,12 +30,6 @@ use crate::ibc_proto::google::protobuf::Any; use crate::ledger::args; use crate::ledger::masp::make_asset_type; use crate::ledger::parameters::storage as parameter_storage; -use crate::ledger::tx::{ - TX_BOND_WASM, TX_CHANGE_COMMISSION_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, - TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, TX_REVEAL_PK, TX_TRANSFER_WASM, - TX_UNBOND_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, - VP_USER_WASM, -}; pub use crate::ledger::wallet::store::AddressVpType; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Section, Tx}; @@ -43,6 +37,12 @@ use crate::sdk::rpc; use crate::sdk::rpc::{ format_denominated_amount, query_wasm_code_hash, validate_amount, }; +use crate::sdk::tx::{ + TX_BOND_WASM, TX_CHANGE_COMMISSION_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, + TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, TX_REVEAL_PK, TX_TRANSFER_WASM, + TX_UNBOND_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, + VP_USER_WASM, +}; use crate::types::error::{EncodingError, Error, TxError}; use crate::types::key::*; use crate::types::masp::{ExtendedViewingKey, PaymentAddress}; diff --git a/shared/src/sdk/mod.rs b/shared/src/sdk/mod.rs index e0b54e103d9..fc82a49fc6b 100644 --- a/shared/src/sdk/mod.rs +++ b/shared/src/sdk/mod.rs @@ -1,2 +1,5 @@ //! Namada's SDK API pub mod rpc; + +#[allow(clippy::result_large_err)] +pub mod tx; diff --git a/shared/src/ledger/tx.rs b/shared/src/sdk/tx.rs similarity index 99% rename from shared/src/ledger/tx.rs rename to shared/src/sdk/tx.rs index 4987744819b..ce65339a743 100644 --- a/shared/src/ledger/tx.rs +++ b/shared/src/sdk/tx.rs @@ -34,7 +34,6 @@ use namada_core::types::transaction::pgf::UpdateStewardCommission; use namada_proof_of_stake::parameters::PosParams; use namada_proof_of_stake::types::{CommissionPair, ValidatorState}; -use super::signing::{self, TxSourcePostBalance}; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc::applications::transfer::packet::PacketData; use crate::ibc::applications::transfer::PrefixedCoin; @@ -46,6 +45,7 @@ use crate::ledger::args::{self, InputAmount}; use crate::ledger::ibc::storage::ibc_denom_key; use crate::ledger::masp::TransferErr::Build; use crate::ledger::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; +use crate::ledger::signing::{self, TxSourcePostBalance}; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Tx}; use crate::sdk::rpc::{ From c0f2a6238fa04e973df8fda32a8cc6e1958d904d Mon Sep 17 00:00:00 2001 From: Gianmarco Fraccaroli Date: Thu, 7 Sep 2023 09:44:25 +0200 Subject: [PATCH 032/114] empty commit From 8925ced43775bb005da6d5013e903422f337778c Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 31 Aug 2023 14:26:57 +0100 Subject: [PATCH 033/114] Make `get_total_consensus_stake` public --- proof_of_stake/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index c18a6262682..0fbbf2231b4 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -4000,7 +4000,9 @@ where } } -fn get_total_consensus_stake( +/// Find the total amount of tokens staked at the given `epoch`, +/// belonging to the set of consensus validators. +pub fn get_total_consensus_stake( storage: &S, epoch: Epoch, params: &PosParams, From 17cb4906e7b6e430ca562c703a6ec53226bfbec5 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 31 Aug 2023 14:27:29 +0100 Subject: [PATCH 034/114] Write `PosQueries::get_total_voting_power` based on `get_total_consensus_stake` --- proof_of_stake/src/pos_queries.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/proof_of_stake/src/pos_queries.rs b/proof_of_stake/src/pos_queries.rs index 351cf4902c1..ce2e25cf39b 100644 --- a/proof_of_stake/src/pos_queries.rs +++ b/proof_of_stake/src/pos_queries.rs @@ -18,7 +18,7 @@ use thiserror::Error; use crate::types::WeightedValidator; use crate::{ consensus_validator_set_handle, find_validator_by_raw_hash, - read_pos_params, validator_eth_cold_key_handle, + get_total_consensus_stake, read_pos_params, validator_eth_cold_key_handle, validator_eth_hot_key_handle, ConsensusValidatorSet, PosParams, }; @@ -131,10 +131,14 @@ where /// Lookup the total voting power for an epoch (defaulting to the /// epoch of the current yet-to-be-committed block). pub fn get_total_voting_power(self, epoch: Option) -> token::Amount { - self.get_consensus_validators(epoch) - .iter() - .map(|validator| validator.bonded_stake) - .sum::() + let epoch = epoch + .unwrap_or_else(|| self.wl_storage.storage.get_current_epoch().0); + let pos_params = self.get_pos_params(); + get_total_consensus_stake(self.wl_storage, epoch, &pos_params) + // NB: the only reason this call should fail is if we request + // an epoch that hasn't been reached yet. let's "fail" by + // returning a total stake of 0 NAM + .unwrap_or_default() } /// Return evidence parameters. From 32bac23d4a15e1190afbe43cd581b6078c67f87a Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 31 Aug 2023 15:36:50 +0100 Subject: [PATCH 035/114] Add eth testing util to append validators to storage --- ethereum_bridge/src/test_utils.rs | 57 +++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/ethereum_bridge/src/test_utils.rs b/ethereum_bridge/src/test_utils.rs index aec64633964..1347d290214 100644 --- a/ethereum_bridge/src/test_utils.rs +++ b/ethereum_bridge/src/test_utils.rs @@ -17,7 +17,11 @@ use namada_core::types::key::{self, protocol_pk_key, RefTo}; use namada_core::types::storage::{BlockHeight, Key}; use namada_core::types::token; use namada_proof_of_stake::parameters::PosParams; +use namada_proof_of_stake::pos_queries::PosQueries; use namada_proof_of_stake::types::GenesisValidator; +use namada_proof_of_stake::{ + become_validator, bond_tokens, store_total_consensus_stake, BecomeValidator, +}; use crate::parameters::{ ContractVersion, Contracts, EthereumBridgeConfig, MinimumConfirmations, @@ -261,3 +265,56 @@ pub fn commit_bridge_pool_root_at_height( storage.commit_block(MockDBWriteBatch).unwrap(); storage.block.tree.delete(&get_key_from_hash(root)).unwrap(); } + +/// Append validators to storage at the current epoch +/// offset by pipeline length. +pub fn append_validators_to_storage( + wl_storage: &mut TestWlStorage, + consensus_validators: HashMap, +) -> HashMap { + let current_epoch = wl_storage.storage.get_current_epoch().0; + + let mut all_keys = HashMap::new(); + let params = wl_storage.pos_queries().get_pos_params(); + + for (validator, stake) in consensus_validators { + let keys = TestValidatorKeys::generate(); + + let consensus_key = &keys.consensus.ref_to(); + let eth_cold_key = &keys.eth_gov.ref_to(); + let eth_hot_key = &keys.eth_bridge.ref_to(); + + become_validator(BecomeValidator { + storage: wl_storage, + params: ¶ms, + address: &validator, + consensus_key, + eth_cold_key, + eth_hot_key, + current_epoch, + commission_rate: Dec::new(5, 2).unwrap(), + max_commission_rate_change: Dec::new(1, 2).unwrap(), + }) + .expect("Test failed"); + bond_tokens(wl_storage, None, &validator, stake, current_epoch) + .expect("Test failed"); + + all_keys.insert(validator, keys); + } + + store_total_consensus_stake( + wl_storage, + current_epoch + params.pipeline_len, + ) + .expect("Test failed"); + + for (validator, keys) in all_keys.iter() { + let protocol_key = keys.protocol.ref_to(); + wl_storage + .write(&protocol_pk_key(validator), protocol_key) + .expect("Test failed"); + } + wl_storage.commit_block().expect("Test failed"); + + all_keys +} From b5f4caf3faead2710eafd7225ffb39723ae0fc54 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 31 Aug 2023 15:37:59 +0100 Subject: [PATCH 036/114] Append validators to storage using new testing util --- .../transactions/bridge_pool_roots.rs | 50 ++++++++----------- .../src/protocol/transactions/votes.rs | 50 ++++++++----------- 2 files changed, 42 insertions(+), 58 deletions(-) diff --git a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs index 85718814536..4e6b2b97279 100644 --- a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs +++ b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs @@ -196,17 +196,13 @@ mod test_apply_bp_roots_to_storage { use namada_core::ledger::storage_api::StorageRead; use namada_core::proto::{SignableEthMessage, Signed}; use namada_core::types::address; - use namada_core::types::dec::Dec; use namada_core::types::ethereum_events::Uint; use namada_core::types::keccak::{keccak_hash, KeccakHash}; - use namada_core::types::key::RefTo; use namada_core::types::storage::Key; use namada_core::types::token::Amount; use namada_core::types::vote_extensions::bridge_pool_roots; use namada_proof_of_stake::parameters::PosParams; - use namada_proof_of_stake::{ - become_validator, bond_tokens, write_pos_params, BecomeValidator, - }; + use namada_proof_of_stake::write_pos_params; use super::*; use crate::protocol::transactions::votes::{ @@ -720,32 +716,16 @@ mod test_apply_bp_roots_to_storage { pipeline_len: 1, ..Default::default() }; - write_pos_params(&mut wl_storage, params.clone()).expect("Test failed"); + write_pos_params(&mut wl_storage, params).expect("Test failed"); // insert validators 2 and 3 at epoch 1 - for (validator, stake) in [ - (&validator_2, validator_2_stake), - (&validator_3, validator_3_stake), - ] { - let keys = test_utils::TestValidatorKeys::generate(); - let consensus_key = &keys.consensus.ref_to(); - let eth_cold_key = &keys.eth_gov.ref_to(); - let eth_hot_key = &keys.eth_bridge.ref_to(); - become_validator(BecomeValidator { - storage: &mut wl_storage, - params: ¶ms, - address: validator, - consensus_key, - eth_cold_key, - eth_hot_key, - current_epoch: 0.into(), - commission_rate: Dec::new(5, 2).unwrap(), - max_commission_rate_change: Dec::new(1, 2).unwrap(), - }) - .expect("Test failed"); - bond_tokens(&mut wl_storage, None, validator, stake, 0.into()) - .expect("Test failed"); - } + test_utils::append_validators_to_storage( + &mut wl_storage, + HashMap::from([ + (validator_2.clone(), validator_2_stake), + (validator_3.clone(), validator_3_stake), + ]), + ); // query validators to make sure they were inserted correctly macro_rules! query_validators { @@ -770,6 +750,12 @@ mod test_apply_bp_roots_to_storage { epoch_0_validators, HashMap::from([(validator_1.clone(), validator_1_stake)]) ); + assert_eq!( + wl_storage + .pos_queries() + .get_total_voting_power(Some(0.into())), + validator_1_stake, + ); assert_eq!( epoch_1_validators, HashMap::from([ @@ -778,6 +764,12 @@ mod test_apply_bp_roots_to_storage { (validator_3, validator_3_stake), ]) ); + assert_eq!( + wl_storage + .pos_queries() + .get_total_voting_power(Some(1.into())), + validator_1_stake + validator_2_stake + validator_3_stake, + ); // set up the bridge pool's storage bridge_pool_vp::init_storage(&mut wl_storage); diff --git a/ethereum_bridge/src/protocol/transactions/votes.rs b/ethereum_bridge/src/protocol/transactions/votes.rs index 5cf8fa4e3dd..eabc0cf1f1c 100644 --- a/ethereum_bridge/src/protocol/transactions/votes.rs +++ b/ethereum_bridge/src/protocol/transactions/votes.rs @@ -203,14 +203,10 @@ mod tests { use std::collections::BTreeSet; use namada_core::ledger::storage::testing::TestWlStorage; - use namada_core::types::dec::Dec; - use namada_core::types::key::RefTo; use namada_core::types::storage::BlockHeight; use namada_core::types::{address, token}; use namada_proof_of_stake::parameters::PosParams; - use namada_proof_of_stake::{ - become_validator, bond_tokens, write_pos_params, BecomeValidator, - }; + use namada_proof_of_stake::write_pos_params; use super::*; use crate::test_utils; @@ -339,32 +335,16 @@ mod tests { pipeline_len: 1, ..Default::default() }; - write_pos_params(&mut wl_storage, params.clone()).expect("Test failed"); + write_pos_params(&mut wl_storage, params).expect("Test failed"); // insert validators 2 and 3 at epoch 1 - for (validator, stake) in [ - (&validator_2, validator_2_stake), - (&validator_3, validator_3_stake), - ] { - let keys = test_utils::TestValidatorKeys::generate(); - let consensus_key = &keys.consensus.ref_to(); - let eth_cold_key = &keys.eth_gov.ref_to(); - let eth_hot_key = &keys.eth_bridge.ref_to(); - become_validator(BecomeValidator { - storage: &mut wl_storage, - params: ¶ms, - address: validator, - consensus_key, - eth_cold_key, - eth_hot_key, - current_epoch: 0.into(), - commission_rate: Dec::new(5, 2).unwrap(), - max_commission_rate_change: Dec::new(1, 2).unwrap(), - }) - .expect("Test failed"); - bond_tokens(&mut wl_storage, None, validator, stake, 0.into()) - .expect("Test failed"); - } + test_utils::append_validators_to_storage( + &mut wl_storage, + HashMap::from([ + (validator_2.clone(), validator_2_stake), + (validator_3.clone(), validator_3_stake), + ]), + ); // query validators to make sure they were inserted correctly let query_validators = |epoch: u64| { @@ -381,6 +361,12 @@ mod tests { epoch_0_validators, HashMap::from([(validator_1.clone(), validator_1_stake)]) ); + assert_eq!( + wl_storage + .pos_queries() + .get_total_voting_power(Some(0.into())), + validator_1_stake, + ); assert_eq!( epoch_1_validators, HashMap::from([ @@ -389,6 +375,12 @@ mod tests { (validator_3, validator_3_stake), ]) ); + assert_eq!( + wl_storage + .pos_queries() + .get_total_voting_power(Some(1.into())), + validator_1_stake + validator_2_stake + validator_3_stake, + ); // check that voting works as expected let aggregated = EpochedVotingPower::from([ From f42f6dde1fa2402aee5e3584ab5d3d8da1194e41 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 1 Sep 2023 10:08:45 +0100 Subject: [PATCH 037/114] Convert Uint to Amount with 0 denom --- core/src/types/token.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/types/token.rs b/core/src/types/token.rs index 3201684e0f7..0ee60b43264 100644 --- a/core/src/types/token.rs +++ b/core/src/types/token.rs @@ -190,9 +190,13 @@ impl Amount { denom: impl Into, ) -> Result { let denom = denom.into(); + let uint = uint.into(); + if denom == 0 { + return Ok(Self { raw: uint }); + } match Uint::from(10) .checked_pow(Uint::from(denom)) - .and_then(|scaling| scaling.checked_mul(uint.into())) + .and_then(|scaling| scaling.checked_mul(uint)) { Some(amount) => Ok(Self { raw: amount }), None => Err(AmountParseError::ConvertToDecimal), From 62184e70b266aa724c62d3c0d2cced6ab34878f6 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 1 Sep 2023 10:09:04 +0100 Subject: [PATCH 038/114] Multiply Amount with FractionalVotingPower --- core/src/types/voting_power.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/core/src/types/voting_power.rs b/core/src/types/voting_power.rs index 946e08b834a..844df5811bd 100644 --- a/core/src/types/voting_power.rs +++ b/core/src/types/voting_power.rs @@ -12,6 +12,7 @@ use num_traits::ops::checked::CheckedAdd; use serde::de::Visitor; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; +use crate::types::token::Amount; use crate::types::uint::Uint; /// Namada voting power, normalized to the range `0 - 2^32`. @@ -170,6 +171,27 @@ impl Mul<&FractionalVotingPower> for FractionalVotingPower { } } +impl Mul for FractionalVotingPower { + type Output = Amount; + + fn mul(self, rhs: Amount) -> Self::Output { + self * &rhs + } +} + +impl Mul<&Amount> for FractionalVotingPower { + type Output = Amount; + + fn mul(self, &rhs: &Amount) -> Self::Output { + let whole: Uint = rhs.into(); + let fraction = (self.0 * whole).to_integer(); + match Amount::from_uint(fraction, 0u8) { + Ok(amount) => amount, + _ => unreachable!(), + } + } +} + impl Add for FractionalVotingPower { type Output = Self; From 9bb78080772e0896b94c9cbcdbd86d81b8ebcaf3 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Thu, 7 Sep 2023 11:59:27 +0200 Subject: [PATCH 039/114] Removes redundant `WasmPayload` enum --- benches/vps.rs | 8 +++--- shared/src/ledger/protocol/mod.rs | 2 +- shared/src/vm/wasm/run.rs | 46 +++++++++++-------------------- 3 files changed, 21 insertions(+), 35 deletions(-) diff --git a/benches/vps.rs b/benches/vps.rs index 20e6055885f..92b5e2fecc0 100644 --- a/benches/vps.rs +++ b/benches/vps.rs @@ -149,7 +149,7 @@ fn vp_user(c: &mut Criterion) { b.iter(|| { assert!( run::vp( - &vp_code_hash, + vp_code_hash, signed_tx, &TxIndex(0), &defaults::albert_address(), @@ -296,7 +296,7 @@ fn vp_implicit(c: &mut Criterion) { b.iter(|| { assert!( run::vp( - &vp_code_hash, + vp_code_hash, tx, &TxIndex(0), &Address::from(&implicit_account.to_public()), @@ -447,7 +447,7 @@ fn vp_validator(c: &mut Criterion) { b.iter(|| { assert!( run::vp( - &vp_code_hash, + vp_code_hash, signed_tx, &TxIndex(0), &defaults::validator_address(), @@ -538,7 +538,7 @@ fn vp_masp(c: &mut Criterion) { b.iter(|| { assert!( run::vp( - &vp_code_hash, + vp_code_hash, &signed_tx, &TxIndex(0), &defaults::validator_address(), diff --git a/shared/src/ledger/protocol/mod.rs b/shared/src/ledger/protocol/mod.rs index c6ed0814b17..845bf29c06f 100644 --- a/shared/src/ledger/protocol/mod.rs +++ b/shared/src/ledger/protocol/mod.rs @@ -882,7 +882,7 @@ where // the first signature verification (if any) is accounted // twice wasm::run::vp( - &vp_code_hash, + vp_code_hash, tx, tx_index, addr, diff --git a/shared/src/vm/wasm/run.rs b/shared/src/vm/wasm/run.rs index 667b6884ee1..972d2780193 100644 --- a/shared/src/vm/wasm/run.rs +++ b/shared/src/vm/wasm/run.rs @@ -86,11 +86,6 @@ pub enum Error { /// Result for functions that may fail pub type Result = std::result::Result; -enum WasmPayload<'fetch> { - Hash(&'fetch Hash), - Code(&'fetch [u8]), -} - /// Execute a transaction code. Returns the set verifiers addresses requested by /// the transaction. #[allow(clippy::too_many_arguments)] @@ -112,19 +107,10 @@ where .get_section(tx.code_sechash()) .and_then(|x| Section::code_sec(x.as_ref())) .ok_or(Error::MissingCode)?; - let (tx_hash, code) = match tx_code.code { - Commitment::Hash(code_hash) => (code_hash, None), - Commitment::Id(tx_code) => (Hash::sha256(&tx_code), Some(tx_code)), - }; - - let code_or_hash = match code { - Some(ref code) => WasmPayload::Code(code), - None => WasmPayload::Hash(&tx_hash), - }; let (module, store) = fetch_or_compile( tx_wasm_cache, - code_or_hash, + &tx_code.code, write_log, storage, gas_meter, @@ -195,7 +181,7 @@ where /// that triggered the execution. #[allow(clippy::too_many_arguments)] pub fn vp( - vp_code_hash: &Hash, + vp_code_hash: Hash, tx: &Tx, tx_index: &TxIndex, address: &Address, @@ -215,7 +201,7 @@ where // Compile the wasm module let (module, store) = fetch_or_compile( &mut vp_wasm_cache, - WasmPayload::Hash(vp_code_hash), + &Commitment::Hash(vp_code_hash), write_log, storage, gas_meter, @@ -254,7 +240,7 @@ where run_vp( module, imports, - vp_code_hash, + &vp_code_hash, tx, address, keys_changed, @@ -399,7 +385,7 @@ where // Compile the wasm module let (module, store) = fetch_or_compile( vp_wasm_cache, - WasmPayload::Hash(&vp_code_hash), + &Commitment::Hash(vp_code_hash), write_log, storage, gas_meter, @@ -455,7 +441,7 @@ pub fn prepare_wasm_code>(code: T) -> Result> { // loading and code compilation gas costs. fn fetch_or_compile( wasm_cache: &mut Cache, - code_or_hash: WasmPayload, + code_or_hash: &Commitment, write_log: &WriteLog, storage: &Storage, gas_meter: &mut dyn GasMetering, @@ -467,7 +453,7 @@ where CA: 'static + WasmCacheAccess, { match code_or_hash { - WasmPayload::Hash(code_hash) => { + Commitment::Hash(code_hash) => { let (module, store, tx_len) = match wasm_cache.fetch(code_hash)? { Some((module, store)) => { // Gas accounting even if the compiled module is in cache @@ -541,7 +527,7 @@ where gas_meter.add_compiling_gas(tx_len)?; Ok((module, store)) } - WasmPayload::Code(code) => { + Commitment::Id(code) => { gas_meter.add_compiling_gas( u64::try_from(code.len()) .map_err(|e| Error::ConversionError(e.to_string()))?, @@ -752,7 +738,7 @@ mod tests { // When the `eval`ed VP doesn't run out of memory, it should return // `true` let passed = vp( - &code_hash, + code_hash, &outer_tx, &tx_index, &addr, @@ -786,7 +772,7 @@ mod tests { // `false`, hence we should also get back `false` from the VP that // called `eval`. let passed = vp( - &code_hash, + code_hash, &outer_tx, &tx_index, &addr, @@ -840,7 +826,7 @@ mod tests { outer_tx.set_code(Code::new(vec![])); let (vp_cache, _) = wasm::compilation_cache::common::testing::cache(); let result = vp( - &code_hash, + code_hash, &outer_tx, &tx_index, &addr, @@ -862,7 +848,7 @@ mod tests { outer_tx.header.chain_id = storage.chain_id.clone(); outer_tx.set_data(Data::new(tx_data)); let error = vp( - &code_hash, + code_hash, &outer_tx, &tx_index, &addr, @@ -976,7 +962,7 @@ mod tests { outer_tx.set_code(Code::new(vec![])); let (vp_cache, _) = wasm::compilation_cache::common::testing::cache(); let result = vp( - &code_hash, + code_hash, &outer_tx, &tx_index, &addr, @@ -1104,7 +1090,7 @@ mod tests { outer_tx.set_code(Code::new(vec![])); let (vp_cache, _) = wasm::compilation_cache::common::testing::cache(); let error = vp( - &code_hash, + code_hash, &outer_tx, &tx_index, &addr, @@ -1183,7 +1169,7 @@ mod tests { let (vp_cache, _) = wasm::compilation_cache::common::testing::cache(); let passed = vp( - &code_hash, + code_hash, &outer_tx, &tx_index, &addr, @@ -1317,7 +1303,7 @@ mod tests { storage.write(&len_key, code_len).unwrap(); vp( - &code_hash, + code_hash, &outer_tx, &tx_index, &addr, From 651d30f5085a14d120c63d423bf00839a8ad2f40 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Thu, 7 Sep 2023 14:30:40 +0200 Subject: [PATCH 040/114] changelog: add #1874 --- .../unreleased/improvements/1874-remove-redundant-struct.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/1874-remove-redundant-struct.md diff --git a/.changelog/unreleased/improvements/1874-remove-redundant-struct.md b/.changelog/unreleased/improvements/1874-remove-redundant-struct.md new file mode 100644 index 00000000000..c1eb946e8b6 --- /dev/null +++ b/.changelog/unreleased/improvements/1874-remove-redundant-struct.md @@ -0,0 +1,2 @@ +- Removed redundant `WasmPayload` enum in favor of `Commitment`. + ([\#1874](https://github.com/anoma/namada/pull/1874)) \ No newline at end of file From 561c49aeac855112c38e5733d25ad5709977461d Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 1 Sep 2023 15:24:27 +0100 Subject: [PATCH 041/114] Rework voting across epochs on Ethereum tallies Instead of accounting for votes on Ethereum tallies based on the average voting power available across all epochs the tally took place in, we account for the maximum voting power found across all these epochs. --- .../transactions/bridge_pool_roots.rs | 10 +- .../transactions/ethereum_events/mod.rs | 28 +- .../src/protocol/transactions/utils.rs | 98 +------ .../transactions/validator_set_update/mod.rs | 5 +- .../src/protocol/transactions/votes.rs | 144 +++++----- .../protocol/transactions/votes/storage.rs | 26 +- .../src/protocol/transactions/votes/update.rs | 251 +++++++++++------- ethereum_bridge/src/test_utils.rs | 40 ++- shared/src/ledger/protocol/mod.rs | 26 +- shared/src/ledger/queries/shell/eth_bridge.rs | 12 +- 10 files changed, 303 insertions(+), 337 deletions(-) diff --git a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs index 4e6b2b97279..0c3ba5c34ce 100644 --- a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs +++ b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs @@ -7,9 +7,9 @@ use namada_core::ledger::storage::{DBIter, StorageHasher, WlStorage, DB}; use namada_core::ledger::storage_api::StorageWrite; use namada_core::types::address::Address; use namada_core::types::storage::BlockHeight; +use namada_core::types::token::Amount; use namada_core::types::transaction::TxResult; use namada_core::types::vote_extensions::bridge_pool_roots::MultiSignedVext; -use namada_core::types::voting_power::FractionalVotingPower; use namada_proof_of_stake::pos_queries::PosQueries; use crate::protocol::transactions::utils::GetVoters; @@ -140,7 +140,7 @@ fn apply_update( wl_storage: &mut WlStorage, mut update: BridgePoolRoot, seen_by: Votes, - voting_powers: &HashMap<(Address, BlockHeight), FractionalVotingPower>, + voting_powers: &HashMap<(Address, BlockHeight), Amount>, ) -> Result<(ChangedKeys, bool)> where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, @@ -199,8 +199,8 @@ mod test_apply_bp_roots_to_storage { use namada_core::types::ethereum_events::Uint; use namada_core::types::keccak::{keccak_hash, KeccakHash}; use namada_core::types::storage::Key; - use namada_core::types::token::Amount; use namada_core::types::vote_extensions::bridge_pool_roots; + use namada_core::types::voting_power::FractionalVotingPower; use namada_proof_of_stake::parameters::PosParams; use namada_proof_of_stake::write_pos_params; @@ -431,7 +431,7 @@ mod test_apply_bp_roots_to_storage { .read::(&bp_root_key.voting_power()) .expect("Test failed") .expect("Test failed") - .average_voting_power(&wl_storage); + .fractional_stake(&wl_storage); assert_eq!( voting_power, FractionalVotingPower::new_u64(5, 12).unwrap() @@ -450,7 +450,7 @@ mod test_apply_bp_roots_to_storage { .read::(&bp_root_key.voting_power()) .expect("Test failed") .expect("Test failed") - .average_voting_power(&wl_storage); + .fractional_stake(&wl_storage); assert_eq!(voting_power, FractionalVotingPower::new_u64(5, 6).unwrap()); } diff --git a/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs b/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs index 97fa999fb47..ab2988d3d5d 100644 --- a/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs +++ b/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs @@ -13,9 +13,9 @@ use namada_core::ledger::storage::{DBIter, WlStorage, DB}; use namada_core::types::address::Address; use namada_core::types::ethereum_events::EthereumEvent; use namada_core::types::storage::{BlockHeight, Epoch, Key}; +use namada_core::types::token::Amount; use namada_core::types::transaction::TxResult; use namada_core::types::vote_extensions::ethereum_events::MultiSignedEthEvent; -use namada_core::types::voting_power::FractionalVotingPower; use namada_proof_of_stake::pos_queries::PosQueries; use super::ChangedKeys; @@ -86,7 +86,7 @@ where pub(super) fn apply_updates( wl_storage: &mut WlStorage, updates: HashSet, - voting_powers: HashMap<(Address, BlockHeight), FractionalVotingPower>, + voting_powers: HashMap<(Address, BlockHeight), Amount>, ) -> Result where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, @@ -133,7 +133,7 @@ where fn apply_update( wl_storage: &mut WlStorage, update: EthMsgUpdate, - voting_powers: &HashMap<(Address, BlockHeight), FractionalVotingPower>, + voting_powers: &HashMap<(Address, BlockHeight), Amount>, ) -> Result<(ChangedKeys, bool)> where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, @@ -284,7 +284,8 @@ mod tests { use namada_core::types::ethereum_events::{ EthereumEvent, TransferToNamada, }; - use namada_core::types::token::{balance_key, minted_balance_key, Amount}; + use namada_core::types::token::{balance_key, minted_balance_key}; + use namada_core::types::voting_power::FractionalVotingPower; use super::*; use crate::protocol::transactions::utils::GetVoters; @@ -305,7 +306,7 @@ mod tests { #[test] /// Test applying a `TransfersToNamada` batch containing a single transfer fn test_apply_single_transfer() -> Result<()> { - let sole_validator = address::testing::gen_established_address(); + let (sole_validator, validator_stake) = test_utils::default_validator(); let receiver = address::testing::established_address_2(); let amount = arbitrary_amount(); @@ -326,10 +327,9 @@ mod tests { let updates = HashSet::from_iter(vec![update]); let voting_powers = HashMap::from_iter(vec![( (sole_validator.clone(), BlockHeight(100)), - FractionalVotingPower::WHOLE, + validator_stake, )]); - let mut wl_storage = TestWlStorage::default(); - test_utils::bootstrap_ethereum_bridge(&mut wl_storage); + let (mut wl_storage, _) = test_utils::setup_default_storage(); test_utils::whitelist_tokens( &mut wl_storage, [( @@ -377,7 +377,7 @@ mod tests { let voting_power = wl_storage .read::(ð_msg_keys.voting_power())? .expect("Test failed") - .average_voting_power(&wl_storage); + .fractional_stake(&wl_storage); assert_eq!(voting_power, FractionalVotingPower::WHOLE); let epoch_bytes = @@ -414,7 +414,6 @@ mod tests { test_utils::setup_storage_with_validators(HashMap::from_iter( vec![(sole_validator.clone(), Amount::native_whole(100))], )); - test_utils::bootstrap_ethereum_bridge(&mut wl_storage); test_utils::whitelist_tokens( &mut wl_storage, [( @@ -488,7 +487,6 @@ mod tests { (validator_b, Amount::native_whole(100)), ]), ); - test_utils::bootstrap_ethereum_bridge(&mut wl_storage); let receiver = address::testing::established_address_1(); let event = EthereumEvent::TransfersToNamada { @@ -590,7 +588,7 @@ mod tests { let voting_power = wl_storage .read::(ð_msg_keys.voting_power())? .expect("Test failed") - .average_voting_power(&wl_storage); + .fractional_stake(&wl_storage); assert_eq!(voting_power, FractionalVotingPower::HALF); Ok(()) @@ -664,7 +662,6 @@ mod tests { (validator_b, Amount::native_whole(100)), ]), ); - test_utils::bootstrap_ethereum_bridge(&mut wl_storage); let receiver = address::testing::established_address_1(); let event = EthereumEvent::TransfersToNamada { @@ -793,7 +790,6 @@ mod tests { (validator_b.clone(), Amount::native_whole(100)), ]), ); - test_utils::bootstrap_ethereum_bridge(&mut wl_storage); let receiver = address::testing::established_address_1(); let event = EthereumEvent::TransfersToNamada { @@ -821,7 +817,7 @@ mod tests { (KeyKind::VotingPower, Some(power)) => { let power = EpochedVotingPower::try_from_slice(&power) .expect("Test failed") - .average_voting_power(&wl_storage); + .fractional_stake(&wl_storage); assert_eq!(power, FractionalVotingPower::HALF); } (_, Some(_)) => {} @@ -851,7 +847,7 @@ mod tests { (KeyKind::VotingPower, Some(power)) => { let power = EpochedVotingPower::try_from_slice(&power) .expect("Test failed") - .average_voting_power(&wl_storage); + .fractional_stake(&wl_storage); assert_eq!(power, FractionalVotingPower::HALF); } (_, Some(_)) => {} diff --git a/ethereum_bridge/src/protocol/transactions/utils.rs b/ethereum_bridge/src/protocol/transactions/utils.rs index 1f06c46a302..d2f44c995e9 100644 --- a/ethereum_bridge/src/protocol/transactions/utils.rs +++ b/ethereum_bridge/src/protocol/transactions/utils.rs @@ -6,7 +6,6 @@ use namada_core::ledger::storage::{DBIter, StorageHasher, WlStorage, DB}; use namada_core::types::address::Address; use namada_core::types::storage::BlockHeight; use namada_core::types::token; -use namada_core::types::voting_power::FractionalVotingPower; use namada_proof_of_stake::pos_queries::PosQueries; use namada_proof_of_stake::types::WeightedValidator; @@ -25,7 +24,7 @@ pub(super) trait GetVoters { pub(super) fn get_voting_powers( wl_storage: &WlStorage, proof: P, -) -> eyre::Result> +) -> eyre::Result> where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, @@ -85,15 +84,13 @@ where pub(super) fn get_voting_powers_for_selected( all_consensus: &BTreeMap>, selected: HashSet<(Address, BlockHeight)>, -) -> eyre::Result> { - let total_voting_powers = - sum_voting_powers_for_block_heights(all_consensus); +) -> eyre::Result> { let voting_powers = selected .into_iter() .map( |(addr, height)| -> eyre::Result<( (Address, BlockHeight), - FractionalVotingPower, + token::Amount, )> { let consensus_validators = all_consensus.get(&height).ok_or_else(|| { @@ -101,7 +98,7 @@ pub(super) fn get_voting_powers_for_selected( "No consensus validators found for height {height}" ) })?; - let individual_voting_power = consensus_validators + let voting_power = consensus_validators .iter() .find(|&v| v.address == addr) .ok_or_else(|| { @@ -111,21 +108,9 @@ pub(super) fn get_voting_powers_for_selected( ) })? .bonded_stake; - let total_voting_power = total_voting_powers - .get(&height) - .ok_or_else(|| { - eyre!( - "No total voting power provided for height \ - {height}" - ) - })? - .to_owned(); Ok(( (addr, height), - FractionalVotingPower::new( - individual_voting_power.into(), - total_voting_power.into(), - )?, + voting_power, )) }, ) @@ -133,24 +118,6 @@ pub(super) fn get_voting_powers_for_selected( Ok(voting_powers) } -pub(super) fn sum_voting_powers_for_block_heights( - validators: &BTreeMap>, -) -> BTreeMap { - validators - .iter() - .map(|(h, vs)| (h.to_owned(), sum_voting_powers(vs))) - .collect() -} - -pub(super) fn sum_voting_powers( - validators: &BTreeSet, -) -> token::Amount { - validators - .iter() - .map(|validator| validator.bonded_stake) - .sum::() -} - #[cfg(test)] mod tests { use std::collections::HashSet; @@ -158,6 +125,7 @@ mod tests { use assert_matches::assert_matches; use namada_core::types::address; use namada_core::types::ethereum_events::testing::arbitrary_bonded_stake; + use namada_core::types::voting_power::FractionalVotingPower; use super::*; @@ -190,7 +158,7 @@ mod tests { assert_eq!(voting_powers.len(), 1); assert_matches!( voting_powers.get(&(sole_validator, BlockHeight(100))), - Some(v) if *v == FractionalVotingPower::WHOLE + Some(v) if *v == bonded_stake ); } @@ -263,6 +231,7 @@ mod tests { weighted_validator_2, ]), )]); + let bonded_stake = bonded_stake_1 + bonded_stake_2; let result = get_voting_powers_for_selected(&consensus_validators, validators); @@ -272,56 +241,17 @@ mod tests { Err(error) => panic!("error: {:?}", error), }; assert_eq!(voting_powers.len(), 2); + let expected_stake = + FractionalVotingPower::new_u64(100, 300).unwrap() * bonded_stake; assert_matches!( voting_powers.get(&(validator_1, BlockHeight(100))), - Some(v) if *v == FractionalVotingPower::new_u64(100, 300).unwrap() + Some(v) if *v == expected_stake ); + let expected_stake = + FractionalVotingPower::new_u64(200, 300).unwrap() * bonded_stake; assert_matches!( voting_powers.get(&(validator_2, BlockHeight(100))), - Some(v) if *v == FractionalVotingPower::new_u64(200, 300).unwrap() + Some(v) if *v == expected_stake ); } - - #[test] - /// Test summing the voting powers for a set of validators containing only - /// one validator - fn test_sum_voting_powers_sole_validator() { - let sole_validator = address::testing::established_address_1(); - let bonded_stake = arbitrary_bonded_stake(); - let weighted_sole_validator = WeightedValidator { - bonded_stake, - address: sole_validator, - }; - let validators = BTreeSet::from_iter(vec![weighted_sole_validator]); - - let total = sum_voting_powers(&validators); - - assert_eq!(total, bonded_stake); - } - - #[test] - /// Test summing the voting powers for a set of validators containing two - /// validators - fn test_sum_voting_powers_two_validators() { - let validator_1 = address::testing::established_address_1(); - let validator_2 = address::testing::established_address_2(); - let bonded_stake_1 = token::Amount::from(100); - let bonded_stake_2 = token::Amount::from(200); - let weighted_validator_1 = WeightedValidator { - bonded_stake: bonded_stake_1, - address: validator_1, - }; - let weighted_validator_2 = WeightedValidator { - bonded_stake: bonded_stake_2, - address: validator_2, - }; - let validators = BTreeSet::from_iter(vec![ - weighted_validator_1, - weighted_validator_2, - ]); - - let total = sum_voting_powers(&validators); - - assert_eq!(total, token::Amount::from(300)); - } } diff --git a/ethereum_bridge/src/protocol/transactions/validator_set_update/mod.rs b/ethereum_bridge/src/protocol/transactions/validator_set_update/mod.rs index 63b6627d9c8..8457b82c4fb 100644 --- a/ethereum_bridge/src/protocol/transactions/validator_set_update/mod.rs +++ b/ethereum_bridge/src/protocol/transactions/validator_set_update/mod.rs @@ -6,11 +6,11 @@ use eyre::Result; use namada_core::ledger::storage::{DBIter, StorageHasher, WlStorage, DB}; use namada_core::types::address::Address; use namada_core::types::storage::{BlockHeight, Epoch}; +use namada_core::types::token::Amount; #[allow(unused_imports)] use namada_core::types::transaction::protocol::ProtocolTxType; use namada_core::types::transaction::TxResult; use namada_core::types::vote_extensions::validator_set_update; -use namada_core::types::voting_power::FractionalVotingPower; use super::ChangedKeys; use crate::protocol::transactions::utils; @@ -85,7 +85,7 @@ fn apply_update( ext: validator_set_update::VextDigest, signing_epoch: Epoch, epoch_2nd_height: BlockHeight, - voting_powers: HashMap<(Address, BlockHeight), FractionalVotingPower>, + voting_powers: HashMap<(Address, BlockHeight), Amount>, ) -> Result where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, @@ -199,7 +199,6 @@ where #[cfg(test)] mod test_valset_upd_state_changes { use namada_core::types::address; - use namada_core::types::token::Amount; use namada_core::types::vote_extensions::validator_set_update::VotingPowersMap; use namada_core::types::voting_power::FractionalVotingPower; use namada_proof_of_stake::pos_queries::PosQueries; diff --git a/ethereum_bridge/src/protocol/transactions/votes.rs b/ethereum_bridge/src/protocol/transactions/votes.rs index eabc0cf1f1c..c3a82bd370e 100644 --- a/ethereum_bridge/src/protocol/transactions/votes.rs +++ b/ethereum_bridge/src/protocol/transactions/votes.rs @@ -5,7 +5,6 @@ use std::collections::{BTreeMap, BTreeSet, HashMap}; use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; use eyre::{eyre, Result}; -use namada_core::hints; use namada_core::ledger::storage::{DBIter, StorageHasher, WlStorage, DB}; use namada_core::types::address::Address; use namada_core::types::storage::{BlockHeight, Epoch}; @@ -27,31 +26,48 @@ pub(super) mod update; pub type Votes = BTreeMap; /// The voting power behind a tally aggregated over multiple epochs. -pub type EpochedVotingPower = BTreeMap; +pub type EpochedVotingPower = BTreeMap; /// Extension methods for [`EpochedVotingPower`] instances. pub trait EpochedVotingPowerExt { - /// Get the total voting power staked across all epochs - /// in this [`EpochedVotingPower`]. - fn get_epoch_voting_powers( + /// Query the stake of the most secure [`Epoch`] referenced by an + /// [`EpochedVotingPower`]. This translates to the [`Epoch`] with + /// the most staked tokens. + fn epoch_max_voting_power( &self, wl_storage: &WlStorage, - ) -> HashMap + ) -> Option where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync; - /// Get the weighted average of some tally's voting powers pertaining to all - /// epochs it was held in. - fn average_voting_power( + /// Fetch the sum of the stake tallied on an + /// [`EpochedVotingPower`]. + fn tallied_stake(&self) -> token::Amount; + + /// Fetch the sum of the stake tallied on an + /// [`EpochedVotingPower`], as a fraction over + /// the maximum stake seen in the epochs voted on. + #[inline] + fn fractional_stake( &self, wl_storage: &WlStorage, ) -> FractionalVotingPower where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, - H: 'static + StorageHasher + Sync; + H: 'static + StorageHasher + Sync, + { + let Some(max_voting_power) = self.epoch_max_voting_power(wl_storage) else { + return FractionalVotingPower::NULL; + }; + FractionalVotingPower::new( + self.tallied_stake().into(), + max_voting_power.into(), + ) + .unwrap() + } - /// Check if the [`Tally`] associated with this [`EpochedVotingPower`] + /// Check if the [`Tally`] associated with an [`EpochedVotingPower`] /// can be considered `seen`. #[inline] fn has_majority_quorum(&self, wl_storage: &WlStorage) -> bool @@ -59,16 +75,29 @@ pub trait EpochedVotingPowerExt { D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, { - self.average_voting_power(wl_storage) - > FractionalVotingPower::TWO_THIRDS + let Some(max_voting_power) = self.epoch_max_voting_power(wl_storage) else { + return false; + }; + // NB: Preserve the safety property of the Tendermint protocol across + // all the epochs we vote on. + // + // PROOF: We calculate the maximum amount of tokens S_max staked on + // one of the epochs the tally occurred in. At most F = 1/3 * S_max + // of the combined stake can be Byzantine, for the protocol to uphold + // its linearizability property whilst remaining "secure" against + // arbitrarily faulty nodes. Therefore, we can consider a tally secure + // if has accumulated an amount of stake greater than the threshold + // stake of S_max - F = 2/3 S_max. + let threshold = FractionalVotingPower::TWO_THIRDS * max_voting_power; + self.tallied_stake() > threshold } } impl EpochedVotingPowerExt for EpochedVotingPower { - fn get_epoch_voting_powers( + fn epoch_max_voting_power( &self, wl_storage: &WlStorage, - ) -> HashMap + ) -> Option where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, @@ -76,57 +105,13 @@ impl EpochedVotingPowerExt for EpochedVotingPower { self.keys() .copied() .map(|epoch| { - ( - epoch, - wl_storage - .pos_queries() - .get_total_voting_power(Some(epoch)), - ) + wl_storage.pos_queries().get_total_voting_power(Some(epoch)) }) - .collect() + .max() } - fn average_voting_power( - &self, - wl_storage: &WlStorage, - ) -> FractionalVotingPower - where - D: 'static + DB + for<'iter> DBIter<'iter> + Sync, - H: 'static + StorageHasher + Sync, - { - // if we only voted across a single epoch, we can avoid doing - // expensive I/O operations - if hints::likely(self.len() == 1) { - // TODO: switch to [`BTreeMap::first_entry`] when we start - // using Rust >= 1.66 - let Some(&power) = self.values().next() else { - hints::cold(); - unreachable!("The map has one value"); - }; - return power; - } - - let epoch_voting_powers = self.get_epoch_voting_powers(wl_storage); - let total_voting_power = epoch_voting_powers - .values() - .fold(token::Amount::from(0u64), |accum, &stake| accum + stake); - - self.iter().map(|(&epoch, &power)| (epoch, power)).fold( - FractionalVotingPower::NULL, - |average, (epoch, aggregated_voting_power)| { - let epoch_voting_power = epoch_voting_powers - .get(&epoch) - .copied() - .expect("This value should be in the map"); - debug_assert!(epoch_voting_power > 0.into()); - let weight = FractionalVotingPower::new( - epoch_voting_power.into(), - total_voting_power.into(), - ) - .unwrap(); - average + weight * aggregated_voting_power - }, - ) + fn tallied_stake(&self) -> token::Amount { + self.values().copied().sum::() } } @@ -153,7 +138,7 @@ pub struct Tally { pub fn calculate_new( wl_storage: &WlStorage, seen_by: Votes, - voting_powers: &HashMap<(Address, BlockHeight), FractionalVotingPower>, + voting_powers: &HashMap<(Address, BlockHeight), token::Amount>, ) -> Result where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, @@ -164,14 +149,14 @@ where match voting_powers .get(&(validator.to_owned(), block_height.to_owned())) { - Some(voting_power) => { + Some(&voting_power) => { let epoch = wl_storage .pos_queries() .get_epoch(*block_height) .expect("The queried epoch should be known"); let aggregated = seen_by_voting_power .entry(epoch) - .or_insert(FractionalVotingPower::NULL); + .or_insert_with(token::Amount::zero); *aggregated += voting_power; } None => { @@ -202,7 +187,6 @@ pub fn dedupe(signers: BTreeSet<(Address, BlockHeight)>) -> Votes { mod tests { use std::collections::BTreeSet; - use namada_core::ledger::storage::testing::TestWlStorage; use namada_core::types::storage::BlockHeight; use namada_core::types::{address, token}; use namada_proof_of_stake::parameters::PosParams; @@ -301,18 +285,21 @@ mod tests { /// fast path of the algorithm. #[test] fn test_tally_vote_single_epoch() { - let dummy_storage = TestWlStorage::default(); + let (_, dummy_validator_stake) = test_utils::default_validator(); + let (dummy_storage, _) = test_utils::setup_default_storage(); - let aggregated = - EpochedVotingPower::from([(0.into(), FractionalVotingPower::HALF)]); + let aggregated = EpochedVotingPower::from([( + 0.into(), + FractionalVotingPower::HALF * dummy_validator_stake, + )]); assert_eq!( - aggregated.average_voting_power(&dummy_storage), + aggregated.fractional_stake(&dummy_storage), FractionalVotingPower::HALF ); } /// Test that voting on a tally across epoch boundaries accounts - /// for the average voting power attained along those epochs. + /// for the maximum voting power attained along those epochs. #[test] fn test_voting_across_epoch_boundaries() { // the validators that will vote in the tally @@ -325,6 +312,9 @@ mod tests { let validator_3 = address::testing::established_address_3(); let validator_3_stake = token::Amount::native_whole(100); + let total_stake = + validator_1_stake + validator_2_stake + validator_3_stake; + // start epoch 0 with validator 1 let (mut wl_storage, _) = test_utils::setup_storage_with_validators( HashMap::from([(validator_1.clone(), validator_1_stake)]), @@ -379,17 +369,17 @@ mod tests { wl_storage .pos_queries() .get_total_voting_power(Some(1.into())), - validator_1_stake + validator_2_stake + validator_3_stake, + total_stake, ); // check that voting works as expected let aggregated = EpochedVotingPower::from([ - (0.into(), FractionalVotingPower::ONE_THIRD), - (1.into(), FractionalVotingPower::ONE_THIRD), + (0.into(), FractionalVotingPower::ONE_THIRD * total_stake), + (1.into(), FractionalVotingPower::ONE_THIRD * total_stake), ]); assert_eq!( - aggregated.average_voting_power(&wl_storage), - FractionalVotingPower::ONE_THIRD + aggregated.fractional_stake(&wl_storage), + FractionalVotingPower::TWO_THIRDS ); } } diff --git a/ethereum_bridge/src/protocol/transactions/votes/storage.rs b/ethereum_bridge/src/protocol/transactions/votes/storage.rs index 4f6d107bb20..bd9f45dceeb 100644 --- a/ethereum_bridge/src/protocol/transactions/votes/storage.rs +++ b/ethereum_bridge/src/protocol/transactions/votes/storage.rs @@ -116,16 +116,16 @@ where mod tests { use std::collections::BTreeMap; - use namada_core::ledger::storage::testing::TestWlStorage; - use namada_core::types::address; use namada_core::types::ethereum_events::EthereumEvent; - use namada_core::types::voting_power::FractionalVotingPower; use super::*; + use crate::test_utils; #[test] fn test_write_tally() { - let mut wl_storage = TestWlStorage::default(); + let (mut wl_storage, _) = test_utils::setup_default_storage(); + let (validator, validator_voting_power) = + test_utils::default_validator(); let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), transfers: vec![], @@ -135,12 +135,9 @@ mod tests { let tally = Tally { voting_power: EpochedVotingPower::from([( 0.into(), - FractionalVotingPower::ONE_THIRD, - )]), - seen_by: BTreeMap::from([( - address::testing::established_address_1(), - 10.into(), + validator_voting_power, )]), + seen_by: BTreeMap::from([(validator, 10.into())]), seen: false, }; @@ -175,7 +172,9 @@ mod tests { #[test] fn test_read_tally() { - let mut wl_storage = TestWlStorage::default(); + let (mut wl_storage, _) = test_utils::setup_default_storage(); + let (validator, validator_voting_power) = + test_utils::default_validator(); let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), transfers: vec![], @@ -185,12 +184,9 @@ mod tests { let tally = Tally { voting_power: EpochedVotingPower::from([( 0.into(), - FractionalVotingPower::ONE_THIRD, - )]), - seen_by: BTreeMap::from([( - address::testing::established_address_1(), - 10.into(), + validator_voting_power, )]), + seen_by: BTreeMap::from([(validator, 10.into())]), seen: false, }; wl_storage diff --git a/ethereum_bridge/src/protocol/transactions/votes/update.rs b/ethereum_bridge/src/protocol/transactions/votes/update.rs index 369290ef6b5..9b20be92ea1 100644 --- a/ethereum_bridge/src/protocol/transactions/votes/update.rs +++ b/ethereum_bridge/src/protocol/transactions/votes/update.rs @@ -5,7 +5,7 @@ use eyre::{eyre, Result}; use namada_core::ledger::storage::{DBIter, StorageHasher, WlStorage, DB}; use namada_core::types::address::Address; use namada_core::types::storage::BlockHeight; -use namada_core::types::voting_power::FractionalVotingPower; +use namada_core::types::token; use namada_proof_of_stake::pos_queries::PosQueries; use super::{ChangedKeys, EpochedVotingPowerExt, Tally, Votes}; @@ -14,34 +14,33 @@ use crate::storage::vote_tallies; /// Wraps all the information about new votes to be applied to some existing /// tally in storage. pub(in super::super) struct NewVotes { - inner: HashMap, + inner: HashMap, } impl NewVotes { /// Constructs a new [`NewVotes`]. /// - /// For all `votes` provided, a corresponding [`FractionalVotingPower`] must + /// For all `votes` provided, a corresponding [`token::Amount`] must /// be provided in `voting_powers` also, otherwise an error will be /// returned. pub fn new( votes: Votes, - voting_powers: &HashMap<(Address, BlockHeight), FractionalVotingPower>, + voting_powers: &HashMap<(Address, BlockHeight), token::Amount>, ) -> Result { let mut inner = HashMap::default(); for vote in votes { - let fract_voting_power = match voting_powers.get(&vote) { - Some(fract_voting_power) => fract_voting_power, + let voting_power = match voting_powers.get(&vote) { + Some(voting_power) => voting_power, None => { let (address, block_height) = vote; return Err(eyre!( - "No fractional voting power provided for vote by \ - validator {address} at block height {block_height}" + "No voting power provided for vote by validator \ + {address} at block height {block_height}" )); } }; let (address, block_height) = vote; - _ = inner - .insert(address, (block_height, fract_voting_power.to_owned())); + _ = inner.insert(address, (block_height, voting_power.to_owned())); } Ok(Self { inner }) } @@ -71,14 +70,14 @@ impl NewVotes { impl IntoIterator for NewVotes { type IntoIter = std::collections::hash_set::IntoIter; - type Item = (Address, BlockHeight, FractionalVotingPower); + type Item = (Address, BlockHeight, token::Amount); fn into_iter(self) -> Self::IntoIter { let items: HashSet<_> = self .inner .into_iter() - .map(|(address, (block_height, fract_voting_power))| { - (address, block_height, fract_voting_power) + .map(|(address, (block_height, stake))| { + (address, block_height, stake) }) .collect(); items.into_iter() @@ -174,7 +173,7 @@ where .expect("The queried epoch should be known"); let aggregated = voting_power_post .entry(epoch) - .or_insert(FractionalVotingPower::NULL); + .or_insert_with(token::Amount::zero); *aggregated += voting_power; } @@ -213,19 +212,27 @@ mod tests { use namada_core::ledger::storage::testing::TestWlStorage; use namada_core::types::address; use namada_core::types::ethereum_events::EthereumEvent; + use namada_core::types::voting_power::FractionalVotingPower; + use self::helpers::{default_event, default_total_stake, TallyParams}; use super::*; - use crate::protocol::transactions::votes::update::tests::helpers::{ - arbitrary_event, setup_tally, - }; use crate::protocol::transactions::votes::{self, EpochedVotingPower}; + use crate::test_utils; mod helpers { + use namada_proof_of_stake::total_consensus_stake_key_handle; + use super::*; + /// Default amount of staked NAM to be used in tests. + pub(super) fn default_total_stake() -> token::Amount { + // 1000 NAM + token::Amount::native_whole(1_000) + } + /// Returns an arbitrary piece of data that can have votes tallied /// against it. - pub(super) fn arbitrary_event() -> EthereumEvent { + pub(super) fn default_event() -> EthereumEvent { EthereumEvent::TransfersToNamada { nonce: 0.into(), transfers: vec![], @@ -233,22 +240,53 @@ mod tests { } } - /// Writes an initial [`Tally`] to storage, based on the passed `votes`. - pub(super) fn setup_tally( - wl_storage: &mut TestWlStorage, - event: &EthereumEvent, - keys: &vote_tallies::Keys, - votes: HashSet<(Address, BlockHeight, FractionalVotingPower)>, - ) -> Result { - let voting_power: FractionalVotingPower = - votes.iter().cloned().map(|(_, _, v)| v).sum(); - let tally = Tally { - voting_power: get_epoched_voting_power(voting_power.to_owned()), - seen_by: votes.into_iter().map(|(a, h, _)| (a, h)).collect(), - seen: voting_power > FractionalVotingPower::TWO_THIRDS, - }; - votes::storage::write(wl_storage, keys, event, &tally, false)?; - Ok(tally) + /// Parameters to construct a test [`Tally`]. + pub(super) struct TallyParams<'a> { + /// Handle to storage. + pub wl_storage: &'a mut TestWlStorage, + /// The event to be voted on. + pub event: &'a EthereumEvent, + /// Votes from the given validators at the given block height. + /// + /// The voting power of each validator is expressed as a fraction + /// of the provided `total_stake` parameter. + pub votes: HashSet<(Address, BlockHeight, token::Amount)>, + /// The [`token::Amount`] staked at epoch 0. + pub total_stake: token::Amount, + } + + impl TallyParams<'_> { + /// Write an initial [`Tally`] to storage. + pub(super) fn setup(self) -> Result { + let Self { + wl_storage, + event, + votes, + total_stake, + } = self; + let keys = vote_tallies::Keys::from(event); + let seen_voting_power: token::Amount = votes + .iter() + .map(|(_, _, voting_power)| *voting_power) + .sum(); + let tally = Tally { + voting_power: get_epoched_voting_power(seen_voting_power), + seen_by: votes + .into_iter() + .map(|(addr, height, _)| (addr, height)) + .collect(), + seen: seen_voting_power + > FractionalVotingPower::TWO_THIRDS * total_stake, + }; + votes::storage::write(wl_storage, &keys, event, &tally, false)?; + total_consensus_stake_key_handle().set( + wl_storage, + total_stake, + 0u64.into(), + 0, + )?; + Ok(tally) + } } } @@ -267,7 +305,8 @@ mod tests { fn test_vote_info_new_single_voter() -> Result<()> { let validator = address::testing::established_address_1(); let vote_height = BlockHeight(100); - let voting_power = FractionalVotingPower::ONE_THIRD; + let voting_power = + FractionalVotingPower::ONE_THIRD * default_total_stake(); let vote = (validator.clone(), vote_height); let votes = Votes::from([vote.clone()]); let voting_powers = HashMap::from([(vote, voting_power)]); @@ -278,7 +317,7 @@ mod tests { let votes: BTreeSet<_> = vote_info.into_iter().collect(); assert_eq!( votes, - BTreeSet::from([(validator, vote_height, voting_power,)]), + BTreeSet::from([(validator, vote_height, voting_power)]), ); Ok(()) } @@ -301,7 +340,8 @@ mod tests { fn test_vote_info_without_voters() -> Result<()> { let validator = address::testing::established_address_1(); let vote_height = BlockHeight(100); - let voting_power = FractionalVotingPower::ONE_THIRD; + let voting_power = + FractionalVotingPower::ONE_THIRD * default_total_stake(); let vote = (validator.clone(), vote_height); let votes = Votes::from([vote.clone()]); let voting_powers = HashMap::from([(vote, voting_power)]); @@ -319,7 +359,8 @@ mod tests { let validator = address::testing::established_address_1(); let new_validator = address::testing::established_address_2(); let vote_height = BlockHeight(100); - let voting_power = FractionalVotingPower::ONE_THIRD; + let voting_power = + FractionalVotingPower::ONE_THIRD * default_total_stake(); let vote = (validator.clone(), vote_height); let votes = Votes::from([vote.clone()]); let voting_powers = HashMap::from([(vote, voting_power)]); @@ -340,23 +381,23 @@ mod tests { let validator = address::testing::established_address_1(); let already_voted_height = BlockHeight(100); - let event = arbitrary_event(); - let keys = vote_tallies::Keys::from(&event); - let tally_pre = setup_tally( - &mut wl_storage, - &event, - &keys, - HashSet::from([( + let event = default_event(); + let tally_pre = TallyParams { + total_stake: default_total_stake(), + wl_storage: &mut wl_storage, + event: &event, + votes: HashSet::from([( validator.clone(), already_voted_height, - FractionalVotingPower::ONE_THIRD, + FractionalVotingPower::ONE_THIRD * default_total_stake(), )]), - )?; + } + .setup()?; let votes = Votes::from([(validator.clone(), BlockHeight(1000))]); let voting_powers = HashMap::from([( (validator, BlockHeight(1000)), - FractionalVotingPower::ONE_THIRD, + FractionalVotingPower::ONE_THIRD * default_total_stake(), )]); let vote_info = NewVotes::new(votes, &voting_powers)?; @@ -371,22 +412,25 @@ mod tests { #[test] fn test_calculate_already_seen() -> Result<()> { let mut wl_storage = TestWlStorage::default(); - let event = arbitrary_event(); + let event = default_event(); let keys = vote_tallies::Keys::from(&event); - let tally_pre = setup_tally( - &mut wl_storage, - &event, - &keys, - HashSet::from([( + let tally_pre = TallyParams { + total_stake: default_total_stake(), + wl_storage: &mut wl_storage, + event: &event, + votes: HashSet::from([( address::testing::established_address_1(), BlockHeight(10), - FractionalVotingPower::new_u64(3, 4)?, // this is > 2/3 + // this is > 2/3 + FractionalVotingPower::new_u64(3, 4)? * default_total_stake(), )]), - )?; + } + .setup()?; let validator = address::testing::established_address_2(); let vote_height = BlockHeight(100); - let voting_power = FractionalVotingPower::ONE_THIRD; + let voting_power = + FractionalVotingPower::new_u64(1, 4)? * default_total_stake(); let vote = (validator, vote_height); let votes = Votes::from([vote.clone()]); let voting_powers = HashMap::from([(vote, voting_power)]); @@ -403,19 +447,20 @@ mod tests { /// Tests that an unchanged tally is returned if no votes are passed. #[test] fn test_calculate_empty() -> Result<()> { - let mut wl_storage = TestWlStorage::default(); - let event = arbitrary_event(); + let (mut wl_storage, _) = test_utils::setup_default_storage(); + let event = default_event(); let keys = vote_tallies::Keys::from(&event); - let tally_pre = setup_tally( - &mut wl_storage, - &event, - &keys, - HashSet::from([( + let tally_pre = TallyParams { + total_stake: default_total_stake(), + wl_storage: &mut wl_storage, + event: &event, + votes: HashSet::from([( address::testing::established_address_1(), BlockHeight(10), - FractionalVotingPower::ONE_THIRD, + FractionalVotingPower::ONE_THIRD * default_total_stake(), )]), - )?; + } + .setup()?; let vote_info = NewVotes::new(Votes::default(), &HashMap::default())?; let (tally_post, changed_keys) = @@ -430,24 +475,26 @@ mod tests { /// not yet seen. #[test] fn test_calculate_one_vote_not_seen() -> Result<()> { - let mut wl_storage = TestWlStorage::default(); + let (mut wl_storage, _) = test_utils::setup_default_storage(); - let event = arbitrary_event(); + let event = default_event(); let keys = vote_tallies::Keys::from(&event); - let _tally_pre = setup_tally( - &mut wl_storage, - &event, - &keys, - HashSet::from([( + let _tally_pre = TallyParams { + total_stake: default_total_stake(), + wl_storage: &mut wl_storage, + event: &event, + votes: HashSet::from([( address::testing::established_address_1(), BlockHeight(10), - FractionalVotingPower::ONE_THIRD, + FractionalVotingPower::ONE_THIRD * default_total_stake(), )]), - )?; + } + .setup()?; let validator = address::testing::established_address_2(); let vote_height = BlockHeight(100); - let voting_power = FractionalVotingPower::ONE_THIRD; + let voting_power = + FractionalVotingPower::ONE_THIRD * default_total_stake(); let vote = (validator, vote_height); let votes = Votes::from([vote.clone()]); let voting_powers = HashMap::from([(vote.clone(), voting_power)]); @@ -460,7 +507,7 @@ mod tests { tally_post, Tally { voting_power: get_epoched_voting_power( - FractionalVotingPower::TWO_THIRDS, + FractionalVotingPower::TWO_THIRDS * default_total_stake(), ), seen_by: BTreeMap::from([ (address::testing::established_address_1(), 10.into()), @@ -480,27 +527,33 @@ mod tests { /// seen. #[test] fn test_calculate_one_vote_seen() -> Result<()> { - let mut wl_storage = TestWlStorage::default(); + let (mut wl_storage, _) = test_utils::setup_default_storage(); - let event = arbitrary_event(); + let first_vote_stake = + FractionalVotingPower::ONE_THIRD * default_total_stake(); + let second_vote_stake = + FractionalVotingPower::ONE_THIRD * default_total_stake(); + let total_stake = first_vote_stake + second_vote_stake; + + let event = default_event(); let keys = vote_tallies::Keys::from(&event); - let _tally_pre = setup_tally( - &mut wl_storage, - &event, - &keys, - HashSet::from([( + let _tally_pre = TallyParams { + total_stake, + wl_storage: &mut wl_storage, + event: &event, + votes: HashSet::from([( address::testing::established_address_1(), BlockHeight(10), - FractionalVotingPower::ONE_THIRD, + first_vote_stake, )]), - )?; + } + .setup()?; let validator = address::testing::established_address_2(); let vote_height = BlockHeight(100); - let voting_power = FractionalVotingPower::TWO_THIRDS; let vote = (validator, vote_height); let votes = Votes::from([vote.clone()]); - let voting_powers = HashMap::from([(vote.clone(), voting_power)]); + let voting_powers = HashMap::from([(vote.clone(), second_vote_stake)]); let vote_info = NewVotes::new(votes, &voting_powers)?; let (tally_post, changed_keys) = @@ -509,9 +562,7 @@ mod tests { assert_eq!( tally_post, Tally { - voting_power: get_epoched_voting_power( - FractionalVotingPower::WHOLE - ), + voting_power: get_epoched_voting_power(total_stake), seen_by: BTreeMap::from([ (address::testing::established_address_1(), 10.into()), vote, @@ -528,8 +579,10 @@ mod tests { #[test] fn test_keys_changed_all() -> Result<()> { - let voting_power_a = FractionalVotingPower::ONE_THIRD; - let voting_power_b = FractionalVotingPower::TWO_THIRDS; + let voting_power_a = + FractionalVotingPower::ONE_THIRD * default_total_stake(); + let voting_power_b = + FractionalVotingPower::TWO_THIRDS * default_total_stake(); let seen_a = false; let seen_b = true; @@ -543,7 +596,7 @@ mod tests { BlockHeight(20), )]); - let event = arbitrary_event(); + let event = default_event(); let keys = vote_tallies::Keys::from(&event); let pre = Tally { voting_power: get_epoched_voting_power(voting_power_a), @@ -572,11 +625,11 @@ mod tests { BlockHeight(10), )]); - let event = arbitrary_event(); + let event = default_event(); let keys = vote_tallies::Keys::from(&event); let pre = Tally { voting_power: get_epoched_voting_power( - FractionalVotingPower::ONE_THIRD, + FractionalVotingPower::ONE_THIRD * default_total_stake(), ), seen, seen_by, @@ -589,9 +642,7 @@ mod tests { Ok(()) } - fn get_epoched_voting_power( - fraction: FractionalVotingPower, - ) -> EpochedVotingPower { - EpochedVotingPower::from([(0.into(), fraction)]) + fn get_epoched_voting_power(thus_far: token::Amount) -> EpochedVotingPower { + EpochedVotingPower::from([(0.into(), thus_far)]) } } diff --git a/ethereum_bridge/src/test_utils.rs b/ethereum_bridge/src/test_utils.rs index 1347d290214..3b7b80febe9 100644 --- a/ethereum_bridge/src/test_utils.rs +++ b/ethereum_bridge/src/test_utils.rs @@ -73,23 +73,29 @@ pub fn setup_default_storage() (wl_storage, all_keys) } -/// Set up a [`TestWlStorage`] initialized at genesis with a single -/// validator. -/// -/// The validator's address is [`address::testing::established_address_1`]. +/// Set up a [`TestWlStorage`] initialized at genesis with +/// [`default_validator`]. #[inline] pub fn init_default_storage( wl_storage: &mut TestWlStorage, ) -> HashMap { init_storage_with_validators( wl_storage, - HashMap::from_iter([( - address::testing::established_address_1(), - token::Amount::native_whole(100), - )]), + HashMap::from_iter([default_validator()]), ) } +/// Default validator used in tests. +/// +/// The validator's address is [`address::testing::established_address_1`], +/// and its voting power is proportional to the stake of 100 NAM. +#[inline] +pub fn default_validator() -> (Address, token::Amount) { + let addr = address::testing::established_address_1(); + let voting_power = token::Amount::native_whole(100); + (addr, voting_power) +} + /// Writes a dummy [`EthereumBridgeConfig`] to the given [`TestWlStorage`], and /// returns it. pub fn bootstrap_ethereum_bridge( @@ -217,23 +223,7 @@ pub fn init_storage_with_validators( 0.into(), ) .expect("Test failed"); - let config = EthereumBridgeConfig { - erc20_whitelist: vec![], - eth_start_height: Default::default(), - min_confirmations: Default::default(), - contracts: Contracts { - native_erc20: wnam(), - bridge: UpgradeableContract { - address: EthAddress([42; 20]), - version: Default::default(), - }, - governance: UpgradeableContract { - address: EthAddress([18; 20]), - version: Default::default(), - }, - }, - }; - config.init_storage(wl_storage); + bootstrap_ethereum_bridge(wl_storage); for (validator, keys) in all_keys.iter() { let protocol_key = keys.protocol.ref_to(); diff --git a/shared/src/ledger/protocol/mod.rs b/shared/src/ledger/protocol/mod.rs index c6ed0814b17..7b8910e9683 100644 --- a/shared/src/ledger/protocol/mod.rs +++ b/shared/src/ledger/protocol/mod.rs @@ -1128,10 +1128,13 @@ mod tests { fn test_apply_protocol_tx_duplicate_eth_events_vext() -> Result<()> { let validator_a = address::testing::established_address_2(); let validator_b = address::testing::established_address_3(); + let validator_a_stake = Amount::native_whole(100); + let validator_b_stake = Amount::native_whole(100); + let total_stake = validator_a_stake + validator_b_stake; let (mut wl_storage, _) = test_utils::setup_storage_with_validators( HashMap::from_iter(vec![ - (validator_a.clone(), Amount::native_whole(100)), - (validator_b, Amount::native_whole(100)), + (validator_a.clone(), validator_a_stake), + (validator_b, validator_b_stake), ]), ); let event = EthereumEvent::TransfersToNamada { @@ -1166,8 +1169,10 @@ mod tests { // the vote should have only be applied once let voting_power: EpochedVotingPower = wl_storage.read(ð_msg_keys.voting_power())?.unwrap(); - let expected = - EpochedVotingPower::from([(0.into(), FractionalVotingPower::HALF)]); + let expected = EpochedVotingPower::from([( + 0.into(), + FractionalVotingPower::HALF * total_stake, + )]); assert_eq!(voting_power, expected); Ok(()) @@ -1180,10 +1185,13 @@ mod tests { fn test_apply_protocol_tx_duplicate_bp_roots_vext() -> Result<()> { let validator_a = address::testing::established_address_2(); let validator_b = address::testing::established_address_3(); + let validator_a_stake = Amount::native_whole(100); + let validator_b_stake = Amount::native_whole(100); + let total_stake = validator_a_stake + validator_b_stake; let (mut wl_storage, keys) = test_utils::setup_storage_with_validators( HashMap::from_iter(vec![ - (validator_a.clone(), Amount::native_whole(100)), - (validator_b, Amount::native_whole(100)), + (validator_a.clone(), validator_a_stake), + (validator_b, validator_b_stake), ]), ); bridge_pool_vp::init_storage(&mut wl_storage); @@ -1222,8 +1230,10 @@ mod tests { // the vote should have only be applied once let voting_power: EpochedVotingPower = wl_storage.read(&bp_root_keys.voting_power())?.unwrap(); - let expected = - EpochedVotingPower::from([(0.into(), FractionalVotingPower::HALF)]); + let expected = EpochedVotingPower::from([( + 0.into(), + FractionalVotingPower::HALF * total_stake, + )]); assert_eq!(voting_power, expected); Ok(()) diff --git a/shared/src/ledger/queries/shell/eth_bridge.rs b/shared/src/ledger/queries/shell/eth_bridge.rs index 2588ef33bd5..237a9bf7950 100644 --- a/shared/src/ledger/queries/shell/eth_bridge.rs +++ b/shared/src/ledger/queries/shell/eth_bridge.rs @@ -504,7 +504,7 @@ where "Iterating over storage should not yield keys without \ values.", ) - .average_voting_power(ctx.wl_storage); + .fractional_stake(ctx.wl_storage); for transfer in transfers { let key = get_key_from_hash(&transfer.keccak256()); let transfer = ctx @@ -1275,6 +1275,7 @@ mod test_ethbridge_router { }, }; // write validator to storage + let (_, dummy_validator_stake) = test_utils::default_validator(); test_utils::init_default_storage(&mut client.wl_storage); // write a transfer into the bridge pool @@ -1307,9 +1308,12 @@ mod test_ethbridge_router { .wl_storage .write_bytes( ð_msg_key.voting_power(), - EpochedVotingPower::from([(0.into(), voting_power)]) - .try_to_vec() - .expect("Test failed"), + EpochedVotingPower::from([( + 0.into(), + voting_power * dummy_validator_stake, + )]) + .try_to_vec() + .expect("Test failed"), ) .expect("Test failed"); client From dcf1dec9b170ef5f7f98c2fa5055e4c1b0b8f169 Mon Sep 17 00:00:00 2001 From: mariari Date: Thu, 7 Sep 2023 01:50:03 +0800 Subject: [PATCH 042/114] Move singing.rs over to the SDK folder --- apps/src/lib/cli/client.rs | 3 +-- apps/src/lib/client/tx.rs | 4 ++-- shared/src/ledger/mod.rs | 1 - shared/src/sdk/mod.rs | 1 + shared/src/{ledger => sdk}/signing.rs | 5 +++-- shared/src/sdk/tx.rs | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) rename shared/src/{ledger => sdk}/signing.rs (99%) diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 98c5ce513f2..d4e1046d132 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -1,8 +1,7 @@ use color_eyre::eyre::{eyre, Report, Result}; use namada::ledger::eth_bridge::bridge_pool; -use namada::ledger::signing; -use namada::sdk::tx as sdk_tx; use namada::sdk::tx::dump_tx; +use namada::sdk::{signing, tx as sdk_tx}; use namada::types::control_flow::ProceedOrElse; use crate::cli; diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 879d1a100f8..6f20bfa28db 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -14,11 +14,11 @@ use namada::core::ledger::governance::cli::onchain::{ DefaultProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, }; use namada::ledger::wallet::{Wallet, WalletUtils}; -use namada::ledger::{masp, pos, signing}; +use namada::ledger::{masp, pos}; use namada::proof_of_stake::parameters::PosParams; use namada::proto::Tx; use namada::sdk::rpc::{TxBroadcastData, TxResponse}; -use namada::sdk::tx; +use namada::sdk::{signing, tx}; use namada::tendermint_rpc::HttpClient; use namada::types::address::{Address, ImplicitAddress}; use namada::types::dec::Dec; diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index 21a393962da..11d85a71317 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -13,7 +13,6 @@ pub mod pos; #[cfg(all(feature = "wasm-runtime", feature = "ferveo-tpke"))] pub mod protocol; pub mod queries; -pub mod signing; pub mod storage; pub mod vp_host_fns; pub mod wallet; diff --git a/shared/src/sdk/mod.rs b/shared/src/sdk/mod.rs index fc82a49fc6b..cfc834fe1a9 100644 --- a/shared/src/sdk/mod.rs +++ b/shared/src/sdk/mod.rs @@ -1,5 +1,6 @@ //! Namada's SDK API pub mod rpc; +pub mod signing; #[allow(clippy::result_large_err)] pub mod tx; diff --git a/shared/src/ledger/signing.rs b/shared/src/sdk/signing.rs similarity index 99% rename from shared/src/ledger/signing.rs rename to shared/src/sdk/signing.rs index 72b1c9ee12d..1f84f8ebe03 100644 --- a/shared/src/ledger/signing.rs +++ b/shared/src/sdk/signing.rs @@ -24,11 +24,12 @@ use serde::{Deserialize, Serialize}; use sha2::Digest; use zeroize::Zeroizing; -use super::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc_proto::google::protobuf::Any; use crate::ledger::args; -use crate::ledger::masp::make_asset_type; +use crate::ledger::masp::{ + make_asset_type, ShieldedContext, ShieldedTransfer, ShieldedUtils, +}; use crate::ledger::parameters::storage as parameter_storage; pub use crate::ledger::wallet::store::AddressVpType; use crate::ledger::wallet::{Wallet, WalletUtils}; diff --git a/shared/src/sdk/tx.rs b/shared/src/sdk/tx.rs index ce65339a743..5f58f7892e0 100644 --- a/shared/src/sdk/tx.rs +++ b/shared/src/sdk/tx.rs @@ -45,13 +45,13 @@ use crate::ledger::args::{self, InputAmount}; use crate::ledger::ibc::storage::ibc_denom_key; use crate::ledger::masp::TransferErr::Build; use crate::ledger::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; -use crate::ledger::signing::{self, TxSourcePostBalance}; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Tx}; use crate::sdk::rpc::{ self, format_denominated_amount, query_wasm_code_hash, validate_amount, TxBroadcastData, TxResponse, }; +use crate::sdk::signing::{self, TxSourcePostBalance}; use crate::tendermint_rpc::endpoint::broadcast::tx_sync::Response; use crate::tendermint_rpc::error::Error as RpcError; use crate::types::control_flow::{time, ProceedOrElse}; From 96918e6432e3ee1fc7bc92e2c85c6a22b4c186c3 Mon Sep 17 00:00:00 2001 From: mariari Date: Thu, 7 Sep 2023 02:01:24 +0800 Subject: [PATCH 043/114] Move masp.rs over to the SDK crate --- apps/src/lib/cli/context.rs | 2 +- apps/src/lib/cli/wallet.rs | 2 +- apps/src/lib/client/rpc.rs | 6 +++--- apps/src/lib/client/tx.rs | 4 ++-- apps/src/lib/wallet/cli_utils.rs | 2 +- benches/lib.rs | 8 ++++---- shared/src/ledger/eth_bridge/bridge_pool.rs | 2 +- shared/src/ledger/mod.rs | 1 - shared/src/{ledger => sdk}/masp.rs | 0 shared/src/sdk/mod.rs | 1 + shared/src/sdk/signing.rs | 6 +++--- shared/src/sdk/tx.rs | 4 ++-- shared/src/vm/host_env.rs | 2 +- 13 files changed, 20 insertions(+), 20 deletions(-) rename shared/src/{ledger => sdk}/masp.rs (100%) diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 14a75ca4605..590fdae744c 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -6,8 +6,8 @@ use std::path::{Path, PathBuf}; use std::str::FromStr; use color_eyre::eyre::Result; -use namada::ledger::masp::ShieldedContext; use namada::ledger::wallet::Wallet; +use namada::sdk::masp::ShieldedContext; use namada::types::address::{Address, InternalAddress}; use namada::types::chain::ChainId; use namada::types::ethereum_events::EthAddress; diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index 7505c59efe3..64cf120cc87 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -7,8 +7,8 @@ use borsh::BorshSerialize; use color_eyre::eyre::Result; use itertools::sorted; use masp_primitives::zip32::ExtendedFullViewingKey; -use namada::ledger::masp::find_valid_diversifier; use namada::ledger::wallet::{DecryptionError, FindKeyError}; +use namada::sdk::masp::find_valid_diversifier; use namada::types::key::*; use namada::types::masp::{MaspValue, PaymentAddress}; use rand_core::OsRng; diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index f39c844f482..7ad413d584b 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -29,15 +29,15 @@ use namada::core::ledger::governance::utils::{ use namada::core::ledger::pgf::parameters::PgfParameters; use namada::core::ledger::pgf::storage::steward::StewardDetail; use namada::ledger::events::Event; -use namada::ledger::masp::{ - Conversions, MaspAmount, MaspChange, ShieldedContext, ShieldedUtils, -}; use namada::ledger::parameters::{storage as param_storage, EpochDuration}; use namada::ledger::pos::{CommissionPair, PosParams, Slash}; use namada::ledger::queries::RPC; use namada::ledger::storage::ConversionState; use namada::ledger::wallet::{AddressVpType, Wallet}; use namada::proof_of_stake::types::{ValidatorState, WeightedValidator}; +use namada::sdk::masp::{ + Conversions, MaspAmount, MaspChange, ShieldedContext, ShieldedUtils, +}; use namada::sdk::rpc::{ self, enriched_bonds_and_unbonds, format_denominated_amount, query_epoch, TxResponse, diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 6f20bfa28db..c93e27106b4 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -13,12 +13,12 @@ use namada::core::ledger::governance::cli::offline::{ use namada::core::ledger::governance::cli::onchain::{ DefaultProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, }; +use namada::ledger::pos; use namada::ledger::wallet::{Wallet, WalletUtils}; -use namada::ledger::{masp, pos}; use namada::proof_of_stake::parameters::PosParams; use namada::proto::Tx; use namada::sdk::rpc::{TxBroadcastData, TxResponse}; -use namada::sdk::{signing, tx}; +use namada::sdk::{masp, signing, tx}; use namada::tendermint_rpc::HttpClient; use namada::types::address::{Address, ImplicitAddress}; use namada::types::dec::Dec; diff --git a/apps/src/lib/wallet/cli_utils.rs b/apps/src/lib/wallet/cli_utils.rs index ffaf0808413..405b3a99fa3 100644 --- a/apps/src/lib/wallet/cli_utils.rs +++ b/apps/src/lib/wallet/cli_utils.rs @@ -4,8 +4,8 @@ use std::io::{self, Write}; use borsh::BorshSerialize; use itertools::sorted; use masp_primitives::zip32::ExtendedFullViewingKey; -use namada::ledger::masp::find_valid_diversifier; use namada::ledger::wallet::{DecryptionError, FindKeyError}; +use namada::sdk::masp::find_valid_diversifier; use namada::types::key::{PublicKeyHash, RefTo}; use namada::types::masp::{MaspValue, PaymentAddress}; use rand_core::OsRng; diff --git a/benches/lib.rs b/benches/lib.rs index 11042c84b3a..951320abf1b 100644 --- a/benches/lib.rs +++ b/benches/lib.rs @@ -65,15 +65,15 @@ use namada::ibc_proto::protobuf::Protobuf; use namada::ledger::args::InputAmount; use namada::ledger::gas::TxGasMeter; use namada::ledger::ibc::storage::{channel_key, connection_key}; -use namada::ledger::masp::{ - self, ShieldedContext, ShieldedTransfer, ShieldedUtils, -}; use namada::ledger::queries::{ Client, EncodedResponseQuery, RequestCtx, RequestQuery, Router, RPC, }; use namada::ledger::wallet::Wallet; use namada::proof_of_stake; use namada::proto::{Code, Data, Section, Signature, Tx}; +use namada::sdk::masp::{ + self, ShieldedContext, ShieldedTransfer, ShieldedUtils, +}; use namada::tendermint::Hash; use namada::tendermint_rpc::{self}; use namada::types::address::InternalAddress; @@ -700,7 +700,7 @@ impl Default for BenchShieldedCtx { .fvk .vk; let (div, _g_d) = - namada::ledger::masp::find_valid_diversifier(&mut OsRng); + namada::sdk::masp::find_valid_diversifier(&mut OsRng); let payment_addr = viewing_key.to_payment_address(div).unwrap(); let _ = ctx .wallet diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index e8f7ce449fb..88289fba148 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -19,12 +19,12 @@ use super::{block_on_eth_sync, eth_sync_or_exit, BlockOnEthSync}; use crate::eth_bridge::ethers::abi::AbiDecode; use crate::eth_bridge::structs::RelayProof; use crate::ledger::args; -use crate::ledger::masp::{ShieldedContext, ShieldedUtils}; use crate::ledger::queries::{ Client, GenBridgePoolProofReq, GenBridgePoolProofRsp, RPC, }; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::Tx; +use crate::sdk::masp::{ShieldedContext, ShieldedUtils}; use crate::sdk::rpc::{query_wasm_code_hash, validate_amount}; use crate::sdk::tx::prepare_tx; use crate::types::address::Address; diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index 11d85a71317..38b7b41e503 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -6,7 +6,6 @@ pub mod events; pub mod governance; pub mod ibc; pub mod inflation; -pub mod masp; pub mod native_vp; pub mod pgf; pub mod pos; diff --git a/shared/src/ledger/masp.rs b/shared/src/sdk/masp.rs similarity index 100% rename from shared/src/ledger/masp.rs rename to shared/src/sdk/masp.rs diff --git a/shared/src/sdk/mod.rs b/shared/src/sdk/mod.rs index cfc834fe1a9..29c4f59b9f7 100644 --- a/shared/src/sdk/mod.rs +++ b/shared/src/sdk/mod.rs @@ -1,6 +1,7 @@ //! Namada's SDK API pub mod rpc; +pub mod masp; pub mod signing; #[allow(clippy::result_large_err)] pub mod tx; diff --git a/shared/src/sdk/signing.rs b/shared/src/sdk/signing.rs index 1f84f8ebe03..eea51f61d39 100644 --- a/shared/src/sdk/signing.rs +++ b/shared/src/sdk/signing.rs @@ -27,13 +27,13 @@ use zeroize::Zeroizing; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc_proto::google::protobuf::Any; use crate::ledger::args; -use crate::ledger::masp::{ - make_asset_type, ShieldedContext, ShieldedTransfer, ShieldedUtils, -}; use crate::ledger::parameters::storage as parameter_storage; pub use crate::ledger::wallet::store::AddressVpType; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Section, Tx}; +use crate::sdk::masp::{ + make_asset_type, ShieldedContext, ShieldedTransfer, ShieldedUtils, +}; use crate::sdk::rpc; use crate::sdk::rpc::{ format_denominated_amount, query_wasm_code_hash, validate_amount, diff --git a/shared/src/sdk/tx.rs b/shared/src/sdk/tx.rs index 5f58f7892e0..c72a3045988 100644 --- a/shared/src/sdk/tx.rs +++ b/shared/src/sdk/tx.rs @@ -43,10 +43,10 @@ use crate::ibc::core::Msg; use crate::ibc::Height as IbcHeight; use crate::ledger::args::{self, InputAmount}; use crate::ledger::ibc::storage::ibc_denom_key; -use crate::ledger::masp::TransferErr::Build; -use crate::ledger::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Tx}; +use crate::sdk::masp::TransferErr::Build; +use crate::sdk::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; use crate::sdk::rpc::{ self, format_denominated_amount, query_wasm_code_hash, validate_amount, TxBroadcastData, TxResponse, diff --git a/shared/src/vm/host_env.rs b/shared/src/vm/host_env.rs index 179472a8906..b0d526fea61 100644 --- a/shared/src/vm/host_env.rs +++ b/shared/src/vm/host_env.rs @@ -1881,7 +1881,7 @@ where // 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(crate::ledger::masp::verify_shielded_tx(&shielded)) + HostEnvResult::from(crate::sdk::masp::verify_shielded_tx(&shielded)) .to_i64(), ) } From 78fb259607868cb8e2dc9c4b5e08d64cc7509951 Mon Sep 17 00:00:00 2001 From: mariari Date: Thu, 7 Sep 2023 02:57:48 +0800 Subject: [PATCH 044/114] Move args.rs into the sdk folder --- apps/src/lib/cli.rs | 2 +- benches/lib.rs | 2 +- shared/src/ledger/eth_bridge/bridge_pool.rs | 2 +- shared/src/ledger/eth_bridge/validator_set.rs | 2 +- shared/src/ledger/mod.rs | 1 - shared/src/{ledger => sdk}/args.rs | 0 shared/src/sdk/masp.rs | 5 ++--- shared/src/sdk/mod.rs | 1 + shared/src/sdk/rpc.rs | 2 +- shared/src/sdk/signing.rs | 3 +-- shared/src/sdk/tx.rs | 6 +++--- 11 files changed, 12 insertions(+), 14 deletions(-) rename shared/src/{ledger => sdk}/args.rs (100%) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 7ef136bc98c..b7e848d02fb 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2460,7 +2460,7 @@ pub mod args { use std::str::FromStr; use namada::ibc::core::ics24_host::identifier::{ChannelId, PortId}; - pub use namada::ledger::args::*; + pub use namada::sdk::args::*; use namada::types::address::Address; use namada::types::chain::{ChainId, ChainIdPrefix}; use namada::types::dec::Dec; diff --git a/benches/lib.rs b/benches/lib.rs index 951320abf1b..b9cf907804e 100644 --- a/benches/lib.rs +++ b/benches/lib.rs @@ -62,7 +62,6 @@ use namada::ibc::core::Msg; use namada::ibc::Height as IbcHeight; use namada::ibc_proto::google::protobuf::Any; use namada::ibc_proto::protobuf::Protobuf; -use namada::ledger::args::InputAmount; use namada::ledger::gas::TxGasMeter; use namada::ledger::ibc::storage::{channel_key, connection_key}; use namada::ledger::queries::{ @@ -71,6 +70,7 @@ use namada::ledger::queries::{ use namada::ledger::wallet::Wallet; use namada::proof_of_stake; use namada::proto::{Code, Data, Section, Signature, Tx}; +use namada::sdk::args::InputAmount; use namada::sdk::masp::{ self, ShieldedContext, ShieldedTransfer, ShieldedUtils, }; diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index 88289fba148..78a7b1c1bc8 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -18,12 +18,12 @@ use serde::{Deserialize, Serialize}; use super::{block_on_eth_sync, eth_sync_or_exit, BlockOnEthSync}; use crate::eth_bridge::ethers::abi::AbiDecode; use crate::eth_bridge::structs::RelayProof; -use crate::ledger::args; use crate::ledger::queries::{ Client, GenBridgePoolProofReq, GenBridgePoolProofRsp, RPC, }; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::Tx; +use crate::sdk::args; use crate::sdk::masp::{ShieldedContext, ShieldedUtils}; use crate::sdk::rpc::{query_wasm_code_hash, validate_amount}; use crate::sdk::tx::prepare_tx; diff --git a/shared/src/ledger/eth_bridge/validator_set.rs b/shared/src/ledger/eth_bridge/validator_set.rs index 7ff30ef07c6..66a21ab32fe 100644 --- a/shared/src/ledger/eth_bridge/validator_set.rs +++ b/shared/src/ledger/eth_bridge/validator_set.rs @@ -18,8 +18,8 @@ use super::{block_on_eth_sync, eth_sync_or, eth_sync_or_exit, BlockOnEthSync}; use crate::eth_bridge::ethers::abi::{AbiDecode, AbiType, Tokenizable}; use crate::eth_bridge::ethers::core::types::TransactionReceipt; use crate::eth_bridge::structs::{Signature, ValidatorSetArgs}; -use crate::ledger::args; use crate::ledger::queries::{Client, RPC}; +use crate::sdk::args; use crate::types::control_flow::time::{self, Duration, Instant}; use crate::types::control_flow::{ self, install_shutdown_signal, Halt, TryHalt, diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index 38b7b41e503..e62fd648872 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -1,6 +1,5 @@ //! The ledger modules -pub mod args; pub mod eth_bridge; pub mod events; pub mod governance; diff --git a/shared/src/ledger/args.rs b/shared/src/sdk/args.rs similarity index 100% rename from shared/src/ledger/args.rs rename to shared/src/sdk/args.rs diff --git a/shared/src/sdk/masp.rs b/shared/src/sdk/masp.rs index 37a464dc949..29611f9b940 100644 --- a/shared/src/sdk/masp.rs +++ b/shared/src/sdk/masp.rs @@ -59,13 +59,12 @@ use ripemd::Digest as RipemdDigest; use sha2::Digest; use thiserror::Error; -use crate::ledger::args; -use crate::ledger::args::InputAmount; use crate::ledger::queries::Client; use crate::proto::Tx; -use crate::sdk::rpc; +use crate::sdk::args::InputAmount; use crate::sdk::rpc::{query_conversion, query_storage_value}; use crate::sdk::tx::decode_component; +use crate::sdk::{args, rpc}; use crate::tendermint_rpc::query::Query; use crate::tendermint_rpc::Order; use crate::types::address::{masp, Address}; diff --git a/shared/src/sdk/mod.rs b/shared/src/sdk/mod.rs index 29c4f59b9f7..b87e8be3eba 100644 --- a/shared/src/sdk/mod.rs +++ b/shared/src/sdk/mod.rs @@ -1,6 +1,7 @@ //! Namada's SDK API pub mod rpc; +pub mod args; pub mod masp; pub mod signing; #[allow(clippy::result_large_err)] diff --git a/shared/src/sdk/rpc.rs b/shared/src/sdk/rpc.rs index ddef3ecb209..464e963a6fb 100644 --- a/shared/src/sdk/rpc.rs +++ b/shared/src/sdk/rpc.rs @@ -26,11 +26,11 @@ use namada_proof_of_stake::types::{ }; use serde::Serialize; -use crate::ledger::args::InputAmount; use crate::ledger::events::Event; use crate::ledger::queries::vp::pos::EnrichedBondsAndUnbondsDetails; use crate::ledger::queries::RPC; use crate::proto::Tx; +use crate::sdk::args::InputAmount; use crate::tendermint::block::Height; use crate::tendermint::merkle::proof::Proof; use crate::tendermint_rpc::error::Error as TError; diff --git a/shared/src/sdk/signing.rs b/shared/src/sdk/signing.rs index eea51f61d39..3daf32fb801 100644 --- a/shared/src/sdk/signing.rs +++ b/shared/src/sdk/signing.rs @@ -26,7 +26,6 @@ use zeroize::Zeroizing; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc_proto::google::protobuf::Any; -use crate::ledger::args; use crate::ledger::parameters::storage as parameter_storage; pub use crate::ledger::wallet::store::AddressVpType; use crate::ledger::wallet::{Wallet, WalletUtils}; @@ -34,7 +33,6 @@ use crate::proto::{MaspBuilder, Section, Tx}; use crate::sdk::masp::{ make_asset_type, ShieldedContext, ShieldedTransfer, ShieldedUtils, }; -use crate::sdk::rpc; use crate::sdk::rpc::{ format_denominated_amount, query_wasm_code_hash, validate_amount, }; @@ -44,6 +42,7 @@ use crate::sdk::tx::{ TX_UNBOND_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, VP_USER_WASM, }; +use crate::sdk::{args, rpc}; use crate::types::error::{EncodingError, Error, TxError}; use crate::types::key::*; use crate::types::masp::{ExtendedViewingKey, PaymentAddress}; diff --git a/shared/src/sdk/tx.rs b/shared/src/sdk/tx.rs index c72a3045988..0c7157dffc9 100644 --- a/shared/src/sdk/tx.rs +++ b/shared/src/sdk/tx.rs @@ -41,10 +41,10 @@ use crate::ibc::core::ics04_channel::timeout::TimeoutHeight; use crate::ibc::core::timestamp::Timestamp as IbcTimestamp; use crate::ibc::core::Msg; use crate::ibc::Height as IbcHeight; -use crate::ledger::args::{self, InputAmount}; use crate::ledger::ibc::storage::ibc_denom_key; use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Tx}; +use crate::sdk::args::{self, InputAmount}; use crate::sdk::masp::TransferErr::Build; use crate::sdk::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; use crate::sdk::rpc::{ @@ -1419,7 +1419,7 @@ pub async fn build( client: &C, wallet: &mut Wallet, shielded: &mut ShieldedContext, - tx_args: &crate::ledger::args::Tx, + tx_args: &crate::sdk::args::Tx, path: PathBuf, data: D, on_tx: F, @@ -1453,7 +1453,7 @@ async fn build_pow_flag( client: &C, wallet: &mut Wallet, shielded: &mut ShieldedContext, - tx_args: &crate::ledger::args::Tx, + tx_args: &crate::sdk::args::Tx, path: PathBuf, mut data: D, on_tx: F, From 302dbd4e313347842ebee7400d907a8fb85dfc3b Mon Sep 17 00:00:00 2001 From: mariari Date: Thu, 7 Sep 2023 03:44:58 +0800 Subject: [PATCH 045/114] Move the Client code into the queries module This type is used extensively in the SDK, and thus it should be considered under the SDK banner --- apps/src/lib/cli/api.rs | 2 +- .../src/lib/node/ledger/shell/testing/node.rs | 3 +- shared/src/ledger/eth_bridge/validator_set.rs | 3 +- shared/src/ledger/queries/mod.rs | 4 +- shared/src/ledger/queries/types.rs | 271 +---------------- shared/src/ledger/queries/vp/mod.rs | 4 +- shared/src/ledger/queries/vp/pos.rs | 3 +- shared/src/ledger/queries/vp/token.rs | 3 +- shared/src/sdk/masp.rs | 2 +- shared/src/sdk/mod.rs | 2 + shared/src/sdk/queries.rs | 275 ++++++++++++++++++ shared/src/sdk/signing.rs | 23 +- shared/src/sdk/tx.rs | 72 ++--- 13 files changed, 339 insertions(+), 328 deletions(-) create mode 100644 shared/src/sdk/queries.rs diff --git a/apps/src/lib/cli/api.rs b/apps/src/lib/cli/api.rs index 138a159b2ee..a8f0a112430 100644 --- a/apps/src/lib/cli/api.rs +++ b/apps/src/lib/cli/api.rs @@ -1,6 +1,6 @@ use std::marker::PhantomData; -use namada::ledger::queries::Client; +use namada::sdk::queries::Client; use namada::sdk::rpc::wait_until_node_is_synched; use namada::tendermint_rpc::HttpClient; use namada::types::control_flow::Halt; diff --git a/apps/src/lib/node/ledger/shell/testing/node.rs b/apps/src/lib/node/ledger/shell/testing/node.rs index cebb970f623..1ffc767691e 100644 --- a/apps/src/lib/node/ledger/shell/testing/node.rs +++ b/apps/src/lib/node/ledger/shell/testing/node.rs @@ -8,7 +8,7 @@ use data_encoding::HEXUPPER; use lazy_static::lazy_static; use namada::ledger::events::log::dumb_queries; use namada::ledger::queries::{ - Client, EncodedResponseQuery, RequestCtx, RequestQuery, Router, RPC, + EncodedResponseQuery, RequestCtx, RequestQuery, Router, RPC, }; use namada::ledger::storage::{ LastBlock, Sha256Hasher, EPOCH_SWITCH_BLOCKS_DELAY, @@ -19,6 +19,7 @@ use namada::proof_of_stake::{ read_consensus_validator_set_addresses_with_stake, validator_consensus_key_handle, }; +use namada::sdk::queries::Client; use namada::tendermint_proto::abci::VoteInfo; use namada::tendermint_rpc::endpoint::abci_info; use namada::tendermint_rpc::SimpleRequest; diff --git a/shared/src/ledger/eth_bridge/validator_set.rs b/shared/src/ledger/eth_bridge/validator_set.rs index 66a21ab32fe..8d40aaa3c95 100644 --- a/shared/src/ledger/eth_bridge/validator_set.rs +++ b/shared/src/ledger/eth_bridge/validator_set.rs @@ -18,8 +18,9 @@ use super::{block_on_eth_sync, eth_sync_or, eth_sync_or_exit, BlockOnEthSync}; use crate::eth_bridge::ethers::abi::{AbiDecode, AbiType, Tokenizable}; use crate::eth_bridge::ethers::core::types::TransactionReceipt; use crate::eth_bridge::structs::{Signature, ValidatorSetArgs}; -use crate::ledger::queries::{Client, RPC}; +use crate::ledger::queries::RPC; use crate::sdk::args; +use crate::sdk::queries::Client; use crate::types::control_flow::time::{self, Duration, Instant}; use crate::types::control_flow::{ self, install_shutdown_signal, Halt, TryHalt, diff --git a/shared/src/ledger/queries/mod.rs b/shared/src/ledger/queries/mod.rs index aa87ce29036..0d0764490b6 100644 --- a/shared/src/ledger/queries/mod.rs +++ b/shared/src/ledger/queries/mod.rs @@ -4,8 +4,6 @@ // Re-export to show in rustdoc! pub use shell::Shell; use shell::SHELL; -#[cfg(any(test, feature = "async-client"))] -pub use types::Client; pub use types::{ EncodedResponseQuery, Error, RequestCtx, RequestQuery, ResponseQuery, Router, @@ -18,6 +16,8 @@ pub use self::shell::eth_bridge::{ use super::storage::traits::StorageHasher; use super::storage::{DBIter, DB}; use super::storage_api; +#[cfg(any(test, feature = "async-client"))] +pub use crate::sdk::queries::Client; use crate::types::storage::BlockHeight; #[macro_use] diff --git a/shared/src/ledger/queries/types.rs b/shared/src/ledger/queries/types.rs index 78f136cad27..235bf76e992 100644 --- a/shared/src/ledger/queries/types.rs +++ b/shared/src/ledger/queries/types.rs @@ -1,4 +1,4 @@ -use std::fmt::{Debug, Display}; +use std::fmt::Debug; use namada_core::ledger::storage::WlStorage; use thiserror::Error; @@ -6,15 +6,7 @@ use thiserror::Error; use crate::ledger::events::log::EventLog; use crate::ledger::storage::{DBIter, StorageHasher, DB}; use crate::ledger::storage_api; -use crate::tendermint::block::Height; use crate::tendermint::merkle::proof::Proof; -use crate::tendermint_rpc::endpoint::{ - abci_info, block, block_results, blockchain, commit, consensus_params, - consensus_state, health, net_info, status, -}; -use crate::tendermint_rpc::error::Error as RpcError; -use crate::tendermint_rpc::query::Query; -use crate::tendermint_rpc::Order; use crate::types::storage::BlockHeight; #[cfg(feature = "wasm-runtime")] use crate::vm::wasm::{TxCache, VpCache}; @@ -78,221 +70,6 @@ pub trait Router { H: 'static + StorageHasher + Sync; } -/// A client with async request dispatcher method, which can be used to invoke -/// type-safe methods from a root [`Router`], generated via `router!` macro. -#[cfg(any(test, feature = "async-client"))] -#[async_trait::async_trait(?Send)] -pub trait Client { - /// `std::io::Error` can happen in decoding with - /// `BorshDeserialize::try_from_slice` - type Error: From + Display + Debug; - - /// Send a simple query request at the given path. For more options, use the - /// `request` method. - async fn simple_request( - &self, - path: String, - ) -> Result, Self::Error> { - self.request(path, None, None, false) - .await - .map(|response| response.data) - } - - /// Send a query request at the given path. - async fn request( - &self, - path: String, - data: Option>, - height: Option, - prove: bool, - ) -> Result; - - /// `/abci_info`: get information about the ABCI application. - async fn abci_info(&self) -> Result { - Ok(self.perform(abci_info::Request).await?.response) - } - - /// `/broadcast_tx_sync`: broadcast a transaction, returning the response - /// from `CheckTx`. - async fn broadcast_tx_sync( - &self, - tx: crate::tendermint::abci::Transaction, - ) -> Result - { - self.perform( - tendermint_rpc::endpoint::broadcast::tx_sync::Request::new(tx), - ) - .await - } - - /// `/block`: get the latest block. - async fn latest_block(&self) -> Result { - self.perform(block::Request::default()).await - } - - /// `/block`: get block at a given height. - async fn block(&self, height: H) -> Result - where - H: Into + Send, - { - self.perform(block::Request::new(height.into())).await - } - - /// `/block_search`: search for blocks by BeginBlock and EndBlock events. - async fn block_search( - &self, - query: Query, - page: u32, - per_page: u8, - order: Order, - ) -> Result - { - self.perform(tendermint_rpc::endpoint::block_search::Request::new( - query, page, per_page, order, - )) - .await - } - - /// `/block_results`: get ABCI results for a block at a particular height. - async fn block_results( - &self, - height: H, - ) -> Result - where - H: Into + Send, - { - self.perform(tendermint_rpc::endpoint::block_results::Request::new( - height.into(), - )) - .await - } - - /// `/tx_search`: search for transactions with their results. - async fn tx_search( - &self, - query: Query, - prove: bool, - page: u32, - per_page: u8, - order: Order, - ) -> Result { - self.perform(tendermint_rpc::endpoint::tx_search::Request::new( - query, prove, page, per_page, order, - )) - .await - } - - /// `/abci_query`: query the ABCI application - async fn abci_query( - &self, - path: Option, - data: V, - height: Option, - prove: bool, - ) -> Result - where - V: Into> + Send, - { - Ok(self - .perform(tendermint_rpc::endpoint::abci_query::Request::new( - path, data, height, prove, - )) - .await? - .response) - } - - /// `/block_results`: get ABCI results for the latest block. - async fn latest_block_results( - &self, - ) -> Result { - self.perform(block_results::Request::default()).await - } - - /// `/blockchain`: get block headers for `min` <= `height` <= `max`. - /// - /// Block headers are returned in descending order (highest first). - /// - /// Returns at most 20 items. - async fn blockchain( - &self, - min: H, - max: H, - ) -> Result - where - H: Into + Send, - { - // TODO(tarcieri): return errors for invalid params before making - // request? - self.perform(blockchain::Request::new(min.into(), max.into())) - .await - } - - /// `/commit`: get block commit at a given height. - async fn commit(&self, height: H) -> Result - where - H: Into + Send, - { - self.perform(commit::Request::new(height.into())).await - } - - /// `/consensus_params`: get current consensus parameters at the specified - /// height. - async fn consensus_params( - &self, - height: H, - ) -> Result - where - H: Into + Send, - { - self.perform(consensus_params::Request::new(Some(height.into()))) - .await - } - - /// `/consensus_state`: get current consensus state - async fn consensus_state( - &self, - ) -> Result { - self.perform(consensus_state::Request::new()).await - } - - /// `/consensus_params`: get the latest consensus parameters. - async fn latest_consensus_params( - &self, - ) -> Result { - self.perform(consensus_params::Request::new(None)).await - } - - /// `/commit`: get the latest block commit - async fn latest_commit(&self) -> Result { - self.perform(commit::Request::default()).await - } - - /// `/health`: get node health. - /// - /// Returns empty result (200 OK) on success, no response in case of an - /// error. - async fn health(&self) -> Result<(), RpcError> { - self.perform(health::Request).await?; - Ok(()) - } - - /// `/net_info`: obtain information about P2P and other network connections. - async fn net_info(&self) -> Result { - self.perform(net_info::Request).await - } - - /// `/status`: get Tendermint status including node info, pubkey, latest - /// block hash, app hash, block height and time. - async fn status(&self) -> Result { - self.perform(status::Request).await - } - - /// Perform a request against the RPC endpoint - async fn perform(&self, request: R) -> Result - where - R: tendermint_rpc::SimpleRequest; -} - #[allow(missing_docs)] #[derive(Error, Debug)] pub enum Error { @@ -306,52 +83,6 @@ pub enum Error { InvalidHeight(BlockHeight), } -#[async_trait::async_trait(?Send)] -impl Client for C { - type Error = Error; - - async fn request( - &self, - path: String, - data: Option>, - height: Option, - prove: bool, - ) -> Result { - let data = data.unwrap_or_default(); - let height = height - .map(|height| { - crate::tendermint::block::Height::try_from(height.0) - .map_err(|_err| Error::InvalidHeight(height)) - }) - .transpose()?; - let response = self - .abci_query( - // TODO open the private Path constructor in tendermint-rpc - Some(std::str::FromStr::from_str(&path).unwrap()), - data, - height, - prove, - ) - .await?; - use crate::tendermint::abci::Code; - match response.code { - Code::Ok => Ok(EncodedResponseQuery { - data: response.value, - info: response.info, - proof: response.proof, - }), - Code::Err(code) => Err(Error::Query(response.info, code)), - } - } - - async fn perform(&self, request: R) -> Result - where - R: tendermint_rpc::SimpleRequest, - { - tendermint_rpc::Client::perform(self, request).await - } -} - /// Temporary domain-type for `tendermint_proto::abci::RequestQuery`, copied /// from /// until we are on a branch that has it included. diff --git a/shared/src/ledger/queries/vp/mod.rs b/shared/src/ledger/queries/vp/mod.rs index c53386b2f8f..cf05e09c170 100644 --- a/shared/src/ledger/queries/vp/mod.rs +++ b/shared/src/ledger/queries/vp/mod.rs @@ -33,7 +33,9 @@ pub mod client_only_methods { use super::Vp; #[cfg(not(feature = "mainnet"))] - use crate::ledger::queries::{Client, RPC}; + use crate::ledger::queries::RPC; + #[cfg(not(feature = "mainnet"))] + use crate::sdk::queries::Client; #[cfg(not(feature = "mainnet"))] use crate::types::address::Address; diff --git a/shared/src/ledger/queries/vp/pos.rs b/shared/src/ledger/queries/vp/pos.rs index aff5181a19b..e78bff146b6 100644 --- a/shared/src/ledger/queries/vp/pos.rs +++ b/shared/src/ledger/queries/vp/pos.rs @@ -531,7 +531,8 @@ where #[cfg(any(test, feature = "async-client"))] pub mod client_only_methods { use super::*; - use crate::ledger::queries::{Client, RPC}; + use crate::ledger::queries::RPC; + use crate::sdk::queries::Client; impl Pos { /// Get bonds and unbonds with all details (slashes and rewards, if any) diff --git a/shared/src/ledger/queries/vp/token.rs b/shared/src/ledger/queries/vp/token.rs index ffb1117c913..3b99cb0fdaa 100644 --- a/shared/src/ledger/queries/vp/token.rs +++ b/shared/src/ledger/queries/vp/token.rs @@ -30,7 +30,8 @@ pub mod client_only_methods { use borsh::BorshDeserialize; use super::Token; - use crate::ledger::queries::{Client, RPC}; + use crate::ledger::queries::RPC; + use crate::sdk::queries::Client; use crate::types::address::Address; use crate::types::token; diff --git a/shared/src/sdk/masp.rs b/shared/src/sdk/masp.rs index 29611f9b940..6d37b51740c 100644 --- a/shared/src/sdk/masp.rs +++ b/shared/src/sdk/masp.rs @@ -59,9 +59,9 @@ use ripemd::Digest as RipemdDigest; use sha2::Digest; use thiserror::Error; -use crate::ledger::queries::Client; use crate::proto::Tx; use crate::sdk::args::InputAmount; +use crate::sdk::queries::Client; use crate::sdk::rpc::{query_conversion, query_storage_value}; use crate::sdk::tx::decode_component; use crate::sdk::{args, rpc}; diff --git a/shared/src/sdk/mod.rs b/shared/src/sdk/mod.rs index b87e8be3eba..69e32f087d3 100644 --- a/shared/src/sdk/mod.rs +++ b/shared/src/sdk/mod.rs @@ -6,3 +6,5 @@ pub mod masp; pub mod signing; #[allow(clippy::result_large_err)] pub mod tx; + +pub mod queries; diff --git a/shared/src/sdk/queries.rs b/shared/src/sdk/queries.rs new file mode 100644 index 00000000000..4877f21c9e1 --- /dev/null +++ b/shared/src/sdk/queries.rs @@ -0,0 +1,275 @@ +//! Query functionality related to the SDK +use std::fmt::{Debug, Display}; + +use namada_core::types::storage::BlockHeight; +use tendermint_rpc::endpoint::{ + abci_info, block, block_results, blockchain, commit, consensus_params, + consensus_state, health, net_info, status, +}; +use tendermint_rpc::query::Query; +use tendermint_rpc::{Error as RpcError, Order}; + +use crate::ledger::queries::{EncodedResponseQuery, Error}; +use crate::tendermint::block::Height; + +/// A client with async request dispatcher method, which can be used to invoke +/// type-safe methods from a root [`crate::ledger::queries::Router`], generated +/// via `router!` macro. +#[cfg(any(test, feature = "async-client"))] +#[async_trait::async_trait(?Send)] +pub trait Client { + /// `std::io::Error` can happen in decoding with + /// `BorshDeserialize::try_from_slice` + type Error: From + Display + Debug; + + /// Send a simple query request at the given path. For more options, use the + /// `request` method. + async fn simple_request( + &self, + path: String, + ) -> Result, Self::Error> { + self.request(path, None, None, false) + .await + .map(|response| response.data) + } + + /// Send a query request at the given path. + async fn request( + &self, + path: String, + data: Option>, + height: Option, + prove: bool, + ) -> Result; + + /// `/abci_info`: get information about the ABCI application. + async fn abci_info(&self) -> Result { + Ok(self.perform(abci_info::Request).await?.response) + } + + /// `/broadcast_tx_sync`: broadcast a transaction, returning the response + /// from `CheckTx`. + async fn broadcast_tx_sync( + &self, + tx: crate::tendermint::abci::Transaction, + ) -> Result + { + self.perform( + tendermint_rpc::endpoint::broadcast::tx_sync::Request::new(tx), + ) + .await + } + + /// `/block`: get the latest block. + async fn latest_block(&self) -> Result { + self.perform(block::Request::default()).await + } + + /// `/block`: get block at a given height. + async fn block(&self, height: H) -> Result + where + H: Into + Send, + { + self.perform(block::Request::new(height.into())).await + } + + /// `/block_search`: search for blocks by BeginBlock and EndBlock events. + async fn block_search( + &self, + query: Query, + page: u32, + per_page: u8, + order: Order, + ) -> Result + { + self.perform(tendermint_rpc::endpoint::block_search::Request::new( + query, page, per_page, order, + )) + .await + } + + /// `/block_results`: get ABCI results for a block at a particular height. + async fn block_results( + &self, + height: H, + ) -> Result + where + H: Into + Send, + { + self.perform(tendermint_rpc::endpoint::block_results::Request::new( + height.into(), + )) + .await + } + + /// `/tx_search`: search for transactions with their results. + async fn tx_search( + &self, + query: Query, + prove: bool, + page: u32, + per_page: u8, + order: Order, + ) -> Result { + self.perform(tendermint_rpc::endpoint::tx_search::Request::new( + query, prove, page, per_page, order, + )) + .await + } + + /// `/abci_query`: query the ABCI application + async fn abci_query( + &self, + path: Option, + data: V, + height: Option, + prove: bool, + ) -> Result + where + V: Into> + Send, + { + Ok(self + .perform(tendermint_rpc::endpoint::abci_query::Request::new( + path, data, height, prove, + )) + .await? + .response) + } + + /// `/block_results`: get ABCI results for the latest block. + async fn latest_block_results( + &self, + ) -> Result { + self.perform(block_results::Request::default()).await + } + + /// `/blockchain`: get block headers for `min` <= `height` <= `max`. + /// + /// Block headers are returned in descending order (highest first). + /// + /// Returns at most 20 items. + async fn blockchain( + &self, + min: H, + max: H, + ) -> Result + where + H: Into + Send, + { + // TODO(tarcieri): return errors for invalid params before making + // request? + self.perform(blockchain::Request::new(min.into(), max.into())) + .await + } + + /// `/commit`: get block commit at a given height. + async fn commit(&self, height: H) -> Result + where + H: Into + Send, + { + self.perform(commit::Request::new(height.into())).await + } + + /// `/consensus_params`: get current consensus parameters at the specified + /// height. + async fn consensus_params( + &self, + height: H, + ) -> Result + where + H: Into + Send, + { + self.perform(consensus_params::Request::new(Some(height.into()))) + .await + } + + /// `/consensus_state`: get current consensus state + async fn consensus_state( + &self, + ) -> Result { + self.perform(consensus_state::Request::new()).await + } + + /// `/consensus_params`: get the latest consensus parameters. + async fn latest_consensus_params( + &self, + ) -> Result { + self.perform(consensus_params::Request::new(None)).await + } + + /// `/commit`: get the latest block commit + async fn latest_commit(&self) -> Result { + self.perform(commit::Request::default()).await + } + + /// `/health`: get node health. + /// + /// Returns empty result (200 OK) on success, no response in case of an + /// error. + async fn health(&self) -> Result<(), RpcError> { + self.perform(health::Request).await?; + Ok(()) + } + + /// `/net_info`: obtain information about P2P and other network connections. + async fn net_info(&self) -> Result { + self.perform(net_info::Request).await + } + + /// `/status`: get Tendermint status including node info, pubkey, latest + /// block hash, app hash, block height and time. + async fn status(&self) -> Result { + self.perform(status::Request).await + } + + /// Perform a request against the RPC endpoint + async fn perform(&self, request: R) -> Result + where + R: tendermint_rpc::SimpleRequest; +} + +#[async_trait::async_trait(?Send)] +impl Client for C { + type Error = Error; + + async fn request( + &self, + path: String, + data: Option>, + height: Option, + prove: bool, + ) -> Result { + let data = data.unwrap_or_default(); + let height = height + .map(|height| { + crate::tendermint::block::Height::try_from(height.0) + .map_err(|_err| Error::InvalidHeight(height)) + }) + .transpose()?; + let response = self + .abci_query( + // TODO open the private Path constructor in tendermint-rpc + Some(std::str::FromStr::from_str(&path).unwrap()), + data, + height, + prove, + ) + .await?; + use crate::tendermint::abci::Code; + match response.code { + Code::Ok => Ok(EncodedResponseQuery { + data: response.value, + info: response.info, + proof: response.proof, + }), + Code::Err(code) => Err(Error::Query(response.info, code)), + } + } + + async fn perform(&self, request: R) -> Result + where + R: tendermint_rpc::SimpleRequest, + { + tendermint_rpc::Client::perform(self, request).await + } +} diff --git a/shared/src/sdk/signing.rs b/shared/src/sdk/signing.rs index 3daf32fb801..fd4ceb13ae5 100644 --- a/shared/src/sdk/signing.rs +++ b/shared/src/sdk/signing.rs @@ -79,10 +79,7 @@ pub struct SigningTxData { /// for it from the wallet. If the keypair is encrypted but a password is not /// supplied, then it is interactively prompted. Errors if the key cannot be /// found or loaded. -pub async fn find_pk< - C: crate::ledger::queries::Client + Sync, - U: WalletUtils, ->( +pub async fn find_pk( client: &C, wallet: &mut Wallet, addr: &Address, @@ -149,7 +146,7 @@ pub fn find_key_by_pk( /// possible. If no explicit signer given, use the `default`. If no `default` /// is given, an `Error` is returned. pub async fn tx_signers< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, >( client: &C, @@ -233,7 +230,7 @@ pub fn sign_tx( /// Return the necessary data regarding an account to be able to generate a /// multisignature section pub async fn aux_signing_data< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, >( client: &C, @@ -296,7 +293,7 @@ pub async fn aux_signing_data< #[cfg(not(feature = "mainnet"))] /// Solve the PoW challenge if balance is insufficient to pay transaction fees /// or if solution is explicitly requested. -pub async fn solve_pow_challenge( +pub async fn solve_pow_challenge( client: &C, args: &args::Tx, requires_pow: bool, @@ -335,7 +332,7 @@ pub async fn solve_pow_challenge( #[cfg(not(feature = "mainnet"))] /// Update the PoW challenge inside the given transaction -pub async fn update_pow_challenge( +pub async fn update_pow_challenge( client: &C, args: &args::Tx, tx: &mut Tx, @@ -435,7 +432,7 @@ pub struct TxSourcePostBalance { /// progress on chain. #[allow(clippy::too_many_arguments)] pub async fn wrap_tx< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, V: ShieldedUtils, >( client: &C, @@ -719,7 +716,7 @@ fn make_ledger_amount_addr( /// Adds a Ledger output line describing a given transaction amount and asset /// type -async fn make_ledger_amount_asset( +async fn make_ledger_amount_asset( client: &C, tokens: &HashMap, output: &mut Vec, @@ -816,7 +813,7 @@ fn format_outputs(output: &mut Vec) { /// Adds a Ledger output for the sender and destination for transparent and MASP /// transactions pub async fn make_ledger_masp_endpoints< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, >( client: &C, tokens: &HashMap, @@ -893,7 +890,7 @@ pub async fn make_ledger_masp_endpoints< /// Internal method used to generate transaction test vectors #[cfg(feature = "std")] pub async fn generate_test_vector< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, >( client: &C, @@ -948,7 +945,7 @@ pub async fn generate_test_vector< /// Converts the given transaction to the form that is displayed on the Ledger /// device pub async fn to_ledger_vector< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, >( client: &C, diff --git a/shared/src/sdk/tx.rs b/shared/src/sdk/tx.rs index 0c7157dffc9..dff903bd34f 100644 --- a/shared/src/sdk/tx.rs +++ b/shared/src/sdk/tx.rs @@ -146,7 +146,7 @@ pub fn dump_tx(args: &args::Tx, tx: Tx) { /// to it. #[allow(clippy::too_many_arguments)] pub async fn prepare_tx< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -182,7 +182,7 @@ pub async fn prepare_tx< /// Submit transaction and wait for result. Returns a list of addresses /// initialized in the transaction if any. In dry run, this is always empty. pub async fn process_tx< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, >( client: &C, @@ -242,20 +242,20 @@ pub async fn process_tx< } /// Check if a reveal public key transaction is needed -pub async fn is_reveal_pk_needed( +pub async fn is_reveal_pk_needed( client: &C, address: &Address, force: bool, ) -> Result where - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, { // Check if PK revealed Ok(force || !has_revealed_pk(client, address).await?) } /// Check if the public key for the given address has been revealed -pub async fn has_revealed_pk( +pub async fn has_revealed_pk( client: &C, address: &Address, ) -> Result { @@ -264,7 +264,7 @@ pub async fn has_revealed_pk( /// Submit transaction to reveal the given public key pub async fn build_reveal_pk< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -298,7 +298,7 @@ pub async fn build_reveal_pk< /// the tx has been successfully included into the mempool of a validator /// /// In the case of errors in any of those stages, an error message is returned -pub async fn broadcast_tx( +pub async fn broadcast_tx( rpc_cli: &C, to_broadcast: &TxBroadcastData, ) -> Result { @@ -353,7 +353,7 @@ pub async fn submit_tx( to_broadcast: TxBroadcastData, ) -> Result where - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, { let (_, wrapper_hash, decrypted_hash) = match &to_broadcast { TxBroadcastData::Live { @@ -492,7 +492,7 @@ pub async fn save_initialized_accounts( /// Submit validator comission rate change pub async fn build_validator_commission_change< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -583,7 +583,7 @@ pub async fn build_validator_commission_change< /// Craft transaction to update a steward commission pub async fn build_update_steward_commission< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -634,7 +634,7 @@ pub async fn build_update_steward_commission< /// Craft transaction to resign as a steward pub async fn build_resign_steward< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -669,7 +669,7 @@ pub async fn build_resign_steward< /// Submit transaction to unjail a jailed validator pub async fn build_unjail_validator< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -769,7 +769,7 @@ pub async fn build_unjail_validator< /// Submit transaction to withdraw an unbond pub async fn build_withdraw< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -838,7 +838,7 @@ pub async fn build_withdraw< /// Submit a transaction to unbond pub async fn build_unbond< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -921,7 +921,7 @@ pub async fn build_unbond< } /// Query the unbonds post-tx -pub async fn query_unbonds( +pub async fn query_unbonds( client: &C, args: args::Unbond, latest_withdrawal_pre: Option<(Epoch, token::Amount)>, @@ -986,7 +986,7 @@ pub async fn query_unbonds( /// Submit a transaction to bond pub async fn build_bond< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1057,7 +1057,7 @@ pub async fn build_bond< /// Build a default proposal governance pub async fn build_default_proposal< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1109,7 +1109,7 @@ pub async fn build_default_proposal< /// Build a proposal vote pub async fn build_vote_proposal< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1191,7 +1191,7 @@ pub async fn build_vote_proposal< /// Build a pgf funding proposal governance pub async fn build_pgf_funding_proposal< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1235,7 +1235,7 @@ pub async fn build_pgf_funding_proposal< /// Build a pgf funding proposal governance pub async fn build_pgf_stewards_proposal< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1280,7 +1280,7 @@ pub async fn build_pgf_stewards_proposal< /// Submit an IBC transfer pub async fn build_ibc_transfer< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1415,7 +1415,7 @@ pub async fn build_ibc_transfer< /// Abstraction for helping build transactions #[allow(clippy::too_many_arguments)] -pub async fn build( +pub async fn build( client: &C, wallet: &mut Wallet, shielded: &mut ShieldedContext, @@ -1449,7 +1449,7 @@ where } #[allow(clippy::too_many_arguments)] -async fn build_pow_flag( +async fn build_pow_flag( client: &C, wallet: &mut Wallet, shielded: &mut ShieldedContext, @@ -1497,7 +1497,7 @@ where /// Try to decode the given asset type and add its decoding to the supplied set. /// Returns true only if a new decoding has been added to the given set. async fn add_asset_type< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: ShieldedUtils, >( asset_types: &mut HashSet<(Address, MaspDenom, Epoch)>, @@ -1518,7 +1518,7 @@ async fn add_asset_type< /// function provides the data necessary for offline wallets to present asset /// type information. async fn used_asset_types< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: ShieldedUtils, P, R, @@ -1569,7 +1569,7 @@ async fn used_asset_types< /// Submit an ordinary transfer pub async fn build_transfer< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1740,7 +1740,7 @@ pub async fn build_transfer< /// Submit a transaction to initialize an account pub async fn build_init_account< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1797,7 +1797,7 @@ pub async fn build_init_account< /// Submit a transaction to update a VP pub async fn build_update_account< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1865,7 +1865,7 @@ pub async fn build_update_account< /// Submit a custom transaction pub async fn build_custom< - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, U: WalletUtils, V: ShieldedUtils, >( @@ -1915,7 +1915,7 @@ pub async fn build_custom< Ok((tx, epoch)) } -async fn expect_dry_broadcast( +async fn expect_dry_broadcast( to_broadcast: TxBroadcastData, client: &C, ) -> Result { @@ -1939,7 +1939,7 @@ fn lift_rpc_error(res: std::result::Result) -> Result { /// Returns the given validator if the given address is a validator, /// otherwise returns an error, force forces the address through even /// if it isn't a validator -async fn known_validator_or_err( +async fn known_validator_or_err( validator: Address, force: bool, client: &C, @@ -1972,7 +1972,7 @@ async fn address_exists_or_err( err: F, ) -> Result
where - C: crate::ledger::queries::Client + Sync, + C: crate::sdk::queries::Client + Sync, F: FnOnce(Address) -> Error, { let addr_exists = rpc::known_address::(client, &addr).await?; @@ -1991,7 +1991,7 @@ where /// Returns the given source address if the given address exists on chain /// otherwise returns an error, force forces the address through even /// if it isn't on chain -async fn source_exists_or_err( +async fn source_exists_or_err( token: Address, force: bool, client: &C, @@ -2007,7 +2007,7 @@ async fn source_exists_or_err( /// Returns the given target address if the given address exists on chain /// otherwise returns an error, force forces the address through even /// if it isn't on chain -async fn target_exists_or_err( +async fn target_exists_or_err( token: Address, force: bool, client: &C, @@ -2023,7 +2023,7 @@ async fn target_exists_or_err( /// Checks the balance at the given address is enough to transfer the /// given amount, along with the balance even existing. Force /// overrides this. Returns the updated balance for fee check if necessary -async fn check_balance_too_low_err( +async fn check_balance_too_low_err( token: &Address, source: &Address, amount: token::Amount, @@ -2093,7 +2093,7 @@ fn validate_untrusted_code_err(vp_code: &Vec, force: bool) -> Result<()> { Ok(()) } } -async fn query_wasm_code_hash_buf( +async fn query_wasm_code_hash_buf( client: &C, path: &Path, ) -> Result { From 22cb30057201af6c8a10363e9cb3ba89f8d79360 Mon Sep 17 00:00:00 2001 From: mariari Date: Thu, 7 Sep 2023 04:23:06 +0800 Subject: [PATCH 046/114] Move wallet to the SDK Wallet is used quite heavily within the SDK for inputs, thus making it apart of the SDK --- apps/src/lib/cli/context.rs | 2 +- apps/src/lib/cli/wallet.rs | 2 +- apps/src/lib/client/rpc.rs | 2 +- apps/src/lib/client/tx.rs | 2 +- apps/src/lib/client/utils.rs | 2 +- apps/src/lib/wallet/cli_utils.rs | 2 +- apps/src/lib/wallet/defaults.rs | 4 ++-- apps/src/lib/wallet/mod.rs | 8 ++++---- apps/src/lib/wallet/pre_genesis.rs | 4 ++-- apps/src/lib/wallet/store.rs | 6 +++--- benches/lib.rs | 2 +- shared/src/ledger/eth_bridge/bridge_pool.rs | 2 +- shared/src/ledger/mod.rs | 1 - shared/src/sdk/mod.rs | 1 + shared/src/sdk/signing.rs | 4 ++-- shared/src/sdk/tx.rs | 2 +- shared/src/{ledger => sdk}/wallet/alias.rs | 0 shared/src/{ledger => sdk}/wallet/derivation_path.rs | 0 shared/src/{ledger => sdk}/wallet/keys.rs | 2 +- shared/src/{ledger => sdk}/wallet/mod.rs | 0 shared/src/{ledger => sdk}/wallet/pre_genesis.rs | 4 ++-- shared/src/{ledger => sdk}/wallet/store.rs | 2 +- 22 files changed, 27 insertions(+), 27 deletions(-) rename shared/src/{ledger => sdk}/wallet/alias.rs (100%) rename shared/src/{ledger => sdk}/wallet/derivation_path.rs (100%) rename shared/src/{ledger => sdk}/wallet/keys.rs (99%) rename shared/src/{ledger => sdk}/wallet/mod.rs (100%) rename shared/src/{ledger => sdk}/wallet/pre_genesis.rs (97%) rename shared/src/{ledger => sdk}/wallet/store.rs (99%) diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 590fdae744c..f66e953f4b6 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -6,8 +6,8 @@ use std::path::{Path, PathBuf}; use std::str::FromStr; use color_eyre::eyre::Result; -use namada::ledger::wallet::Wallet; use namada::sdk::masp::ShieldedContext; +use namada::sdk::wallet::Wallet; use namada::types::address::{Address, InternalAddress}; use namada::types::chain::ChainId; use namada::types::ethereum_events::EthAddress; diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index 64cf120cc87..a8fbfc3c975 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -7,8 +7,8 @@ use borsh::BorshSerialize; use color_eyre::eyre::Result; use itertools::sorted; use masp_primitives::zip32::ExtendedFullViewingKey; -use namada::ledger::wallet::{DecryptionError, FindKeyError}; use namada::sdk::masp::find_valid_diversifier; +use namada::sdk::wallet::{DecryptionError, FindKeyError}; use namada::types::key::*; use namada::types::masp::{MaspValue, PaymentAddress}; use rand_core::OsRng; diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 7ad413d584b..f8ab74ff28b 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -33,7 +33,6 @@ use namada::ledger::parameters::{storage as param_storage, EpochDuration}; use namada::ledger::pos::{CommissionPair, PosParams, Slash}; use namada::ledger::queries::RPC; use namada::ledger::storage::ConversionState; -use namada::ledger::wallet::{AddressVpType, Wallet}; use namada::proof_of_stake::types::{ValidatorState, WeightedValidator}; use namada::sdk::masp::{ Conversions, MaspAmount, MaspChange, ShieldedContext, ShieldedUtils, @@ -42,6 +41,7 @@ use namada::sdk::rpc::{ self, enriched_bonds_and_unbonds, format_denominated_amount, query_epoch, TxResponse, }; +use namada::sdk::wallet::{AddressVpType, Wallet}; use namada::types::address::{masp, Address}; use namada::types::control_flow::ProceedOrElse; use namada::types::error::{is_pinned_error, Error, PinnedBalanceError}; diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index c93e27106b4..a4441df373c 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -14,10 +14,10 @@ use namada::core::ledger::governance::cli::onchain::{ DefaultProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, }; use namada::ledger::pos; -use namada::ledger::wallet::{Wallet, WalletUtils}; use namada::proof_of_stake::parameters::PosParams; use namada::proto::Tx; use namada::sdk::rpc::{TxBroadcastData, TxResponse}; +use namada::sdk::wallet::{Wallet, WalletUtils}; use namada::sdk::{masp, signing, tx}; use namada::tendermint_rpc::HttpClient; use namada::types::address::{Address, ImplicitAddress}; diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 77b18f9136f..0eedb23968a 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -10,7 +10,7 @@ use borsh::BorshSerialize; use flate2::read::GzDecoder; use flate2::write::GzEncoder; use flate2::Compression; -use namada::ledger::wallet::Wallet; +use namada::sdk::wallet::Wallet; use namada::types::address; use namada::types::chain::ChainId; use namada::types::dec::Dec; diff --git a/apps/src/lib/wallet/cli_utils.rs b/apps/src/lib/wallet/cli_utils.rs index 405b3a99fa3..72bb0acaab2 100644 --- a/apps/src/lib/wallet/cli_utils.rs +++ b/apps/src/lib/wallet/cli_utils.rs @@ -4,8 +4,8 @@ use std::io::{self, Write}; use borsh::BorshSerialize; use itertools::sorted; use masp_primitives::zip32::ExtendedFullViewingKey; -use namada::ledger::wallet::{DecryptionError, FindKeyError}; use namada::sdk::masp::find_valid_diversifier; +use namada::sdk::wallet::{DecryptionError, FindKeyError}; use namada::types::key::{PublicKeyHash, RefTo}; use namada::types::masp::{MaspValue, PaymentAddress}; use rand_core::OsRng; diff --git a/apps/src/lib/wallet/defaults.rs b/apps/src/lib/wallet/defaults.rs index 88d9589e69e..00b0f49d269 100644 --- a/apps/src/lib/wallet/defaults.rs +++ b/apps/src/lib/wallet/defaults.rs @@ -8,8 +8,8 @@ pub use dev::{ validator_keys, }; use namada::core::ledger::eth_bridge::storage::bridge_pool::BRIDGE_POOL_ADDRESS; -use namada::ledger::wallet::alias::Alias; use namada::ledger::{eth_bridge, governance, pgf, pos}; +use namada::sdk::wallet::alias::Alias; use namada::types::address::Address; use namada::types::key::*; @@ -77,8 +77,8 @@ mod dev { use std::collections::HashMap; use borsh::BorshDeserialize; - use namada::ledger::wallet::alias::Alias; use namada::ledger::{governance, pgf, pos}; + use namada::sdk::wallet::alias::Alias; use namada::types::address::{ apfel, btc, dot, eth, kartoffel, nam, schnitzel, Address, }; diff --git a/apps/src/lib/wallet/mod.rs b/apps/src/lib/wallet/mod.rs index 7c9c193087e..f6611ebe180 100644 --- a/apps/src/lib/wallet/mod.rs +++ b/apps/src/lib/wallet/mod.rs @@ -9,12 +9,12 @@ use std::str::FromStr; use std::{env, fs}; use namada::bip39::{Language, Mnemonic}; -pub use namada::ledger::wallet::alias::Alias; -use namada::ledger::wallet::{ +pub use namada::sdk::wallet::alias::Alias; +use namada::sdk::wallet::{ AddressVpType, ConfirmationResponse, FindKeyError, GenRestoreKeyError, Wallet, WalletUtils, }; -pub use namada::ledger::wallet::{ValidatorData, ValidatorKeys}; +pub use namada::sdk::wallet::{ValidatorData, ValidatorKeys}; use namada::types::address::Address; use namada::types::key::*; use rand_core::OsRng; @@ -309,7 +309,7 @@ pub fn read_and_confirm_encryption_password( #[cfg(test)] mod tests { use namada::bip39::MnemonicType; - use namada::ledger::wallet::WalletUtils; + use namada::sdk::wallet::WalletUtils; use rand_core; use super::CliWalletUtils; diff --git a/apps/src/lib/wallet/pre_genesis.rs b/apps/src/lib/wallet/pre_genesis.rs index 3b05bb214fe..21a80267f1d 100644 --- a/apps/src/lib/wallet/pre_genesis.rs +++ b/apps/src/lib/wallet/pre_genesis.rs @@ -3,10 +3,10 @@ use std::path::{Path, PathBuf}; use ark_serialize::{Read, Write}; use fd_lock::RwLock; -use namada::ledger::wallet::pre_genesis::{ +use namada::sdk::wallet::pre_genesis::{ ReadError, ValidatorStore, ValidatorWallet, }; -use namada::ledger::wallet::{gen_key_to_store, WalletUtils}; +use namada::sdk::wallet::{gen_key_to_store, WalletUtils}; use namada::types::key::SchemeType; use zeroize::Zeroizing; diff --git a/apps/src/lib/wallet/store.rs b/apps/src/lib/wallet/store.rs index 6ae0d023d94..0f2aa86b7be 100644 --- a/apps/src/lib/wallet/store.rs +++ b/apps/src/lib/wallet/store.rs @@ -9,10 +9,10 @@ use ark_std::rand::prelude::*; use ark_std::rand::SeedableRng; use fd_lock::RwLock; #[cfg(not(feature = "dev"))] -use namada::ledger::wallet::store::AddressVpType; +use namada::sdk::wallet::store::AddressVpType; #[cfg(feature = "dev")] -use namada::ledger::wallet::StoredKeypair; -use namada::ledger::wallet::{gen_sk_rng, Store, ValidatorKeys}; +use namada::sdk::wallet::StoredKeypair; +use namada::sdk::wallet::{gen_sk_rng, Store, ValidatorKeys}; #[cfg(not(feature = "dev"))] use namada::types::address::Address; use namada::types::key::*; diff --git a/benches/lib.rs b/benches/lib.rs index b9cf907804e..9c97499c2c3 100644 --- a/benches/lib.rs +++ b/benches/lib.rs @@ -67,13 +67,13 @@ use namada::ledger::ibc::storage::{channel_key, connection_key}; use namada::ledger::queries::{ Client, EncodedResponseQuery, RequestCtx, RequestQuery, Router, RPC, }; -use namada::ledger::wallet::Wallet; use namada::proof_of_stake; use namada::proto::{Code, Data, Section, Signature, Tx}; use namada::sdk::args::InputAmount; use namada::sdk::masp::{ self, ShieldedContext, ShieldedTransfer, ShieldedUtils, }; +use namada::sdk::wallet::Wallet; use namada::tendermint::Hash; use namada::tendermint_rpc::{self}; use namada::types::address::InternalAddress; diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index 78a7b1c1bc8..bc7d1694b92 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -21,12 +21,12 @@ use crate::eth_bridge::structs::RelayProof; use crate::ledger::queries::{ Client, GenBridgePoolProofReq, GenBridgePoolProofRsp, RPC, }; -use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::Tx; use crate::sdk::args; use crate::sdk::masp::{ShieldedContext, ShieldedUtils}; use crate::sdk::rpc::{query_wasm_code_hash, validate_amount}; use crate::sdk::tx::prepare_tx; +use crate::sdk::wallet::{Wallet, WalletUtils}; use crate::types::address::Address; use crate::types::control_flow::time::{Duration, Instant}; use crate::types::control_flow::{ diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index e62fd648872..04b5809bc27 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -13,7 +13,6 @@ pub mod protocol; pub mod queries; pub mod storage; pub mod vp_host_fns; -pub mod wallet; pub use namada_core::ledger::{ gas, parameters, replay_protection, storage_api, tx_env, vp_env, diff --git a/shared/src/sdk/mod.rs b/shared/src/sdk/mod.rs index 69e32f087d3..cf7236af5f5 100644 --- a/shared/src/sdk/mod.rs +++ b/shared/src/sdk/mod.rs @@ -8,3 +8,4 @@ pub mod signing; pub mod tx; pub mod queries; +pub mod wallet; diff --git a/shared/src/sdk/signing.rs b/shared/src/sdk/signing.rs index fd4ceb13ae5..639e3f28c5d 100644 --- a/shared/src/sdk/signing.rs +++ b/shared/src/sdk/signing.rs @@ -27,8 +27,6 @@ use zeroize::Zeroizing; use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc_proto::google::protobuf::Any; use crate::ledger::parameters::storage as parameter_storage; -pub use crate::ledger::wallet::store::AddressVpType; -use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Section, Tx}; use crate::sdk::masp::{ make_asset_type, ShieldedContext, ShieldedTransfer, ShieldedUtils, @@ -42,6 +40,8 @@ use crate::sdk::tx::{ TX_UNBOND_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, VP_USER_WASM, }; +pub use crate::sdk::wallet::store::AddressVpType; +use crate::sdk::wallet::{Wallet, WalletUtils}; use crate::sdk::{args, rpc}; use crate::types::error::{EncodingError, Error, TxError}; use crate::types::key::*; diff --git a/shared/src/sdk/tx.rs b/shared/src/sdk/tx.rs index dff903bd34f..fa26619e9f1 100644 --- a/shared/src/sdk/tx.rs +++ b/shared/src/sdk/tx.rs @@ -42,7 +42,6 @@ use crate::ibc::core::timestamp::Timestamp as IbcTimestamp; use crate::ibc::core::Msg; use crate::ibc::Height as IbcHeight; use crate::ledger::ibc::storage::ibc_denom_key; -use crate::ledger::wallet::{Wallet, WalletUtils}; use crate::proto::{MaspBuilder, Tx}; use crate::sdk::args::{self, InputAmount}; use crate::sdk::masp::TransferErr::Build; @@ -52,6 +51,7 @@ use crate::sdk::rpc::{ TxBroadcastData, TxResponse, }; use crate::sdk::signing::{self, TxSourcePostBalance}; +use crate::sdk::wallet::{Wallet, WalletUtils}; use crate::tendermint_rpc::endpoint::broadcast::tx_sync::Response; use crate::tendermint_rpc::error::Error as RpcError; use crate::types::control_flow::{time, ProceedOrElse}; diff --git a/shared/src/ledger/wallet/alias.rs b/shared/src/sdk/wallet/alias.rs similarity index 100% rename from shared/src/ledger/wallet/alias.rs rename to shared/src/sdk/wallet/alias.rs diff --git a/shared/src/ledger/wallet/derivation_path.rs b/shared/src/sdk/wallet/derivation_path.rs similarity index 100% rename from shared/src/ledger/wallet/derivation_path.rs rename to shared/src/sdk/wallet/derivation_path.rs diff --git a/shared/src/ledger/wallet/keys.rs b/shared/src/sdk/wallet/keys.rs similarity index 99% rename from shared/src/ledger/wallet/keys.rs rename to shared/src/sdk/wallet/keys.rs index d13ebbd07c2..867a2b1ad0c 100644 --- a/shared/src/ledger/wallet/keys.rs +++ b/shared/src/sdk/wallet/keys.rs @@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize}; use thiserror::Error; use zeroize::Zeroizing; -use crate::ledger::wallet::WalletUtils; +use crate::sdk::wallet::WalletUtils; const ENCRYPTED_KEY_PREFIX: &str = "encrypted:"; const UNENCRYPTED_KEY_PREFIX: &str = "unencrypted:"; diff --git a/shared/src/ledger/wallet/mod.rs b/shared/src/sdk/wallet/mod.rs similarity index 100% rename from shared/src/ledger/wallet/mod.rs rename to shared/src/sdk/wallet/mod.rs diff --git a/shared/src/ledger/wallet/pre_genesis.rs b/shared/src/sdk/wallet/pre_genesis.rs similarity index 97% rename from shared/src/ledger/wallet/pre_genesis.rs rename to shared/src/sdk/wallet/pre_genesis.rs index dc19c8bfe54..fd66dedbfec 100644 --- a/shared/src/ledger/wallet/pre_genesis.rs +++ b/shared/src/sdk/wallet/pre_genesis.rs @@ -3,8 +3,8 @@ use serde::{Deserialize, Serialize}; use thiserror::Error; use zeroize::Zeroizing; -use crate::ledger::wallet; -use crate::ledger::wallet::{store, StoredKeypair}; +use crate::sdk::wallet; +use crate::sdk::wallet::{store, StoredKeypair}; use crate::types::key::{common, SchemeType}; /// Ways in which wallet store operations can fail diff --git a/shared/src/ledger/wallet/store.rs b/shared/src/sdk/wallet/store.rs similarity index 99% rename from shared/src/ledger/wallet/store.rs rename to shared/src/sdk/wallet/store.rs index 09e04ed836f..509ff5afe68 100644 --- a/shared/src/ledger/wallet/store.rs +++ b/shared/src/sdk/wallet/store.rs @@ -17,7 +17,7 @@ use zeroize::Zeroizing; use super::alias::{self, Alias}; use super::derivation_path::DerivationPath; use super::pre_genesis; -use crate::ledger::wallet::{StoredKeypair, WalletUtils}; +use crate::sdk::wallet::{StoredKeypair, WalletUtils}; use crate::types::address::{Address, ImplicitAddress}; use crate::types::key::dkg_session_keys::DkgKeypair; use crate::types::key::*; From 093a505d617628eb5d6366dd075b5f4af69ea410 Mon Sep 17 00:00:00 2001 From: mariari Date: Fri, 8 Sep 2023 00:12:03 +0800 Subject: [PATCH 047/114] Update CONTRIBUTING.md to properly outline how to document SDK changes --- CONTRIBUTING.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5798b2c71c7..233a9333501 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,6 +24,7 @@ The section should either be one of the following choices: - `features` - `improvements` - `testing` +- `SDK` To add a change log entry using `unclog`, you can fill in the following command (prefer to use the issue number, for which the `--pull-request` argument may be omitted): @@ -47,6 +48,13 @@ If none of the sections fit, new sections may be added. To find the existing sec for i in $(ls -d .changelog/*/*/); do basename "$i"; done | sort | uniq ``` +#### SDK Changelog + +The Namada SDK is exposed to any developer building upon Namada. Thus, any change made to a public facing function is a breaking change, and therefore should be documented in the Changelog under the `SDK` section. + +The message should outline the exact API change, along with a small section describing *how* and *why* the componenet was change. This should give motivation and context to any developer building upon Namada on how they can update their code to the next version. + ## Development priorities + If you’d like to follow the development or contribute with new or unimplemented features, we recommend to check [the issues](https://github.com/anoma/namada/issues) that are in current focus of the ledger team. From 9b8e9cce9678af208d837e9c7df73a311a3acc77 Mon Sep 17 00:00:00 2001 From: mariari Date: Fri, 8 Sep 2023 00:17:00 +0800 Subject: [PATCH 048/114] Add Changelog explaining the changelog changes --- .../unreleased/improvements/1876-updating-contributing.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/1876-updating-contributing.md diff --git a/.changelog/unreleased/improvements/1876-updating-contributing.md b/.changelog/unreleased/improvements/1876-updating-contributing.md new file mode 100644 index 00000000000..871c666e413 --- /dev/null +++ b/.changelog/unreleased/improvements/1876-updating-contributing.md @@ -0,0 +1,2 @@ +- Added a section in CONTRIBUTING.md to outline how to document SDK + changes ([#1876](https://github.com/anoma/namada/pull/1876)) From 6b72c7220d9e214a01af63198511b39466de15dd Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Thu, 7 Sep 2023 19:10:21 +0200 Subject: [PATCH 049/114] Shared function to retrieve fee unshielding transaction --- apps/src/lib/node/ledger/shell/mod.rs | 15 ++------- .../lib/node/ledger/shell/prepare_proposal.rs | 15 ++------- .../lib/node/ledger/shell/process_proposal.rs | 16 ++-------- shared/src/ledger/protocol/mod.rs | 31 ++++++++++++------- 4 files changed, 27 insertions(+), 50 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 46a985b8fcf..db71ac98ec7 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -38,7 +38,8 @@ use namada::ledger::pos::namada_proof_of_stake::types::{ ConsensusValidator, ValidatorSetUpdate, }; use namada::ledger::protocol::{ - apply_wasm_tx, get_transfer_hash_from_storage, ShellParams, + apply_wasm_tx, get_fee_unshielding_transaction, + get_transfer_hash_from_storage, ShellParams, }; use namada::ledger::storage::write_log::WriteLog; use namada::ledger::storage::{ @@ -1262,20 +1263,10 @@ where return response; } - let fee_unshield = wrapper - .unshield_section_hash - .and_then(|ref hash| tx.get_section(hash)) - .and_then(|section| { - if let Section::MaspTx(transaction) = section.as_ref() { - Some(transaction.to_owned()) - } else { - None - } - }); // Validate wrapper fees if let Err(e) = self.wrapper_fee_check( &wrapper, - fee_unshield, + get_fee_unshielding_transaction(&tx, &wrapper), &mut TempWlStorage::new(&self.wl_storage.storage), &mut self.vp_wasm_cache.clone(), &mut self.tx_wasm_cache.clone(), diff --git a/apps/src/lib/node/ledger/shell/prepare_proposal.rs b/apps/src/lib/node/ledger/shell/prepare_proposal.rs index e8633940b9a..f3a56e78481 100644 --- a/apps/src/lib/node/ledger/shell/prepare_proposal.rs +++ b/apps/src/lib/node/ledger/shell/prepare_proposal.rs @@ -5,9 +5,10 @@ use namada::core::ledger::gas::TxGasMeter; #[cfg(feature = "abcipp")] use namada::ledger::eth_bridge::{EthBridgeQueries, SendValsetUpd}; use namada::ledger::pos::PosQueries; +use namada::ledger::protocol::get_fee_unshielding_transaction; use namada::ledger::storage::{DBIter, StorageHasher, TempWlStorage, DB}; use namada::proof_of_stake::find_validator_by_raw_hash; -use namada::proto::{Section, Tx}; +use namada::proto::Tx; use namada::types::address::Address; use namada::types::internal::TxInQueue; use namada::types::key::tm_raw_hash_to_string; @@ -249,19 +250,9 @@ where .map_err(|_| ())?; // Check fees - let fee_unshield = - wrapper.unshield_section_hash.and_then(|ref hash| { - tx.get_section(hash).and_then(|section| { - if let Section::MaspTx(transaction) = section.as_ref() { - Some(transaction.to_owned()) - } else { - None - } - }) - }); match self.wrapper_fee_check( &wrapper, - fee_unshield, + get_fee_unshielding_transaction(&tx, &wrapper), temp_wl_storage, vp_wasm_cache, tx_wasm_cache, diff --git a/apps/src/lib/node/ledger/shell/process_proposal.rs b/apps/src/lib/node/ledger/shell/process_proposal.rs index dca2d4fe4ed..0ad847107bb 100644 --- a/apps/src/lib/node/ledger/shell/process_proposal.rs +++ b/apps/src/lib/node/ledger/shell/process_proposal.rs @@ -6,6 +6,7 @@ use namada::core::hints; use namada::core::ledger::storage::WlStorage; use namada::ledger::eth_bridge::{EthBridgeQueries, SendValsetUpd}; use namada::ledger::pos::PosQueries; +use namada::ledger::protocol::get_fee_unshielding_transaction; use namada::ledger::storage::TempWlStorage; use namada::proof_of_stake::find_validator_by_raw_hash; use namada::types::internal::TxInQueue; @@ -889,22 +890,9 @@ where } // Check that the fee payer has sufficient balance. - let fee_unshield = - wrapper.unshield_section_hash.and_then(|ref hash| { - tx.get_section(hash).and_then(|section| { - if let Section::MaspTx(transaction) = - section.as_ref() - { - Some(transaction.to_owned()) - } else { - None - } - }) - }); - match self.wrapper_fee_check( &wrapper, - fee_unshield, + get_fee_unshielding_transaction(&tx, &wrapper), temp_wl_storage, vp_wasm_cache, tx_wasm_cache, diff --git a/shared/src/ledger/protocol/mod.rs b/shared/src/ledger/protocol/mod.rs index c6ed0814b17..5774c5c9aaf 100644 --- a/shared/src/ledger/protocol/mod.rs +++ b/shared/src/ledger/protocol/mod.rs @@ -175,20 +175,9 @@ where apply_protocol_tx(protocol_tx.tx, tx.data(), wl_storage) } TxType::Wrapper(ref wrapper) => { - let masp_transaction = - wrapper.unshield_section_hash.and_then(|ref hash| { - tx.get_section(hash).and_then(|section| { - if let Section::MaspTx(transaction) = section.as_ref() { - Some(transaction.to_owned()) - } else { - None - } - }) - }); - let changed_keys = apply_wrapper_tx( wrapper, - masp_transaction, + get_fee_unshielding_transaction(&tx, wrapper), tx_bytes, ShellParams { tx_gas_meter, @@ -291,6 +280,24 @@ where Ok(changed_keys) } +/// Retrieve the Masp `Transaction` for fee unshielding from the provided +/// transaction, if present +pub fn get_fee_unshielding_transaction( + tx: &Tx, + wrapper: &WrapperTx, +) -> Option { + wrapper + .unshield_section_hash + .and_then(|ref hash| tx.get_section(hash)) + .and_then(|section| { + if let Section::MaspTx(transaction) = section.as_ref() { + Some(transaction.to_owned()) + } else { + None + } + }) +} + /// Charge fee for the provided wrapper transaction. In ABCI returns an error if /// the balance of the block proposer overflows. In ABCI plus returns error if: /// - The unshielding fails From 0ba4d782e33eee73b3de14fad8707fc65ddbf4c7 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Thu, 7 Sep 2023 19:24:37 +0200 Subject: [PATCH 050/114] Refactors masp section check in encryption --- core/src/proto/types.rs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/core/src/proto/types.rs b/core/src/proto/types.rs index 43da551d871..42d7c687b2b 100644 --- a/core/src/proto/types.rs +++ b/core/src/proto/types.rs @@ -1500,7 +1500,6 @@ impl Tx { /// signatures over it #[cfg(feature = "ferveo-tpke")] pub fn encrypt(&mut self, pubkey: &EncryptionKey) -> &mut Self { - use crate::types::hash::Hash; let header_hash = self.header_hash(); let mut plaintexts = vec![]; // Iterate backwrds to sidestep the effects of deletion on indexing @@ -1508,7 +1507,7 @@ impl Tx { match &self.sections[i] { Section::Signature(sig) if sig.targets.contains(&header_hash) => {} - Section::MaspTx(_) => { + masp_section @ Section::MaspTx(_) => { // Do NOT encrypt the fee unshielding transaction if let Some(unshield_section_hash) = self .header() @@ -1516,14 +1515,7 @@ impl Tx { .expect("Tried to encrypt a non-wrapper tx") .unshield_section_hash { - if unshield_section_hash - == Hash( - self.sections[i] - .hash(&mut Sha256::new()) - .finalize_reset() - .into(), - ) - { + if unshield_section_hash == masp_section.get_hash() { continue; } } From 78a23f441525f6b6f77e492f69c3f6d171feac86 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Thu, 7 Sep 2023 19:58:25 +0200 Subject: [PATCH 051/114] changelog: add #1877 --- .../unreleased/improvements/1877-refactor-get-fee-unshield.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/1877-refactor-get-fee-unshield.md diff --git a/.changelog/unreleased/improvements/1877-refactor-get-fee-unshield.md b/.changelog/unreleased/improvements/1877-refactor-get-fee-unshield.md new file mode 100644 index 00000000000..8db436c7bdd --- /dev/null +++ b/.changelog/unreleased/improvements/1877-refactor-get-fee-unshield.md @@ -0,0 +1,2 @@ +- Refactored retrieval of `Transaction` object for fee unshielding. + ([\#1877](https://github.com/anoma/namada/pull/1877)) \ No newline at end of file From 1c53a58f0c6c6915a6b5126d692f576e1f1b1c3c Mon Sep 17 00:00:00 2001 From: mariari Date: Sat, 9 Sep 2023 00:00:09 +0800 Subject: [PATCH 052/114] Move namada::types::error into namada::sdk::error this type is used quite extensively in the SDK and the shared crate in general, any change to it should be noted in the changelog under SDK changes as it is developer facing --- apps/src/lib/client/rpc.rs | 5 +++-- apps/src/lib/client/tx.rs | 3 +-- shared/src/ledger/eth_bridge/bridge_pool.rs | 2 +- shared/src/ledger/events.rs | 2 +- shared/src/{types => sdk}/error.rs | 2 +- shared/src/sdk/masp.rs | 4 +--- shared/src/sdk/mod.rs | 1 + shared/src/sdk/rpc.rs | 5 +++-- shared/src/sdk/signing.rs | 2 +- shared/src/sdk/tx.rs | 2 +- shared/src/types/mod.rs | 1 - 11 files changed, 14 insertions(+), 15 deletions(-) rename shared/src/{types => sdk}/error.rs (99%) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index f8ab74ff28b..ecd6bbc4c09 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -34,6 +34,8 @@ use namada::ledger::pos::{CommissionPair, PosParams, Slash}; use namada::ledger::queries::RPC; use namada::ledger::storage::ConversionState; use namada::proof_of_stake::types::{ValidatorState, WeightedValidator}; +use namada::sdk::error; +use namada::sdk::error::{is_pinned_error, Error, PinnedBalanceError}; use namada::sdk::masp::{ Conversions, MaspAmount, MaspChange, ShieldedContext, ShieldedUtils, }; @@ -44,13 +46,12 @@ use namada::sdk::rpc::{ use namada::sdk::wallet::{AddressVpType, Wallet}; use namada::types::address::{masp, Address}; use namada::types::control_flow::ProceedOrElse; -use namada::types::error::{is_pinned_error, Error, PinnedBalanceError}; use namada::types::hash::Hash; use namada::types::key::*; use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; -use namada::types::{error, storage, token}; +use namada::types::{storage, token}; use tokio::time::Instant; use crate::cli::{self, args}; diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index a4441df373c..e1a3c15d316 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -18,11 +18,10 @@ use namada::proof_of_stake::parameters::PosParams; use namada::proto::Tx; use namada::sdk::rpc::{TxBroadcastData, TxResponse}; use namada::sdk::wallet::{Wallet, WalletUtils}; -use namada::sdk::{masp, signing, tx}; +use namada::sdk::{error, masp, signing, tx}; use namada::tendermint_rpc::HttpClient; use namada::types::address::{Address, ImplicitAddress}; use namada::types::dec::Dec; -use namada::types::error; use namada::types::key::{self, *}; use namada::types::transaction::pos::InitValidator; diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index bc7d1694b92..209f84c0533 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -23,6 +23,7 @@ use crate::ledger::queries::{ }; use crate::proto::Tx; use crate::sdk::args; +use crate::sdk::error::Error; use crate::sdk::masp::{ShieldedContext, ShieldedUtils}; use crate::sdk::rpc::{query_wasm_code_hash, validate_amount}; use crate::sdk::tx::prepare_tx; @@ -32,7 +33,6 @@ use crate::types::control_flow::time::{Duration, Instant}; use crate::types::control_flow::{ self, install_shutdown_signal, Halt, TryHalt, }; -use crate::types::error::Error; use crate::types::eth_abi::Encode; use crate::types::eth_bridge_pool::{ GasFee, PendingTransfer, TransferToEthereum, TransferToEthereumKind, diff --git a/shared/src/ledger/events.rs b/shared/src/ledger/events.rs index fd2b2df3f6b..ff5b9f108d3 100644 --- a/shared/src/ledger/events.rs +++ b/shared/src/ledger/events.rs @@ -11,8 +11,8 @@ use borsh::{BorshDeserialize, BorshSerialize}; use serde_json::Value; use crate::ledger::governance::utils::ProposalEvent; +use crate::sdk::error::{EncodingError, Error, EventError}; use crate::tendermint_proto::abci::EventAttribute; -use crate::types::error::{EncodingError, Error, EventError}; use crate::types::ibc::IbcEvent; #[cfg(feature = "ferveo-tpke")] use crate::types::transaction::TxType; diff --git a/shared/src/types/error.rs b/shared/src/sdk/error.rs similarity index 99% rename from shared/src/types/error.rs rename to shared/src/sdk/error.rs index 20d278ddea7..eb5f2b2d166 100644 --- a/shared/src/types/error.rs +++ b/shared/src/sdk/error.rs @@ -9,7 +9,7 @@ use prost::EncodeError; use tendermint_rpc::Error as RpcError; use thiserror::Error; -use crate::types::error::Error::Pinned; +use crate::sdk::error::Error::Pinned; use crate::vm::WasmValidationError; /// The standard Result type that most code ought to return diff --git a/shared/src/sdk/masp.rs b/shared/src/sdk/masp.rs index 6d37b51740c..5d0314b0430 100644 --- a/shared/src/sdk/masp.rs +++ b/shared/src/sdk/masp.rs @@ -61,6 +61,7 @@ use thiserror::Error; use crate::proto::Tx; use crate::sdk::args::InputAmount; +use crate::sdk::error::{EncodingError, Error, PinnedBalanceError, QueryError}; use crate::sdk::queries::Client; use crate::sdk::rpc::{query_conversion, query_storage_value}; use crate::sdk::tx::decode_component; @@ -68,9 +69,6 @@ use crate::sdk::{args, rpc}; use crate::tendermint_rpc::query::Query; use crate::tendermint_rpc::Order; use crate::types::address::{masp, Address}; -use crate::types::error::{ - EncodingError, Error, PinnedBalanceError, QueryError, -}; use crate::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use crate::types::storage::{BlockHeight, Epoch, Key, KeySeg, TxIndex}; use crate::types::token; diff --git a/shared/src/sdk/mod.rs b/shared/src/sdk/mod.rs index cf7236af5f5..381bac03d1c 100644 --- a/shared/src/sdk/mod.rs +++ b/shared/src/sdk/mod.rs @@ -7,5 +7,6 @@ pub mod signing; #[allow(clippy::result_large_err)] pub mod tx; +pub mod error; pub mod queries; pub mod wallet; diff --git a/shared/src/sdk/rpc.rs b/shared/src/sdk/rpc.rs index 464e963a6fb..efcc84a75a7 100644 --- a/shared/src/sdk/rpc.rs +++ b/shared/src/sdk/rpc.rs @@ -31,17 +31,18 @@ use crate::ledger::queries::vp::pos::EnrichedBondsAndUnbondsDetails; use crate::ledger::queries::RPC; use crate::proto::Tx; use crate::sdk::args::InputAmount; +use crate::sdk::error; +use crate::sdk::error::{EncodingError, Error, QueryError}; use crate::tendermint::block::Height; use crate::tendermint::merkle::proof::Proof; use crate::tendermint_rpc::error::Error as TError; use crate::tendermint_rpc::query::Query; use crate::tendermint_rpc::Order; use crate::types::control_flow::{time, Halt, TryHalt}; -use crate::types::error::{EncodingError, Error, QueryError}; use crate::types::hash::Hash; use crate::types::key::common; use crate::types::storage::{BlockHeight, BlockResults, Epoch, PrefixValue}; -use crate::types::{error, storage, token}; +use crate::types::{storage, token}; /// Query the status of a given transaction. /// diff --git a/shared/src/sdk/signing.rs b/shared/src/sdk/signing.rs index 639e3f28c5d..82be9c3aea5 100644 --- a/shared/src/sdk/signing.rs +++ b/shared/src/sdk/signing.rs @@ -28,6 +28,7 @@ use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; use crate::ibc_proto::google::protobuf::Any; use crate::ledger::parameters::storage as parameter_storage; use crate::proto::{MaspBuilder, Section, Tx}; +use crate::sdk::error::{EncodingError, Error, TxError}; use crate::sdk::masp::{ make_asset_type, ShieldedContext, ShieldedTransfer, ShieldedUtils, }; @@ -43,7 +44,6 @@ use crate::sdk::tx::{ pub use crate::sdk::wallet::store::AddressVpType; use crate::sdk::wallet::{Wallet, WalletUtils}; use crate::sdk::{args, rpc}; -use crate::types::error::{EncodingError, Error, TxError}; use crate::types::key::*; use crate::types::masp::{ExtendedViewingKey, PaymentAddress}; use crate::types::storage::Epoch; diff --git a/shared/src/sdk/tx.rs b/shared/src/sdk/tx.rs index fa26619e9f1..ff753aa7f0b 100644 --- a/shared/src/sdk/tx.rs +++ b/shared/src/sdk/tx.rs @@ -44,6 +44,7 @@ use crate::ibc::Height as IbcHeight; use crate::ledger::ibc::storage::ibc_denom_key; use crate::proto::{MaspBuilder, Tx}; use crate::sdk::args::{self, InputAmount}; +use crate::sdk::error::{EncodingError, Error, QueryError, Result, TxError}; use crate::sdk::masp::TransferErr::Build; use crate::sdk::masp::{ShieldedContext, ShieldedTransfer, ShieldedUtils}; use crate::sdk::rpc::{ @@ -55,7 +56,6 @@ use crate::sdk::wallet::{Wallet, WalletUtils}; use crate::tendermint_rpc::endpoint::broadcast::tx_sync::Response; use crate::tendermint_rpc::error::Error as RpcError; use crate::types::control_flow::{time, ProceedOrElse}; -use crate::types::error::{EncodingError, Error, QueryError, Result, TxError}; use crate::types::key::*; use crate::types::masp::TransferTarget; use crate::types::storage::Epoch; diff --git a/shared/src/types/mod.rs b/shared/src/types/mod.rs index 026295d7288..25ffab20545 100644 --- a/shared/src/types/mod.rs +++ b/shared/src/types/mod.rs @@ -1,7 +1,6 @@ //! Types definitions. pub mod control_flow; -pub mod error; pub mod ibc; pub mod key; From fbbdedb697a3134743090335a07d3c9b2932ccd6 Mon Sep 17 00:00:00 2001 From: mariari Date: Thu, 7 Sep 2023 23:50:13 +0800 Subject: [PATCH 053/114] Create Changelog --- .../SDK/1868-shared-utils-folder.md | 21 +++++++++++++++++++ .../improvements/1868-shared-utils-folder.md | 2 ++ 2 files changed, 23 insertions(+) create mode 100644 .changelog/unreleased/SDK/1868-shared-utils-folder.md create mode 100644 .changelog/unreleased/improvements/1868-shared-utils-folder.md diff --git a/.changelog/unreleased/SDK/1868-shared-utils-folder.md b/.changelog/unreleased/SDK/1868-shared-utils-folder.md new file mode 100644 index 00000000000..67af881b6ff --- /dev/null +++ b/.changelog/unreleased/SDK/1868-shared-utils-folder.md @@ -0,0 +1,21 @@ +- The shared-utils topic ([#1868](https://github.com/anoma/namada/pull/1868)) moves the following: + + _Modules_ + | From | To | + |-----------------------------------------|--------------------------------------| + | namada::ledger::tx | namada::sdk::tx | + | namada::ledger::rpc | namada::sdk::rpc | + | namada::ledger::signing | namada::sdk::signing | + | namada::ledger::masp | namada::sdk::masp | + | namada::ledger::args | namada::sdk::args | + | namada::ledger::wallet::alias | namada::sdk::wallet::alias | + | namada::ledger::wallet::derivation_path | namada::sdk::wallet::derivation_path | + | namada::ledger::wallet::keys | namada::sdk::wallet::keys | + | namada::ledger::wallet::pre_genesis | namada::sdk::wallet::pre_genesis | + | namada::ledger::wallet::store | namada::sdk::wallet::store | + | namada::types::error | namada::sdk::error | + + + _Types_ + + | From | To | + |---------------------------------|------------------------------| + | namada::ledger::queires::Client | namada::sdk::queires::Client | diff --git a/.changelog/unreleased/improvements/1868-shared-utils-folder.md b/.changelog/unreleased/improvements/1868-shared-utils-folder.md new file mode 100644 index 00000000000..40d45529b4e --- /dev/null +++ b/.changelog/unreleased/improvements/1868-shared-utils-folder.md @@ -0,0 +1,2 @@ +- Move all functions considered to be apart of the SDK to the SDK + folder. ([#1868](https://github.com/anoma/namada/pull/1868)) From 754ce687c0e70c867a181660cb8654b0339bc404 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 8 Sep 2023 09:44:21 +0000 Subject: [PATCH 054/114] Update ethbridge-rs to v0.24.0 --- Cargo.lock | 41 ++++++--------------------- Cargo.toml | 10 +++---- apps/Cargo.toml | 1 - shared/Cargo.toml | 1 - wasm/Cargo.lock | 35 ++++------------------- wasm_for_tests/wasm_source/Cargo.lock | 35 ++++------------------- 6 files changed, 24 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 143043ddcbd..92053185c66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2106,8 +2106,8 @@ dependencies = [ [[package]] name = "ethbridge-bridge-contract" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethbridge-bridge-events", "ethbridge-structs", @@ -2117,8 +2117,8 @@ dependencies = [ [[package]] name = "ethbridge-bridge-events" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethabi", "ethbridge-structs", @@ -2128,40 +2128,17 @@ dependencies = [ [[package]] name = "ethbridge-events" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethbridge-bridge-events", - "ethbridge-governance-events", "ethers", ] -[[package]] -name = "ethbridge-governance-contract" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" -dependencies = [ - "ethbridge-governance-events", - "ethbridge-structs", - "ethers", - "ethers-contract", -] - -[[package]] -name = "ethbridge-governance-events" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" -dependencies = [ - "ethabi", - "ethbridge-structs", - "ethers", - "ethers-contract", -] - [[package]] name = "ethbridge-structs" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethabi", "ethers", @@ -4088,7 +4065,6 @@ dependencies = [ "derivation-path", "derivative", "ethbridge-bridge-contract", - "ethbridge-governance-contract", "ethers", "eyre", "futures", @@ -4167,7 +4143,6 @@ dependencies = [ "ethabi", "ethbridge-bridge-events", "ethbridge-events", - "ethbridge-governance-events", "eyre", "fd-lock", "ferveo", diff --git a/Cargo.toml b/Cargo.toml index 48141a0f775..e1f3124fbf1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,12 +67,10 @@ directories = "4.0.1" ed25519-consensus = "1.2.0" escargot = "0.5.7" ethabi = "18.0.0" -ethbridge-bridge-contract = {git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.23.0"} -ethbridge-bridge-events = {git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.23.0"} -ethbridge-events = {git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.23.0"} -ethbridge-governance-contract = {git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.23.0"} -ethbridge-governance-events = {git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.23.0"} -ethbridge-structs = { git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.23.0" } +ethbridge-bridge-contract = {git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.24.0"} +ethbridge-bridge-events = {git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.24.0"} +ethbridge-events = {git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.24.0"} +ethbridge-structs = { git = "https://github.com/heliaxdev/ethbridge-rs", tag = "v0.24.0" } ethers = "2.0.0" expectrl = "0.7.0" eyre = "0.6.5" diff --git a/apps/Cargo.toml b/apps/Cargo.toml index 16fe028be33..1d33f55df75 100644 --- a/apps/Cargo.toml +++ b/apps/Cargo.toml @@ -89,7 +89,6 @@ ed25519-consensus.workspace = true ethabi.workspace = true ethbridge-bridge-events.workspace = true ethbridge-events.workspace = true -ethbridge-governance-events.workspace = true eyre.workspace = true fd-lock.workspace = true ferveo-common.workspace = true diff --git a/shared/Cargo.toml b/shared/Cargo.toml index 783a3498837..47023ab9da0 100644 --- a/shared/Cargo.toml +++ b/shared/Cargo.toml @@ -101,7 +101,6 @@ data-encoding.workspace = true derivation-path.workspace = true derivative.workspace = true ethbridge-bridge-contract.workspace = true -ethbridge-governance-contract.workspace = true ethers.workspace = true eyre.workspace = true futures.workspace = true diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 4edaef87c47..d547e7dc8b3 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -1677,8 +1677,8 @@ dependencies = [ [[package]] name = "ethbridge-bridge-contract" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethbridge-bridge-events", "ethbridge-structs", @@ -1688,30 +1688,8 @@ dependencies = [ [[package]] name = "ethbridge-bridge-events" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" -dependencies = [ - "ethabi", - "ethbridge-structs", - "ethers", - "ethers-contract", -] - -[[package]] -name = "ethbridge-governance-contract" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" -dependencies = [ - "ethbridge-governance-events", - "ethbridge-structs", - "ethers", - "ethers-contract", -] - -[[package]] -name = "ethbridge-governance-events" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethabi", "ethbridge-structs", @@ -1721,8 +1699,8 @@ dependencies = [ [[package]] name = "ethbridge-structs" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethabi", "ethers", @@ -3344,7 +3322,6 @@ dependencies = [ "derivation-path", "derivative", "ethbridge-bridge-contract", - "ethbridge-governance-contract", "ethers", "eyre", "futures", diff --git a/wasm_for_tests/wasm_source/Cargo.lock b/wasm_for_tests/wasm_source/Cargo.lock index 2c4f12d24c7..7269fdb27ec 100644 --- a/wasm_for_tests/wasm_source/Cargo.lock +++ b/wasm_for_tests/wasm_source/Cargo.lock @@ -1677,8 +1677,8 @@ dependencies = [ [[package]] name = "ethbridge-bridge-contract" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethbridge-bridge-events", "ethbridge-structs", @@ -1688,30 +1688,8 @@ dependencies = [ [[package]] name = "ethbridge-bridge-events" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" -dependencies = [ - "ethabi", - "ethbridge-structs", - "ethers", - "ethers-contract", -] - -[[package]] -name = "ethbridge-governance-contract" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" -dependencies = [ - "ethbridge-governance-events", - "ethbridge-structs", - "ethers", - "ethers-contract", -] - -[[package]] -name = "ethbridge-governance-events" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethabi", "ethbridge-structs", @@ -1721,8 +1699,8 @@ dependencies = [ [[package]] name = "ethbridge-structs" -version = "0.23.0" -source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.23.0#1bb96e06cbc3889aa46a01e3768bf25f0c78168a" +version = "0.24.0" +source = "git+https://github.com/heliaxdev/ethbridge-rs?tag=v0.24.0#d66708bb8a734111988b9eaf08c7473bd7020c00" dependencies = [ "ethabi", "ethers", @@ -3344,7 +3322,6 @@ dependencies = [ "derivation-path", "derivative", "ethbridge-bridge-contract", - "ethbridge-governance-contract", "ethers", "eyre", "futures", From cb8d6e24c0803e1fa8ce8bfe8b91683576c6709d Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 8 Sep 2023 10:14:16 +0000 Subject: [PATCH 055/114] Scale Ethereum bridge voting power to 12 bytes --- core/src/types/eth_abi.rs | 2 +- .../vote_extensions/validator_set_update.rs | 2 +- core/src/types/voting_power.rs | 32 +++++++++++-------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/core/src/types/eth_abi.rs b/core/src/types/eth_abi.rs index adda87e6c95..4c002ef88fd 100644 --- a/core/src/types/eth_abi.rs +++ b/core/src/types/eth_abi.rs @@ -198,7 +198,7 @@ mod tests { ) .expect("Test failed"), ], - voting_powers: vec![8828299.try_into().unwrap()], + voting_powers: vec![8828299u64.into()], epoch: 0.into(), }; let encoded = valset_update.encode().into_inner(); diff --git a/core/src/types/vote_extensions/validator_set_update.rs b/core/src/types/vote_extensions/validator_set_update.rs index 5a9324fec6b..60cc2e16620 100644 --- a/core/src/types/vote_extensions/validator_set_update.rs +++ b/core/src/types/vote_extensions/validator_set_update.rs @@ -328,7 +328,7 @@ impl From for ethbridge_structs::ValidatorSetArgs { .collect(), powers: voting_powers .into_iter() - .map(|power| u64::from(power).into()) + .map(|power| u128::from(power).into()) .collect(), nonce: epoch.0.into(), } diff --git a/core/src/types/voting_power.rs b/core/src/types/voting_power.rs index 946e08b834a..a229e03ad9a 100644 --- a/core/src/types/voting_power.rs +++ b/core/src/types/voting_power.rs @@ -29,19 +29,28 @@ use crate::types::uint::Uint; Hash, Debug, )] -pub struct EthBridgeVotingPower(u64); +pub struct EthBridgeVotingPower(u128); impl EthBridgeVotingPower { /// Maximum value that can be represented for the voting power /// stored in an Ethereum bridge smart contract. - pub const MAX: Self = Self(1 << 32); + /// + /// The smart contract uses 12-byte integers. + pub const MAX: Self = Self((1 << 96) - 1); } -impl TryFrom for EthBridgeVotingPower { +impl From for EthBridgeVotingPower { + #[inline] + fn from(val: u64) -> Self { + Self(val as u128) + } +} + +impl TryFrom for EthBridgeVotingPower { type Error = (); #[inline] - fn try_from(val: u64) -> Result { + fn try_from(val: u128) -> Result { if val <= Self::MAX.0 { Ok(Self(val)) } else { @@ -51,14 +60,11 @@ impl TryFrom for EthBridgeVotingPower { } impl From<&FractionalVotingPower> for EthBridgeVotingPower { - fn from(ratio: &FractionalVotingPower) -> Self { - // normalize the voting power - // https://github.com/anoma/ethereum-bridge/blob/fe93d2e95ddb193a759811a79c8464ad4d709c12/test/utils/utilities.js#L29 - const NORMALIZED_VOTING_POWER: Uint = - Uint::from_u64(EthBridgeVotingPower::MAX.0); + fn from(FractionalVotingPower(ratio): &FractionalVotingPower) -> Self { + let max_bridge_voting_power = Uint::from(EthBridgeVotingPower::MAX.0); - let voting_power = ratio.0 * NORMALIZED_VOTING_POWER; - let voting_power = voting_power.round().to_integer().low_u64(); + let voting_power = ratio * max_bridge_voting_power; + let voting_power = voting_power.round().to_integer().low_u128(); Self(voting_power) } @@ -78,9 +84,9 @@ impl From for ethereum::U256 { } } -impl From for u64 { +impl From for u128 { #[inline] - fn from(EthBridgeVotingPower(voting_power): EthBridgeVotingPower) -> u64 { + fn from(EthBridgeVotingPower(voting_power): EthBridgeVotingPower) -> u128 { voting_power } } From ed1acef19a4ede8a22009092f278cfa6ed1a2a85 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 8 Sep 2023 09:44:57 +0000 Subject: [PATCH 056/114] Fix compilation errors --- apps/src/lib/config/genesis.rs | 4 - .../lib/node/ledger/ethereum_oracle/events.rs | 88 +++++-------- .../lib/node/ledger/ethereum_oracle/mod.rs | 31 ++--- .../ledger/ethereum_oracle/test_tools/mod.rs | 8 +- .../lib/node/ledger/shell/finalize_block.rs | 24 +--- apps/src/lib/node/ledger/shell/mod.rs | 4 - .../lib/node/ledger/shell/prepare_proposal.rs | 2 - .../lib/node/ledger/shell/process_proposal.rs | 5 - .../shell/vote_extensions/eth_events.rs | 63 +-------- core/src/ledger/eth_bridge/storage/mod.rs | 5 - core/src/ledger/parameters/storage.rs | 2 - core/src/types/eth_bridge_pool.rs | 4 +- core/src/types/ethereum_events.rs | 42 +----- core/src/types/storage.rs | 7 - .../types/vote_extensions/ethereum_events.rs | 3 - .../vote_extensions/validator_set_update.rs | 42 +++--- ethereum_bridge/src/oracle/config.rs | 3 - ethereum_bridge/src/parameters.rs | 23 ---- .../transactions/ethereum_events/events.rs | 121 +++++------------- .../transactions/ethereum_events/mod.rs | 7 - .../protocol/transactions/votes/storage.rs | 2 - .../src/protocol/transactions/votes/update.rs | 1 - ethereum_bridge/src/storage/vote_tallies.rs | 1 - ethereum_bridge/src/test_utils.rs | 8 -- shared/src/ledger/eth_bridge/bridge_pool.rs | 20 +-- shared/src/ledger/eth_bridge/validator_set.rs | 106 ++++++++------- .../ethereum_bridge/bridge_pool_vp.rs | 4 - .../ledger/native_vp/ethereum_bridge/vp.rs | 4 - shared/src/ledger/protocol/mod.rs | 1 - shared/src/ledger/queries/mod.rs | 1 + shared/src/ledger/queries/shell/eth_bridge.rs | 71 +++++----- tests/src/native_vp/eth_bridge_pool.rs | 4 - 32 files changed, 208 insertions(+), 503 deletions(-) diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index 0e5fced67ee..525d25c36b0 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -1150,10 +1150,6 @@ pub fn genesis(num_validators: u64) -> Genesis { address: EthAddress([0; 20]), version: Default::default(), }, - governance: UpgradeableContract { - address: EthAddress([1; 20]), - version: Default::default(), - }, }, }), native_token: address::nam(), diff --git a/apps/src/lib/node/ledger/ethereum_oracle/events.rs b/apps/src/lib/node/ledger/ethereum_oracle/events.rs index bd11cf09e8e..be8a32a8685 100644 --- a/apps/src/lib/node/ledger/ethereum_oracle/events.rs +++ b/apps/src/lib/node/ledger/ethereum_oracle/events.rs @@ -3,15 +3,11 @@ pub mod eth_events { use std::str::FromStr; use ethbridge_bridge_events::{ - BridgeEvents, TransferToErcFilter, TransferToNamadaFilter, - }; - use ethbridge_events::{DynEventCodec, Events as RawEvents}; - use ethbridge_governance_events::{ - GovernanceEvents, NewContractFilter, UpgradedContractFilter, + BridgeEvents, TransferToChainFilter, TransferToErcFilter, ValidatorSetUpdateFilter, }; + use ethbridge_events::{DynEventCodec, Events as RawEvents}; use namada::core::types::ethereum_structs; - use namada::eth_bridge::ethers::contract::EthEvent; use namada::types::address::Address; use namada::types::ethereum_events::{ EthAddress, EthereumEvent, TransferToEthereum, TransferToNamada, Uint, @@ -70,20 +66,17 @@ pub mod eth_events { TransferToErcFilter { nonce, transfers, - valid_map, relayer_address, }, )) => EthereumEvent::TransfersToEthereum { nonce: nonce.parse_uint256()?, transfers: transfers.parse_transfer_to_eth_array()?, - valid_transfers_map: valid_map, relayer: relayer_address.parse_address()?, }, - RawEvents::Bridge(BridgeEvents::TransferToNamadaFilter( - TransferToNamadaFilter { + RawEvents::Bridge(BridgeEvents::TransferToChainFilter( + TransferToChainFilter { nonce, transfers, - valid_map, confirmations: requested_confirmations, }, )) => { @@ -96,34 +89,15 @@ pub mod eth_events { nonce: nonce.parse_uint256()?, transfers: transfers .parse_transfer_to_namada_array()?, - valid_transfers_map: valid_map, } } - RawEvents::Governance(GovernanceEvents::NewContractFilter( - NewContractFilter { name: _, addr: _ }, - )) => { - return Err(Error::NotInUse( - NewContractFilter::name().into(), - )); - } - RawEvents::Governance( - GovernanceEvents::UpgradedContractFilter( - UpgradedContractFilter { name: _, addr: _ }, - ), - ) => { - return Err(Error::NotInUse( - UpgradedContractFilter::name().into(), - )); - } - RawEvents::Governance( - GovernanceEvents::ValidatorSetUpdateFilter( - ValidatorSetUpdateFilter { - validator_set_nonce, - bridge_validator_set_hash, - governance_validator_set_hash, - }, - ), - ) => EthereumEvent::ValidatorSetUpdate { + RawEvents::Bridge(BridgeEvents::ValidatorSetUpdateFilter( + ValidatorSetUpdateFilter { + validator_set_nonce, + bridge_validator_set_hash, + governance_validator_set_hash, + }, + )) => EthereumEvent::ValidatorSetUpdate { nonce: validator_set_nonce.into(), bridge_validator_hash: bridge_validator_set_hash .parse_keccak()?, @@ -253,7 +227,7 @@ pub mod eth_events { } } - impl Parse for Vec { + impl Parse for Vec { fn parse_transfer_to_namada_array( self, ) -> Result> { @@ -264,7 +238,7 @@ pub mod eth_events { } } - impl Parse for ethereum_structs::NamadaTransfer { + impl Parse for ethereum_structs::ChainTransfer { fn parse_transfer_to_namada(self) -> Result { let asset = self.from.parse_eth_address()?; let amount = self.amount.parse_amount()?; @@ -293,7 +267,7 @@ pub mod eth_events { let asset = self.from.parse_eth_address()?; let receiver = self.to.parse_eth_address()?; let amount = self.amount.parse_amount()?; - let checksum = self.namada_data_digest.parse_hash()?; + let checksum = self.data_digest.parse_hash()?; Ok(TransferToEthereum { asset, amount, @@ -321,9 +295,10 @@ pub mod eth_events { use assert_matches::assert_matches; use ethabi::ethereum_types::{H160, U256}; use ethbridge_events::{ - TRANSFER_TO_ERC_CODEC, TRANSFER_TO_NAMADA_CODEC, + TRANSFER_TO_CHAIN_CODEC, TRANSFER_TO_ERC_CODEC, VALIDATOR_SET_UPDATE_CODEC, }; + use namada::eth_bridge::ethers::contract::EthEvent; use super::*; use crate::node::ledger::ethereum_oracle::test_tools::event_log::GetLog; @@ -339,10 +314,9 @@ pub mod eth_events { let lower_than_min_confirmations = 5u64; let (codec, event) = ( - TRANSFER_TO_NAMADA_CODEC, - TransferToNamadaFilter { + TRANSFER_TO_CHAIN_CODEC, + TransferToChainFilter { transfers: vec![], - valid_map: vec![], nonce: 0.into(), confirmations: lower_than_min_confirmations.into(), }, @@ -363,9 +337,10 @@ pub mod eth_events { Ok(()) } - /// Test decoding a [`TransferToNamadaFilter`] Ethereum event. + /// Test decoding a "Transfer to Namada" Ethereum event. #[test] fn test_transfer_to_namada_decode() { + // XXX: this is gonna fail :D let data = vec![ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -396,9 +371,9 @@ pub mod eth_events { 0, 0, 1, ]; - let raw: TransferToNamadaFilter = TRANSFER_TO_NAMADA_CODEC + let raw: TransferToChainFilter = TRANSFER_TO_CHAIN_CODEC .decode(ðabi::RawLog { - topics: vec![TransferToNamadaFilter::signature()], + topics: vec![TransferToChainFilter::signature()], data, }) .expect("Test failed") @@ -407,7 +382,7 @@ pub mod eth_events { assert_eq!( raw.transfers, - vec![ethereum_structs::NamadaTransfer { + vec![ethereum_structs::ChainTransfer { amount: 100u64.into(), from: ethabi::Address::from_str("0x5FbDB2315678afecb367f032d93F642f64180aa3").unwrap(), to: "atest1v4ehgw36xuunwd6989prwdfkxqmnvsfjxs6nvv6xxucrs3f3xcmns3fcxdzrvvz9xverzvzr56le8f".into(), @@ -425,10 +400,9 @@ pub mod eth_events { let higher_than_min_confirmations = 200u64; let (codec, event) = ( - TRANSFER_TO_NAMADA_CODEC, - TransferToNamadaFilter { + TRANSFER_TO_CHAIN_CODEC, + TransferToChainFilter { transfers: vec![], - valid_map: vec![], nonce: 0u64.into(), confirmations: higher_than_min_confirmations.into(), }, @@ -501,16 +475,15 @@ pub mod eth_events { let address: String = "atest1v4ehgw36gep5ysecxq6nyv3jg3zygv3e89qn2vp48pryxsf4xpznvve5gvmy23fs89pryvf5a6ht90" .into(); - let nam_transfers = TransferToNamadaFilter { + let nam_transfers = TransferToChainFilter { transfers: vec![ - ethereum_structs::NamadaTransfer { + ethereum_structs::ChainTransfer { amount: 0u64.into(), from: H160([0; 20]), to: address.clone(), }; 2 ], - valid_map: vec![true; 2], nonce: 0u64.into(), confirmations: 0u64.into(), }; @@ -520,11 +493,10 @@ pub mod eth_events { from: H160([1; 20]), to: H160([2; 20]), amount: 0u64.into(), - namada_data_digest: [0; 32], + data_digest: [0; 32], }; 2 ], - valid_map: vec![true; 2], nonce: 0u64.into(), relayer_address: address, }; @@ -535,8 +507,8 @@ pub mod eth_events { }; assert_eq!( { - let decoded: TransferToNamadaFilter = - TRANSFER_TO_NAMADA_CODEC + let decoded: TransferToChainFilter = + TRANSFER_TO_CHAIN_CODEC .decode(&nam_transfers.clone().get_log()) .expect("Test failed") .try_into() diff --git a/apps/src/lib/node/ledger/ethereum_oracle/mod.rs b/apps/src/lib/node/ledger/ethereum_oracle/mod.rs index a8db91831c8..6980778c075 100644 --- a/apps/src/lib/node/ledger/ethereum_oracle/mod.rs +++ b/apps/src/lib/node/ledger/ethereum_oracle/mod.rs @@ -444,7 +444,6 @@ async fn process( let sig = codec.event_signature(); let addr: Address = match codec.kind() { EventKind::Bridge => config.bridge_contract.into(), - EventKind::Governance => config.governance_contract.into(), }; tracing::debug!( ?block_to_process, @@ -562,9 +561,7 @@ pub mod last_processed_block { mod test_oracle { use std::num::NonZeroU64; - use ethbridge_bridge_events::{ - TransferToErcFilter, TransferToNamadaFilter, - }; + use ethbridge_bridge_events::{TransferToChainFilter, TransferToErcFilter}; use namada::eth_bridge::ethers::types::H160; use namada::eth_bridge::structs::Erc20Transfer; use namada::types::address::testing::gen_established_address; @@ -710,16 +707,15 @@ mod test_oracle { // Increase height above the configured minimum confirmations controller.apply_cmd(TestCmd::NewHeight(min_confirmations.into())); - let new_event = TransferToNamadaFilter { + let new_event = TransferToChainFilter { nonce: 0.into(), transfers: vec![], - valid_map: vec![], confirmations: 100.into(), } .get_log(); let (sender, _) = channel(); controller.apply_cmd(TestCmd::NewEvent { - event_type: event_signature::(), + event_type: event_signature::(), log: new_event, height: 101, seen: sender, @@ -760,16 +756,15 @@ mod test_oracle { // set the oracle to be unresponsive controller.apply_cmd(TestCmd::Unresponsive); // send a new event to the oracle - let new_event = TransferToNamadaFilter { + let new_event = TransferToChainFilter { nonce: 0.into(), transfers: vec![], - valid_map: vec![], confirmations: 100.into(), } .get_log(); let (sender, mut seen) = channel(); controller.apply_cmd(TestCmd::NewEvent { - event_type: event_signature::(), + event_type: event_signature::(), log: new_event, height: 150, seen: sender, @@ -815,10 +810,9 @@ mod test_oracle { controller.apply_cmd(TestCmd::NewHeight(min_confirmations.into())); // confirmed after 100 blocks - let first_event = TransferToNamadaFilter { + let first_event = TransferToChainFilter { nonce: 0.into(), transfers: vec![], - valid_map: vec![], confirmations: 100.into(), } .get_log(); @@ -830,9 +824,8 @@ mod test_oracle { amount: 0.into(), from: H160([0; 20]), to: H160([1; 20]), - namada_data_digest: [0; 32], + data_digest: [0; 32], }], - valid_map: vec![true], relayer_address: gas_payer.to_string(), nonce: 0.into(), } @@ -848,7 +841,7 @@ mod test_oracle { }); let (sender, _recv) = channel(); controller.apply_cmd(TestCmd::NewEvent { - event_type: event_signature::(), + event_type: event_signature::(), log: first_event, height: 100, seen: sender, @@ -859,15 +852,9 @@ mod test_oracle { controller.apply_cmd(TestCmd::NewHeight(Uint256::from(200u32))); // check the correct event is received let event = eth_recv.recv().await.expect("Test failed"); - if let EthereumEvent::TransfersToNamada { - nonce, - transfers, - valid_transfers_map: valid_map, - } = event - { + if let EthereumEvent::TransfersToNamada { nonce, transfers } = event { assert_eq!(nonce, 0.into()); assert!(transfers.is_empty()); - assert!(valid_map.is_empty()); } else { panic!("Test failed, {:?}", event); } diff --git a/apps/src/lib/node/ledger/ethereum_oracle/test_tools/mod.rs b/apps/src/lib/node/ledger/ethereum_oracle/test_tools/mod.rs index 672a1546f8f..9a2454be17b 100644 --- a/apps/src/lib/node/ledger/ethereum_oracle/test_tools/mod.rs +++ b/apps/src/lib/node/ledger/ethereum_oracle/test_tools/mod.rs @@ -6,9 +6,8 @@ pub mod event_log { // p.s.: https://medium.com/mycrypto/understanding-event-logs-on-the-ethereum-blockchain-f4ae7ba50378 use ethbridge_bridge_events::{ - TransferToErcFilter, TransferToNamadaFilter, + TransferToChainFilter, TransferToErcFilter, ValidatorSetUpdateFilter, }; - use ethbridge_governance_events::ValidatorSetUpdateFilter; use namada::eth_bridge::ethers::abi::AbiEncode; use namada::eth_bridge::ethers::contract::EthEvent; @@ -18,7 +17,7 @@ pub mod event_log { fn get_log(self) -> ethabi::RawLog; } - impl GetLog for TransferToNamadaFilter { + impl GetLog for TransferToChainFilter { fn get_log(self) -> ethabi::RawLog { ethabi::RawLog { topics: vec![Self::signature()], @@ -35,8 +34,7 @@ pub mod event_log { self.nonce.to_big_endian(&mut buf); ethabi::ethereum_types::H256(buf) }], - data: (self.transfers, self.valid_map, self.relayer_address) - .encode(), + data: (self.transfers, self.relayer_address).encode(), } } } diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 57ed9269e0d..ae99cfbdd85 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -1538,9 +1538,9 @@ mod test_finalize_block { .clone(); // ---- the ledger receives a new Ethereum event - let event = EthereumEvent::NewContract { - name: "Test".to_string(), - address: EthAddress([0; 20]), + let event = EthereumEvent::TransfersToNamada { + nonce: 0u64.into(), + transfers: vec![], }; tokio_test::block_on(oracle.send(event.clone())).expect("Test failed"); let [queued_event]: [EthereumEvent; 1] = @@ -1616,9 +1616,9 @@ mod test_finalize_block { .clone(); // ---- the ledger receives a new Ethereum event - let event = EthereumEvent::NewContract { - name: "Test".to_string(), - address: EthAddress([0; 20]), + let event = EthereumEvent::TransfersToNamada { + nonce: 0u64.into(), + transfers: vec![], }; tokio_test::block_on(oracle.send(event.clone())).expect("Test failed"); let [queued_event]: [EthereumEvent; 1] = @@ -1736,17 +1736,8 @@ mod test_finalize_block { #[test] /// Test that adding a new erc20 transfer to the bridge pool - /// increments the pool's nonce, whether only invalid transfers - /// were relayed or not. + /// increments the pool's nonce. fn test_bp_nonce_is_incremented() { - test_bp_nonce_is_incremented_aux(false); - test_bp_nonce_is_incremented_aux(true); - } - - /// Helper function to [`test_bp_nonce_is_incremented`]. - /// - /// Sets the validity of the transfer on Ethereum's side. - fn test_bp_nonce_is_incremented_aux(valid_transfer: bool) { use crate::node::ledger::shell::address::nam; test_bp(|shell: &mut TestShell| { let asset = EthAddress([0xff; 20]); @@ -1812,7 +1803,6 @@ mod test_finalize_block { let ethereum_event = EthereumEvent::TransfersToEthereum { nonce: 0u64.into(), transfers: vec![transfer], - valid_transfers_map: vec![valid_transfer], relayer: bertha, }; let (protocol_key, _, _) = diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 46a985b8fcf..af555a8c432 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -988,7 +988,6 @@ where let config = namada::eth_bridge::oracle::config::Config { min_confirmations: config.min_confirmations.into(), bridge_contract: config.contracts.bridge.address, - governance_contract: config.contracts.governance.address, start_block, }; tracing::info!( @@ -2189,7 +2188,6 @@ mod abciplus_mempool_tests { let ethereum_event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let eth_vext = EthereumTxData::EthEventsVext( ethereum_events::Vext { @@ -2242,7 +2240,6 @@ mod abciplus_mempool_tests { let ethereum_event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let ext = { let ext = ethereum_events::Vext { @@ -2276,7 +2273,6 @@ mod abciplus_mempool_tests { let ethereum_event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let ext = { let ext = ethereum_events::Vext { diff --git a/apps/src/lib/node/ledger/shell/prepare_proposal.rs b/apps/src/lib/node/ledger/shell/prepare_proposal.rs index e8633940b9a..a9270c5e373 100644 --- a/apps/src/lib/node/ledger/shell/prepare_proposal.rs +++ b/apps/src/lib/node/ledger/shell/prepare_proposal.rs @@ -804,7 +804,6 @@ mod test_prepare_proposal { let ethereum_event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let signed_vote_extension = { let ev = ethereum_event; @@ -1005,7 +1004,6 @@ mod test_prepare_proposal { let ethereum_event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let signed_eth_ev_vote_extension = { let ext = ethereum_events::Vext { diff --git a/apps/src/lib/node/ledger/shell/process_proposal.rs b/apps/src/lib/node/ledger/shell/process_proposal.rs index dca2d4fe4ed..7ea31dc72c9 100644 --- a/apps/src/lib/node/ledger/shell/process_proposal.rs +++ b/apps/src/lib/node/ledger/shell/process_proposal.rs @@ -1182,7 +1182,6 @@ mod test_process_proposal { let event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let ext = ethereum_events::Vext { validator_addr: addr.clone(), @@ -1309,7 +1308,6 @@ mod test_process_proposal { let event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let ext = ethereum_events::Vext { validator_addr: addr.clone(), @@ -1414,7 +1412,6 @@ mod test_process_proposal { let event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let ext = { // generate a valid signature @@ -1484,7 +1481,6 @@ mod test_process_proposal { let event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let ext = { #[allow(clippy::redundant_clone)] @@ -1540,7 +1536,6 @@ mod test_process_proposal { let event = EthereumEvent::TransfersToNamada { nonce: 0u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let ext = { #[allow(clippy::redundant_clone)] diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs index 1ee2331f23b..b19fc93b143 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs @@ -192,24 +192,11 @@ where /// thus the inclusion of its container Ethereum events vote /// extension. /// - /// Additionally, the length of the transfers array and their - /// respective validity map must match, for the event to be - /// considered valid. - /// /// ## Transfers to Namada /// /// For a transfers to Namada event to be considered valid, /// the nonce of this kind of event must not be lower than /// the one stored in Namada. - /// - /// In this case, the length of the transfers array and their - /// respective validity map must also match. - /// - /// ## Whitelist updates - /// - /// For any of these events to be considered valid, the - /// whitelist update nonce in storage must be greater - /// than or equal to the nonce in the event. fn validate_eth_event( &self, event: &EthereumEvent, @@ -222,20 +209,8 @@ where // out such events, which will time out in storage match event { EthereumEvent::TransfersToEthereum { - nonce: ext_nonce, - transfers, - valid_transfers_map, - .. + nonce: ext_nonce, .. } => { - if transfers.len() != valid_transfers_map.len() { - tracing::debug!( - transfers_len = transfers.len(), - valid_transfers_map_len = valid_transfers_map.len(), - "{}", - VoteExtensionError::TransfersLenMismatch - ); - return Err(VoteExtensionError::TransfersLenMismatch); - } let current_bp_nonce = self.wl_storage.ethbridge_queries().get_bridge_pool_nonce(); if ¤t_bp_nonce != ext_nonce { @@ -249,20 +224,8 @@ where } } EthereumEvent::TransfersToNamada { - nonce: ext_nonce, - transfers, - valid_transfers_map, - .. + nonce: ext_nonce, .. } => { - if transfers.len() != valid_transfers_map.len() { - tracing::debug!( - transfers_len = transfers.len(), - valid_transfers_map_len = valid_transfers_map.len(), - "{}", - VoteExtensionError::TransfersLenMismatch - ); - return Err(VoteExtensionError::TransfersLenMismatch); - } let next_nam_transfers_nonce = self .wl_storage .ethbridge_queries() @@ -514,7 +477,6 @@ mod test_vote_extensions { .validate_eth_event(&EthereumEvent::TransfersToEthereum { nonce, transfers: vec![], - valid_transfers_map: vec![], relayer: gen_established_address(), }) .expect("Test failed"); @@ -524,7 +486,6 @@ mod test_vote_extensions { .validate_eth_event(&EthereumEvent::TransfersToEthereum { nonce: nonce + 1, transfers: vec![], - valid_transfers_map: vec![], relayer: gen_established_address(), }) .expect_err("Test failed"); @@ -532,7 +493,6 @@ mod test_vote_extensions { .validate_eth_event(&EthereumEvent::TransfersToEthereum { nonce: nonce - 1, transfers: vec![], - valid_transfers_map: vec![], relayer: gen_established_address(), }) .expect_err("Test failed"); @@ -542,14 +502,12 @@ mod test_vote_extensions { .validate_eth_event(&EthereumEvent::TransfersToNamada { nonce, transfers: vec![], - valid_transfers_map: vec![], }) .expect("Test failed"); shell .validate_eth_event(&EthereumEvent::TransfersToNamada { nonce: nonce + 5, transfers: vec![], - valid_transfers_map: vec![], }) .expect("Test failed"); @@ -558,14 +516,12 @@ mod test_vote_extensions { .validate_eth_event(&EthereumEvent::TransfersToNamada { nonce: nonce - 1, transfers: vec![], - valid_transfers_map: vec![], }) .expect_err("Test failed"); shell .validate_eth_event(&EthereumEvent::TransfersToNamada { nonce: nonce - 2, transfers: vec![], - valid_transfers_map: vec![], }) .expect_err("Test failed"); @@ -575,7 +531,6 @@ mod test_vote_extensions { .validate_eth_event(&EthereumEvent::TransfersToEthereum { nonce, transfers: vec![], - valid_transfers_map: vec![true, true], relayer: gen_established_address(), }) .expect_err("Test failed"); @@ -583,7 +538,6 @@ mod test_vote_extensions { .validate_eth_event(&EthereumEvent::TransfersToNamada { nonce, transfers: vec![], - valid_transfers_map: vec![true, true], }) .expect_err("Test failed"); } @@ -605,7 +559,6 @@ mod test_vote_extensions { receiver: EthAddress([2; 20]), checksum: Hash::default(), }], - valid_transfers_map: vec![true], relayer: gen_established_address(), }; let event_2 = EthereumEvent::TransfersToEthereum { @@ -616,12 +569,11 @@ mod test_vote_extensions { receiver: EthAddress([2; 20]), checksum: Hash::default(), }], - valid_transfers_map: vec![true], relayer: gen_established_address(), }; - let event_3 = EthereumEvent::NewContract { - name: "Test".to_string(), - address: EthAddress([0; 20]), + let event_3 = EthereumEvent::TransfersToNamada { + nonce: 0.into(), + transfers: vec![], }; tokio_test::block_on(oracle.send(event_1.clone())) @@ -665,7 +617,6 @@ mod test_vote_extensions { receiver: EthAddress([2; 20]), checksum: Hash::default(), }], - valid_transfers_map: vec![true], relayer: gen_established_address(), }; let event_2 = EthereumEvent::NewContract { @@ -725,7 +676,6 @@ mod test_vote_extensions { receiver: EthAddress([2; 20]), checksum: Hash::default(), }], - valid_transfers_map: vec![true], relayer: gen_established_address(), }], block_height: shell @@ -817,7 +767,6 @@ mod test_vote_extensions { receiver: EthAddress([2; 20]), checksum: Hash::default(), }], - valid_transfers_map: vec![true], relayer: gen_established_address(), }], block_height: signed_height, @@ -922,7 +871,6 @@ mod test_vote_extensions { receiver: EthAddress([2; 20]), checksum: Hash::default(), }], - valid_transfers_map: vec![true], relayer: gen_established_address(), }], block_height: shell.wl_storage.storage.get_last_block_height(), @@ -1002,7 +950,6 @@ mod test_vote_extensions { receiver: EthAddress([2; 20]), checksum: Hash::default(), }], - valid_transfers_map: vec![true], relayer: gen_established_address(), }], block_height: shell.wl_storage.storage.get_last_block_height(), diff --git a/core/src/ledger/eth_bridge/storage/mod.rs b/core/src/ledger/eth_bridge/storage/mod.rs index e728603fb7f..5e11db64efe 100644 --- a/core/src/ledger/eth_bridge/storage/mod.rs +++ b/core/src/ledger/eth_bridge/storage/mod.rs @@ -63,11 +63,6 @@ pub fn bridge_contract_key() -> Key { get_bridge_contract_address_key_at_addr(PARAM_ADDRESS) } -/// Storage key for the Ethereum address of the governance contract. -pub fn governance_contract_key() -> Key { - get_governance_contract_address_key_at_addr(PARAM_ADDRESS) -} - #[cfg(test)] mod test { use super::*; diff --git a/core/src/ledger/parameters/storage.rs b/core/src/ledger/parameters/storage.rs index 3e877990164..8d092ff6ee5 100644 --- a/core/src/ledger/parameters/storage.rs +++ b/core/src/ledger/parameters/storage.rs @@ -23,8 +23,6 @@ struct Keys { native_erc20: &'static str, /// Sub-lkey for storing the Ethereum address of the bridge contract. bridge_contract_address: &'static str, - /// Sub-key for storing the Ethereum address of the governance contract. - governance_contract_address: &'static str, // ======================================== // PoS parameters // ======================================== diff --git a/core/src/types/eth_bridge_pool.rs b/core/src/types/eth_bridge_pool.rs index 86b08155095..0f1a8873452 100644 --- a/core/src/types/eth_bridge_pool.rs +++ b/core/src/types/eth_bridge_pool.rs @@ -210,12 +210,12 @@ impl PendingTransfer { impl From<&PendingTransfer> for ethbridge_structs::Erc20Transfer { fn from(pending: &PendingTransfer) -> Self { - let HashDigest(namada_data_digest) = pending.appendix().checksum(); + let HashDigest(data_digest) = pending.appendix().checksum(); Self { from: pending.transfer.asset.0.into(), to: pending.transfer.recipient.0.into(), amount: pending.transfer.amount.into(), - namada_data_digest, + data_digest, } } } diff --git a/core/src/types/ethereum_events.rs b/core/src/types/ethereum_events.rs index 57c8047fdd5..8dce0a39a42 100644 --- a/core/src/types/ethereum_events.rs +++ b/core/src/types/ethereum_events.rs @@ -235,8 +235,6 @@ pub struct TransfersToNamada { pub nonce: Uint, /// The batch of transfers pub transfers: Vec, - /// The indices of the transfers which succeeded or failed - pub valid_transfers_map: Vec, } impl GetEventNonce for TransfersToNamada { @@ -249,16 +247,8 @@ impl GetEventNonce for TransfersToNamada { impl From for EthereumEvent { #[inline] fn from(event: TransfersToNamada) -> Self { - let TransfersToNamada { - nonce, - transfers, - valid_transfers_map, - } = event; - Self::TransfersToNamada { - nonce, - transfers, - valid_transfers_map, - } + let TransfersToNamada { nonce, transfers } = event; + Self::TransfersToNamada { nonce, transfers } } } @@ -285,9 +275,6 @@ pub enum EthereumEvent { /// The batch of transfers #[allow(dead_code)] transfers: Vec, - /// The indices of the transfers which succeeded or failed - #[allow(dead_code)] - valid_transfers_map: Vec, }, /// A confirmation event that a batch of transfers have been made /// from Namada to Ethereum @@ -298,9 +285,6 @@ pub enum EthereumEvent { /// The batch of transfers #[allow(dead_code)] transfers: Vec, - /// The indices of the transfers which succeeded or failed - #[allow(dead_code)] - valid_transfers_map: Vec, /// The Namada address that receives the gas fees /// for relaying a batch of transfers #[allow(dead_code)] @@ -319,25 +303,6 @@ pub enum EthereumEvent { #[allow(dead_code)] governance_validator_hash: KeccakHash, }, - /// Event indication that a new smart contract has been - /// deployed - NewContract { - /// Name of the contract - #[allow(dead_code)] - name: String, - /// Address of the contract on Ethereum - #[allow(dead_code)] - address: EthAddress, - }, - /// Event indicating that a smart contract has been updated - UpgradedContract { - /// Name of the contract - #[allow(dead_code)] - name: String, - /// Address of the contract on Ethereum - #[allow(dead_code)] - address: EthAddress, - }, } impl EthereumEvent { @@ -417,7 +382,7 @@ impl From for TransferToEthereum { }, asset: EthAddress(transfer.from.0), receiver: EthAddress(transfer.to.0), - checksum: Hash(transfer.namada_data_digest), + checksum: Hash(transfer.data_digest), } } } @@ -530,7 +495,6 @@ pub mod testing { asset: arbitrary_eth_address(), receiver, }], - valid_transfers_map: vec![true], } } } diff --git a/core/src/types/storage.rs b/core/src/types/storage.rs index b6467b8a000..b2793a8d62b 100644 --- a/core/src/types/storage.rs +++ b/core/src/types/storage.rs @@ -1482,7 +1482,6 @@ mod tests { let mut queue = EthEventsQueue::default(); queue.transfers_to_namada.next_nonce_to_process = 2u64.into(); let new_event = TransfersToNamada { - valid_transfers_map: vec![], transfers: vec![], nonce: 2u64.into(), }; @@ -1502,7 +1501,6 @@ mod tests { let mut queue = EthEventsQueue::default(); queue.transfers_to_namada.next_nonce_to_process = 3u64.into(); let new_event = TransfersToNamada { - valid_transfers_map: vec![], transfers: vec![], nonce: 2u64.into(), }; @@ -1517,27 +1515,22 @@ mod tests { queue.transfers_to_namada.next_nonce_to_process = 1u64.into(); let new_event_1 = TransfersToNamada { - valid_transfers_map: vec![], transfers: vec![], nonce: 1u64.into(), }; let new_event_2 = TransfersToNamada { - valid_transfers_map: vec![], transfers: vec![], nonce: 2u64.into(), }; let new_event_3 = TransfersToNamada { - valid_transfers_map: vec![], transfers: vec![], nonce: 3u64.into(), }; let new_event_4 = TransfersToNamada { - valid_transfers_map: vec![], transfers: vec![], nonce: 4u64.into(), }; let new_event_7 = TransfersToNamada { - valid_transfers_map: vec![], transfers: vec![], nonce: 7u64.into(), }; diff --git a/core/src/types/vote_extensions/ethereum_events.rs b/core/src/types/vote_extensions/ethereum_events.rs index 863211a18d7..2f7397f1bdb 100644 --- a/core/src/types/vote_extensions/ethereum_events.rs +++ b/core/src/types/vote_extensions/ethereum_events.rs @@ -155,7 +155,6 @@ mod tests { let event = EthereumEvent::TransfersToNamada { nonce, transfers: vec![], - valid_transfers_map: vec![], }; let hash = event.hash().unwrap(); @@ -181,12 +180,10 @@ mod tests { let ev_1 = EthereumEvent::TransfersToNamada { nonce: 1u64.into(), transfers: vec![], - valid_transfers_map: vec![], }; let ev_2 = EthereumEvent::TransfersToEthereum { nonce: 2u64.into(), transfers: vec![], - valid_transfers_map: vec![], relayer: address::testing::established_address_1(), }; diff --git a/core/src/types/vote_extensions/validator_set_update.rs b/core/src/types/vote_extensions/validator_set_update.rs index 60cc2e16620..85557cd6ee4 100644 --- a/core/src/types/vote_extensions/validator_set_update.rs +++ b/core/src/types/vote_extensions/validator_set_update.rs @@ -297,6 +297,24 @@ fn compute_hash( ]) } +/// Given a validator's [`EthAddress`] and its respective +/// [`EthBridgeVotingPower`], return an encoded representation +/// of this data, understood by the smart contract. +#[inline] +fn encode_validator_data( + address: EthAddress, + voting_power: EthBridgeVotingPower, +) -> [u8; 32] { + let address = address.0; + let voting_power = u128::from(voting_power).to_be_bytes(); + + let mut buffer = [0u8; 32]; + buffer[..20].copy_from_slice(&address); + buffer[20..].copy_from_slice(&voting_power[4..]); + + buffer +} + /// Struct for serializing validator set /// arguments with ABI for Ethereum smart /// contracts. @@ -322,13 +340,10 @@ impl From for ethbridge_structs::ValidatorSetArgs { epoch, } = valset; ethbridge_structs::ValidatorSetArgs { - validators: validators - .into_iter() - .map(|addr| addr.0.into()) - .collect(), - powers: voting_powers + validator_set: validators .into_iter() - .map(|power| u128::from(power).into()) + .zip(voting_powers.into_iter()) + .map(|(addr, power)| encode_validator_data(addr, power)) .collect(), nonce: epoch.0.into(), } @@ -337,20 +352,17 @@ impl From for ethbridge_structs::ValidatorSetArgs { impl Encode<1> for ValidatorSetArgs { fn tokenize(&self) -> [Token; 1] { - let addrs = Token::Array( + let validator_set = Token::Array( self.validators .iter() - .map(|addr| Token::Address(addr.0.into())) - .collect(), - ); - let powers = Token::Array( - self.voting_powers - .iter() - .map(|&power| Token::Uint(power.into())) + .zip(self.voting_powers.iter()) + .map(|(&addr, &power)| { + Token::FixedBytes(encode_validator_data(addr, power).into()) + }) .collect(), ); let nonce = Token::Uint(self.epoch.0.into()); - [Token::Tuple(vec![addrs, powers, nonce])] + [Token::Tuple(vec![validator_set, nonce])] } } diff --git a/ethereum_bridge/src/oracle/config.rs b/ethereum_bridge/src/oracle/config.rs index 4ddb3ede1d1..b0718e81d94 100644 --- a/ethereum_bridge/src/oracle/config.rs +++ b/ethereum_bridge/src/oracle/config.rs @@ -12,8 +12,6 @@ pub struct Config { pub min_confirmations: NonZeroU64, /// The Ethereum address of the current bridge contract. pub bridge_contract: EthAddress, - /// The Ethereum address of the current governance contract. - pub governance_contract: EthAddress, /// The earliest Ethereum block from which events may be processed. pub start_block: ethereum_structs::BlockHeight, } @@ -27,7 +25,6 @@ impl std::default::Default for Config { // value that is >= 1 min_confirmations: unsafe { NonZeroU64::new_unchecked(100) }, bridge_contract: EthAddress([0; 20]), - governance_contract: EthAddress([1; 20]), start_block: 0.into(), } } diff --git a/ethereum_bridge/src/parameters.rs b/ethereum_bridge/src/parameters.rs index 6395dd6cabc..c86ef1e6ed3 100644 --- a/ethereum_bridge/src/parameters.rs +++ b/ethereum_bridge/src/parameters.rs @@ -137,8 +137,6 @@ pub struct Contracts { pub native_erc20: EthAddress, /// The Ethereum address of the bridge contract. pub bridge: UpgradeableContract, - /// The Ethereum address of the governance contract. - pub governance: UpgradeableContract, } /// Represents chain parameters for the Ethereum bridge. @@ -183,14 +181,12 @@ impl EthereumBridgeConfig { Contracts { native_erc20, bridge, - governance, }, } = self; let active_key = bridge_storage::active_key(); let min_confirmations_key = bridge_storage::min_confirmations_key(); let native_erc20_key = bridge_storage::native_erc20_key(); let bridge_contract_key = bridge_storage::bridge_contract_key(); - let governance_contract_key = bridge_storage::governance_contract_key(); let eth_start_height_key = bridge_storage::eth_start_height_key(); wl_storage .write_bytes( @@ -207,9 +203,6 @@ impl EthereumBridgeConfig { wl_storage .write_bytes(&bridge_contract_key, encode(bridge)) .unwrap(); - wl_storage - .write_bytes(&governance_contract_key, encode(governance)) - .unwrap(); wl_storage .write_bytes(ð_start_height_key, encode(eth_start_height)) .unwrap(); @@ -309,7 +302,6 @@ impl EthereumOracleConfig { let min_confirmations_key = bridge_storage::min_confirmations_key(); let native_erc20_key = bridge_storage::native_erc20_key(); let bridge_contract_key = bridge_storage::bridge_contract_key(); - let governance_contract_key = bridge_storage::governance_contract_key(); let eth_start_height_key = bridge_storage::eth_start_height_key(); // These reads must succeed otherwise the storage is corrupt or a @@ -318,8 +310,6 @@ impl EthereumOracleConfig { must_read_key(wl_storage, &min_confirmations_key); let native_erc20 = must_read_key(wl_storage, &native_erc20_key); let bridge_contract = must_read_key(wl_storage, &bridge_contract_key); - let governance_contract = - must_read_key(wl_storage, &governance_contract_key); let eth_start_height = must_read_key(wl_storage, ð_start_height_key); Some(Self { @@ -328,7 +318,6 @@ impl EthereumOracleConfig { contracts: Contracts { native_erc20, bridge: bridge_contract, - governance: governance_contract, }, }) } @@ -403,10 +392,6 @@ mod tests { address: EthAddress([23; 20]), version: ContractVersion::default(), }, - governance: UpgradeableContract { - address: EthAddress([18; 20]), - version: ContractVersion::default(), - }, }, }; let serialized = toml::to_string(&config)?; @@ -429,10 +414,6 @@ mod tests { address: EthAddress([23; 20]), version: ContractVersion::default(), }, - governance: UpgradeableContract { - address: EthAddress([18; 20]), - version: ContractVersion::default(), - }, }, }; config.init_storage(&mut wl_storage); @@ -465,10 +446,6 @@ mod tests { address: EthAddress([23; 20]), version: ContractVersion::default(), }, - governance: UpgradeableContract { - address: EthAddress([18; 20]), - version: ContractVersion::default(), - }, }, }; config.init_storage(&mut wl_storage); diff --git a/ethereum_bridge/src/protocol/transactions/ethereum_events/events.rs b/ethereum_bridge/src/protocol/transactions/ethereum_events/events.rs index 48aac0b8de4..d878a56d11c 100644 --- a/ethereum_bridge/src/protocol/transactions/ethereum_events/events.rs +++ b/ethereum_bridge/src/protocol/transactions/ethereum_events/events.rs @@ -45,29 +45,17 @@ where H: 'static + StorageHasher + Sync, { match event { - EthereumEvent::TransfersToNamada { - transfers, - valid_transfers_map, - nonce, - } => act_on_transfers_to_namada( - wl_storage, - TransfersToNamada { - transfers, - valid_transfers_map, - nonce, - }, - ), + EthereumEvent::TransfersToNamada { transfers, nonce } => { + act_on_transfers_to_namada( + wl_storage, + TransfersToNamada { transfers, nonce }, + ) + } EthereumEvent::TransfersToEthereum { ref transfers, ref relayer, - ref valid_transfers_map, .. - } => act_on_transfers_to_eth( - wl_storage, - transfers, - valid_transfers_map, - relayer, - ), + } => act_on_transfers_to_eth(wl_storage, transfers, relayer), _ => { tracing::debug!(?event, "No actions taken for Ethereum event"); Ok(BTreeSet::default()) @@ -93,28 +81,11 @@ where .transfers_to_namada .push_and_iter(transfer_event) .collect(); - for TransfersToNamada { - transfers, - valid_transfers_map, - .. - } in confirmed_events - { + for TransfersToNamada { transfers, .. } in confirmed_events { update_transfers_to_namada_state( wl_storage, &mut changed_keys, - transfers.iter().zip(valid_transfers_map.iter()).filter_map( - |(transfer, &valid)| { - if valid { - Some(transfer) - } else { - tracing::debug!( - ?transfer, - "Ignoring invalid transfer to Namada event" - ); - None - } - }, - ), + transfers.iter(), )?; } Ok(changed_keys) @@ -329,18 +300,13 @@ where fn act_on_transfers_to_eth( wl_storage: &mut WlStorage, transfers: &[TransferToEthereum], - valid_transfers: &[bool], relayer: &Address, ) -> Result> where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, { - tracing::debug!( - ?transfers, - ?valid_transfers, - "Acting on transfers to Ethereum" - ); + tracing::debug!(?transfers, "Acting on transfers to Ethereum"); let mut changed_keys = BTreeSet::default(); // the BP nonce should always be incremented, even if no valid @@ -362,9 +328,7 @@ where .filter(is_pending_transfer_key) .collect(); // Remove the completed transfers from the bridge pool - for (event, is_valid) in - transfers.iter().zip(valid_transfers.iter().copied()) - { + for event in transfers { let (pending_transfer, key) = if let Some((pending, key)) = wl_storage.ethbridge_queries().lookup_transfer_to_eth(event) { @@ -373,27 +337,15 @@ where hints::cold(); unreachable!("The transfer should exist in the bridge pool"); }; - if hints::likely(is_valid) { - tracing::debug!( - ?pending_transfer, - "Valid transfer to Ethereum detected, compensating the \ - relayer and burning any Ethereum assets in Namada" - ); - changed_keys.append(&mut update_transferred_asset_balances( - wl_storage, - &pending_transfer, - )?); - } else { - tracing::debug!( - ?pending_transfer, - "Invalid transfer to Ethereum detected, compensating the \ - relayer and refunding assets in Namada" - ); - changed_keys.append(&mut refund_transferred_assets( - wl_storage, - &pending_transfer, - )?); - } + tracing::debug!( + ?pending_transfer, + "Valid transfer to Ethereum detected, compensating the relayer \ + and burning any Ethereum assets in Namada" + ); + changed_keys.append(&mut update_transferred_asset_balances( + wl_storage, + &pending_transfer, + )?); let pool_balance_key = balance_key(&pending_transfer.gas_fee.token, &BRIDGE_POOL_ADDRESS); let relayer_rewards_key = @@ -625,8 +577,7 @@ mod tests { use namada_core::types::address::{gen_established_address, nam, wnam}; use namada_core::types::eth_bridge_pool::GasFee; use namada_core::types::ethereum_events::testing::{ - arbitrary_eth_address, arbitrary_keccak_hash, arbitrary_nonce, - DAI_ERC20_ETH_ADDRESS, + arbitrary_keccak_hash, arbitrary_nonce, DAI_ERC20_ETH_ADDRESS, }; use namada_core::types::time::DurationSecs; use namada_core::types::token::Amount; @@ -860,21 +811,11 @@ mod tests { let mut wl_storage = TestWlStorage::default(); test_utils::bootstrap_ethereum_bridge(&mut wl_storage); let initial_stored_keys_count = stored_keys_count(&wl_storage); - let events = vec![ - EthereumEvent::NewContract { - name: "bridge".to_string(), - address: arbitrary_eth_address(), - }, - EthereumEvent::UpgradedContract { - name: "bridge".to_string(), - address: arbitrary_eth_address(), - }, - EthereumEvent::ValidatorSetUpdate { - nonce: arbitrary_nonce(), - bridge_validator_hash: arbitrary_keccak_hash(), - governance_validator_hash: arbitrary_keccak_hash(), - }, - ]; + let events = vec![EthereumEvent::ValidatorSetUpdate { + nonce: arbitrary_nonce(), + bridge_validator_hash: arbitrary_keccak_hash(), + governance_validator_hash: arbitrary_keccak_hash(), + }]; for event in events { act_on(&mut wl_storage, event.clone()).unwrap(); @@ -904,7 +845,6 @@ mod tests { }]; let event = EthereumEvent::TransfersToNamada { nonce: arbitrary_nonce(), - valid_transfers_map: transfers.iter().map(|_| true).collect(), transfers, }; @@ -1084,7 +1024,6 @@ mod tests { .collect(); let event = EthereumEvent::TransfersToEthereum { nonce: arbitrary_nonce(), - valid_transfers_map: transfers.iter().map(|_| true).collect(), transfers, relayer: relayer.clone(), }; @@ -1235,7 +1174,6 @@ mod tests { let event = EthereumEvent::TransfersToEthereum { nonce: arbitrary_nonce(), transfers: vec![], - valid_transfers_map: vec![], relayer: gen_implicit_address(), }; let _ = act_on(&mut wl_storage, event).unwrap(); @@ -1428,17 +1366,16 @@ mod tests { ], ); init_balance(&mut wl_storage, &pending_transfers); - let (transfers, valid_transfers_map) = pending_transfers + let transfers = pending_transfers .into_iter() .map(|ref transfer| { let transfer_to_eth: TransferToEthereum = transfer.into(); - (transfer_to_eth, true) + transfer_to_eth }) - .unzip(); + .collect(); let relayer = gen_established_address("random"); let event = EthereumEvent::TransfersToEthereum { nonce: arbitrary_nonce(), - valid_transfers_map, transfers, relayer, }; diff --git a/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs b/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs index 97fa999fb47..fc23cd2742d 100644 --- a/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs +++ b/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs @@ -312,7 +312,6 @@ mod tests { let asset = arbitrary_eth_address(); let body = EthereumEvent::TransfersToNamada { nonce: arbitrary_nonce(), - valid_transfers_map: vec![true], transfers: vec![TransferToNamada { amount, asset, @@ -429,7 +428,6 @@ mod tests { let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), - valid_transfers_map: vec![true], transfers: vec![TransferToNamada { amount: Amount::from(100), asset: DAI_ERC20_ETH_ADDRESS, @@ -493,7 +491,6 @@ mod tests { let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), - valid_transfers_map: vec![true], transfers: vec![TransferToNamada { amount: Amount::from(100), asset: DAI_ERC20_ETH_ADDRESS, @@ -545,7 +542,6 @@ mod tests { let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), - valid_transfers_map: vec![true], transfers: vec![TransferToNamada { amount: Amount::from(100), asset: DAI_ERC20_ETH_ADDRESS, @@ -669,7 +665,6 @@ mod tests { let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), - valid_transfers_map: vec![true], transfers: vec![TransferToNamada { amount: Amount::from(100), asset: DAI_ERC20_ETH_ADDRESS, @@ -700,7 +695,6 @@ mod tests { let new_event = EthereumEvent::TransfersToNamada { nonce: 1.into(), - valid_transfers_map: vec![true], transfers: vec![TransferToNamada { amount: Amount::from(100), asset: DAI_ERC20_ETH_ADDRESS, @@ -798,7 +792,6 @@ mod tests { let receiver = address::testing::established_address_1(); let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), - valid_transfers_map: vec![true], transfers: vec![TransferToNamada { amount: Amount::from(100), asset: DAI_ERC20_ETH_ADDRESS, diff --git a/ethereum_bridge/src/protocol/transactions/votes/storage.rs b/ethereum_bridge/src/protocol/transactions/votes/storage.rs index 4f6d107bb20..5992e3b944b 100644 --- a/ethereum_bridge/src/protocol/transactions/votes/storage.rs +++ b/ethereum_bridge/src/protocol/transactions/votes/storage.rs @@ -129,7 +129,6 @@ mod tests { let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), transfers: vec![], - valid_transfers_map: vec![], }; let keys = vote_tallies::Keys::from(&event); let tally = Tally { @@ -179,7 +178,6 @@ mod tests { let event = EthereumEvent::TransfersToNamada { nonce: 0.into(), transfers: vec![], - valid_transfers_map: vec![], }; let keys = vote_tallies::Keys::from(&event); let tally = Tally { diff --git a/ethereum_bridge/src/protocol/transactions/votes/update.rs b/ethereum_bridge/src/protocol/transactions/votes/update.rs index 369290ef6b5..da1cb644540 100644 --- a/ethereum_bridge/src/protocol/transactions/votes/update.rs +++ b/ethereum_bridge/src/protocol/transactions/votes/update.rs @@ -229,7 +229,6 @@ mod tests { EthereumEvent::TransfersToNamada { nonce: 0.into(), transfers: vec![], - valid_transfers_map: vec![], } } diff --git a/ethereum_bridge/src/storage/vote_tallies.rs b/ethereum_bridge/src/storage/vote_tallies.rs index 084746adbbe..de74c5aebf9 100644 --- a/ethereum_bridge/src/storage/vote_tallies.rs +++ b/ethereum_bridge/src/storage/vote_tallies.rs @@ -263,7 +263,6 @@ mod test { EthereumEvent::TransfersToNamada { nonce: 0.into(), transfers: vec![], - valid_transfers_map: vec![], }, "9E1736C43D19118E6CE4302118AF337109491ECC52757DFB949BAD6A7940B0C2" .to_owned(), diff --git a/ethereum_bridge/src/test_utils.rs b/ethereum_bridge/src/test_utils.rs index aec64633964..1fb44d04b76 100644 --- a/ethereum_bridge/src/test_utils.rs +++ b/ethereum_bridge/src/test_utils.rs @@ -107,10 +107,6 @@ pub fn bootstrap_ethereum_bridge( address: EthAddress([2; 20]), version: ContractVersion::default(), }, - governance: UpgradeableContract { - address: EthAddress([3; 20]), - version: ContractVersion::default(), - }, }, }; config.init_storage(wl_storage); @@ -223,10 +219,6 @@ pub fn init_storage_with_validators( address: EthAddress([42; 20]), version: Default::default(), }, - governance: UpgradeableContract { - address: EthAddress([18; 20]), - version: Default::default(), - }, }, }; config.init_storage(wl_storage); diff --git a/shared/src/ledger/eth_bridge/bridge_pool.rs b/shared/src/ledger/eth_bridge/bridge_pool.rs index 2b2220a5f9c..80038aaf1b4 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool.rs @@ -17,11 +17,11 @@ use serde::{Deserialize, Serialize}; use super::{block_on_eth_sync, eth_sync_or_exit, BlockOnEthSync}; use crate::eth_bridge::ethers::abi::AbiDecode; -use crate::eth_bridge::structs::RelayProof; use crate::ledger::args; use crate::ledger::masp::{ShieldedContext, ShieldedUtils}; use crate::ledger::queries::{ - Client, GenBridgePoolProofReq, GenBridgePoolProofRsp, RPC, + Client, GenBridgePoolProofReq, GenBridgePoolProofRsp, TransferToErcArgs, + RPC, }; use crate::ledger::rpc::{query_wasm_code_hash, validate_amount}; use crate::ledger::tx::prepare_tx; @@ -286,7 +286,7 @@ struct BridgePoolProofResponse { hashes: Vec, relayer_address: Address, total_fees: HashMap, - abi_encoded_proof: Vec, + abi_encoded_args: Vec, } /// Construct a merkle proof of a batch of transfers in @@ -300,7 +300,7 @@ where C: Client + Sync, { let GenBridgePoolProofRsp { - abi_encoded_proof: bp_proof_bytes, + abi_encoded_args, appendices, } = construct_bridge_pool_proof( client, @@ -330,7 +330,7 @@ where ) }) .unwrap_or_default(), - abi_encoded_proof: bp_proof_bytes, + abi_encoded_args, }; println!("{}", serde_json::to_string(&resp).unwrap()); control_flow::proceed(()) @@ -363,8 +363,7 @@ where } let GenBridgePoolProofRsp { - abi_encoded_proof: bp_proof, - .. + abi_encoded_args, .. } = construct_bridge_pool_proof( nam_client, GenBridgePoolProofReq { @@ -395,8 +394,8 @@ where } }; - let bp_proof: RelayProof = - AbiDecode::decode(&bp_proof).try_halt(|error| { + let (validator_set, signatures, bp_proof): TransferToErcArgs = + AbiDecode::decode(&abi_encoded_args).try_halt(|error| { println!("Unable to decode the generated proof: {:?}", error); })?; @@ -433,7 +432,8 @@ where } } - let mut relay_op = bridge.transfer_to_erc(bp_proof); + let mut relay_op = + bridge.transfer_to_erc(validator_set, signatures, bp_proof); if let Some(gas) = args.gas { relay_op.tx.set_gas(gas); } diff --git a/shared/src/ledger/eth_bridge/validator_set.rs b/shared/src/ledger/eth_bridge/validator_set.rs index 7ff30ef07c6..861958a570b 100644 --- a/shared/src/ledger/eth_bridge/validator_set.rs +++ b/shared/src/ledger/eth_bridge/validator_set.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use std::task::Poll; use data_encoding::HEXLOWER; -use ethbridge_governance_contract::Governance; +use ethbridge_bridge_contract::Bridge; use ethers::providers::Middleware; use futures::future::{self, FutureExt}; use namada_core::hints; @@ -139,7 +139,7 @@ impl GetStatus for RelayResult { fn is_successful(&self) -> bool { use RelayResult::*; match self { - GovernanceCallError(_) | NonceError { .. } | NoReceipt => false, + BridgeCallError(_) | NonceError { .. } | NoReceipt => false, Receipt { receipt } => receipt.is_successful(), } } @@ -151,7 +151,7 @@ enum CheckNonce {} /// Do not check the nonce of a relay. enum DoNotCheckNonce {} -/// Determine if the nonce in the Governance smart contract prompts +/// Determine if the nonce in the Bridge smart contract prompts /// a relay operation or not. trait ShouldRelay { /// The result of a relay operation. @@ -161,7 +161,7 @@ trait ShouldRelay { type Future<'gov>: Future> + 'gov; /// Returns [`Ok`] if the relay should happen. - fn should_relay(_: Epoch, _: &Governance) -> Self::Future<'_> + fn should_relay(_: Epoch, _: &Bridge) -> Self::Future<'_> where E: Middleware, E::Error: std::fmt::Display; @@ -175,7 +175,7 @@ impl ShouldRelay for DoNotCheckNonce { type RelayResult = Option; #[inline] - fn should_relay(_: Epoch, _: &Governance) -> Self::Future<'_> + fn should_relay(_: Epoch, _: &Bridge) -> Self::Future<'_> where E: Middleware, E::Error: std::fmt::Display, @@ -194,26 +194,23 @@ impl ShouldRelay for CheckNonce { Pin> + 'gov>>; type RelayResult = RelayResult; - fn should_relay( - epoch: Epoch, - governance: &Governance, - ) -> Self::Future<'_> + fn should_relay(epoch: Epoch, bridge: &Bridge) -> Self::Future<'_> where E: Middleware, E::Error: std::fmt::Display, { Box::pin(async move { - let governance_epoch_prep_call = governance.validator_set_nonce(); - let governance_epoch_fut = - governance_epoch_prep_call.call().map(|result| { + let bridge_epoch_prep_call = bridge.validator_set_nonce(); + let bridge_epoch_fut = + bridge_epoch_prep_call.call().map(|result| { result .map_err(|err| { - RelayResult::GovernanceCallError(err.to_string()) + RelayResult::BridgeCallError(err.to_string()) }) .map(|e| Epoch(e.as_u64())) }); - let gov_current_epoch = governance_epoch_fut.await?; + let gov_current_epoch = bridge_epoch_fut.await?; if epoch == gov_current_epoch + 1u64 { Ok(()) } else { @@ -233,15 +230,15 @@ impl ShouldRelay for CheckNonce { /// Relay result for [`CheckNonce`]. enum RelayResult { - /// The call to Governance failed. - GovernanceCallError(String), + /// The call to Bridge failed. + BridgeCallError(String), /// Some nonce related error occurred. /// /// The following comparison must hold: `contract + 1 = argument`. NonceError { /// The value of the [`Epoch`] argument passed via CLI. argument: Epoch, - /// The value of the [`Epoch`] in the Governance contract. + /// The value of the [`Epoch`] in the bridge contract. contract: Epoch, }, /// No receipt was returned from the relay operation. @@ -351,8 +348,8 @@ where eth_client, nam_client, |relay_result| match relay_result { - RelayResult::GovernanceCallError(reason) => { - tracing::error!(reason, "Calling Governance failed"); + RelayResult::BridgeCallError(reason) => { + tracing::error!(reason, "Calling Bridge failed"); } RelayResult::NonceError { argument, contract } => { let whence = match argument.cmp(&contract) { @@ -441,27 +438,25 @@ where } // we could be racing against governance updates, - // so it is best to always fetch the latest governance + // so it is best to always fetch the latest Bridge // contract address - let governance = - get_governance_contract(nam_client, Arc::clone(ð_client)) - .await - .try_halt(|err| { - // only care about displaying errors, - // exit on all circumstances - _ = err.handle(); - })?; - let governance_epoch_prep_call = governance.validator_set_nonce(); - let governance_epoch_fut = - governance_epoch_prep_call.call().map(|result| { - result - .map_err(|err| { - tracing::error!( - "Failed to fetch latest validator set nonce: {err}" - ); - }) - .map(|e| e.as_u64() as i128) - }); + let bridge = get_bridge_contract(nam_client, Arc::clone(ð_client)) + .await + .try_halt(|err| { + // only care about displaying errors, + // exit on all circumstances + _ = err.handle(); + })?; + let bridge_epoch_prep_call = bridge.validator_set_nonce(); + let bridge_epoch_fut = bridge_epoch_prep_call.call().map(|result| { + result + .map_err(|err| { + tracing::error!( + "Failed to fetch latest validator set nonce: {err}" + ); + }) + .map(|e| e.as_u64() as i128) + }); let shell = RPC.shell(); let nam_current_epoch_fut = shell.epoch(nam_client).map(|result| { @@ -475,7 +470,7 @@ where }); let (nam_current_epoch, gov_current_epoch) = - futures::try_join!(nam_current_epoch_fut, governance_epoch_fut) + futures::try_join!(nam_current_epoch_fut, bridge_epoch_fut) .try_halt(|()| ())?; tracing::debug!( @@ -486,11 +481,11 @@ where let new_epoch = match nam_current_epoch - gov_current_epoch { // NB: a namada epoch should always be one behind the nonce - // in the governance contract, for the latter to be considered + // in the bridge contract, for the latter to be considered // up to date -1 => { tracing::debug!( - "Nothing to do, since the validator set in the Governance \ + "Nothing to do, since the validator set in the Bridge \ contract is up to date", ); last_call_succeeded = false; @@ -504,7 +499,7 @@ where // NB: if the nonce difference is lower than 0, somehow the state // of namada managed to fall behind the state of the smart contract _ => { - tracing::error!("The Governance contract is ahead of Namada!"); + tracing::error!("The Bridge contract is ahead of Namada!"); last_call_succeeded = false; continue; } @@ -541,21 +536,21 @@ where } } -async fn get_governance_contract( +async fn get_bridge_contract( nam_client: &C, eth_client: Arc, -) -> Result, Error> +) -> Result, Error> where C: Client + Sync, E: Middleware, { - let governance_contract = RPC + let bridge_contract = RPC .shell() .eth_bridge() - .read_governance_contract(nam_client) + .read_bridge_contract(nam_client) .await .map_err(|err| Error::critical(err.to_string()))?; - Ok(Governance::new(governance_contract.address, eth_client)) + Ok(Bridge::new(bridge_contract.address, eth_client)) } async fn relay_validator_set_update_once( @@ -597,13 +592,13 @@ where shell.read_consensus_valset(nam_client, &bridge_current_epoch); let shell = RPC.shell().eth_bridge(); - let governance_address_fut = shell.read_governance_contract(nam_client); + let bridge_address_fut = shell.read_bridge_contract(nam_client); - let (encoded_proof, encoded_validator_set_args, governance_contract) = + let (encoded_proof, encoded_validator_set_args, bridge_contract) = futures::try_join!( encoded_proof_fut, encoded_validator_set_args_fut, - governance_address_fut + bridge_address_fut ) .map_err(|err| R::try_recover(err.to_string()))?; @@ -615,19 +610,18 @@ where let consensus_set: ValidatorSetArgs = abi_decode_struct(encoded_validator_set_args); - let governance = Governance::new(governance_contract.address, eth_client); + let bridge = Bridge::new(bridge_contract.address, eth_client); - if let Err(result) = R::should_relay(epoch_to_relay, &governance).await { + if let Err(result) = R::should_relay(epoch_to_relay, &bridge).await { action(result); return Err(Error::NoContext); } - let mut relay_op = governance.update_validators_set( + let mut relay_op = bridge.update_validator_set( consensus_set, bridge_hash, gov_hash, signatures, - epoch_to_relay.0.into(), ); if let Some(gas) = args.gas { relay_op.tx.set_gas(gas); @@ -688,7 +682,7 @@ mod tests { }) .is_successful() ); - assert!(!RelayResult::GovernanceCallError("".into()).is_successful()); + assert!(!RelayResult::BridgeCallError("".into()).is_successful()); assert!( !RelayResult::NonceError { contract: 0.into(), diff --git a/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs b/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs index 89b1b332536..8a7e65cb78c 100644 --- a/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs @@ -860,10 +860,6 @@ mod test_bridge_pool_vp { address: EthAddress([42; 20]), version: Default::default(), }, - governance: UpgradeableContract { - address: EthAddress([18; 20]), - version: Default::default(), - }, }, }; let mut wl_storage = WlStorage { diff --git a/shared/src/ledger/native_vp/ethereum_bridge/vp.rs b/shared/src/ledger/native_vp/ethereum_bridge/vp.rs index 650c065ab7b..4d006229a13 100644 --- a/shared/src/ledger/native_vp/ethereum_bridge/vp.rs +++ b/shared/src/ledger/native_vp/ethereum_bridge/vp.rs @@ -236,10 +236,6 @@ mod tests { address: EthAddress([42; 20]), version: Default::default(), }, - governance: UpgradeableContract { - address: EthAddress([18; 20]), - version: Default::default(), - }, }, }; config.init_storage(&mut wl_storage); diff --git a/shared/src/ledger/protocol/mod.rs b/shared/src/ledger/protocol/mod.rs index c6ed0814b17..301f399b37e 100644 --- a/shared/src/ledger/protocol/mod.rs +++ b/shared/src/ledger/protocol/mod.rs @@ -1141,7 +1141,6 @@ mod tests { asset: DAI_ERC20_ETH_ADDRESS, receiver: address::testing::established_address_4(), }], - valid_transfers_map: vec![true], }; let vext = EthereumEventsVext { block_height: BlockHeight(100), diff --git a/shared/src/ledger/queries/mod.rs b/shared/src/ledger/queries/mod.rs index aa87ce29036..cd236f1a6ff 100644 --- a/shared/src/ledger/queries/mod.rs +++ b/shared/src/ledger/queries/mod.rs @@ -14,6 +14,7 @@ use vp::{Vp, VP}; pub use self::shell::eth_bridge::{ Erc20FlowControl, GenBridgePoolProofReq, GenBridgePoolProofRsp, + TransferToErcArgs, }; use super::storage::traits::StorageHasher; use super::storage::{DBIter, DB}; diff --git a/shared/src/ledger/queries/shell/eth_bridge.rs b/shared/src/ledger/queries/shell/eth_bridge.rs index 2588ef33bd5..fa81320b011 100644 --- a/shared/src/ledger/queries/shell/eth_bridge.rs +++ b/shared/src/ledger/queries/shell/eth_bridge.rs @@ -16,7 +16,7 @@ use namada_core::types::eth_bridge_pool::PendingTransferAppendix; use namada_core::types::ethereum_events::{ EthAddress, EthereumEvent, TransferToEthereum, }; -use namada_core::types::ethereum_structs::RelayProof; +use namada_core::types::ethereum_structs; use namada_core::types::storage::{BlockHeight, DbKeySeg, Key}; use namada_core::types::token::Amount; use namada_core::types::vote_extensions::validator_set_update::{ @@ -31,8 +31,7 @@ use namada_ethereum_bridge::storage::eth_bridge_queries::EthBridgeQueries; use namada_ethereum_bridge::storage::proof::{sort_sigs, EthereumProof}; use namada_ethereum_bridge::storage::vote_tallies::{eth_msgs_prefix, Keys}; use namada_ethereum_bridge::storage::{ - bridge_contract_key, governance_contract_key, native_erc20_key, - vote_tallies, + bridge_contract_key, native_erc20_key, vote_tallies, }; use namada_proof_of_stake::pos_queries::PosQueries; @@ -69,11 +68,18 @@ pub struct GenBridgePoolProofReq<'transfers, 'relayer> { pub with_appendix: bool, } +/// Arguments to pass to `transfer_to_erc`. +pub type TransferToErcArgs = ( + ethereum_structs::ValidatorSetArgs, + Vec, + ethereum_structs::RelayProof, +); + /// Response data returned by `generate_bridge_pool_proof`. #[derive(Debug, Clone, Eq, PartialEq, BorshSerialize, BorshDeserialize)] pub struct GenBridgePoolProofRsp { - /// Ethereum ABI encoded [`RelayProof`]. - pub abi_encoded_proof: Vec, + /// Ethereum ABI encoded arguments to pass to `transfer_to_erc`. + pub abi_encoded_args: Vec, /// Appendix data of all requested pending transfers. pub appendices: Option>>, } @@ -81,9 +87,9 @@ pub struct GenBridgePoolProofRsp { impl GenBridgePoolProofRsp { /// Retrieve all [`PendingTransfer`] instances returned from the RPC server. pub fn pending_transfers(self) -> impl Iterator { - RelayProof::decode(&self.abi_encoded_proof) + TransferToErcArgs::decode(&self.abi_encoded_args) .into_iter() - .flat_map(|proof| proof.transfers) + .flat_map(|(_, _, proof)| proof.transfers) .zip(self.appendices.into_iter().flatten()) .map(|(event, appendix)| { let event: TransferToEthereum = event.into(); @@ -127,11 +133,6 @@ router! {ETH_BRIDGE, ( "validator_set" / "consensus" / [epoch: Epoch] ) -> EncodeCell = read_consensus_valset, - // Read the address and version of the Ethereum bridge's Governance - // smart contract. - ( "contracts" / "governance" ) - -> UpgradeableContract = read_governance_contract, - // Read the address and version of the Ethereum bridge's Bridge // smart contract. ( "contracts" / "bridge" ) @@ -202,19 +203,6 @@ where Ok(contract) } -/// Read the address and version of the Ethereum bridge's Governance -/// smart contract. -#[inline] -fn read_governance_contract( - ctx: RequestCtx<'_, D, H>, -) -> storage_api::Result -where - D: 'static + DB + for<'iter> DBIter<'iter> + Sync, - H: 'static + StorageHasher + Sync, -{ - read_contract(&governance_contract_key(), ctx) -} - /// Read the address and version of the Ethereum bridge's Bridge /// smart contract. #[inline] @@ -411,12 +399,7 @@ where .wl_storage .ethbridge_queries() .get_validator_set_args(None); - let relay_proof = RelayProof { - validator_set_args: validator_args.into(), - signatures: sort_sigs( - &voting_powers, - &signed_root.signatures, - ), + let relay_proof = ethereum_structs::RelayProof { transfers, pool_root: signed_root.data.0.0, proof: proof.proof.into_iter().map(|hash| hash.0).collect(), @@ -424,10 +407,16 @@ where batch_nonce: signed_root.data.1.into(), relayer_address: relayer.to_string(), }; + let validator_set: ethereum_structs::ValidatorSetArgs = + validator_args.into(); + let signatures = + sort_sigs(&voting_powers, &signed_root.signatures); let rsp = GenBridgePoolProofRsp { - abi_encoded_proof: ethers::abi::AbiEncode::encode( + abi_encoded_args: ethers::abi::AbiEncode::encode(( + validator_set, + signatures, relay_proof, - ), + )), appendices: with_appendix.then_some(appendices), }; let data = rsp.try_to_vec().into_storage_result()?; @@ -1072,9 +1061,7 @@ mod test_ethbridge_router { .wl_storage .ethbridge_queries() .get_validator_set_args(None); - let data = RelayProof { - validator_set_args: validator_args.into(), - signatures: sort_sigs(&voting_powers, &signed_root.signatures), + let relay_proof = ethereum_structs::RelayProof { transfers: vec![(&transfer).into()], pool_root: signed_root.data.0.0, proof: proof.proof.into_iter().map(|hash| hash.0).collect(), @@ -1082,8 +1069,15 @@ mod test_ethbridge_router { batch_nonce: Default::default(), relayer_address: bertha_address().to_string(), }; - let proof = ethers::abi::AbiEncode::encode(data); - assert_eq!(proof, resp.data.abi_encoded_proof); + let signatures = sort_sigs(&voting_powers, &signed_root.signatures); + let validator_set: ethereum_structs::ValidatorSetArgs = + validator_args.into(); + let encoded = ethers::abi::AbiEncode::encode(( + validator_set, + signatures, + relay_proof, + )); + assert_eq!(encoded, resp.data.abi_encoded_args); } /// Test if the merkle tree including a transfer has not had its @@ -1291,7 +1285,6 @@ mod test_ethbridge_router { let eth_event = EthereumEvent::TransfersToEthereum { nonce: Default::default(), transfers: vec![event_transfer.clone()], - valid_transfers_map: vec![true], relayer: bertha_address(), }; let eth_msg_key = vote_tallies::Keys::from(ð_event); diff --git a/tests/src/native_vp/eth_bridge_pool.rs b/tests/src/native_vp/eth_bridge_pool.rs index 22584e1464c..364dcd074c6 100644 --- a/tests/src/native_vp/eth_bridge_pool.rs +++ b/tests/src/native_vp/eth_bridge_pool.rs @@ -77,10 +77,6 @@ mod test_bridge_pool_vp { address: EthAddress([42; 20]), version: Default::default(), }, - governance: UpgradeableContract { - address: EthAddress([18; 20]), - version: Default::default(), - }, }, }; // initialize Ethereum bridge storage From 56d5cd6e263bae7cd337f843fef9928df461044d Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 11 Sep 2023 14:51:58 +0100 Subject: [PATCH 057/114] Fix unit tests --- .../lib/node/ledger/ethereum_oracle/events.rs | 43 ++++++++----------- .../shell/vote_extensions/eth_events.rs | 40 +++++++---------- core/src/types/eth_abi.rs | 12 +++--- .../types/vote_extensions/ethereum_events.rs | 6 +-- ethereum_bridge/src/storage/vote_tallies.rs | 2 +- 5 files changed, 45 insertions(+), 58 deletions(-) diff --git a/apps/src/lib/node/ledger/ethereum_oracle/events.rs b/apps/src/lib/node/ledger/ethereum_oracle/events.rs index be8a32a8685..4baae5e19f5 100644 --- a/apps/src/lib/node/ledger/ethereum_oracle/events.rs +++ b/apps/src/lib/node/ledger/ethereum_oracle/events.rs @@ -340,35 +340,30 @@ pub mod eth_events { /// Test decoding a "Transfer to Namada" Ethereum event. #[test] fn test_transfer_to_namada_decode() { - // XXX: this is gonna fail :D let data = vec![ + 170, 156, 23, 249, 166, 216, 156, 37, 67, 204, 150, 161, 103, + 163, 161, 122, 243, 66, 109, 149, 141, 194, 27, 80, 238, 109, + 40, 128, 254, 233, 54, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 160, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 189, 178, 49, 86, + 120, 175, 236, 179, 103, 240, 50, 217, 63, 100, 47, 100, 24, + 10, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 189, - 178, 49, 86, 120, 175, 236, 179, 103, 240, 50, 217, 63, 100, - 47, 100, 24, 10, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, - 97, 116, 101, 115, 116, 49, 118, 52, 101, 104, 103, 119, 51, - 54, 120, 117, 117, 110, 119, 100, 54, 57, 56, 57, 112, 114, - 119, 100, 102, 107, 120, 113, 109, 110, 118, 115, 102, 106, - 120, 115, 54, 110, 118, 118, 54, 120, 120, 117, 99, 114, 115, - 51, 102, 51, 120, 99, 109, 110, 115, 51, 102, 99, 120, 100, - 122, 114, 118, 118, 122, 57, 120, 118, 101, 114, 122, 118, 122, - 114, 53, 54, 108, 101, 56, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, + 0, 0, 0, 84, 97, 116, 101, 115, 116, 49, 118, 52, 101, 104, + 103, 119, 51, 54, 120, 117, 117, 110, 119, 100, 54, 57, 56, 57, + 112, 114, 119, 100, 102, 107, 120, 113, 109, 110, 118, 115, + 102, 106, 120, 115, 54, 110, 118, 118, 54, 120, 120, 117, 99, + 114, 115, 51, 102, 51, 120, 99, 109, 110, 115, 51, 102, 99, + 120, 100, 122, 114, 118, 118, 122, 57, 120, 118, 101, 114, 122, + 118, 122, 114, 53, 54, 108, 101, 56, 102, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, ]; let raw: TransferToChainFilter = TRANSFER_TO_CHAIN_CODEC diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs index b19fc93b143..0dd85bfd700 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs @@ -524,22 +524,6 @@ mod test_vote_extensions { transfers: vec![], }) .expect_err("Test failed"); - - // either kind of transfer with different validity map and transfer - // array length are invalid - shell - .validate_eth_event(&EthereumEvent::TransfersToEthereum { - nonce, - transfers: vec![], - relayer: gen_established_address(), - }) - .expect_err("Test failed"); - shell - .validate_eth_event(&EthereumEvent::TransfersToNamada { - nonce, - transfers: vec![], - }) - .expect_err("Test failed"); } /// Test that we successfully receive ethereum events @@ -580,22 +564,30 @@ mod test_vote_extensions { .expect("Test failed"); tokio_test::block_on(oracle.send(event_3.clone())) .expect("Test failed"); - let [event_first, event_second]: [EthereumEvent; 2] = + + let got_events: [EthereumEvent; 2] = shell.new_ethereum_events().try_into().expect("Test failed"); + let expected_events: Vec<_> = std::collections::BTreeSet::from([ + event_1.clone(), + event_3.clone(), + ]) + .into_iter() + .collect(); + assert_eq!(expected_events, got_events); - assert_eq!(event_first, event_1); - assert_eq!(event_second, event_3); // check that we queue and de-duplicate events tokio_test::block_on(oracle.send(event_2.clone())) .expect("Test failed"); tokio_test::block_on(oracle.send(event_3.clone())) .expect("Test failed"); - let [event_first, event_second, event_third]: [EthereumEvent; 3] = - shell.new_ethereum_events().try_into().expect("Test failed"); - assert_eq!(event_first, event_1); - assert_eq!(event_second, event_2); - assert_eq!(event_third, event_3); + let got_events: [EthereumEvent; 3] = + shell.new_ethereum_events().try_into().expect("Test failed"); + let expected_events: Vec<_> = + std::collections::BTreeSet::from([event_1, event_2, event_3]) + .into_iter() + .collect(); + assert_eq!(expected_events, got_events); } /// Test that ethereum events are added to vote extensions. diff --git a/core/src/types/eth_abi.rs b/core/src/types/eth_abi.rs index 4c002ef88fd..27d2b93db17 100644 --- a/core/src/types/eth_abi.rs +++ b/core/src/types/eth_abi.rs @@ -203,12 +203,12 @@ mod tests { }; let encoded = valset_update.encode().into_inner(); let encoded = HEXLOWER.encode(&encoded); - let expected = "00000000000000000000000000000000000000000000000000000000000000200000\ - 00000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000\ - 000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000\ - 00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000\ - 241d37b7cf5233b3b0b204321420a86e8f7bfdb50000000000000000000000000000000000000000000000000000\ - 000000000001000000000000000000000000000000000000000000000000000000000086b58b"; + let expected = "000000000000000000000000000000000000000000000000000000000000002\ + 000000000000000000000000000000000000000000000000000000000000000\ + 400000000000000000000000000000000000000000000000000000000000000\ + 000000000000000000000000000000000000000000000000000000000000000\ + 0001241d37b7cf5233b3b0b204321420a86e8f7bfdb50000000000000000008\ + 6b58b"; assert_eq!(expected, encoded); } } diff --git a/core/src/types/vote_extensions/ethereum_events.rs b/core/src/types/vote_extensions/ethereum_events.rs index 2f7397f1bdb..efd019c76b1 100644 --- a/core/src/types/vote_extensions/ethereum_events.rs +++ b/core/src/types/vote_extensions/ethereum_events.rs @@ -161,9 +161,9 @@ mod tests { assert_eq!( hash, Hash([ - 237, 76, 45, 220, 228, 238, 146, 153, 170, 10, 70, 130, 32, 16, - 67, 66, 231, 34, 223, 166, 173, 203, 204, 195, 54, 19, 165, - 119, 63, 252, 187, 132 + 94, 131, 116, 129, 41, 204, 178, 144, 24, 8, 185, 16, 103, 236, + 209, 191, 20, 89, 145, 17, 41, 233, 31, 98, 185, 6, 217, 204, + 80, 38, 224, 23 ]) ); } diff --git a/ethereum_bridge/src/storage/vote_tallies.rs b/ethereum_bridge/src/storage/vote_tallies.rs index de74c5aebf9..23ec02bfec1 100644 --- a/ethereum_bridge/src/storage/vote_tallies.rs +++ b/ethereum_bridge/src/storage/vote_tallies.rs @@ -264,7 +264,7 @@ mod test { nonce: 0.into(), transfers: vec![], }, - "9E1736C43D19118E6CE4302118AF337109491ECC52757DFB949BAD6A7940B0C2" + "AB24A95F44CECA5D2AED4B6D056ADDDD8539F44C6CD6CA506534E830C82EA8A8" .to_owned(), ) } From 92810ebba71b2f9bfd04d7c4e953737af42a9a5c Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 12 Sep 2023 11:05:33 +0100 Subject: [PATCH 058/114] Rework validator set args eth bridge query --- .../vote_extensions/validator_set_update.rs | 11 ++- .../src/storage/eth_bridge_queries.rs | 40 +++++++++-- shared/src/ledger/eth_bridge/validator_set.rs | 46 ++++++++++--- shared/src/ledger/queries/shell/eth_bridge.rs | 68 ++++++++++++++----- 4 files changed, 131 insertions(+), 34 deletions(-) diff --git a/core/src/types/vote_extensions/validator_set_update.rs b/core/src/types/vote_extensions/validator_set_update.rs index 85557cd6ee4..448347b8fdb 100644 --- a/core/src/types/vote_extensions/validator_set_update.rs +++ b/core/src/types/vote_extensions/validator_set_update.rs @@ -318,7 +318,16 @@ fn encode_validator_data( /// Struct for serializing validator set /// arguments with ABI for Ethereum smart /// contracts. -#[derive(Debug, Clone, Default, Eq, PartialEq)] +#[derive( + Debug, + Clone, + Default, + Eq, + PartialEq, + BorshSerialize, + BorshDeserialize, + BorshSchema, +)] // TODO: find a new home for this type pub struct ValidatorSetArgs { /// Ethereum addresses of the validators. diff --git a/ethereum_bridge/src/storage/eth_bridge_queries.rs b/ethereum_bridge/src/storage/eth_bridge_queries.rs index 5d068d2e38c..5e2f7b63991 100644 --- a/ethereum_bridge/src/storage/eth_bridge_queries.rs +++ b/ethereum_bridge/src/storage/eth_bridge_queries.rs @@ -354,12 +354,16 @@ where } } - /// Query the consensus [`ValidatorSetArgs`] at the given [`Epoch`]. + /// Query a chosen [`ValidatorSetArgs`] at the given [`Epoch`]. /// Also returns a map of each validator's voting power. - pub fn get_validator_set_args( + fn get_validator_set_args( self, epoch: Option, - ) -> (ValidatorSetArgs, VotingPowersMap) { + mut select_validator: F, + ) -> (ValidatorSetArgs, VotingPowersMap) + where + F: FnMut(&EthAddrBook) -> EthAddress, + { let epoch = epoch .unwrap_or_else(|| self.wl_storage.storage.get_current_epoch().0); @@ -377,12 +381,12 @@ where let (validators, voting_powers) = voting_powers_map .get_sorted() .into_iter() - .map(|(&EthAddrBook { hot_key_addr, .. }, &power)| { + .map(|(addr_book, &power)| { let voting_power: EthBridgeVotingPower = FractionalVotingPower::new(power.into(), total_power) .expect("Fractional voting power should be >1") .into(); - (hot_key_addr, voting_power) + (select_validator(addr_book), voting_power) }) .unzip(); @@ -396,6 +400,32 @@ where ) } + /// Query the Bridge [`ValidatorSetArgs`] at the given [`Epoch`]. + /// Also returns a map of each validator's voting power. + #[inline] + pub fn get_bridge_validator_set( + self, + epoch: Option, + ) -> (ValidatorSetArgs, VotingPowersMap) { + self.get_validator_set_args( + epoch, + |&EthAddrBook { hot_key_addr, .. }| hot_key_addr, + ) + } + + /// Query the Governance [`ValidatorSetArgs`] at the given [`Epoch`]. + /// Also returns a map of each validator's voting power. + #[inline] + pub fn get_governance_validator_set( + self, + epoch: Option, + ) -> (ValidatorSetArgs, VotingPowersMap) { + self.get_validator_set_args( + epoch, + |&EthAddrBook { cold_key_addr, .. }| cold_key_addr, + ) + } + /// Check if the token at the given [`EthAddress`] is whitelisted. pub fn is_token_whitelisted(self, &token: &EthAddress) -> bool { let key = whitelist::Key { diff --git a/shared/src/ledger/eth_bridge/validator_set.rs b/shared/src/ledger/eth_bridge/validator_set.rs index 861958a570b..d0cfbb2a23a 100644 --- a/shared/src/ledger/eth_bridge/validator_set.rs +++ b/shared/src/ledger/eth_bridge/validator_set.rs @@ -17,13 +17,15 @@ use namada_core::types::storage::Epoch; use super::{block_on_eth_sync, eth_sync_or, eth_sync_or_exit, BlockOnEthSync}; use crate::eth_bridge::ethers::abi::{AbiDecode, AbiType, Tokenizable}; use crate::eth_bridge::ethers::core::types::TransactionReceipt; -use crate::eth_bridge::structs::{Signature, ValidatorSetArgs}; +use crate::eth_bridge::structs::Signature; use crate::ledger::args; use crate::ledger::queries::{Client, RPC}; use crate::types::control_flow::time::{self, Duration, Instant}; use crate::types::control_flow::{ self, install_shutdown_signal, Halt, TryHalt, }; +use crate::types::ethereum_events::EthAddress; +use crate::types::vote_extensions::validator_set_update::ValidatorSetArgs; /// Relayer related errors. #[derive(Debug, Default)] @@ -292,20 +294,44 @@ pub async fn query_validator_set_args( ) where C: Client + Sync, { + use serde::Serialize; + + #[derive(Serialize)] + struct Validator { + addr: EthAddress, + voting_power: u128, + } + + #[derive(Serialize)] + struct ValidatorSet { + set: Vec, + } + let epoch = if let Some(epoch) = args.epoch { epoch } else { RPC.shell().epoch(client).await.unwrap() }; - let encoded_validator_set_args = RPC + let ValidatorSetArgs { + validators, + voting_powers, + .. + } = RPC .shell() .eth_bridge() - .read_consensus_valset(client, &epoch) + .read_bridge_valset(client, &epoch) .await .unwrap(); + let validator_set = ValidatorSet { + set: validators + .into_iter() + .zip(voting_powers.into_iter().map(u128::from)) + .map(|(addr, voting_power)| Validator { addr, voting_power }) + .collect(), + }; - println!("0x{}", HEXLOWER.encode(encoded_validator_set_args.as_ref())); + println!("{}", serde_json::to_string_pretty(&validator_set).unwrap()); } /// Relay a validator set update, signed off for a given epoch. @@ -588,16 +614,16 @@ where let bridge_current_epoch = epoch_to_relay - 1; let shell = RPC.shell().eth_bridge(); - let encoded_validator_set_args_fut = - shell.read_consensus_valset(nam_client, &bridge_current_epoch); + let validator_set_args_fut = + shell.read_bridge_valset(nam_client, &bridge_current_epoch); let shell = RPC.shell().eth_bridge(); let bridge_address_fut = shell.read_bridge_contract(nam_client); - let (encoded_proof, encoded_validator_set_args, bridge_contract) = + let (encoded_proof, validator_set_args, bridge_contract) = futures::try_join!( encoded_proof_fut, - encoded_validator_set_args_fut, + validator_set_args_fut, bridge_address_fut ) .map_err(|err| R::try_recover(err.to_string()))?; @@ -607,8 +633,6 @@ where [u8; 32], Vec, ) = abi_decode_struct(encoded_proof); - let consensus_set: ValidatorSetArgs = - abi_decode_struct(encoded_validator_set_args); let bridge = Bridge::new(bridge_contract.address, eth_client); @@ -618,7 +642,7 @@ where } let mut relay_op = bridge.update_validator_set( - consensus_set, + validator_set_args.into(), bridge_hash, gov_hash, signatures, diff --git a/shared/src/ledger/queries/shell/eth_bridge.rs b/shared/src/ledger/queries/shell/eth_bridge.rs index fa81320b011..aeedbf2e59f 100644 --- a/shared/src/ledger/queries/shell/eth_bridge.rs +++ b/shared/src/ledger/queries/shell/eth_bridge.rs @@ -127,11 +127,17 @@ router! {ETH_BRIDGE, -> EncodeCell> = read_valset_upd_proof, - // Request the set of consensus validator at the given epoch. + // Request the set of bridge validators at the given epoch. // // The request may fail if no validator set exists at that epoch. - ( "validator_set" / "consensus" / [epoch: Epoch] ) - -> EncodeCell = read_consensus_valset, + ( "validator_set" / "bridge" / [epoch: Epoch] ) + -> ValidatorSetArgs = read_bridge_valset, + + // Request the set of governance validators at the given epoch. + // + // The request may fail if no validator set exists at that epoch. + ( "validator_set" / "governance" / [epoch: Epoch] ) + -> ValidatorSetArgs = read_governance_valset, // Read the address and version of the Ethereum bridge's Bridge // smart contract. @@ -398,7 +404,7 @@ where let (validator_args, voting_powers) = ctx .wl_storage .ethbridge_queries() - .get_validator_set_args(None); + .get_bridge_validator_set(None); let relay_proof = ethereum_structs::RelayProof { transfers, pool_root: signed_root.data.0.0, @@ -558,14 +564,44 @@ where Ok(proof.map(|set| (epoch, set)).encode()) } -/// Read the consensus set of validators at the given [`Epoch`]. +/// Request the set of bridge validators at the given epoch. +/// +/// This method may fail if no set of validators exists yet, +/// at that [`Epoch`]. +fn read_bridge_valset( + ctx: RequestCtx<'_, D, H>, + epoch: Epoch, +) -> storage_api::Result +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + let current_epoch = ctx.wl_storage.storage.last_epoch; + if epoch > current_epoch.next() { + Err(storage_api::Error::Custom(CustomError( + format!( + "Requesting Bridge validator set at {epoch:?}, but the last \ + installed epoch is still {current_epoch:?}" + ) + .into(), + ))) + } else { + Ok(ctx + .wl_storage + .ethbridge_queries() + .get_bridge_validator_set(Some(epoch)) + .0) + } +} + +/// Request the set of governance validators at the given epoch. /// /// This method may fail if no set of validators exists yet, /// at that [`Epoch`]. -fn read_consensus_valset( +fn read_governance_valset( ctx: RequestCtx<'_, D, H>, epoch: Epoch, -) -> storage_api::Result> +) -> storage_api::Result where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, @@ -574,7 +610,7 @@ where if epoch > current_epoch.next() { Err(storage_api::Error::Custom(CustomError( format!( - "Requesting consensus validator set at {epoch:?}, but the \ + "Requesting Governance validator set at {epoch:?}, but the \ last installed epoch is still {current_epoch:?}" ) .into(), @@ -583,9 +619,8 @@ where Ok(ctx .wl_storage .ethbridge_queries() - .get_validator_set_args(Some(epoch)) - .0 - .encode()) + .get_governance_validator_set(Some(epoch)) + .0) } } @@ -627,7 +662,7 @@ where let (_, voting_powers) = ctx .wl_storage .ethbridge_queries() - .get_validator_set_args(Some(epoch)); + .get_bridge_validator_set(Some(epoch)); Ok(voting_powers) } @@ -667,7 +702,7 @@ mod test_ethbridge_router { }; use crate::types::ethereum_events::EthAddress; - /// Test that reading the consensus validator set works. + /// Test that reading the bridge validator set works. #[tokio::test] async fn test_read_consensus_valset() { let mut client = TestClient::new(RPC); @@ -688,7 +723,7 @@ mod test_ethbridge_router { let validator_set = RPC .shell() .eth_bridge() - .read_consensus_valset(&client, &epoch) + .read_bridge_valset(&client, &epoch) .await .unwrap(); let expected = { @@ -722,7 +757,6 @@ mod test_ethbridge_router { validators, voting_powers, } - .encode() }; assert_eq!(validator_set, expected); @@ -749,7 +783,7 @@ mod test_ethbridge_router { let result = RPC .shell() .eth_bridge() - .read_consensus_valset(&client, &Epoch(999_999)) + .read_bridge_valset(&client, &Epoch(999_999)) .await; let Err(err) = result else { panic!("Test failed"); @@ -1060,7 +1094,7 @@ mod test_ethbridge_router { let (validator_args, voting_powers) = client .wl_storage .ethbridge_queries() - .get_validator_set_args(None); + .get_bridge_validator_set(None); let relay_proof = ethereum_structs::RelayProof { transfers: vec![(&transfer).into()], pool_root: signed_root.data.0.0, From e25d4533bd2a9ebb08480d54565aa6ffc5fc8b6d Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 12 Sep 2023 11:33:47 +0100 Subject: [PATCH 059/114] Fix Ethereum validator set hashes --- .../vote_extensions/validator_set_update.rs | 68 ++++++++----------- ethereum_bridge/src/storage/proof.rs | 7 +- 2 files changed, 33 insertions(+), 42 deletions(-) diff --git a/core/src/types/vote_extensions/validator_set_update.rs b/core/src/types/vote_extensions/validator_set_update.rs index 448347b8fdb..23dedb6bd2e 100644 --- a/core/src/types/vote_extensions/validator_set_update.rs +++ b/core/src/types/vote_extensions/validator_set_update.rs @@ -4,7 +4,6 @@ use std::cmp::Ordering; use std::collections::HashMap; use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; -use ethabi::ethereum_types as ethereum; use crate::proto::Signed; use crate::types::address::Address; @@ -165,16 +164,16 @@ pub trait VotingPowersMapExt { /// sorted in descending order by voting power, as this is more efficient to /// deal with on the Ethereum side when working out if there is enough /// voting power for a given validator set update. - fn get_abi_encoded(&self) -> (Vec, Vec, Vec) { + fn get_abi_encoded(&self) -> (Vec, Vec) { let sorted = self.get_sorted(); let total_voting_power: token::Amount = sorted.iter().map(|&(_, &voting_power)| voting_power).sum(); - // split the vec into three portions - sorted.into_iter().fold( - Default::default(), - |accum, (addr_book, &voting_power)| { + // split the vec into two portions + sorted + .into_iter() + .map(|(addr_book, &voting_power)| { let voting_power: EthBridgeVotingPower = FractionalVotingPower::new( voting_power.into(), @@ -186,22 +185,23 @@ pub trait VotingPowersMapExt { ) .into(); - let (mut hot_key_addrs, mut cold_key_addrs, mut voting_powers) = - accum; let &EthAddrBook { - hot_key_addr: EthAddress(hot_key_addr), - cold_key_addr: EthAddress(cold_key_addr), + hot_key_addr, + cold_key_addr, } = addr_book; - hot_key_addrs - .push(Token::Address(ethereum::H160(hot_key_addr))); - cold_key_addrs - .push(Token::Address(ethereum::H160(cold_key_addr))); - voting_powers.push(Token::Uint(voting_power.into())); - - (hot_key_addrs, cold_key_addrs, voting_powers) - }, - ) + ( + Token::FixedBytes( + encode_validator_data(hot_key_addr, voting_power) + .into(), + ), + Token::FixedBytes( + encode_validator_data(cold_key_addr, voting_power) + .into(), + ), + ) + }) + .unzip() } /// Returns the bridge and governance keccak hashes of @@ -211,13 +211,11 @@ pub trait VotingPowersMapExt { &self, next_epoch: Epoch, ) -> (KeccakHash, KeccakHash) { - let (hot_key_addrs, cold_key_addrs, voting_powers) = - self.get_abi_encoded(); + let (bridge_validators, governance_validators) = self.get_abi_encoded(); valset_upd_toks_to_hashes( next_epoch, - hot_key_addrs, - cold_key_addrs, - voting_powers, + bridge_validators, + governance_validators, ) } } @@ -227,23 +225,20 @@ pub trait VotingPowersMapExt { /// voting powers, normalized to `2^32`. pub fn valset_upd_toks_to_hashes( next_epoch: Epoch, - hot_key_addrs: Vec, - cold_key_addrs: Vec, - voting_powers: Vec, + bridge_validators: Vec, + governance_validators: Vec, ) -> (KeccakHash, KeccakHash) { let bridge_hash = compute_hash( next_epoch, BRIDGE_CONTRACT_VERSION, BRIDGE_CONTRACT_NAMESPACE, - hot_key_addrs, - voting_powers.clone(), + bridge_validators, ); let governance_hash = compute_hash( next_epoch, GOVERNANCE_CONTRACT_VERSION, GOVERNANCE_CONTRACT_NAMESPACE, - cold_key_addrs, - voting_powers, + governance_validators, ); (bridge_hash, governance_hash) } @@ -286,13 +281,11 @@ fn compute_hash( contract_version: u8, contract_namespace: &str, validators: Vec, - voting_powers: Vec, ) -> KeccakHash { AbiEncode::keccak256(&[ Token::Uint(contract_version.into()), Token::String(contract_namespace.into()), Token::Array(validators), - Token::Array(voting_powers), epoch_to_token(next_epoch), ]) } @@ -430,11 +423,11 @@ mod tests { // const ethers = require('ethers'); // const keccak256 = require('keccak256') // - // const abiEncoder = new ethers.utils.AbiCoder(); + // const abiEncoder = new ethers.AbiCoder(); // // const output = abiEncoder.encode( - // ['uint256', 'string', 'address[]', 'uint256[]', 'uint256'], - // [1, 'bridge', [], [], 1], + // ['uint256', 'string', 'bytes32[]', 'uint256'], + // [1, 'bridge', [], 1], // ); // // const hash = keccak256(output).toString('hex'); @@ -442,14 +435,13 @@ mod tests { // console.log(hash); // ``` const EXPECTED: &str = - "b8da710845ad3b9e8a9dec6639a0b1a60c90441037cc0845c4b45d5aed19ec59"; + "b97454f4c266c0d223651a52a705d76f3be337ace04be4590d9aedab9818dabc"; let KeccakHash(got) = compute_hash( 1u64.into(), BRIDGE_CONTRACT_VERSION, BRIDGE_CONTRACT_NAMESPACE, vec![], - vec![], ); assert_eq!(&HEXLOWER.encode(&got[..]), EXPECTED); diff --git a/ethereum_bridge/src/storage/proof.rs b/ethereum_bridge/src/storage/proof.rs index c25033bb9f2..a0287258837 100644 --- a/ethereum_bridge/src/storage/proof.rs +++ b/ethereum_bridge/src/storage/proof.rs @@ -102,14 +102,13 @@ pub fn sort_sigs( impl Encode<1> for EthereumProof<(Epoch, VotingPowersMap)> { fn tokenize(&self) -> [eth_abi::Token; 1] { let signatures = sort_sigs(&self.data.1, &self.signatures); - let (hot_key_addrs, cold_key_addrs, voting_powers) = + let (bridge_validators, governance_validators) = self.data.1.get_abi_encoded(); let (KeccakHash(bridge_hash), KeccakHash(gov_hash)) = valset_upd_toks_to_hashes( self.data.0, - hot_key_addrs, - cold_key_addrs, - voting_powers, + bridge_validators, + governance_validators, ); [eth_abi::Token::Tuple(vec![ eth_abi::Token::FixedBytes(bridge_hash.to_vec()), From 3ebc8c4618da5c9a38b1f7e4d73de3efcc7d6e19 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 12 Sep 2023 13:05:21 +0100 Subject: [PATCH 060/114] Query Bridge and Governance Ethereum validator sets --- apps/src/lib/cli.rs | 102 +++++++++++++----- apps/src/lib/cli/relayer.rs | 22 +++- shared/src/ledger/args.rs | 13 ++- shared/src/ledger/eth_bridge/validator_set.rs | 70 +++++++++--- 4 files changed, 163 insertions(+), 44 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 7ef136bc98c..f122796880c 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2290,10 +2290,12 @@ pub mod cmds { /// Used as sub-commands (`SubCmd` instance) in `namadar` binary. #[derive(Clone, Debug)] pub enum ValidatorSet { - /// Query an Ethereum ABI encoding of the consensus validator - /// set in Namada, at the given epoch, or the latest - /// one, if none is provided. - ConsensusValidatorSet(ConsensusValidatorSet), + /// Query the Bridge validator set in Namada, at the given epoch, + /// or the latest one, if none is provided. + BridgeValidatorSet(BridgeValidatorSet), + /// Query the Governance validator set in Namada, at the given epoch, + /// or the latest one, if none is provided. + GovernanceValidatorSet(GovernanceValidatorSet), /// Query an Ethereum ABI encoding of a proof of the consensus /// validator set in Namada, at the given epoch, or the next /// one, if none is provided. @@ -2308,14 +2310,19 @@ pub mod cmds { fn parse(matches: &ArgMatches) -> Option { matches.subcommand_matches(Self::CMD).and_then(|matches| { - let consensus_validator_set = - ConsensusValidatorSet::parse(matches) - .map(Self::ConsensusValidatorSet); + let bridge_validator_set = BridgeValidatorSet::parse(matches) + .map(Self::BridgeValidatorSet); + let governance_validator_set = + GovernanceValidatorSet::parse(matches) + .map(Self::GovernanceValidatorSet); let validator_set_proof = ValidatorSetProof::parse(matches) .map(Self::ValidatorSetProof); let relay = ValidatorSetUpdateRelay::parse(matches) .map(Self::ValidatorSetUpdateRelay); - consensus_validator_set.or(validator_set_proof).or(relay) + bridge_validator_set + .or(governance_validator_set) + .or(validator_set_proof) + .or(relay) }) } @@ -2327,34 +2334,56 @@ pub mod cmds { contracts.", ) .subcommand_required(true) - .subcommand(ConsensusValidatorSet::def().display_order(1)) + .subcommand(BridgeValidatorSet::def().display_order(1)) + .subcommand(GovernanceValidatorSet::def().display_order(1)) .subcommand(ValidatorSetProof::def().display_order(1)) .subcommand(ValidatorSetUpdateRelay::def().display_order(1)) } } #[derive(Clone, Debug)] - pub struct ConsensusValidatorSet( - pub args::ConsensusValidatorSet, + pub struct BridgeValidatorSet(pub args::BridgeValidatorSet); + + impl SubCmd for BridgeValidatorSet { + const CMD: &'static str = "bridge"; + + fn parse(matches: &ArgMatches) -> Option { + matches + .subcommand_matches(Self::CMD) + .map(|matches| Self(args::BridgeValidatorSet::parse(matches))) + } + + fn def() -> App { + App::new(Self::CMD) + .about( + "Query the Bridge validator set in Namada, at the given \ + epoch, or the latest one, if none is provided.", + ) + .add_args::>() + } + } + + #[derive(Clone, Debug)] + pub struct GovernanceValidatorSet( + pub args::GovernanceValidatorSet, ); - impl SubCmd for ConsensusValidatorSet { - const CMD: &'static str = "consensus"; + impl SubCmd for GovernanceValidatorSet { + const CMD: &'static str = "governance"; fn parse(matches: &ArgMatches) -> Option { matches.subcommand_matches(Self::CMD).map(|matches| { - Self(args::ConsensusValidatorSet::parse(matches)) + Self(args::GovernanceValidatorSet::parse(matches)) }) } fn def() -> App { App::new(Self::CMD) .about( - "Query an Ethereum ABI encoding of the consensus \ - validator set in Namada, at the requested epoch, or the \ - current one, if no epoch is provided.", + "Query the Governance validator set in Namada, at the \ + given epoch, or the latest one, if none is provided.", ) - .add_args::>() + .add_args::>() } } @@ -3184,18 +3213,18 @@ pub mod args { } } - impl CliToSdkCtxless> - for ConsensusValidatorSet + impl CliToSdkCtxless> + for BridgeValidatorSet { - fn to_sdk_ctxless(self) -> ConsensusValidatorSet { - ConsensusValidatorSet:: { + fn to_sdk_ctxless(self) -> BridgeValidatorSet { + BridgeValidatorSet:: { query: self.query.to_sdk_ctxless(), epoch: self.epoch, } } } - impl Args for ConsensusValidatorSet { + impl Args for BridgeValidatorSet { fn parse(matches: &ArgMatches) -> Self { let query = Query::parse(matches); let epoch = EPOCH.parse(matches); @@ -3205,12 +3234,37 @@ pub mod args { fn def(app: App) -> App { app.add_args::>().arg( EPOCH.def().help( - "The epoch of the consensus set of validators to query.", + "The epoch of the Bridge set of validators to query.", ), ) } } + impl CliToSdkCtxless> + for GovernanceValidatorSet + { + fn to_sdk_ctxless(self) -> GovernanceValidatorSet { + GovernanceValidatorSet:: { + query: self.query.to_sdk_ctxless(), + epoch: self.epoch, + } + } + } + + impl Args for GovernanceValidatorSet { + fn parse(matches: &ArgMatches) -> Self { + let query = Query::parse(matches); + let epoch = EPOCH.parse(matches); + Self { query, epoch } + } + + fn def(app: App) -> App { + app.add_args::>().arg(EPOCH.def().help( + "The epoch of the Governance set of validators to query.", + )) + } + } + impl CliToSdkCtxless> for ValidatorSetProof { diff --git a/apps/src/lib/cli/relayer.rs b/apps/src/lib/cli/relayer.rs index 242a9ff061b..807dc9f6f37 100644 --- a/apps/src/lib/cli/relayer.rs +++ b/apps/src/lib/cli/relayer.rs @@ -124,7 +124,7 @@ impl CliApi { } }, cli::NamadaRelayer::ValidatorSet(sub) => match sub { - ValidatorSet::ConsensusValidatorSet(ConsensusValidatorSet( + ValidatorSet::BridgeValidatorSet(BridgeValidatorSet( mut args, )) => { let client = client.unwrap_or_else(|| { @@ -137,9 +137,27 @@ impl CliApi { .await .proceed_or_else(error)?; let args = args.to_sdk_ctxless(); - validator_set::query_validator_set_args(&client, args) + validator_set::query_bridge_validator_set(&client, args) .await; } + ValidatorSet::GovernanceValidatorSet( + GovernanceValidatorSet(mut args), + ) => { + let client = client.unwrap_or_else(|| { + C::from_tendermint_address( + &mut args.query.ledger_address, + ) + }); + client + .wait_until_node_is_synced() + .await + .proceed_or_else(error)?; + let args = args.to_sdk_ctxless(); + validator_set::query_governnace_validator_set( + &client, args, + ) + .await; + } ValidatorSet::ValidatorSetProof(ValidatorSetProof( mut args, )) => { diff --git a/shared/src/ledger/args.rs b/shared/src/ledger/args.rs index d3413c588b9..b765dece5a0 100644 --- a/shared/src/ledger/args.rs +++ b/shared/src/ledger/args.rs @@ -822,9 +822,18 @@ pub struct RelayBridgePoolProof { pub safe_mode: bool, } -/// Consensus validator set arguments. +/// Bridge validator set arguments. #[derive(Debug, Clone)] -pub struct ConsensusValidatorSet { +pub struct BridgeValidatorSet { + /// The query parameters. + pub query: Query, + /// The epoch to query. + pub epoch: Option, +} + +/// Governance validator set arguments. +#[derive(Debug, Clone)] +pub struct GovernanceValidatorSet { /// The query parameters. pub query: Query, /// The epoch to query. diff --git a/shared/src/ledger/eth_bridge/validator_set.rs b/shared/src/ledger/eth_bridge/validator_set.rs index d0cfbb2a23a..d37bfb10d55 100644 --- a/shared/src/ledger/eth_bridge/validator_set.rs +++ b/shared/src/ledger/eth_bridge/validator_set.rs @@ -287,13 +287,62 @@ pub async fn query_validator_set_update_proof( println!("0x{}", HEXLOWER.encode(encoded_proof.as_ref())); } -/// Query an ABI encoding of the validator set at a given epoch. -pub async fn query_validator_set_args( +/// Query an ABI encoding of the Bridge validator set at a given epoch. +pub async fn query_bridge_validator_set( client: &C, - args: args::ConsensusValidatorSet, -) where + args: args::BridgeValidatorSet, +) -> Halt<()> +where + C: Client + Sync, +{ + let epoch = if let Some(epoch) = args.epoch { + epoch + } else { + RPC.shell().epoch(client).await.unwrap() + }; + + let args = RPC + .shell() + .eth_bridge() + .read_bridge_valset(client, &epoch) + .await + .try_halt(|err| { + tracing::error!(%err, "Failed to fetch Bridge validator set"); + })?; + + display_validator_set(args); + control_flow::proceed(()) +} + +/// Query an ABI encoding of the Governance validator set at a given epoch. +pub async fn query_governnace_validator_set( + client: &C, + args: args::GovernanceValidatorSet, +) -> Halt<()> +where C: Client + Sync, { + let epoch = if let Some(epoch) = args.epoch { + epoch + } else { + RPC.shell().epoch(client).await.unwrap() + }; + + let args = RPC + .shell() + .eth_bridge() + .read_governance_valset(client, &epoch) + .await + .try_halt(|err| { + tracing::error!(%err, "Failed to fetch Governance validator set"); + })?; + + display_validator_set(args); + control_flow::proceed(()) +} + +/// Display the given [`ValidatorSetArgs`]. +fn display_validator_set(args: ValidatorSetArgs) { use serde::Serialize; #[derive(Serialize)] @@ -307,22 +356,11 @@ pub async fn query_validator_set_args( set: Vec, } - let epoch = if let Some(epoch) = args.epoch { - epoch - } else { - RPC.shell().epoch(client).await.unwrap() - }; - let ValidatorSetArgs { validators, voting_powers, .. - } = RPC - .shell() - .eth_bridge() - .read_bridge_valset(client, &epoch) - .await - .unwrap(); + } = args; let validator_set = ValidatorSet { set: validators .into_iter() From 0e52848f873814eff4ae0d7cd9a6b1811d6a2e74 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Mon, 11 Sep 2023 17:50:10 +0200 Subject: [PATCH 061/114] Changes `SocketAddr` to `String` to identify validators by hostnames --- apps/src/lib/cli.rs | 4 ++-- apps/src/lib/client/utils.rs | 4 ++-- genesis/e2e-tests-single-node.toml | 2 +- tests/src/e2e/setup.rs | 14 +++++++------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 7ef136bc98c..f0b001beba7 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2611,7 +2611,7 @@ pub mod args { arg("max-commission-rate-change"); pub const MAX_ETH_GAS: ArgOpt = arg_opt("max_eth-gas"); pub const MODE: ArgOpt = arg_opt("mode"); - pub const NET_ADDRESS: Arg = arg("net-address"); + pub const NET_ADDRESS: Arg = arg("net-address"); pub const NAMADA_START_TIME: ArgOpt = arg_opt("time"); pub const NO_CONVERSIONS: ArgFlag = flag("no-conversions"); pub const NUT: ArgFlag = flag("nut"); @@ -5567,7 +5567,7 @@ pub mod args { pub alias: String, pub commission_rate: Dec, pub max_commission_rate_change: Dec, - pub net_address: SocketAddr, + pub net_address: String, pub unsafe_dont_encrypt: bool, pub key_scheme: SchemeType, } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 77b18f9136f..5e5bebc3934 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -799,8 +799,8 @@ pub fn init_network( config.ledger.cometbft.p2p.addr_book_strict = !localhost; // Clear the net address from the config and use it to set ports let net_address = validator_config.net_address.take().unwrap(); - let _ip = SocketAddr::from_str(&net_address).unwrap().ip(); - let first_port = SocketAddr::from_str(&net_address).unwrap().port(); + let split: Vec<&str> = net_address.split(':').collect(); + let first_port = split[1].parse::().unwrap(); if localhost { config.ledger.cometbft.p2p.laddr = TendermintAddress::from_str( &format!("127.0.0.1:{}", first_port), diff --git a/genesis/e2e-tests-single-node.toml b/genesis/e2e-tests-single-node.toml index 0af2a23b86f..aa35ca1f173 100644 --- a/genesis/e2e-tests-single-node.toml +++ b/genesis/e2e-tests-single-node.toml @@ -18,7 +18,7 @@ validator_vp = "vp_validator" commission_rate = "0.05" # Maximum change per epoch in the commission rate max_commission_rate_change = "0.01" -# Public IP:port address. +# (Public IP | Hostname):port address. # We set the port to be the default+1000, so that if a local node was running at # the same time as the E2E tests, it wouldn't affect them. net_address = "127.0.0.1:27656" diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index eecc60588f1..c995547fbf5 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -122,17 +122,17 @@ where let validator_0 = genesis.validator.get_mut("validator-0").unwrap(); // Clone the first validator before modifying it let other_validators = validator_0.clone(); - let net_address_0 = - SocketAddr::from_str(validator_0.net_address.as_ref().unwrap()) - .unwrap(); - let net_address_port_0 = net_address_0.port(); + let validator_0_target = validator_0.net_address.clone().unwrap(); + let split: Vec<&str> = validator_0_target.split(':').collect(); + let (mut net_target_0, net_address_port_0) = + (split[0], split[1].parse::().unwrap()); for ix in 0..num { let mut validator = other_validators.clone(); - let mut net_address = net_address_0; + let mut net_target = net_target_0.to_string(); // 6 ports for each validator let first_port = net_address_port_0 + port_offset(ix); - net_address.set_port(first_port); - validator.net_address = Some(net_address.to_string()); + net_target = format!("{}:{}", net_target, first_port); + validator.net_address = Some(net_target.to_string()); let name = format!("validator-{}", ix); genesis.validator.insert(name, validator); } From a57bd89d8c32d18db54f79e1cce6e70bdae3beb2 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Tue, 12 Sep 2023 14:20:20 +0200 Subject: [PATCH 062/114] Refactors `get_actor_rpc` --- tests/src/e2e/helpers.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/src/e2e/helpers.rs b/tests/src/e2e/helpers.rs index e2d887b5a21..5e4edce6aa3 100644 --- a/tests/src/e2e/helpers.rs +++ b/tests/src/e2e/helpers.rs @@ -167,14 +167,9 @@ pub fn get_actor_rpc(test: &Test, who: &Who) -> String { }; let config = Config::load(base_dir, &test.net.chain_id, Some(tendermint_mode)); - let ip = convert_tm_addr_to_socket_addr(&config.ledger.cometbft.rpc.laddr) - .ip() - .to_string(); - let port = - convert_tm_addr_to_socket_addr(&config.ledger.cometbft.rpc.laddr) - .port() - .to_string(); - format!("{}:{}", ip, port) + let socket_addr = + convert_tm_addr_to_socket_addr(&config.ledger.cometbft.rpc.laddr); + format!("{}:{}", socket_addr.ip(), socket_addr.port()) } /// Get the public key of the validator From ac9e14930c40b903ae15cb7c6273a91844857143 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 12 Sep 2023 14:11:46 +0100 Subject: [PATCH 063/114] Fix validator set hashing --- core/src/types/vote_extensions/validator_set_update.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/types/vote_extensions/validator_set_update.rs b/core/src/types/vote_extensions/validator_set_update.rs index 23dedb6bd2e..bf3d749ff5d 100644 --- a/core/src/types/vote_extensions/validator_set_update.rs +++ b/core/src/types/vote_extensions/validator_set_update.rs @@ -398,7 +398,7 @@ mod tag { ext.voting_powers.get_bridge_and_gov_hashes(next_epoch); AbiEncode::signable_keccak256(&[ Token::Uint(GOVERNANCE_CONTRACT_VERSION.into()), - Token::String("updateValidatorsSet".into()), + Token::String("updateValidatorSet".into()), Token::FixedBytes(bridge_hash.to_vec()), Token::FixedBytes(gov_hash.to_vec()), epoch_to_token(next_epoch), From 891a88c5f446d5d6fe9f27d03daae5d5666bb0a9 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Tue, 12 Sep 2023 15:38:10 +0200 Subject: [PATCH 064/114] Adjusts fixme comment on hostname resolution --- apps/src/lib/config/utils.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/src/lib/config/utils.rs b/apps/src/lib/config/utils.rs index ca038dcb422..03725d112c8 100644 --- a/apps/src/lib/config/utils.rs +++ b/apps/src/lib/config/utils.rs @@ -47,8 +47,7 @@ fn num_of_threads_aux( } } -// fixme: Handle this gracefully with either an Option or a Result. Ensure that -// hostname resolution works. +// FIXME: Handle this gracefully with either an Option or a Result. pub fn convert_tm_addr_to_socket_addr( tm_addr: &TendermintAddress, ) -> SocketAddr { From 1dd35cfc9e7e34b2294da9123165e4523ced1a20 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Tue, 12 Sep 2023 15:38:34 +0200 Subject: [PATCH 065/114] Clippy + fmt --- apps/src/lib/cli.rs | 1 - apps/src/lib/client/utils.rs | 3 +-- tests/src/e2e/setup.rs | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index f0b001beba7..c4f22538eca 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2455,7 +2455,6 @@ pub mod args { use std::collections::HashMap; use std::convert::TryFrom; use std::env; - use std::net::SocketAddr; use std::path::PathBuf; use std::str::FromStr; diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 5e5bebc3934..0c0d24772e2 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use std::env; use std::fs::{self, File, OpenOptions}; use std::io::Write; -use std::net::SocketAddr; use std::path::{Path, PathBuf}; use std::str::FromStr; @@ -1050,7 +1049,7 @@ pub fn init_genesis_validator( tendermint_node_key: Some(HexString( pre_genesis.tendermint_node_key.ref_to().to_string(), )), - net_address: Some(net_address.to_string()), + net_address: Some(net_address), ..Default::default() }, )]), diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index c995547fbf5..9a58230072b 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use std::ffi::OsStr; use std::fmt::Display; use std::fs::{File, OpenOptions}; -use std::net::SocketAddr; use std::path::{Path, PathBuf}; use std::process::Command; use std::str::FromStr; @@ -124,7 +123,7 @@ where let other_validators = validator_0.clone(); let validator_0_target = validator_0.net_address.clone().unwrap(); let split: Vec<&str> = validator_0_target.split(':').collect(); - let (mut net_target_0, net_address_port_0) = + let (net_target_0, net_address_port_0) = (split[0], split[1].parse::().unwrap()); for ix in 0..num { let mut validator = other_validators.clone(); From 07a3dac5358437e40f508f6bc1290b7f05cbc76a Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Tue, 12 Sep 2023 18:18:42 +0200 Subject: [PATCH 066/114] changelog: add #1886 --- .../unreleased/improvements/1886-validators-by-hostnames.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/1886-validators-by-hostnames.md diff --git a/.changelog/unreleased/improvements/1886-validators-by-hostnames.md b/.changelog/unreleased/improvements/1886-validators-by-hostnames.md new file mode 100644 index 00000000000..fc96da016eb --- /dev/null +++ b/.changelog/unreleased/improvements/1886-validators-by-hostnames.md @@ -0,0 +1,2 @@ +- Added support for validators' hostnames in configuration. + ([\#1886](https://github.com/anoma/namada/pull/1886)) \ No newline at end of file From bdfaff4a0b5e4154576c955f96bfb743d6f213cc Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:00:05 +0200 Subject: [PATCH 067/114] [feat]: Refactored the masp integration tests to no longer need the nightly feature --- Cargo.lock | 10 +- apps/src/lib/cli.rs | 2 +- apps/src/lib/cli/utils.rs | 51 ----- apps/src/lib/client/rpc.rs | 7 +- .../lib/node/ledger/shell/testing/client.rs | 12 +- .../lib/node/ledger/shell/testing/utils.rs | 197 ++++++++++++++++++ shared/src/types/io.rs | 9 + tests/src/integration.rs | 1 - tests/src/integration/masp.rs | 3 +- tests/src/integration/utils.rs | 83 -------- tests/src/lib.rs | 2 - wasm/checksums.json | 40 ++-- 12 files changed, 241 insertions(+), 176 deletions(-) delete mode 100644 tests/src/integration/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 143043ddcbd..e100cceb45a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3485,7 +3485,7 @@ checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.48.0", ] @@ -5851,16 +5851,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.13" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" +checksum = "d4790277f605573dd24b6751701e0823582a63c7cafc095e427e6c66e45dd75e" dependencies = [ "bitflags 1.2.1", "errno", "io-lifetimes", "libc", "linux-raw-sys 0.3.7", - "windows-sys 0.48.0", + "windows-sys 0.45.0", ] [[package]] @@ -6623,7 +6623,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.13", + "rustix 0.37.1", "windows-sys 0.45.0", ] diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 1565e8ee213..677a048fe09 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -17,7 +17,7 @@ use clap::{ArgGroup, ArgMatches, ColorChoice}; use color_eyre::eyre::Result; use namada::types::io::DefaultIo; use utils::*; -pub use utils::{dispatch_prompt, safe_exit, Cmd, TESTIN}; +pub use utils::{safe_exit, Cmd}; pub use self::context::Context; use crate::cli::api::CliIo; diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index 4ae8e4adbc3..26cc38ff7fb 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -6,7 +6,6 @@ use std::str::FromStr; use clap::{ArgAction, ArgMatches}; use color_eyre::eyre::Result; -use lazy_static::lazy_static; use super::args; use super::context::{Context, FromContext}; @@ -363,53 +362,3 @@ pub fn safe_exit(_: i32) -> ! { panic!("Test failed because the client exited unexpectedly.") } - -lazy_static! { - /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); -} - -/// A generic function for displaying a prompt to users and reading -/// in their response. -fn prompt_aux(mut reader: R, mut writer: W, question: &str) -> String -where - R: std::io::Read, - W: Write, -{ - write!(&mut writer, "{}", question).expect("Unable to write"); - writer.flush().unwrap(); - let mut s = String::new(); - reader.read_to_string(&mut s).expect("Unable to read"); - s -} - -/// A function that chooses how to dispatch prompts -/// to users. There is a hierarchy of feature flags -/// that determines this. If no flags are set, -/// the question is printed to stdout and response -/// read from stdin. -pub fn dispatch_prompt(question: impl AsRef) -> String { - if cfg!(feature = "testing") { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) - } else { - prompt_aux( - std::io::stdin().lock(), - std::io::stdout(), - question.as_ref(), - ) - } -} - -#[macro_export] -/// A convenience macro for formatting the user prompt before -/// forwarding it to the `[dispatch_prompt]` method. -macro_rules! prompt { - ($($arg:tt)*) => {{ - $crate::cli::dispatch_prompt(format!("{}", format_args!($($arg)*))) - }} -} diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index a1e97cfb230..a2777cd82ed 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -52,13 +52,12 @@ use namada::types::masp::{BalanceOwner, ExtendedViewingKey, PaymentAddress}; use namada::types::storage::{BlockHeight, BlockResults, Epoch, Key, KeySeg}; use namada::types::token::{Change, MaspDenom}; use namada::types::{error, storage, token}; -use namada::{display, display_line, edisplay_line}; +use namada::{display, display_line, edisplay_line, prompt}; use tokio::time::Instant; use crate::cli::{self, args}; use crate::facade::tendermint::merkle::proof::Proof; use crate::facade::tendermint_rpc::error::Error as TError; -use crate::prompt; use crate::wallet::CliWalletUtils; /// Query the status of a given transaction. @@ -461,8 +460,8 @@ pub async fn query_pinned_balance< } } // If a suitable viewing key was not found, then demand it from the user - if is_pinned_error(&balance) { - let vk_str = prompt!("Enter the viewing key for {}: ", owner); + if balance == pinned_error { + let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 68a346a4ed1..9ebc825f545 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -3,14 +3,14 @@ use std::ops::ControlFlow; use clap::Command as App; use eyre::Report; use namada::types::control_flow::Halt; -use namada::types::io::{DefaultIo, Io}; +use namada::types::io::Io; use tendermint_config::net::Address as TendermintAddress; use super::node::MockNode; use crate::cli::api::{CliApi, CliClient}; use crate::cli::args::Global; use crate::cli::{args, cmds, Cmd, Context, NamadaClient, NamadaRelayer}; -use crate::node::ledger::shell::testing::utils::Bin; +use crate::node::ledger::shell::testing::utils::{Bin, TestingIo}; pub fn run( node: &MockNode, @@ -25,7 +25,7 @@ pub fn run( wasm_dir: Some(locked.wasm_dir.clone()), } }; - let ctx = Context::new::(global.clone())?; + let ctx = Context::new::(global.clone())?; let rt = tokio::runtime::Runtime::new().unwrap(); match who { @@ -47,7 +47,7 @@ pub fn run( NamadaClient::WithoutContext(sub_cmd, global) } }; - rt.block_on(CliApi::::handle_client_command( + rt.block_on(CliApi::::handle_client_command( Some(node), cmd, )) @@ -60,7 +60,7 @@ pub fn run( let cmd = cmds::NamadaWallet::parse(&matches) .expect("Could not parse wallet command"); - CliApi::::handle_wallet_command(cmd, ctx) + CliApi::::handle_wallet_command(cmd, ctx) } Bin::Relayer => { args.insert(0, "relayer"); @@ -82,7 +82,7 @@ pub fn run( NamadaRelayer::ValidatorSet(sub_cmd) } }; - rt.block_on(CliApi::::handle_relayer_command( + rt.block_on(CliApi::::handle_relayer_command( Some(node), cmd, )) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index e66ead21e7d..95da7efb856 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,5 +1,7 @@ use std::path::{Path, PathBuf}; +use lazy_static::lazy_static; +use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; /// Namada binaries @@ -46,3 +48,198 @@ impl Default for TestDir { Self::new() } } + +/// The max number of bytes that the is currently remembered from stdout while +/// testing. +const TESTOUT_BUF_SIZE: usize = 100_000; + +lazy_static! { + /// A replacement for stdout in testing. The maximum number of bytes + /// it holds is limited to prevent memory issues. + pub static ref TESTOUT: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(FixedBuffer::new(TESTOUT_BUF_SIZE))); +} + +lazy_static! { + /// A replacement for stdin in testing. + pub static ref TESTIN: std::sync::Arc>> = + std::sync::Arc::new(std::sync::Mutex::new(vec![])); +} + +pub struct TestingIo; + +impl Io for TestingIo { + fn print(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + testout.append(output.as_ref().as_bytes().to_vec()); + print!("{}", output.as_ref()); + } + + fn println(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + println!("{}", output.as_ref()); + } + + fn write( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::print(output); + Ok(()) + } + + fn writeln( + _: W, + output: impl AsRef, + ) -> std::io::Result<()> { + Self::println(output); + Ok(()) + } + + fn eprintln(output: impl AsRef) { + let mut testout = TESTOUT.lock().unwrap(); + let mut bytes = output.as_ref().as_bytes().to_vec(); + bytes.extend_from_slice("\n".as_bytes()); + testout.append(bytes); + eprintln!("{}", output.as_ref()); + } + + fn read() -> std::io::Result { + read_aux(TESTIN.lock().unwrap().as_slice()) + } + + fn prompt(question: impl AsRef) -> String { + prompt_aux( + TESTIN.lock().unwrap().as_slice(), + std::io::stdout(), + question.as_ref(), + ) + } +} + +/// Test helper that captures stdout of +/// a process. +pub struct CapturedOutput { + pub output: String, + pub result: T, + input: String, +} + +impl CapturedOutput { + pub fn with_input(input: String) -> Self { + Self { + output: "".to_string(), + result: (), + input, + } + } +} + +impl CapturedOutput { + /// Run a client command and capture + /// the output to the mocked stdout. + pub fn of(func: F) -> Self + where + F: FnOnce() -> T, + { + let mut capture = Self { + output: Default::default(), + result: func(), + input: Default::default(), + }; + capture.output = TESTOUT.lock().unwrap().read_string(); + capture + } + + /// Run a client command with input to the mocked stdin and capture + /// the output to the mocked stdout + pub fn run(&self, func: F) -> CapturedOutput + where + F: FnOnce() -> U, + { + { + // write the input to the mocked stdin + let mut buf = TESTIN.lock().unwrap(); + buf.clear(); + buf.extend_from_slice(self.input.as_bytes()); + } + CapturedOutput::of(func) + } + + /// Check if the captured output contains the regex. + pub fn matches(&self, needle: regex::Regex) -> bool { + needle.captures(&self.output).is_some() + } + + /// Check if the captured output contains the string. + pub fn contains(&self, needle: &str) -> bool { + let needle = regex::Regex::new(needle).unwrap(); + self.matches(needle) + } +} + +/// A buffer with a max size. Drops elements from the front on +/// size overflow. +pub struct FixedBuffer { + inner: Vec, + max_size: usize, +} + +impl FixedBuffer { + fn new(max_size: usize) -> Self { + Self { + inner: vec![], + max_size, + } + } + + /// Remove the first `size` elements from the buffer. + fn roll(&mut self, size: usize) { + self.inner = self.inner[size..].to_vec(); + } + + /// Add data to the end of the buffer, deleting from the + /// front as necessary. + fn append(&mut self, mut other: Vec) { + // if new data exceeds max size, take the tail. + if other.len() > self.max_size { + self.inner = other[(other.len() - self.max_size)..].to_vec(); + return; + } + // check if appending the data overflows buffer + let free_space = self.max_size - self.inner.len(); + if other.len() > free_space { + // delete the minimum amount of data from the front of the buffer + // to fit new data. + self.roll(other.len() - free_space); + } + self.inner.append(&mut other); + } +} + +impl FixedBuffer { + /// Read the inner buffer out to string + pub fn read_string(&mut self) -> String { + let mut fresh = vec![]; + std::mem::swap(&mut fresh, &mut self.inner); + String::from_utf8(fresh).unwrap() + } +} + +#[cfg(test)] +mod testing { + use super::*; + + #[test] + fn test_buffer() { + let mut buffer = FixedBuffer::::new(10); + buffer.inner = (1u64..=9_u64).collect(); + buffer.append(vec![10, 11, 12, 13, 14, 15]); + assert_eq!(buffer.inner, (6u64..=15_u64).collect::>()); + buffer.append((20u64..=40_u64).collect()); + assert_eq!(buffer.inner, (31u64..=40_u64).collect::>()); + } +} diff --git a/shared/src/types/io.rs b/shared/src/types/io.rs index 93d45a75ffc..13798cc5b26 100644 --- a/shared/src/types/io.rs +++ b/shared/src/types/io.rs @@ -121,3 +121,12 @@ macro_rules! edisplay_line { <$io>::eprintln(format_args!($($args)*).to_string()) }; } + +#[macro_export] +/// A convenience macro for formatting the user prompt before +/// forwarding it to the [`Io::prompt`] method. +macro_rules! prompt { + ($io:ty,$($arg:tt)*) => {{ + <$io>::prompt(format!("{}", format_args!($($arg)*))) + }} +} diff --git a/tests/src/integration.rs b/tests/src/integration.rs index 8642e0e03c2..1a7c84dbfbd 100644 --- a/tests/src/integration.rs +++ b/tests/src/integration.rs @@ -1,3 +1,2 @@ mod masp; mod setup; -mod utils; diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index 02d6dabc8f0..8c55910b0a6 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -5,7 +5,7 @@ use color_eyre::owo_colors::OwoColorize; use namada::types::io::DefaultIo; use namada_apps::client::tx::CLIShieldedUtils; use namada_apps::node::ledger::shell::testing::client::run; -use namada_apps::node::ledger::shell::testing::utils::Bin; +use namada_apps::node::ledger::shell::testing::utils::{Bin, CapturedOutput}; use namada_core::types::address::{btc, eth, masp_rewards}; use namada_core::types::token; use namada_core::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; @@ -17,7 +17,6 @@ use crate::e2e::setup::constants::{ AC_PAYMENT_ADDRESS, AC_VIEWING_KEY, ALBERT, A_SPENDING_KEY, BB_PAYMENT_ADDRESS, BERTHA, BTC, B_SPENDING_KEY, CHRISTEL, ETH, MASP, NAM, }; -use crate::integration::utils::CapturedOutput; /// In this test we verify that users of the MASP receive the correct rewards /// for leaving their assets in the pool for varying periods of time. diff --git a/tests/src/integration/utils.rs b/tests/src/integration/utils.rs deleted file mode 100644 index f626a001ee8..00000000000 --- a/tests/src/integration/utils.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::fs::File; -use std::path::PathBuf; -use std::sync::Arc; - -struct TempFile(PathBuf); -impl TempFile { - fn new(path: PathBuf) -> (Self, File) { - let f = File::create(&path).unwrap(); - (Self(path), f) - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = std::fs::remove_file(&self.0); - } -} - -/// Test helper that captures stdout of -/// a process. -pub struct CapturedOutput { - pub output: String, - pub result: T, - input: String, -} - -impl CapturedOutput { - pub fn with_input(input: String) -> Self { - Self { - output: "".to_string(), - result: (), - input, - } - } -} - -impl CapturedOutput { - /// Run a client command and capture - /// the output to the mocked stdout. - pub(crate) fn of(func: F) -> Self - where - F: FnOnce() -> T, - { - std::io::set_output_capture(Some(Default::default())); - let mut capture = Self { - output: Default::default(), - result: func(), - input: Default::default(), - }; - let captured = std::io::set_output_capture(None); - let captured = captured.unwrap(); - let captured = Arc::try_unwrap(captured).unwrap(); - let captured = captured.into_inner().unwrap(); - capture.output = String::from_utf8(captured).unwrap(); - capture - } - - /// Run a client command with input to the mocked stdin and capture - /// the output to the mocked stdout - pub fn run(&self, func: F) -> CapturedOutput - where - F: FnOnce() -> U, - { - { - // write the input to the mocked stdin - let mut buf = namada_apps::cli::TESTIN.lock().unwrap(); - buf.clear(); - buf.extend_from_slice(self.input.as_bytes()); - } - CapturedOutput::of(func) - } - - /// Check if the captured output contains the regex. - pub fn matches(&self, needle: regex::Regex) -> bool { - needle.captures(&self.output).is_some() - } - - /// Check if the captured output contains the string. - pub fn contains(&self, needle: &str) -> bool { - let needle = regex::Regex::new(needle).unwrap(); - self.matches(needle) - } -} diff --git a/tests/src/lib.rs b/tests/src/lib.rs index 7e359474772..1d9958a30a3 100644 --- a/tests/src/lib.rs +++ b/tests/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(test, feature(internal_output_capture))] //! Namada integrations and WASM tests and testing helpers. #![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] @@ -13,7 +12,6 @@ pub use vm_host_env::{ibc, tx, vp}; #[cfg(test)] mod e2e; #[cfg(test)] -#[allow(dead_code)] mod integration; pub mod native_vp; pub mod storage; diff --git a/wasm/checksums.json b/wasm/checksums.json index 7ddad4f479f..adf06b5afee 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,23 +1,21 @@ { - "tx_bond.wasm": "tx_bond.65775f3faf6f0ff1bbfa8bd7f171dd1d591d83536a4eac3016c2a460471b7fa7.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.2e664c7d28bf61b04a826a43532c35c3982e4f5eb9fbf5159888b4e6a1f540a6.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.c3f55f00b0a58b9f78703f8b96893839aa771610b670aeeef4e9db55a00ec1bc.wasm", - "tx_ibc.wasm": "tx_ibc.27f6f51add11129c6845000e76ad5fcef3151f3c3339464ee1bb367ea2654981.wasm", - "tx_init_account.wasm": "tx_init_account.6bd6d908fb6e88ea91777d59c30e4ed0de0cd682101098966703bed7d9fbf58b.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.d7b84245eab1529041367d7109594ca4496b6d7425cf4c9f4bfb69951cf2f5f3.wasm", - "tx_init_validator.wasm": "tx_init_validator.f8f5c1512b4f117ac4bd7f1860799265e1b671739ea3e712e85ed4c8063594d1.wasm", - "tx_resign_steward.wasm": "tx_resign_steward.3460f267f3bad1de285d2cd53f1eecda29b44eefb2f7dee0df9d059f778670c0.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.214dbad89fecd6897d41db962688fd5320ed50a805025eef857d47761fb30088.wasm", - "tx_transfer.wasm": "tx_transfer.e452dbee5ffadc6f4df60a7adbf638592b94da8fdbcf5767f09170b71dee68f0.wasm", - "tx_unbond.wasm": "tx_unbond.4082bf7da70105c1c248ee403762d2cacb1ce15bf1e7da7cd82e800fae7b05fb.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.1dfe798b2bffcfcafd0439cfea7b40ad7a3380dc02d424ecf07de35d6219f55e.wasm", - "tx_update_account.wasm": "tx_update_account.22ad3f7a3afafe8cb3aedd6d4fc210b93208221795fdd76626e803b972935176.wasm", - "tx_update_steward_commission.wasm": "tx_update_steward_commission.eb59360509115e7ec537ba49f7e4438a4522b1929c78d7b644af1025479594a3.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.ca1171723084845931b994535631b05a843b5db0d54b52a484653a932de704db.wasm", - "tx_withdraw.wasm": "tx_withdraw.2505b1c659e910b078f8c618c10659645e96c9ae0aac55c3adbdb05a7e7622d1.wasm", - "vp_implicit.wasm": "vp_implicit.d46e9d52909cd365203bedd007effd12fe17e50a5f25151d827e4cc05cee0cca.wasm", - "vp_masp.wasm": "vp_masp.0dda4af5fb350cb2d4c795c51abe150f0df772a4d335540846cc5dffd8880928.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.54a30792965ebdb8476f0cdcae4e374350653baa69dd1c0e2e1ffde4e496169c.wasm", - "vp_user.wasm": "vp_user.c5c935be6353c1ea08c012af3850dd7819ee58f81b2c8ffaf7826020b1fb41d6.wasm", - "vp_validator.wasm": "vp_validator.f91045a01992002574796e598c611ac71ad57bb17061467b049596cb0c756ecc.wasm" + "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", + "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", + "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", + "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", + "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", + "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", + "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", + "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", + "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", + "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", + "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", + "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" } \ No newline at end of file From bbfb810009ac75a35009966a9ab4849680a6b05e Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 26 Jul 2023 13:41:01 +0200 Subject: [PATCH 068/114] [fix]: Fixing downstream async io changes from bat/generic-io --- apps/src/lib/client/rpc.rs | 3 ++- apps/src/lib/node/ledger/shell/testing/utils.rs | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index a2777cd82ed..cd7aeb2b566 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -461,7 +461,8 @@ pub async fn query_pinned_balance< } // If a suitable viewing key was not found, then demand it from the user if balance == pinned_error { - let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner); + let vk_str = + prompt!(IO, "Enter the viewing key for {}: ", owner).await; let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { Ok(fvk) => fvk, _ => { diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 95da7efb856..3ff3bdb7d31 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -68,6 +68,7 @@ lazy_static! { pub struct TestingIo; +#[async_trait::async_trait(?Send)] impl Io for TestingIo { fn print(output: impl AsRef) { let mut testout = TESTOUT.lock().unwrap(); @@ -107,11 +108,11 @@ impl Io for TestingIo { eprintln!("{}", output.as_ref()); } - fn read() -> std::io::Result { + async fn read() -> std::io::Result { read_aux(TESTIN.lock().unwrap().as_slice()) } - fn prompt(question: impl AsRef) -> String { + async fn prompt(question: impl AsRef) -> String { prompt_aux( TESTIN.lock().unwrap().as_slice(), std::io::stdout(), From 4cdcd6c93367bb2f0521eafd6d6a1da1d2f873b2 Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 28 Jul 2023 13:16:44 +0200 Subject: [PATCH 069/114] [feat]: After rebasing on bat/generic-io, need to make io read methods async for integration testing --- .../lib/node/ledger/shell/testing/utils.rs | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 3ff3bdb7d31..0161f864160 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -1,8 +1,12 @@ +use std::ops::{Deref, DerefMut}; use std::path::{Path, PathBuf}; +use std::pin::Pin; +use std::task::{Context, Poll}; use lazy_static::lazy_static; use namada::types::io::{prompt_aux, read_aux, Io}; use tempfile::tempdir; +use tokio::io::{AsyncRead, ReadBuf}; /// Namada binaries #[derive(Debug)] @@ -62,8 +66,8 @@ lazy_static! { lazy_static! { /// A replacement for stdin in testing. - pub static ref TESTIN: std::sync::Arc>> = - std::sync::Arc::new(std::sync::Mutex::new(vec![])); + pub static ref TESTIN: AtomicBuffer = + AtomicBuffer(std::sync::Arc::new(std::sync::Mutex::new(vec![]))); } pub struct TestingIo; @@ -108,16 +112,12 @@ impl Io for TestingIo { eprintln!("{}", output.as_ref()); } - async fn read() -> std::io::Result { - read_aux(TESTIN.lock().unwrap().as_slice()) + async fn read() -> tokio::io::Result { + read_aux(&*TESTIN).await } async fn prompt(question: impl AsRef) -> String { - prompt_aux( - TESTIN.lock().unwrap().as_slice(), - std::io::stdout(), - question.as_ref(), - ) + prompt_aux(&*TESTIN, tokio::io::stdout(), question.as_ref()).await } } @@ -230,6 +230,31 @@ impl FixedBuffer { } } +pub struct AtomicBuffer(std::sync::Arc>>); + +impl Deref for AtomicBuffer { + type Target = std::sync::Arc>>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'a> AsyncRead for &'a AtomicBuffer { + fn poll_read( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut ReadBuf<'_>, + ) -> Poll> { + let mut inner = self.lock().unwrap(); + let buf_before = buf.filled().len(); + let res = AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); + let amount_read = buf.filled().len() - buf_before; + *inner.deref_mut() = inner[amount_read..].to_vec(); + res + } +} + #[cfg(test)] mod testing { use super::*; From 52446311d7e1dd71e117934b898869b5b1a2c94c Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 28 Jul 2023 13:18:13 +0200 Subject: [PATCH 070/114] [chore]: Formatting --- apps/src/lib/node/ledger/shell/testing/utils.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/src/lib/node/ledger/shell/testing/utils.rs b/apps/src/lib/node/ledger/shell/testing/utils.rs index 0161f864160..bfcb7f50ab9 100644 --- a/apps/src/lib/node/ledger/shell/testing/utils.rs +++ b/apps/src/lib/node/ledger/shell/testing/utils.rs @@ -248,7 +248,8 @@ impl<'a> AsyncRead for &'a AtomicBuffer { ) -> Poll> { let mut inner = self.lock().unwrap(); let buf_before = buf.filled().len(); - let res = AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); + let res = + AsyncRead::poll_read(Pin::new(&mut inner.as_slice()), cx, buf); let amount_read = buf.filled().len() - buf_before; *inner.deref_mut() = inner[amount_read..].to_vec(); res From e9a613af2cafe2b9690595f33fc4fdeb9091a249 Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 1 Sep 2023 10:21:34 +0200 Subject: [PATCH 071/114] [chore]: merge in v0.21.1 --- wasm/checksums.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index adf06b5afee..71b5580e4ac 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", - "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", - "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", - "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", - "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", - "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", - "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", - "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", - "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", - "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", - "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", - "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" + "tx_bond.wasm": "tx_bond.0967203d10b78f7f28c3e1d674c0ff3ec25ec00e9b3a4010648c5cc381ad52ec.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.c6dd30e79edff950016f495cee946bc6c0d6847f89322fbf733c89bb768c1fd4.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.1e89cf7f091a324872582c1092f2bda662be21040ac796d8aca08d08e9332a3e.wasm", + "tx_ibc.wasm": "tx_ibc.2b35a3a35049fe267121906176bafc0ea2b221a185fe31652216f93da66209e7.wasm", + "tx_init_account.wasm": "tx_init_account.6e77218b385a386f49c65c13b6112c75dcb06c50cf7bf7a5a479e7e8b7b458fa.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.d0c969c6b7a3d262d82586c630f29a00e587653fa9df1cf17021914764d4d3ab.wasm", + "tx_init_validator.wasm": "tx_init_validator.df780e2cc9ab4a5726931b662fd75cad907e495745aec1c466877878cee1ae3a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.062b11c679a35e50f7fcfca95e3ada01bc89098591ae92526cfafaab5adf954e.wasm", + "tx_transfer.wasm": "tx_transfer.5f9e5a2f85fa5c1ec2bbb0aa9bebaba6bddc7e777ca956f5d980ad1cc9af3e7e.wasm", + "tx_unbond.wasm": "tx_unbond.dc169426d36f2bcfd82d976e77e2f3beb85ac98e75652ddf8367fa081fb17b3d.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.23d1b075f28d5fa3ee413ee4db31792a2714d9b21929cbf1ba59832c3adec886.wasm", + "tx_update_account.wasm": "tx_update_account.88646c9fb5d3327701d69b12ce49ae35431ebe2ea3691900874cad66791f1ca9.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.c9abcd6f37d59daf9a39e30dcebd9e0789d5bcd679f5931ed7899073d0a5d36f.wasm", + "tx_withdraw.wasm": "tx_withdraw.02ac0399bc5b745346641facd968607931bf9abf67d7ed336b6b0540360f2d43.wasm", + "vp_implicit.wasm": "vp_implicit.1d212280efc3fccc16de9497dae8cc1670f21f0e0ce4c3bd9fc58fc816037cdf.wasm", + "vp_masp.wasm": "vp_masp.1d264f4ba602df546011ae4040da00bd0b103c6bad62ee5de985940e8bf0c2e7.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.d279129573a4f0625f411c7b147ac94bc40e0db2ea04b777f29e57be33a53522.wasm", + "vp_user.wasm": "vp_user.788b8039744b73bd6fe2b67b273802bae4c26cd117092eb8437f455d5aa95dbd.wasm", + "vp_validator.wasm": "vp_validator.98457b70476c76a16b1cd28232bacf043438bfd5e054bc9f7651ef1747e48594.wasm" } \ No newline at end of file From 2e31a7d0da25a6b256ba1bba4ccc1a4044ab254b Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Jul 2023 17:00:05 +0200 Subject: [PATCH 072/114] [feat]: Refactored the masp integration tests to no longer need the nightly feature --- wasm/checksums.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 71b5580e4ac..adf06b5afee 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,21 +1,21 @@ { - "tx_bond.wasm": "tx_bond.0967203d10b78f7f28c3e1d674c0ff3ec25ec00e9b3a4010648c5cc381ad52ec.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.c6dd30e79edff950016f495cee946bc6c0d6847f89322fbf733c89bb768c1fd4.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.1e89cf7f091a324872582c1092f2bda662be21040ac796d8aca08d08e9332a3e.wasm", - "tx_ibc.wasm": "tx_ibc.2b35a3a35049fe267121906176bafc0ea2b221a185fe31652216f93da66209e7.wasm", - "tx_init_account.wasm": "tx_init_account.6e77218b385a386f49c65c13b6112c75dcb06c50cf7bf7a5a479e7e8b7b458fa.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.d0c969c6b7a3d262d82586c630f29a00e587653fa9df1cf17021914764d4d3ab.wasm", - "tx_init_validator.wasm": "tx_init_validator.df780e2cc9ab4a5726931b662fd75cad907e495745aec1c466877878cee1ae3a.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.062b11c679a35e50f7fcfca95e3ada01bc89098591ae92526cfafaab5adf954e.wasm", - "tx_transfer.wasm": "tx_transfer.5f9e5a2f85fa5c1ec2bbb0aa9bebaba6bddc7e777ca956f5d980ad1cc9af3e7e.wasm", - "tx_unbond.wasm": "tx_unbond.dc169426d36f2bcfd82d976e77e2f3beb85ac98e75652ddf8367fa081fb17b3d.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.23d1b075f28d5fa3ee413ee4db31792a2714d9b21929cbf1ba59832c3adec886.wasm", - "tx_update_account.wasm": "tx_update_account.88646c9fb5d3327701d69b12ce49ae35431ebe2ea3691900874cad66791f1ca9.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.c9abcd6f37d59daf9a39e30dcebd9e0789d5bcd679f5931ed7899073d0a5d36f.wasm", - "tx_withdraw.wasm": "tx_withdraw.02ac0399bc5b745346641facd968607931bf9abf67d7ed336b6b0540360f2d43.wasm", - "vp_implicit.wasm": "vp_implicit.1d212280efc3fccc16de9497dae8cc1670f21f0e0ce4c3bd9fc58fc816037cdf.wasm", - "vp_masp.wasm": "vp_masp.1d264f4ba602df546011ae4040da00bd0b103c6bad62ee5de985940e8bf0c2e7.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.d279129573a4f0625f411c7b147ac94bc40e0db2ea04b777f29e57be33a53522.wasm", - "vp_user.wasm": "vp_user.788b8039744b73bd6fe2b67b273802bae4c26cd117092eb8437f455d5aa95dbd.wasm", - "vp_validator.wasm": "vp_validator.98457b70476c76a16b1cd28232bacf043438bfd5e054bc9f7651ef1747e48594.wasm" + "tx_bond.wasm": "tx_bond.3d9341191f3059b478435c52ec0db4b19fe9d2b7a60ac7371287fb15552dbe3b.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.0d8d4de6222aeb5b0cb80fa39b1ce1ee9e2f50115ffdaa2a1e79eabdddeb6bfe.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.349170accac147e8b4b77eb10ded0421936176b09d8913246235db0c5a4fac83.wasm", + "tx_ibc.wasm": "tx_ibc.5ddb7f3032d8b59446486a7fb20bac8c43c5a002f6e9b3309ff2e01048b98c7f.wasm", + "tx_init_account.wasm": "tx_init_account.f254fa819c85694d01f440132690ac54b3a8911a5eca9ccb49bc6171cf219017.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.1cf4ac19672bc368ff1e8ea0fd31507ac4a9a33c1b21ff80d85de8b36c6bce66.wasm", + "tx_init_validator.wasm": "tx_init_validator.bd5aa6513bf890e4591413fe6a4345dc28a0767ebc2fad2279e851fb1373091a.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8f252e6fd0ab74be7f7afb4dbe4ba2b3d441011fd57ce5ccd06fe24109728019.wasm", + "tx_transfer.wasm": "tx_transfer.cdb2edbaa152608e2ae6d96a586955b911b74cc097228fee2bb5768f5f6db0ea.wasm", + "tx_unbond.wasm": "tx_unbond.0e6319063d74311a42a405435c15aa867894fc0a7ae209c08fc5fa9eee4013c5.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.24e345f69f62fc8b75c475eee66e3252dc06a5468411f6770096b1b8ced8f022.wasm", + "tx_update_vp.wasm": "tx_update_vp.86123368b829488aface2804afc397a8c26873e9f319e3183fb211b292239e1d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.80586902bae368088edfdef22a6fcc25aee8779620fd48eabbe1f3f11754d701.wasm", + "tx_withdraw.wasm": "tx_withdraw.5648dac90b0f25c94d60fb39dfed6120f6eed8794e4c3dbf554af36adf7bafc3.wasm", + "vp_implicit.wasm": "vp_implicit.18f2b20fa776493a0182b05e95b3eb0676be702dc0a4d39a09cb9ab51d116146.wasm", + "vp_masp.wasm": "vp_masp.b07f344c2d760ee69dfcef1ae4e703f63c7c6594a377a48550ef576f9fcaca96.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.9e3c9d133e52d4b762b9fc7d3bcc1e7d0ad2bc4d1754d390ed31555471f184d5.wasm", + "vp_user.wasm": "vp_user.df279909cb2de9d5125bbfe8b34b14ff3b924ed7db61dcc93cbb06f2f3f29509.wasm", + "vp_validator.wasm": "vp_validator.e3ed90196c676b73bcfa2f4142e2831b306eef56bde73243b2d50ddc5ab8e2b2.wasm" } \ No newline at end of file From e84e66f0e07eb32cc1b1b08e6b94d3bad92da02c Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 13 Sep 2023 12:45:44 +0100 Subject: [PATCH 073/114] Fix Bridge pool proofs --- .../ledger/eth_bridge/storage/bridge_pool.rs | 62 +++++++++++++------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/core/src/ledger/eth_bridge/storage/bridge_pool.rs b/core/src/ledger/eth_bridge/storage/bridge_pool.rs index 167e23e7797..b37b26da611 100644 --- a/core/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/core/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -156,14 +156,16 @@ impl BridgePoolTree { /// Compute the root of the merkle tree fn compute_root(&self) -> KeccakHash { let mut hashes: Vec = self.leaves.keys().cloned().collect(); + let mut prefix = 0u8; while hashes.len() > 1 { let mut next_hashes = vec![]; for pair in hashes.chunks(2) { let left = pair[0].clone(); let right = pair.get(1).cloned().unwrap_or_default(); - next_hashes.push(hash_pair(left, right)); + next_hashes.push(hash_pair(left, right, prefix)); } hashes = next_hashes; + prefix = 0xff; } if hashes.is_empty() { @@ -215,6 +217,8 @@ impl BridgePoolTree { }) .collect(); + let mut prefix = 0u8; + while hashes.len() > 1 { let mut next_hashes = vec![]; @@ -224,30 +228,41 @@ impl BridgePoolTree { match (left, right) { (Node::OnPath(left), Node::OnPath(right)) => { flags.push(true); - next_hashes - .push(Node::OnPath(hash_pair(left.clone(), right))); + next_hashes.push(Node::OnPath(hash_pair( + left.clone(), + right, + prefix, + ))); } (Node::OnPath(hash), Node::OffPath(sib)) => { flags.push(false); proof_hashes.push(sib.clone()); - next_hashes - .push(Node::OnPath(hash_pair(hash.clone(), sib))); + next_hashes.push(Node::OnPath(hash_pair( + hash.clone(), + sib, + prefix, + ))); } (Node::OffPath(sib), Node::OnPath(hash)) => { flags.push(false); proof_hashes.push(sib.clone()); - next_hashes - .push(Node::OnPath(hash_pair(hash, sib.clone()))); + next_hashes.push(Node::OnPath(hash_pair( + hash, + sib.clone(), + prefix, + ))); } (Node::OffPath(left), Node::OffPath(right)) => { next_hashes.push(Node::OffPath(hash_pair( left.clone(), right, + prefix, ))); } } } hashes = next_hashes; + prefix = 0xff; } // add the root to the proof if flags.is_empty() && proof_hashes.is_empty() && leaves.is_empty() { @@ -285,14 +300,21 @@ impl BridgePoolTree { } } -/// Concatenate two keccak hashes and hash the result +/// Concatenate a byte prefix and two keccak hashes, +/// then compute the keccak hash of the resulting +/// byte array. #[inline] -fn hash_pair(left: KeccakHash, right: KeccakHash) -> KeccakHash { +fn hash_pair(left: KeccakHash, right: KeccakHash, prefix: u8) -> KeccakHash { + let mut buf = [0u8; 32 + 32 + 1]; + buf[0] = prefix; if left.0 < right.0 { - keccak_hash([left.0, right.0].concat().as_slice()) + buf[1..33].copy_from_slice(&left.0); + buf[33..].copy_from_slice(&right.0); } else { - keccak_hash([right.0, left.0].concat().as_slice()) + buf[1..33].copy_from_slice(&right.0); + buf[33..].copy_from_slice(&left.0); } + keccak_hash(buf) } /// Keeps track if a node is on a path from the @@ -348,14 +370,14 @@ impl BridgePoolProof { let mut proof_pos = 0usize; for i in 0..total_hashes { - let left = if leaf_pos < leaf_len { + let (left, prefix) = if leaf_pos < leaf_len { let next = self.leaves[leaf_pos].keccak256(); leaf_pos += 1; - next + (next, 0x00) } else { let next = hashes[hash_pos].clone(); hash_pos += 1; - next + (next, 0xff) }; let right = if self.flags[i] { if leaf_pos < leaf_len { @@ -372,7 +394,7 @@ impl BridgePoolProof { proof_pos += 1; next }; - hashes[i] = hash_pair(left, right); + hashes[i] = hash_pair(left, right, prefix); } if let Some(computed) = hashes.last() { @@ -480,7 +502,7 @@ mod test_bridge_pool_tree { let _ = tree.insert_key(&key, BlockHeight(1)).expect("Test failed"); } let expected = - hash_pair(transfers[0].keccak256(), transfers[1].keccak256()); + hash_pair(transfers[0].keccak256(), transfers[1].keccak256(), 0); assert_eq!(tree.root(), expected); } @@ -517,10 +539,10 @@ mod test_bridge_pool_tree { ); let left_hash = - hash_pair(transfers[0].keccak256(), transfers[1].keccak256()); + hash_pair(transfers[0].keccak256(), transfers[1].keccak256(), 0); let right_hash = - hash_pair(transfers[2].keccak256(), Default::default()); - let expected = hash_pair(left_hash, right_hash); + hash_pair(transfers[2].keccak256(), Default::default(), 0); + let expected = hash_pair(left_hash, right_hash, 0xff); assert_eq!(tree.root(), expected); } @@ -582,7 +604,7 @@ mod test_bridge_pool_tree { tree.delete_key(&deleted_key).expect("Test failed"); let expected = - hash_pair(transfers[0].keccak256(), transfers[2].keccak256()); + hash_pair(transfers[0].keccak256(), transfers[2].keccak256(), 0); assert_eq!(tree.root(), expected); assert_matches!(tree.get(&deleted_key), Err(_)); } From 17358c393475e91adda62d8bda5a263c3dd2d8a5 Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 13 Sep 2023 14:10:58 +0200 Subject: [PATCH 074/114] [chore] Merging in v0.22 --- apps/src/lib/client/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index cd7aeb2b566..c074f42315b 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -460,7 +460,7 @@ pub async fn query_pinned_balance< } } // If a suitable viewing key was not found, then demand it from the user - if balance == pinned_error { + if is_pinned_error(&balance) { let vk_str = prompt!(IO, "Enter the viewing key for {}: ", owner).await; let fvk = match ExtendedViewingKey::from_str(vk_str.trim()) { From cab0561a66c907f67f990135dbfd7976965a9f46 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 13 Sep 2023 15:49:45 +0100 Subject: [PATCH 075/114] Validate txs moving 0 value to the Bridge pool --- .../ethereum_bridge/bridge_pool_vp.rs | 204 +++++++++++++++++- 1 file changed, 197 insertions(+), 7 deletions(-) diff --git a/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs b/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs index 89b1b332536..22fee8b2f0a 100644 --- a/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs @@ -412,17 +412,59 @@ struct EscrowDelta<'a, KIND> { _kind: PhantomData<*const KIND>, } -impl EscrowDelta<'_, KIND> { - fn validate_changed_keys(&self, changed_keys: &BTreeSet) -> bool { +impl EscrowDelta<'_, TokenCheck> { + fn validate_changed_keys( + &self, + changed_keys: &BTreeSet, + pending: &PendingTransfer, + ) -> bool { + let EscrowDelta { + token, + payer_account, + escrow_account, + .. + } = self; + + let owner_key = balance_key(token, payer_account); + let escrow_key = balance_key(token, escrow_account); + + let has_owner_key = changed_keys.contains(&owner_key); + let has_escrow_key = changed_keys.contains(&escrow_key); + + let amount_is_zero = pending.transfer.amount.is_zero(); + + hints::likely(!amount_is_zero && has_owner_key && has_escrow_key) + || hints::unlikely( + amount_is_zero && !has_owner_key && !has_escrow_key, + ) + } +} + +impl EscrowDelta<'_, GasCheck> { + fn validate_changed_keys( + &self, + changed_keys: &BTreeSet, + pending: &PendingTransfer, + ) -> bool { let EscrowDelta { token, payer_account, escrow_account, .. } = self; + let owner_key = balance_key(token, payer_account); let escrow_key = balance_key(token, escrow_account); - changed_keys.contains(&owner_key) && changed_keys.contains(&escrow_key) + + let has_owner_key = changed_keys.contains(&owner_key); + let has_escrow_key = changed_keys.contains(&escrow_key); + + let amount_is_zero = pending.gas_fee.amount.is_zero(); + + hints::likely(!amount_is_zero && has_owner_key && has_escrow_key) + || hints::unlikely( + amount_is_zero && !has_owner_key && !has_escrow_key, + ) } } @@ -437,9 +479,15 @@ struct EscrowCheck<'a> { impl EscrowCheck<'_> { #[inline] - fn validate_changed_keys(&self, changed_keys: &BTreeSet) -> bool { - self.gas_check.validate_changed_keys(changed_keys) - && self.token_check.validate_changed_keys(changed_keys) + fn validate_changed_keys( + &self, + changed_keys: &BTreeSet, + pending: &PendingTransfer, + ) -> bool { + self.gas_check.validate_changed_keys(changed_keys, pending) + && self + .token_check + .validate_changed_keys(changed_keys, pending) } } @@ -541,7 +589,7 @@ where let wnam_address = read_native_erc20_address(&self.ctx.pre())?; let escrow_checks = self.determine_escrow_checks(&wnam_address, &transfer)?; - if !escrow_checks.validate_changed_keys(keys_changed) { + if !escrow_checks.validate_changed_keys(keys_changed, &transfer) { tracing::debug!( ?transfer, "Missing storage modifications in the Bridge pool" @@ -1849,4 +1897,146 @@ mod test_bridge_pool_vp { Expect::True, ); } + + /// Test that the Bridge pool native VP validates transfers that + /// do not contain gas fees and no associated changed keys. + #[test] + fn test_no_gas_fees_with_no_changed_keys() { + let nam_addr = nam(); + let pending = PendingTransfer { + transfer: TransferToEthereum { + kind: TransferToEthereumKind::Erc20, + asset: wnam(), + sender: bertha_address(), + recipient: EthAddress([1; 20]), + amount: Amount::from(1u64), + }, + gas_fee: GasFee { + token: nam(), + // NOTE: testing 0 amount + amount: Amount::zero(), + payer: bertha_address(), + }, + }; + let delta = EscrowDelta { + token: Cow::Borrowed(&nam_addr), + payer_account: &bertha_address(), + escrow_account: &BRIDGE_ADDRESS, + expected_debit: Amount::zero(), + expected_credit: Amount::zero(), + // NOTE: testing gas fees + _kind: PhantomData::<*const GasCheck>, + }; + // NOTE: testing no changed keys + let empty_keys = BTreeSet::new(); + + assert!(delta.validate_changed_keys(&empty_keys, &pending)); + } + + /// Test that the Bridge pool native VP rejects transfers that + /// do not contain gas fees and has associated changed keys. + #[test] + fn test_no_gas_fees_with_changed_keys() { + let nam_addr = nam(); + let pending = PendingTransfer { + transfer: TransferToEthereum { + kind: TransferToEthereumKind::Erc20, + asset: wnam(), + sender: bertha_address(), + recipient: EthAddress([1; 20]), + amount: Amount::from(1u64), + }, + gas_fee: GasFee { + token: nam(), + // NOTE: testing 0 amount + amount: Amount::zero(), + payer: bertha_address(), + }, + }; + let delta = EscrowDelta { + token: Cow::Borrowed(&nam_addr), + payer_account: &bertha_address(), + escrow_account: &BRIDGE_ADDRESS, + expected_debit: Amount::zero(), + expected_credit: Amount::zero(), + // NOTE: testing gas fees + _kind: PhantomData::<*const GasCheck>, + }; + let owner_key = balance_key(&nam_addr, &bertha_address()); + // NOTE: testing changed keys + let some_changed_keys = BTreeSet::from([owner_key]); + + assert!(!delta.validate_changed_keys(&some_changed_keys, &pending)); + } + + /// Test that the Bridge pool native VP validates transfers + /// moving no value and with no associated changed keys. + #[test] + fn test_no_amount_with_no_changed_keys() { + let nam_addr = nam(); + let pending = PendingTransfer { + transfer: TransferToEthereum { + kind: TransferToEthereumKind::Erc20, + asset: wnam(), + sender: bertha_address(), + recipient: EthAddress([1; 20]), + // NOTE: testing 0 amount + amount: Amount::zero(), + }, + gas_fee: GasFee { + token: nam(), + amount: Amount::from(1u64), + payer: bertha_address(), + }, + }; + let delta = EscrowDelta { + token: Cow::Borrowed(&nam_addr), + payer_account: &bertha_address(), + escrow_account: &BRIDGE_ADDRESS, + expected_debit: Amount::zero(), + expected_credit: Amount::zero(), + // NOTE: testing token transfers + _kind: PhantomData::<*const TokenCheck>, + }; + // NOTE: testing no changed keys + let empty_keys = BTreeSet::new(); + + assert!(delta.validate_changed_keys(&empty_keys, &pending)); + } + + /// Test that the Bridge pool native VP rejects transfers + /// moving no value and with associated changed keys. + #[test] + fn test_no_amount_with_changed_keys() { + let nam_addr = nam(); + let pending = PendingTransfer { + transfer: TransferToEthereum { + kind: TransferToEthereumKind::Erc20, + asset: wnam(), + sender: bertha_address(), + recipient: EthAddress([1; 20]), + // NOTE: testing 0 amount + amount: Amount::zero(), + }, + gas_fee: GasFee { + token: nam(), + amount: Amount::from(1u64), + payer: bertha_address(), + }, + }; + let delta = EscrowDelta { + token: Cow::Borrowed(&nam_addr), + payer_account: &bertha_address(), + escrow_account: &BRIDGE_ADDRESS, + expected_debit: Amount::zero(), + expected_credit: Amount::zero(), + // NOTE: testing token transfers + _kind: PhantomData::<*const TokenCheck>, + }; + let owner_key = balance_key(&nam_addr, &bertha_address()); + // NOTE: testing changed keys + let some_changed_keys = BTreeSet::from([owner_key]); + + assert!(!delta.validate_changed_keys(&some_changed_keys, &pending)); + } } From ce407a837e0af1a1a9007a8cf7921aff623d00ec Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 13:18:12 +0100 Subject: [PATCH 076/114] Refactor validate_changed_keys in the Bridge pool VP --- .../ethereum_bridge/bridge_pool_vp.rs | 155 ++++++------------ 1 file changed, 54 insertions(+), 101 deletions(-) diff --git a/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs b/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs index 22fee8b2f0a..9853a1dacaa 100644 --- a/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/native_vp/ethereum_bridge/bridge_pool_vp.rs @@ -387,6 +387,7 @@ where escrow_account: &BRIDGE_POOL_ADDRESS, expected_debit: expected_gas_debit, expected_credit: expected_gas_credit, + transferred_amount: &transfer.gas_fee.amount, _kind: PhantomData, }, token_check: EscrowDelta { @@ -395,6 +396,7 @@ where escrow_account: token_check_escrow_acc, expected_debit: expected_token_debit, expected_credit: expected_token_credit, + transferred_amount: &transfer.transfer.amount, _kind: PhantomData, }, }) @@ -409,15 +411,31 @@ struct EscrowDelta<'a, KIND> { escrow_account: &'a Address, expected_debit: Amount, expected_credit: Amount, + transferred_amount: &'a Amount, _kind: PhantomData<*const KIND>, } -impl EscrowDelta<'_, TokenCheck> { - fn validate_changed_keys( - &self, - changed_keys: &BTreeSet, - pending: &PendingTransfer, - ) -> bool { +impl EscrowDelta<'_, KIND> { + /// Validate an [`EscrowDelta`]. + /// + /// # Conditions for validation + /// + /// If the transferred amount in the [`EscrowDelta`] is nil, + /// then no keys could have been changed. If the transferred + /// amount is greater than zero, then the appropriate escrow + /// keys must have been written to by some wasm tx. + #[inline] + fn validate(&self, changed_keys: &BTreeSet) -> bool { + if hints::unlikely(self.transferred_amount_is_nil()) { + self.check_escrow_keys_unchanged(changed_keys) + } else { + self.check_escrow_keys_changed(changed_keys) + } + } + + /// Check if all required escrow keys in `changed_keys` were modified. + #[inline] + fn check_escrow_keys_changed(&self, changed_keys: &BTreeSet) -> bool { let EscrowDelta { token, payer_account, @@ -428,23 +446,14 @@ impl EscrowDelta<'_, TokenCheck> { let owner_key = balance_key(token, payer_account); let escrow_key = balance_key(token, escrow_account); - let has_owner_key = changed_keys.contains(&owner_key); - let has_escrow_key = changed_keys.contains(&escrow_key); - - let amount_is_zero = pending.transfer.amount.is_zero(); - - hints::likely(!amount_is_zero && has_owner_key && has_escrow_key) - || hints::unlikely( - amount_is_zero && !has_owner_key && !has_escrow_key, - ) + changed_keys.contains(&owner_key) && changed_keys.contains(&escrow_key) } -} -impl EscrowDelta<'_, GasCheck> { - fn validate_changed_keys( + /// Check if no escrow keys in `changed_keys` were modified. + #[inline] + fn check_escrow_keys_unchanged( &self, changed_keys: &BTreeSet, - pending: &PendingTransfer, ) -> bool { let EscrowDelta { token, @@ -456,15 +465,17 @@ impl EscrowDelta<'_, GasCheck> { let owner_key = balance_key(token, payer_account); let escrow_key = balance_key(token, escrow_account); - let has_owner_key = changed_keys.contains(&owner_key); - let has_escrow_key = changed_keys.contains(&escrow_key); - - let amount_is_zero = pending.gas_fee.amount.is_zero(); + !changed_keys.contains(&owner_key) + && !changed_keys.contains(&escrow_key) + } - hints::likely(!amount_is_zero && has_owner_key && has_escrow_key) - || hints::unlikely( - amount_is_zero && !has_owner_key && !has_escrow_key, - ) + /// Check if the amount transferred to escrow is nil. + #[inline] + fn transferred_amount_is_nil(&self) -> bool { + let EscrowDelta { + transferred_amount, .. + } = self; + transferred_amount.is_zero() } } @@ -479,15 +490,9 @@ struct EscrowCheck<'a> { impl EscrowCheck<'_> { #[inline] - fn validate_changed_keys( - &self, - changed_keys: &BTreeSet, - pending: &PendingTransfer, - ) -> bool { - self.gas_check.validate_changed_keys(changed_keys, pending) - && self - .token_check - .validate_changed_keys(changed_keys, pending) + fn validate(&self, changed_keys: &BTreeSet) -> bool { + self.gas_check.validate(changed_keys) + && self.token_check.validate(changed_keys) } } @@ -589,7 +594,7 @@ where let wnam_address = read_native_erc20_address(&self.ctx.pre())?; let escrow_checks = self.determine_escrow_checks(&wnam_address, &transfer)?; - if !escrow_checks.validate_changed_keys(keys_changed, &transfer) { + if !escrow_checks.validate(keys_changed) { tracing::debug!( ?transfer, "Missing storage modifications in the Bridge pool" @@ -1903,34 +1908,21 @@ mod test_bridge_pool_vp { #[test] fn test_no_gas_fees_with_no_changed_keys() { let nam_addr = nam(); - let pending = PendingTransfer { - transfer: TransferToEthereum { - kind: TransferToEthereumKind::Erc20, - asset: wnam(), - sender: bertha_address(), - recipient: EthAddress([1; 20]), - amount: Amount::from(1u64), - }, - gas_fee: GasFee { - token: nam(), - // NOTE: testing 0 amount - amount: Amount::zero(), - payer: bertha_address(), - }, - }; let delta = EscrowDelta { token: Cow::Borrowed(&nam_addr), payer_account: &bertha_address(), escrow_account: &BRIDGE_ADDRESS, expected_debit: Amount::zero(), expected_credit: Amount::zero(), + // NOTE: testing 0 amount + transferred_amount: &Amount::zero(), // NOTE: testing gas fees _kind: PhantomData::<*const GasCheck>, }; // NOTE: testing no changed keys let empty_keys = BTreeSet::new(); - assert!(delta.validate_changed_keys(&empty_keys, &pending)); + assert!(delta.validate(&empty_keys)); } /// Test that the Bridge pool native VP rejects transfers that @@ -1938,27 +1930,14 @@ mod test_bridge_pool_vp { #[test] fn test_no_gas_fees_with_changed_keys() { let nam_addr = nam(); - let pending = PendingTransfer { - transfer: TransferToEthereum { - kind: TransferToEthereumKind::Erc20, - asset: wnam(), - sender: bertha_address(), - recipient: EthAddress([1; 20]), - amount: Amount::from(1u64), - }, - gas_fee: GasFee { - token: nam(), - // NOTE: testing 0 amount - amount: Amount::zero(), - payer: bertha_address(), - }, - }; let delta = EscrowDelta { token: Cow::Borrowed(&nam_addr), payer_account: &bertha_address(), escrow_account: &BRIDGE_ADDRESS, expected_debit: Amount::zero(), expected_credit: Amount::zero(), + // NOTE: testing 0 amount + transferred_amount: &Amount::zero(), // NOTE: testing gas fees _kind: PhantomData::<*const GasCheck>, }; @@ -1966,7 +1945,7 @@ mod test_bridge_pool_vp { // NOTE: testing changed keys let some_changed_keys = BTreeSet::from([owner_key]); - assert!(!delta.validate_changed_keys(&some_changed_keys, &pending)); + assert!(!delta.validate(&some_changed_keys)); } /// Test that the Bridge pool native VP validates transfers @@ -1974,34 +1953,21 @@ mod test_bridge_pool_vp { #[test] fn test_no_amount_with_no_changed_keys() { let nam_addr = nam(); - let pending = PendingTransfer { - transfer: TransferToEthereum { - kind: TransferToEthereumKind::Erc20, - asset: wnam(), - sender: bertha_address(), - recipient: EthAddress([1; 20]), - // NOTE: testing 0 amount - amount: Amount::zero(), - }, - gas_fee: GasFee { - token: nam(), - amount: Amount::from(1u64), - payer: bertha_address(), - }, - }; let delta = EscrowDelta { token: Cow::Borrowed(&nam_addr), payer_account: &bertha_address(), escrow_account: &BRIDGE_ADDRESS, expected_debit: Amount::zero(), expected_credit: Amount::zero(), + // NOTE: testing 0 amount + transferred_amount: &Amount::zero(), // NOTE: testing token transfers _kind: PhantomData::<*const TokenCheck>, }; // NOTE: testing no changed keys let empty_keys = BTreeSet::new(); - assert!(delta.validate_changed_keys(&empty_keys, &pending)); + assert!(delta.validate(&empty_keys)); } /// Test that the Bridge pool native VP rejects transfers @@ -2009,27 +1975,14 @@ mod test_bridge_pool_vp { #[test] fn test_no_amount_with_changed_keys() { let nam_addr = nam(); - let pending = PendingTransfer { - transfer: TransferToEthereum { - kind: TransferToEthereumKind::Erc20, - asset: wnam(), - sender: bertha_address(), - recipient: EthAddress([1; 20]), - // NOTE: testing 0 amount - amount: Amount::zero(), - }, - gas_fee: GasFee { - token: nam(), - amount: Amount::from(1u64), - payer: bertha_address(), - }, - }; let delta = EscrowDelta { token: Cow::Borrowed(&nam_addr), payer_account: &bertha_address(), escrow_account: &BRIDGE_ADDRESS, expected_debit: Amount::zero(), expected_credit: Amount::zero(), + // NOTE: testing 0 amount + transferred_amount: &Amount::zero(), // NOTE: testing token transfers _kind: PhantomData::<*const TokenCheck>, }; @@ -2037,6 +1990,6 @@ mod test_bridge_pool_vp { // NOTE: testing changed keys let some_changed_keys = BTreeSet::from([owner_key]); - assert!(!delta.validate_changed_keys(&some_changed_keys, &pending)); + assert!(!delta.validate(&some_changed_keys)); } } From a524dfaa593cdad513a5f5859d4975ac9abc6f3e Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 13 Sep 2023 15:53:58 +0100 Subject: [PATCH 077/114] Changelog for #1892 --- .../unreleased/improvements/1892-bridge-pool-zero-fees.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/1892-bridge-pool-zero-fees.md diff --git a/.changelog/unreleased/improvements/1892-bridge-pool-zero-fees.md b/.changelog/unreleased/improvements/1892-bridge-pool-zero-fees.md new file mode 100644 index 00000000000..83ff3dd0f82 --- /dev/null +++ b/.changelog/unreleased/improvements/1892-bridge-pool-zero-fees.md @@ -0,0 +1,2 @@ +- Allow Bridge pool transfers to pay zero gas fees + ([\#1892](https://github.com/anoma/namada/pull/1892)) \ No newline at end of file From 362148183c60b45304102467540664eed6944c12 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 13:39:34 +0100 Subject: [PATCH 078/114] Name Bridge pool root prefixes --- .../ledger/eth_bridge/storage/bridge_pool.rs | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/core/src/ledger/eth_bridge/storage/bridge_pool.rs b/core/src/ledger/eth_bridge/storage/bridge_pool.rs index b37b26da611..78e15b5d388 100644 --- a/core/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/core/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -15,6 +15,14 @@ use crate::types::hash::Hash; use crate::types::keccak::{keccak_hash, KeccakHash}; use crate::types::storage::{BlockHeight, DbKeySeg, Key, KeySeg}; +/// Prefix to be used in Bridge pool tree root computations. +/// This value corresponds to leaf nodes. +const POOL_ROOT_PREFIX_LEAF: u8 = 0x00; + +/// Prefix to be used in Bridge pool tree root computations. +/// This value corresponds to non-leaf nodes. +const POOL_ROOT_PREFIX_NON_LEAF: u8 = 0xff; + /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = Address::Internal(InternalAddress::EthBridgePool); @@ -156,7 +164,7 @@ impl BridgePoolTree { /// Compute the root of the merkle tree fn compute_root(&self) -> KeccakHash { let mut hashes: Vec = self.leaves.keys().cloned().collect(); - let mut prefix = 0u8; + let mut prefix = POOL_ROOT_PREFIX_LEAF; while hashes.len() > 1 { let mut next_hashes = vec![]; for pair in hashes.chunks(2) { @@ -165,7 +173,7 @@ impl BridgePoolTree { next_hashes.push(hash_pair(left, right, prefix)); } hashes = next_hashes; - prefix = 0xff; + prefix = POOL_ROOT_PREFIX_NON_LEAF; } if hashes.is_empty() { @@ -217,7 +225,7 @@ impl BridgePoolTree { }) .collect(); - let mut prefix = 0u8; + let mut prefix = POOL_ROOT_PREFIX_LEAF; while hashes.len() > 1 { let mut next_hashes = vec![]; @@ -262,7 +270,7 @@ impl BridgePoolTree { } } hashes = next_hashes; - prefix = 0xff; + prefix = POOL_ROOT_PREFIX_NON_LEAF; } // add the root to the proof if flags.is_empty() && proof_hashes.is_empty() && leaves.is_empty() { @@ -373,11 +381,11 @@ impl BridgePoolProof { let (left, prefix) = if leaf_pos < leaf_len { let next = self.leaves[leaf_pos].keccak256(); leaf_pos += 1; - (next, 0x00) + (next, POOL_ROOT_PREFIX_LEAF) } else { let next = hashes[hash_pos].clone(); hash_pos += 1; - (next, 0xff) + (next, POOL_ROOT_PREFIX_NON_LEAF) }; let right = if self.flags[i] { if leaf_pos < leaf_len { @@ -501,8 +509,11 @@ mod test_bridge_pool_tree { transfers.push(transfer); let _ = tree.insert_key(&key, BlockHeight(1)).expect("Test failed"); } - let expected = - hash_pair(transfers[0].keccak256(), transfers[1].keccak256(), 0); + let expected = hash_pair( + transfers[0].keccak256(), + transfers[1].keccak256(), + POOL_ROOT_PREFIX_LEAF, + ); assert_eq!(tree.root(), expected); } @@ -538,11 +549,18 @@ mod test_bridge_pool_tree { tree.leaves.keys().cloned().collect::>() ); - let left_hash = - hash_pair(transfers[0].keccak256(), transfers[1].keccak256(), 0); - let right_hash = - hash_pair(transfers[2].keccak256(), Default::default(), 0); - let expected = hash_pair(left_hash, right_hash, 0xff); + let left_hash = hash_pair( + transfers[0].keccak256(), + transfers[1].keccak256(), + POOL_ROOT_PREFIX_LEAF, + ); + let right_hash = hash_pair( + transfers[2].keccak256(), + Default::default(), + POOL_ROOT_PREFIX_LEAF, + ); + let expected = + hash_pair(left_hash, right_hash, POOL_ROOT_PREFIX_NON_LEAF); assert_eq!(tree.root(), expected); } @@ -603,8 +621,11 @@ mod test_bridge_pool_tree { let deleted_key = Key::from(&transfers[1]); tree.delete_key(&deleted_key).expect("Test failed"); - let expected = - hash_pair(transfers[0].keccak256(), transfers[2].keccak256(), 0); + let expected = hash_pair( + transfers[0].keccak256(), + transfers[2].keccak256(), + POOL_ROOT_PREFIX_LEAF, + ); assert_eq!(tree.root(), expected); assert_matches!(tree.get(&deleted_key), Err(_)); } From 05c4519621f46e08c47bb96c3ac509dd377793f2 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 13 Sep 2023 13:36:13 +0100 Subject: [PATCH 079/114] Changelog for #1885 --- .../unreleased/miscellaneous/1885-migrate-new-contracts.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/miscellaneous/1885-migrate-new-contracts.md diff --git a/.changelog/unreleased/miscellaneous/1885-migrate-new-contracts.md b/.changelog/unreleased/miscellaneous/1885-migrate-new-contracts.md new file mode 100644 index 00000000000..42e75fb5a3a --- /dev/null +++ b/.changelog/unreleased/miscellaneous/1885-migrate-new-contracts.md @@ -0,0 +1,2 @@ +- Migrate to the new Ethereum contracts + ([\#1885](https://github.com/anoma/namada/pull/1885)) \ No newline at end of file From d0f8337350df48deade661f930a8fb28bcd836d6 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 13:45:10 +0100 Subject: [PATCH 080/114] New method to append segments to a storage key --- core/src/types/storage.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/types/storage.rs b/core/src/types/storage.rs index b6467b8a000..e94f1280b86 100644 --- a/core/src/types/storage.rs +++ b/core/src/types/storage.rs @@ -497,6 +497,13 @@ impl Key { Ok(Key { segments }) } + /// Takes ownership of the key, appends a new segment to it, + /// and returns the modified key. + pub fn with_segment(mut self, other: T) -> Self { + self.segments.push(other.to_db_key()); + self + } + /// Returns a new key with segments of `Self` and the given key pub fn join(&self, other: &Key) -> Self { let mut segments = self.segments.clone(); From 589f5118358e0c3578adc12273c417b5f35038f4 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 13:48:41 +0100 Subject: [PATCH 081/114] Parameterize signed Bridge pool root by its block height --- .../transactions/bridge_pool_roots.rs | 52 ++++++++++--------- ethereum_bridge/src/storage/vote_tallies.rs | 34 ++++++------ shared/src/ledger/protocol/mod.rs | 7 +-- 3 files changed, 50 insertions(+), 43 deletions(-) diff --git a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs index 85718814536..cee70fcf4d1 100644 --- a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs +++ b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs @@ -49,20 +49,17 @@ where let (partial_proof, seen_by) = parse_vexts(wl_storage, vext); // apply updates to the bridge pool root. - let (mut changed, confirmed) = apply_update( + let (mut changed, confirmed_update) = apply_update( wl_storage, - partial_proof.clone(), + root_height, + partial_proof, seen_by, &voting_powers, )?; // if the root is confirmed, update storage and add // relevant key to changed. - if confirmed { - let proof = votes::storage::read_body( - wl_storage, - &vote_tallies::Keys::from(&partial_proof), - )?; + if let Some(proof) = confirmed_update { wl_storage .write_bytes( &get_signed_root_key(), @@ -138,15 +135,16 @@ where /// In all instances, the changed storage keys are returned. fn apply_update( wl_storage: &mut WlStorage, + root_height: BlockHeight, mut update: BridgePoolRoot, seen_by: Votes, voting_powers: &HashMap<(Address, BlockHeight), FractionalVotingPower>, -) -> Result<(ChangedKeys, bool)> +) -> Result<(ChangedKeys, Option)> where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, { - let bp_key = vote_tallies::Keys::from(&update); + let bp_key = vote_tallies::Keys::from((&update, root_height)); let partial_proof = votes::storage::read_body(wl_storage, &bp_key); let (vote_tracking, changed, confirmed, already_present) = if let Ok( partial, @@ -162,7 +160,7 @@ where let (vote_tracking, changed) = votes::update::calculate(wl_storage, &bp_key, new_votes)?; if changed.is_empty() { - return Ok((changed, false)); + return Ok((changed, None)); } let confirmed = vote_tracking.seen && changed.contains(&bp_key.seen()); (vote_tracking, changed, confirmed, true) @@ -181,7 +179,7 @@ where &vote_tracking, already_present, )?; - Ok((changed, confirmed)) + Ok((changed, confirmed.then_some(update))) } #[cfg(test)] @@ -292,8 +290,9 @@ mod test_apply_bp_roots_to_storage { let TxResult { changed_keys, .. } = apply_derived_tx(&mut wl_storage, vext.into()) .expect("Test failed"); - let bp_root_key = vote_tallies::Keys::from(BridgePoolRoot( - BridgePoolRootProof::new((root, nonce)), + let bp_root_key = vote_tallies::Keys::from(( + &BridgePoolRoot(BridgePoolRootProof::new((root, nonce))), + 100.into(), )); let expected: BTreeSet = bp_root_key.into_iter().collect(); assert_eq!(expected, changed_keys); @@ -349,8 +348,9 @@ mod test_apply_bp_roots_to_storage { vexts.insert(vext); let TxResult { changed_keys, .. } = apply_derived_tx(&mut wl_storage, vexts).expect("Test failed"); - let bp_root_key = vote_tallies::Keys::from(BridgePoolRoot( - BridgePoolRootProof::new((root, nonce)), + let bp_root_key = vote_tallies::Keys::from(( + &BridgePoolRoot(BridgePoolRootProof::new((root, nonce))), + 100.into(), )); let mut expected: BTreeSet = bp_root_key.into_iter().collect(); @@ -392,8 +392,9 @@ mod test_apply_bp_roots_to_storage { let TxResult { changed_keys, .. } = apply_derived_tx(&mut wl_storage, vext.into()) .expect("Test failed"); - let bp_root_key = vote_tallies::Keys::from(BridgePoolRoot( - BridgePoolRootProof::new((root, nonce)), + let bp_root_key = vote_tallies::Keys::from(( + &BridgePoolRoot(BridgePoolRootProof::new((root, nonce))), + 100.into(), )); let expected: BTreeSet = [ bp_root_key.seen(), @@ -417,8 +418,9 @@ mod test_apply_bp_roots_to_storage { let root = wl_storage.ethbridge_queries().get_bridge_pool_root(); let nonce = wl_storage.ethbridge_queries().get_bridge_pool_nonce(); let to_sign = keccak_hash([root.0, nonce.to_bytes()].concat()); - let bp_root_key = vote_tallies::Keys::from(BridgePoolRoot( - BridgePoolRootProof::new((root, nonce)), + let bp_root_key = vote_tallies::Keys::from(( + &BridgePoolRoot(BridgePoolRootProof::new((root, nonce))), + 100.into(), )); let hot_key = &keys[&validators[0]].eth_bridge; @@ -471,8 +473,9 @@ mod test_apply_bp_roots_to_storage { let to_sign = keccak_hash([root.0, nonce.to_bytes()].concat()); let hot_key = &keys[&validators[0]].eth_bridge; - let bp_root_key = vote_tallies::Keys::from(BridgePoolRoot( - BridgePoolRootProof::new((root, nonce)), + let bp_root_key = vote_tallies::Keys::from(( + &BridgePoolRoot(BridgePoolRootProof::new((root, nonce))), + 100.into(), )); let vext = bridge_pool_roots::Vext { @@ -529,8 +532,9 @@ mod test_apply_bp_roots_to_storage { let to_sign = keccak_hash([root.0, nonce.to_bytes()].concat()); let hot_key = &keys[&validators[0]].eth_bridge; - let bp_root_key = vote_tallies::Keys::from(BridgePoolRoot( - BridgePoolRootProof::new((root, nonce)), + let bp_root_key = vote_tallies::Keys::from(( + &BridgePoolRoot(BridgePoolRootProof::new((root, nonce))), + 100.into(), )); let vext = bridge_pool_roots::Vext { @@ -593,7 +597,7 @@ mod test_apply_bp_roots_to_storage { let hot_key = &keys[&validators[0]].eth_bridge; let mut expected = BridgePoolRoot(BridgePoolRootProof::new((root, nonce))); - let bp_root_key = vote_tallies::Keys::from(&expected); + let bp_root_key = vote_tallies::Keys::from((&expected, 100.into())); let vext = bridge_pool_roots::Vext { validator_addr: validators[0].clone(), diff --git a/ethereum_bridge/src/storage/vote_tallies.rs b/ethereum_bridge/src/storage/vote_tallies.rs index 084746adbbe..4b2d26c5c45 100644 --- a/ethereum_bridge/src/storage/vote_tallies.rs +++ b/ethereum_bridge/src/storage/vote_tallies.rs @@ -8,8 +8,8 @@ use namada_core::ledger::eth_bridge::ADDRESS; use namada_core::types::address::Address; use namada_core::types::ethereum_events::{EthereumEvent, Uint}; use namada_core::types::hash::Hash; -use namada_core::types::keccak::KeccakHash; -use namada_core::types::storage::{DbKeySeg, Epoch, Key}; +use namada_core::types::keccak::{keccak_hash, KeccakHash}; +use namada_core::types::storage::{BlockHeight, DbKeySeg, Epoch, Key}; use namada_core::types::vote_extensions::validator_set_update::VotingPowersMap; use namada_macros::StorageKeys; @@ -207,15 +207,23 @@ impl BorshDeserialize for BridgePoolRoot { } } -impl<'a> From<&'a BridgePoolRoot> for Keys { - fn from(bp_root: &BridgePoolRoot) -> Self { - let hash = [bp_root.0.data.0.to_string(), bp_root.0.data.1.to_string()] - .concat(); +impl From<(&BridgePoolRoot, BlockHeight)> for Keys { + fn from( + (BridgePoolRoot(bp_root), root_height): (&BridgePoolRoot, BlockHeight), + ) -> Self { + let hash = { + let (KeccakHash(root), nonce) = &bp_root.data; + + let mut to_hash = [0u8; 64]; + to_hash[..32].copy_from_slice(root); + to_hash[32..].copy_from_slice(&nonce.to_bytes()); + + keccak_hash(to_hash).to_string() + }; let prefix = super::prefix() - .push(&BRIDGE_POOL_ROOT_PREFIX_KEY_SEGMENT.to_owned()) - .expect("should always be able to construct this key") - .push(&hash) - .expect("should always be able to construct this key"); + .with_segment(BRIDGE_POOL_ROOT_PREFIX_KEY_SEGMENT.to_owned()) + .with_segment(root_height) + .with_segment(hash); Keys { prefix, _phantom: std::marker::PhantomData, @@ -223,12 +231,6 @@ impl<'a> From<&'a BridgePoolRoot> for Keys { } } -impl From for Keys { - fn from(bp_root: BridgePoolRoot) -> Self { - Self::from(&bp_root) - } -} - /// Get the key prefix corresponding to the storage location of validator set /// updates whose "seen" state is being tracked. pub fn valset_upds_prefix() -> Key { diff --git a/shared/src/ledger/protocol/mod.rs b/shared/src/ledger/protocol/mod.rs index c6ed0814b17..2891f1f0fbf 100644 --- a/shared/src/ledger/protocol/mod.rs +++ b/shared/src/ledger/protocol/mod.rs @@ -1210,9 +1210,10 @@ mod tests { apply_eth_tx(tx.clone(), &mut wl_storage)?; apply_eth_tx(tx, &mut wl_storage)?; - let bp_root_keys = vote_tallies::Keys::from( - vote_tallies::BridgePoolRoot(EthereumProof::new((root, nonce))), - ); + let bp_root_keys = vote_tallies::Keys::from(( + &vote_tallies::BridgePoolRoot(EthereumProof::new((root, nonce))), + 100.into(), + )); let root_seen_by_bytes = wl_storage.read_bytes(&bp_root_keys.seen_by())?; assert_eq!( From cd8a0c4b5ff8a6c7d52e2d390271af5621be2582 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 14:01:04 +0100 Subject: [PATCH 082/114] Only update a signed BP root in storage if it is newer than old root --- .../transactions/bridge_pool_roots.rs | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs index cee70fcf4d1..34a9de3dba0 100644 --- a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs +++ b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs @@ -1,10 +1,9 @@ use std::collections::{HashMap, HashSet}; -use borsh::BorshSerialize; use eyre::Result; use namada_core::ledger::eth_bridge::storage::bridge_pool::get_signed_root_key; use namada_core::ledger::storage::{DBIter, StorageHasher, WlStorage, DB}; -use namada_core::ledger::storage_api::StorageWrite; +use namada_core::ledger::storage_api::{StorageRead, StorageWrite}; use namada_core::types::address::Address; use namada_core::types::storage::BlockHeight; use namada_core::types::transaction::TxResult; @@ -60,17 +59,32 @@ where // if the root is confirmed, update storage and add // relevant key to changed. if let Some(proof) = confirmed_update { - wl_storage - .write_bytes( - &get_signed_root_key(), - (proof, root_height) - .try_to_vec() - .expect("Serializing a Bridge pool root shouldn't fail."), - ) + let signed_root_key = get_signed_root_key(); + let should_write_root = wl_storage + .read::<(BridgePoolRoot, BlockHeight)>(&signed_root_key) .expect( - "Writing a signed bridge pool root to storage should not fail.", - ); - changed.insert(get_signed_root_key()); + "Reading a signed Bridge pool root from storage should not \ + fail", + ) + .map(|(_, existing_root_height)| { + // only write the newly confirmed signed root if + // it is more recent than the existing root in + // storage + existing_root_height < root_height + }) + .unwrap_or({ + // if no signed root was present in storage, write the new one + true + }); + if should_write_root { + wl_storage + .write(&signed_root_key, (proof, root_height)) + .expect( + "Writing a signed Bridge pool root to storage should not \ + fail.", + ); + changed.insert(get_signed_root_key()); + } } Ok(TxResult { From b28aaf2007bbdcfd0848ababd6bc0f355ab07384 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 14:28:44 +0100 Subject: [PATCH 083/114] Add Debug to Bridge pool root tallies --- ethereum_bridge/src/storage/vote_tallies.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum_bridge/src/storage/vote_tallies.rs b/ethereum_bridge/src/storage/vote_tallies.rs index 4b2d26c5c45..09c9278d437 100644 --- a/ethereum_bridge/src/storage/vote_tallies.rs +++ b/ethereum_bridge/src/storage/vote_tallies.rs @@ -189,7 +189,7 @@ impl From<&Hash> for Keys { /// A wrapper struct for managing keys related to /// tracking signatures over bridge pool roots and nonces. -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct BridgePoolRoot(pub BridgePoolRootProof); impl BorshSerialize for BridgePoolRoot { From d1ab2e12dbe423d9f917b811d8969e0f86baaefd Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 14:29:15 +0100 Subject: [PATCH 084/114] Write test_more_recent_signed_root_not_overwritten() unit test --- .../transactions/bridge_pool_roots.rs | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs index 34a9de3dba0..6b36aa47734 100644 --- a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs +++ b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs @@ -200,6 +200,7 @@ where mod test_apply_bp_roots_to_storage { use std::collections::BTreeSet; + use assert_matches::assert_matches; use borsh::{BorshDeserialize, BorshSerialize}; use namada_core::ledger::eth_bridge::storage::bridge_pool::{ get_key_from_hash, get_nonce_key, @@ -253,6 +254,11 @@ mod test_apply_bp_roots_to_storage { ]), ); bridge_pool_vp::init_storage(&mut wl_storage); + test_utils::commit_bridge_pool_root_at_height( + &mut wl_storage.storage, + &KeccakHash([1; 32]), + 99.into(), + ); test_utils::commit_bridge_pool_root_at_height( &mut wl_storage.storage, &KeccakHash([1; 32]), @@ -835,4 +841,79 @@ mod test_apply_bp_roots_to_storage { let root_epoch_validators = query_validators(root_epoch.0); assert_eq!(epoch_0_validators, root_epoch_validators); } + + #[test] + /// Test that a signed root is not overwritten in storage + /// if a signed root is decided that had been signed at a + /// less recent block height. + fn test_more_recent_signed_root_not_overwritten() { + let TestPackage { + validators, + keys, + mut wl_storage, + } = setup(); + + let root = wl_storage.ethbridge_queries().get_bridge_pool_root(); + let nonce = wl_storage.ethbridge_queries().get_bridge_pool_nonce(); + let to_sign = keccak_hash([root.0, nonce.to_bytes()].concat()); + + macro_rules! decide_at_height { + ($block_height:expr) => { + let hot_key = &keys[&validators[0]].eth_bridge; + let vext = bridge_pool_roots::Vext { + validator_addr: validators[0].clone(), + block_height: $block_height.into(), + sig: Signed::<_, SignableEthMessage>::new( + hot_key, + to_sign.clone(), + ) + .sig, + } + .sign(&keys[&validators[0]].protocol); + _ = apply_derived_tx(&mut wl_storage, vext.into()) + .expect("Test failed"); + let hot_key = &keys[&validators[1]].eth_bridge; + let vext = bridge_pool_roots::Vext { + validator_addr: validators[1].clone(), + block_height: $block_height.into(), + sig: Signed::<_, SignableEthMessage>::new( + hot_key, + to_sign.clone(), + ) + .sig, + } + .sign(&keys[&validators[1]].protocol); + _ = apply_derived_tx(&mut wl_storage, vext.into()) + .expect("Test failed"); + }; + } + + // decide bridge pool root signed at block height 100 + decide_at_height!(100); + + // check the signed root in storage + let root_in_storage = wl_storage + .read::<(BridgePoolRoot, BlockHeight)>(&get_signed_root_key()) + .expect("Test failed - storage read failed") + .expect("Test failed - no signed root in storage"); + assert_matches!( + root_in_storage, + (BridgePoolRoot(r), BlockHeight(100)) + if r.data.0 == root && r.data.1 == nonce + ); + + // decide bridge pool root signed at block height 99 + decide_at_height!(99); + + // check the signed root in storage is unchanged + let root_in_storage = wl_storage + .read::<(BridgePoolRoot, BlockHeight)>(&get_signed_root_key()) + .expect("Test failed - storage read failed") + .expect("Test failed - no signed root in storage"); + assert_matches!( + root_in_storage, + (BridgePoolRoot(r), BlockHeight(100)) + if r.data.0 == root && r.data.1 == nonce + ); + } } From 299fbc8a1a573de259f1a03060ac045fce411c86 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 15:24:26 +0100 Subject: [PATCH 085/114] Return immediately if a BP proof is already available --- .../protocol/transactions/bridge_pool_roots.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs index 6b36aa47734..4def4464120 100644 --- a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs +++ b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs @@ -47,10 +47,23 @@ where let root_height = vext.iter().next().unwrap().data.block_height; let (partial_proof, seen_by) = parse_vexts(wl_storage, vext); + // return immediately if a complete proof has already been acquired + let bp_key = vote_tallies::Keys::from((&partial_proof, root_height)); + let seen = + votes::storage::maybe_read_seen(wl_storage, &bp_key)?.unwrap_or(false); + if seen { + tracing::debug!( + ?root_height, + ?partial_proof, + "Bridge pool root tally is already complete" + ); + return Ok(TxResult::default()); + } + // apply updates to the bridge pool root. let (mut changed, confirmed_update) = apply_update( wl_storage, - root_height, + bp_key, partial_proof, seen_by, &voting_powers, @@ -149,7 +162,7 @@ where /// In all instances, the changed storage keys are returned. fn apply_update( wl_storage: &mut WlStorage, - root_height: BlockHeight, + bp_key: vote_tallies::Keys, mut update: BridgePoolRoot, seen_by: Votes, voting_powers: &HashMap<(Address, BlockHeight), FractionalVotingPower>, @@ -158,7 +171,6 @@ where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, { - let bp_key = vote_tallies::Keys::from((&update, root_height)); let partial_proof = votes::storage::read_body(wl_storage, &bp_key); let (vote_tracking, changed, confirmed, already_present) = if let Ok( partial, From c92f8be85dad2cd8ba09fa597019089dc49fd5ac Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 14 Sep 2023 15:34:31 +0100 Subject: [PATCH 086/114] Add debug logs for discarded Bridge pool root proofs --- .../src/protocol/transactions/bridge_pool_roots.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs index 4def4464120..cd28eeb8c71 100644 --- a/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs +++ b/ethereum_bridge/src/protocol/transactions/bridge_pool_roots.rs @@ -90,6 +90,10 @@ where true }); if should_write_root { + tracing::debug!( + ?root_height, + "New Bridge pool root proof acquired" + ); wl_storage .write(&signed_root_key, (proof, root_height)) .expect( @@ -97,6 +101,11 @@ where fail.", ); changed.insert(get_signed_root_key()); + } else { + tracing::debug!( + ?root_height, + "Discarding outdated Bridge pool root proof" + ); } } From ac727b98d4beb2fb9a04f85cbd9a07f6c8c6d098 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Mon, 11 Sep 2023 11:58:02 +0200 Subject: [PATCH 087/114] Allow public key to be specified in signature section. --- apps/src/lib/cli/client.rs | 2 +- apps/src/lib/client/tx.rs | 50 +++-- benches/host_env.rs | 10 +- core/src/ledger/governance/cli/offline.rs | 22 +- core/src/proto/mod.rs | 2 +- core/src/proto/types.rs | 244 +++++++++++++++------- core/src/types/account.rs | 14 +- shared/src/ledger/signing.rs | 9 +- tests/src/vm_host_env/mod.rs | 50 ++--- wasm/checksums.json | 42 ++-- wasm/wasm_source/src/vp_implicit.rs | 20 +- wasm/wasm_source/src/vp_testnet_faucet.rs | 8 +- wasm/wasm_source/src/vp_user.rs | 34 +-- wasm/wasm_source/src/vp_validator.rs | 34 +-- wasm_for_tests/tx_memory_limit.wasm | Bin 461032 -> 458918 bytes wasm_for_tests/tx_mint_tokens.wasm | Bin 595637 -> 595637 bytes wasm_for_tests/tx_no_op.wasm | Bin 381071 -> 378213 bytes wasm_for_tests/tx_proposal_code.wasm | Bin 540664 -> 537785 bytes wasm_for_tests/tx_read_storage_key.wasm | Bin 465085 -> 464053 bytes wasm_for_tests/tx_write.wasm | Bin 468686 -> 467479 bytes wasm_for_tests/tx_write_storage_key.wasm | Bin 465585 -> 465585 bytes wasm_for_tests/vp_always_false.wasm | Bin 436052 -> 435152 bytes wasm_for_tests/vp_always_true.wasm | Bin 436052 -> 435152 bytes wasm_for_tests/vp_eval.wasm | Bin 510831 -> 507688 bytes wasm_for_tests/vp_memory_limit.wasm | Bin 485554 -> 484515 bytes wasm_for_tests/vp_read_storage_key.wasm | Bin 490646 -> 491789 bytes 26 files changed, 324 insertions(+), 217 deletions(-) diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 675c5b4aea4..418e3645396 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -246,7 +246,7 @@ impl CliApi { &client, &mut ctx.wallet, &args.tx, - &Some(args.sender.clone()), + Some(args.sender.clone()), default_signer, ) .await?; diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index c3a46d3fd7f..36f2d405fd8 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -42,7 +42,7 @@ pub async fn aux_signing_data( client: &C, wallet: &mut Wallet, args: &args::Tx, - owner: &Option
, + owner: Option
, default_signer: Option
, ) -> Result { let signing_data = @@ -88,7 +88,7 @@ pub async fn submit_reveal_aux( if tx::is_reveal_pk_needed::(client, address, args.force).await? { let signing_data = - aux_signing_data(client, &mut ctx.wallet, &args, &None, None) + aux_signing_data(client, &mut ctx.wallet, &args, None, None) .await?; let (mut tx, _epoch) = tx::build_reveal_pk( @@ -126,7 +126,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(args.owner.clone()), + Some(args.owner.clone()), default_signer, ) .await?; @@ -168,7 +168,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(args.addr.clone()), + Some(args.addr.clone()), default_signer, ) .await?; @@ -203,7 +203,7 @@ where C::Error: std::fmt::Display, { let signing_data = - aux_signing_data(client, &mut ctx.wallet, &args.tx, &None, None) + aux_signing_data(client, &mut ctx.wallet, &args.tx, None, None) .await?; let (mut tx, _epoch) = tx::build_init_account( @@ -429,7 +429,7 @@ pub async fn submit_init_validator< tx.add_code_from_hash(tx_code_hash).add_data(data); let signing_data = - aux_signing_data(client, &mut ctx.wallet, &tx_args, &None, None) + aux_signing_data(client, &mut ctx.wallet, &tx_args, None, None) .await?; tx::prepare_tx( @@ -647,7 +647,7 @@ pub async fn submit_transfer( client, &mut ctx.wallet, &args.tx, - &Some(args.source.effective_address()), + Some(args.source.effective_address()), default_signer, ) .await?; @@ -720,7 +720,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(args.source.clone()), + Some(args.source.clone()), default_signer, ) .await?; @@ -775,7 +775,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(proposal.author.clone()), + Some(proposal.author.clone()), default_signer, ) .await?; @@ -810,7 +810,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(proposal.proposal.author.clone()), + Some(proposal.proposal.author.clone()), default_signer, ) .await?; @@ -862,7 +862,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(proposal.proposal.author.clone()), + Some(proposal.proposal.author.clone()), default_signer, ) .await?; @@ -912,7 +912,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(proposal.proposal.author.clone()), + Some(proposal.proposal.author.clone()), default_signer, ) .await?; @@ -971,7 +971,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(args.voter.clone()), + Some(args.voter.clone()), default_signer.clone(), ) .await?; @@ -1070,7 +1070,7 @@ where client, &mut ctx.wallet, &tx_args, - &Some(owner), + Some(owner.clone()), default_signer, ) .await?; @@ -1097,13 +1097,13 @@ where if let Some(account_public_keys_map) = signing_data.account_public_keys_map { let signatures = - tx.compute_section_signature(secret_keys, &account_public_keys_map); + tx.compute_section_signature(secret_keys, &account_public_keys_map, Some(owner)); for signature in &signatures { let filename = format!( "offline_signature_{}_{}.tx", tx.header_hash(), - signature.index + signature.pubkey, ); let output_path = match &tx_args.output_folder { Some(path) => path.join(filename), @@ -1120,9 +1120,7 @@ where .expect("Signature should be deserializable."); println!( "Signature for {} serialized at {}", - &account_public_keys_map - .get_public_key_from_index(signature.index) - .unwrap(), + signature.pubkey, output_path.display() ); } @@ -1158,7 +1156,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(default_address.clone()), + Some(default_address.clone()), default_signer, ) .await?; @@ -1200,7 +1198,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(default_address), + Some(default_address), default_signer, ) .await?; @@ -1243,7 +1241,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(default_address), + Some(default_address), default_signer, ) .await?; @@ -1284,7 +1282,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(args.validator.clone()), + Some(args.validator.clone()), default_signer, ) .await?; @@ -1325,7 +1323,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(args.validator.clone()), + Some(args.validator.clone()), default_signer, ) .await?; @@ -1367,7 +1365,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(args.steward.clone()), + Some(args.steward.clone()), default_signer, ) .await?; @@ -1407,7 +1405,7 @@ where client, &mut ctx.wallet, &args.tx, - &Some(args.steward.clone()), + Some(args.steward.clone()), default_signer, ) .await?; diff --git a/benches/host_env.rs b/benches/host_env.rs index 6a3cc6e37b8..a55b97a2470 100644 --- a/benches/host_env.rs +++ b/benches/host_env.rs @@ -5,6 +5,7 @@ use namada::core::types::address; use namada::core::types::token::{Amount, Transfer}; use namada::proto::{Data, MultiSignature, Section}; use namada_apps::wallet::defaults; +use std::collections::HashSet; /// Benchmarks the validation of a single signature on a single `Section` of a /// transaction @@ -26,15 +27,14 @@ fn tx_section_signature_validation(c: &mut Criterion) { let multisig = MultiSignature::new( vec![section_hash], - &[defaults::albert_keypair()], - &pkim, + pkim.index_secret_keys(vec![defaults::albert_keypair()]), + None, ); - let signature_index = multisig.signatures.first().unwrap().clone(); c.bench_function("tx_section_signature_validation", |b| { b.iter(|| { - signature_index - .verify(&pkim, &multisig.get_raw_hash()) + multisig + .verify_signature(&mut HashSet::new(), &pkim) .unwrap() }) }); diff --git a/core/src/ledger/governance/cli/offline.rs b/core/src/ledger/governance/cli/offline.rs index 3f9feeb1dce..29afb07b74c 100644 --- a/core/src/ledger/governance/cli/offline.rs +++ b/core/src/ledger/governance/cli/offline.rs @@ -315,18 +315,12 @@ fn compute_signatures_index( account_public_keys_map: &AccountPublicKeysMap, hashed_data: &Hash, ) -> BTreeSet { - keys.iter() - .filter_map(|signing_key| { + account_public_keys_map.index_secret_keys(keys.to_vec()).values() + .map(|signing_key| { let public_key = signing_key.ref_to(); - let public_key_index = - account_public_keys_map.get_index_from_public_key(&public_key); - if public_key_index.is_some() { - let signature = - common::SigScheme::sign(signing_key, hashed_data); - Some(SignatureIndex::from_single_signature(signature)) - } else { - None - } + let signature = + common::SigScheme::sign(signing_key, hashed_data); + SignatureIndex::from_single_signature(public_key, signature) }) .collect::>() } @@ -338,11 +332,9 @@ fn compute_total_valid_signatures( hashed_data: &Hash, ) -> u8 { signatures.iter().fold(0_u8, |acc, signature_index| { - let public_key = account_public_keys_map - .get_public_key_from_index(signature_index.index); - if let Some(pk) = public_key { + if account_public_keys_map.get_index_from_public_key(&signature_index.pubkey).is_some() { let sig_check = common::SigScheme::verify_signature( - &pk, + &signature_index.pubkey, hashed_data, &signature_index.signature, ); diff --git a/core/src/proto/mod.rs b/core/src/proto/mod.rs index e8411a41d2d..497c6064778 100644 --- a/core/src/proto/mod.rs +++ b/core/src/proto/mod.rs @@ -6,7 +6,7 @@ mod types; pub use types::{ Code, Commitment, Data, Dkg, Error, Header, MaspBuilder, MultiSignature, Section, Signable, SignableEthMessage, Signature, SignatureIndex, Signed, - Tx, TxError, + Signer, Tx, TxError, }; #[cfg(test)] diff --git a/core/src/proto/types.rs b/core/src/proto/types.rs index 43da551d871..0c59fd1e0a4 100644 --- a/core/src/proto/types.rs +++ b/core/src/proto/types.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; use std::cmp::Ordering; -use std::collections::{BTreeSet, HashMap, HashSet}; +use std::collections::{BTreeMap, HashMap, HashSet}; use std::convert::TryFrom; use std::hash::{Hash, Hasher}; use std::marker::PhantomData; @@ -389,40 +389,27 @@ impl Code { PartialEq, )] pub struct SignatureIndex { + pub pubkey: common::PublicKey, + pub index: Option<(Address, u8)>, pub signature: common::Signature, - pub index: u8, } impl SignatureIndex { - pub fn from_single_signature(signature: common::Signature) -> Self { + pub fn from_single_signature( + pubkey: common::PublicKey, + signature: common::Signature, + ) -> Self { Self { + pubkey, signature, - index: 0, + index: None, } } - + pub fn to_vec(&self) -> Vec { vec![self.clone()] } - pub fn verify( - &self, - public_key_index_map: &AccountPublicKeysMap, - data: &impl SignableBytes, - ) -> std::result::Result<(), VerifySigError> { - let public_key = - public_key_index_map.get_public_key_from_index(self.index); - if let Some(public_key) = public_key { - common::SigScheme::verify_signature( - &public_key, - data, - &self.signature, - ) - } else { - Err(VerifySigError::MissingData) - } - } - pub fn serialize(&self) -> String { let signature_bytes = self.try_to_vec().expect("Signature should be serializable"); @@ -444,7 +431,7 @@ impl SignatureIndex { impl Ord for SignatureIndex { fn cmp(&self, other: &Self) -> Ordering { - self.index.cmp(&other.index) + self.pubkey.cmp(&other.pubkey) } } @@ -454,6 +441,23 @@ impl PartialOrd for SignatureIndex { } } +/// Indicates the list of public keys against which signatures will be verified +#[derive( + Clone, + Debug, + BorshSerialize, + BorshDeserialize, + BorshSchema, + Serialize, + Deserialize, +)] +pub enum Signer { + /// The address of a multisignature account + Address(Address), + /// The public keys that constitute a signer + PubKeys(Vec), +} + /// A section representing a multisig over another section #[derive( Clone, @@ -467,41 +471,50 @@ impl PartialOrd for SignatureIndex { pub struct MultiSignature { /// The hash of the section being signed pub targets: Vec, + /// The public keys against which the signatures should be verified + pub signer: Signer, /// The signature over the above hash - pub signatures: BTreeSet, + pub signatures: BTreeMap, } impl MultiSignature { /// Sign the given section hash with the given key and return a section pub fn new( targets: Vec, - secret_keys: &[common::SecretKey], - public_keys_index_map: &AccountPublicKeysMap, + secret_keys: BTreeMap, + signer: Option
, ) -> Self { + // If no signer address is given, then derive the signer's public keys + // from the given secret keys. + let signer = if let Some(addr) = signer { + Signer::Address(addr) + } else { + // Make sure the corresponding public keys can be represented by a + // vector instead of a map + assert!( + secret_keys.keys().cloned().eq(0..(secret_keys.len() as u8)), + "seecret keys must be enumerateed when signer address is absent" + ); + Signer::PubKeys(secret_keys.values().map(RefTo::ref_to).collect()) + }; + + // Commit to the given targets let target = Self { targets: targets.clone(), - signatures: BTreeSet::new(), + signer: Signer::PubKeys(vec![]), + signatures: BTreeMap::new(), } .get_hash(); - let signatures_public_keys_map = - secret_keys.iter().map(|secret_key: &common::SecretKey| { - let signature = common::SigScheme::sign(secret_key, target); - let public_key = secret_key.ref_to(); - (public_key, signature) - }); - - let signatures = signatures_public_keys_map - .filter_map(|(public_key, signature)| { - let public_key_index = public_keys_index_map - .get_index_from_public_key(&public_key); - public_key_index - .map(|index| SignatureIndex { signature, index }) - }) - .collect::>(); + // Turn the map of secret keys into a map of signatures over the + // commitment made above + let signatures = secret_keys.iter().map(|(index, secret_key)| { + (*index, common::SigScheme::sign(secret_key, target)) + }).collect(); Self { targets, + signer, signatures, } } @@ -528,11 +541,47 @@ impl MultiSignature { pub fn get_raw_hash(&self) -> crate::types::hash::Hash { Self { - signatures: BTreeSet::new(), + signer: Signer::PubKeys(vec![]), + signatures: BTreeMap::new(), ..self.clone() } .get_hash() } + + /// Verify that the signature contained in this section is valid + pub fn verify_signature( + &self, + verified_pks: &mut HashSet, + public_keys_index_map: &AccountPublicKeysMap, + ) -> std::result::Result<(), VerifySigError> { + match &self.signer { + Signer::Address(_) => { + for (idx, sig) in &self.signatures { + if let Some(pk) = public_keys_index_map.get_public_key_from_index(*idx) { + common::SigScheme::verify_signature( + &pk, + &self.get_raw_hash(), + sig, + )?; + verified_pks.insert(pk); + } + } + }, + Signer::PubKeys(pks) => { + for (idx, pk) in pks.iter().enumerate() { + if public_keys_index_map.get_index_from_public_key(pk).is_some() { + common::SigScheme::verify_signature( + pk, + &self.get_raw_hash(), + &self.signatures[&(idx as u8)], + )?; + verified_pks.insert(pk.clone()); + } + } + }, + } + Ok(()) + } } /// A section representing the signature over another section @@ -1355,7 +1404,7 @@ impl Tx { gas_meter: &mut VpGasMeter, ) -> std::result::Result<(), Error> { let max_signatures = max_signatures.unwrap_or(u8::MAX); - let mut valid_signatures = 0; + let mut verified_pks = HashSet::new(); for section in &self.sections { if let Section::SectionSignature(signatures) = section { @@ -1387,28 +1436,23 @@ impl Tx { )); } - for signature_index in &signatures.signatures { - let is_valid_signature = signature_index - .verify( - &public_keys_index_map, - &signatures.get_raw_hash(), - ) - .is_ok(); - gas_meter - .consume(VERIFY_TX_SIG_GAS_COST) - .map_err(|_| Error::OutOfGas)?; - if is_valid_signature { - valid_signatures += 1; - } - if valid_signatures >= threshold { - return Ok(()); - } - } + // Finally verify that the signature itself is valid + signatures + .verify_signature(&mut verified_pks, &public_keys_index_map) + .map_err(|_| Error::InvalidWrapperSignature)?; + gas_meter + .consume(VERIFY_TX_SIG_GAS_COST * (signatures.signatures.len() as u64)) + .map_err(|_| Error::OutOfGas)?; + } } - Err(Error::InvalidSectionSignature( - "invalid signatures.".to_string(), - )) + if verified_pks.len() >= threshold.into() { + Ok(()) + } else { + Err(Error::InvalidSectionSignature( + "invalid signatures.".to_string(), + )) + } } /// Verify that the sections with the given hashes have been signed together @@ -1466,10 +1510,38 @@ impl Tx { &self, secret_keys: &[common::SecretKey], public_keys_index_map: &AccountPublicKeysMap, - ) -> BTreeSet { + signer: Option
, + ) -> Vec { let targets = self.inner_section_targets(); - MultiSignature::new(targets, secret_keys, public_keys_index_map) - .signatures + let mut signatures = Vec::new(); + let section = MultiSignature::new( + targets, + public_keys_index_map.index_secret_keys(secret_keys.to_vec()), + signer, + ); + match section.signer { + Signer::Address(addr) => { + for (idx, signature) in section.signatures { + signatures.push(SignatureIndex { + pubkey: public_keys_index_map + .get_public_key_from_index(idx) + .unwrap(), + index: Some((addr.clone(), idx)), + signature, + }); + } + }, + Signer::PubKeys(pub_keys) => { + for (idx, signature) in section.signatures { + signatures.push(SignatureIndex { + pubkey: pub_keys[idx as usize].clone(), + index: None, + signature, + }); + } + }, + } + signatures } /// Decrypt any and all ciphertexts stored in this transaction use the @@ -1728,27 +1800,49 @@ impl Tx { &mut self, keypairs: Vec, account_public_keys_map: AccountPublicKeysMap, + signer: Option
, ) -> &mut Self { self.protocol_filter(); let hashes = self.inner_section_targets(); self.add_section(Section::SectionSignature(MultiSignature::new( hashes, - &keypairs, - &account_public_keys_map, + account_public_keys_map.index_secret_keys(keypairs), + signer, ))); self } - /// Add signature + /// Add signatures pub fn add_signatures( &mut self, - signatures: BTreeSet, + signatures: Vec, ) -> &mut Self { self.protocol_filter(); - self.add_section(Section::SectionSignature(MultiSignature { + let mut pk_section = MultiSignature { targets: self.inner_section_targets(), - signatures, - })); + signatures: BTreeMap::new(), + signer: Signer::PubKeys(vec![]), + }; + let mut sections = HashMap::new(); + // Put the supplied signatures into the correct sections + for signature in signatures { + if let Some((addr, idx)) = &signature.index { + // Add the signature under the given multisig address + let section = sections.entry(addr.clone()).or_insert_with(|| MultiSignature { + targets: self.inner_section_targets(), + signatures: BTreeMap::new(), + signer: Signer::Address(addr.clone()), + }); + section.signatures.insert(*idx, signature.signature); + } else if let Signer::PubKeys(pks) = &mut pk_section.signer { + // Add the signature under its corresponding public key + pk_section.signatures.insert(pks.len() as u8, signature.signature); + pks.push(signature.pubkey); + } + } + for section in std::iter::once(pk_section).chain(sections.into_values()) { + self.add_section(Section::SectionSignature(section)); + } self } } diff --git a/core/src/types/account.rs b/core/src/types/account.rs index d66876ba37b..2dcf99209cd 100644 --- a/core/src/types/account.rs +++ b/core/src/types/account.rs @@ -1,12 +1,13 @@ //! Helper structures to manage accounts -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use borsh::{BorshDeserialize, BorshSerialize}; use serde::{Deserialize, Serialize}; use super::address::Address; use super::key::common; +use super::key::RefTo; #[derive( Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, @@ -89,4 +90,15 @@ impl AccountPublicKeysMap { ) -> Option { self.pk_to_idx.get(public_key).cloned() } + + /// Index the given set of secret keys + pub fn index_secret_keys( + &self, + secret_keys: Vec, + ) -> BTreeMap { + secret_keys.into_iter().filter_map(|secret_key: common::SecretKey| { + self.get_index_from_public_key(&secret_key.ref_to()) + .map(|index| (index, secret_key)) + }).collect() + } } diff --git a/shared/src/ledger/signing.rs b/shared/src/ledger/signing.rs index 1753c645d35..13401f67296 100644 --- a/shared/src/ledger/signing.rs +++ b/shared/src/ledger/signing.rs @@ -63,6 +63,8 @@ const ENV_VAR_TX_LOG_PATH: &str = "NAMADA_TX_LOG_PATH"; /// A struture holding the signing data to craft a transaction #[derive(Clone)] pub struct SigningTxData { + /// The address owning the transaction + pub owner: Option
, /// The public keys associated to an account pub public_keys: Vec, /// The threshold associated to an account @@ -219,7 +221,7 @@ pub fn sign_tx( } }) .collect::>(); - tx.sign_raw(signing_tx_keypairs, account_public_keys_map); + tx.sign_raw(signing_tx_keypairs, account_public_keys_map, signing_data.owner); } let fee_payer_keypair = @@ -237,7 +239,7 @@ pub async fn aux_signing_data< client: &C, wallet: &mut Wallet, args: &args::Tx, - owner: &Option
, + owner: Option
, default_signer: Option
, ) -> Result { let public_keys = if owner.is_some() || args.wrapper_fee_payer.is_none() { @@ -246,7 +248,7 @@ pub async fn aux_signing_data< vec![] }; - let (account_public_keys_map, threshold) = match owner { + let (account_public_keys_map, threshold) = match &owner { Some(owner @ Address::Established(_)) => { let account = rpc::get_account_info::(client, owner).await?; if let Some(account) = account { @@ -284,6 +286,7 @@ pub async fn aux_signing_data< } Ok(SigningTxData { + owner, public_keys, threshold, account_public_keys_map, diff --git a/tests/src/vm_host_env/mod.rs b/tests/src/vm_host_env/mod.rs index fe61570fb8b..c8c105400e8 100644 --- a/tests/src/vm_host_env/mod.rs +++ b/tests/src/vm_host_env/mod.rs @@ -466,7 +466,7 @@ mod tests { let mut tx = Tx::new(chain_id, expiration); tx.add_code(code.clone()) .add_serialized_data(data.to_vec()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); env.tx = tx; env.tx.clone() @@ -567,7 +567,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(input_data.clone()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); let result = vp::CTX.eval(empty_code, tx).unwrap(); assert!(!result); @@ -589,7 +589,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code_from_hash(code_hash) .add_serialized_data(input_data.clone()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); let result = vp::CTX.eval(code_hash, tx).unwrap(); assert!(result); @@ -612,7 +612,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code_from_hash(code_hash) .add_serialized_data(input_data) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); let result = vp::CTX.eval(code_hash, tx).unwrap(); assert!(!result); @@ -637,7 +637,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); // create a client with the message @@ -671,7 +671,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // update the client with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -714,7 +714,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); // init a connection with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -747,7 +747,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // open the connection with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -791,7 +791,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); // open try a connection with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -824,7 +824,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // open the connection with the mssage tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -870,7 +870,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); // init a channel with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -903,7 +903,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // open the channle with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -949,7 +949,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); // try open a channel with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -983,7 +983,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // open a channel with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1032,7 +1032,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // close the channel with the message let mut actions = tx_host_env::ibc::ibc_actions(tx::ctx()); @@ -1089,7 +1089,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // close the channel with the message @@ -1143,7 +1143,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs.clone(), pks_map.clone()) + .sign_raw(keypairs.clone(), pks_map.clone(), None) .sign_wrapper(keypair.clone()); // send the token and a packet with the data tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1190,7 +1190,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // ack the packet with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1280,7 +1280,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // send the token and a packet with the data tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1353,7 +1353,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // receive a packet with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1432,7 +1432,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // Receive the packet, but no token is received tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1536,7 +1536,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // receive a packet with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1641,7 +1641,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // receive a packet with the message tx_host_env::ibc::ibc_actions(tx::ctx()) @@ -1741,7 +1741,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // timeout the packet @@ -1830,7 +1830,7 @@ mod tests { let mut tx = Tx::new(ChainId::default(), None); tx.add_code(vec![]) .add_serialized_data(tx_data.clone()) - .sign_raw(keypairs, pks_map) + .sign_raw(keypairs, pks_map, None) .sign_wrapper(keypair); // timeout the packet diff --git a/wasm/checksums.json b/wasm/checksums.json index 9c50dd46dc8..45f369185d8 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,23 +1,23 @@ { - "tx_bond.wasm": "tx_bond.8d1ddbeb397209c5efa22dd57fbdb31825d67c2942441cb2612583ec2593831a.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.41ada308019a6227a495d996f5d3248e3f8052fcadf8779ee2b2e293aa73ccd0.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.137f2871848970aa9cf1d3a92a1e1a6e7a48b0537632d838bbb4e69fd301f8c3.wasm", - "tx_ibc.wasm": "tx_ibc.af007e03e8de1f8c34eb928fcfe91fd44b05c0183ca1149c5b262c8f62fcdd36.wasm", - "tx_init_account.wasm": "tx_init_account.d527ea17b417fca1a72d6a26abc34219630efcad4701e629a89e026e06ee06c1.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.e605bb96ff8b6ad1e10491a81590d15ed792f87b0382d1faee9966cb25a09028.wasm", - "tx_init_validator.wasm": "tx_init_validator.91ce97ff0bfa49ce9baa7585ae7e2c0514e91a66c625502b4aced635da5b021a.wasm", - "tx_resign_steward.wasm": "tx_resign_steward.a34a5737653182ecb75f6fcbac5b74ef849eb29b0072a20e90897acc14d8886e.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.8ab38f516ac799dcb96ba372cd5e5defd381ddf9d69579ce1556d1721d34f668.wasm", - "tx_transfer.wasm": "tx_transfer.738ac69d4a4f3dfb154aeed6b806ef1042b1a707de98bf8c6cc5ad66d478f6d9.wasm", - "tx_unbond.wasm": "tx_unbond.0c90a1f9a95b7171e0ebdca8318c19ba45f358158aa68370f630f84025635c8f.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.310c196cb7b2d371bb74fe37ee1f2f7e233ead59477027891e4e28751b6bb3fe.wasm", - "tx_update_account.wasm": "tx_update_account.8f5934e4fcca4e7d3c58e1c0b8722ce0a948efa6b99e7801dd1c16f8ea22fb59.wasm", - "tx_update_steward_commission.wasm": "tx_update_steward_commission.3deda3d2d0fcce2e14c6a4d72931ea3a3713666c6eed5fd29a78e30d395b3cf5.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.33567afd0c59d5f2499a3cf4ebf3c254de1cae1d310d004b8e0e538f2fc8377a.wasm", - "tx_withdraw.wasm": "tx_withdraw.00e0a04e892eb67ac3c3c7a3162b12dc198506c1c466893923911c3ab471dc03.wasm", - "vp_implicit.wasm": "vp_implicit.0fc8114c5d87db4d818b4b38ded664c1ca1d3d42026e6b1328213c00e99f01eb.wasm", - "vp_masp.wasm": "vp_masp.8b01ab3c616342973fb30e37c8b9e4c83615f25b7cc6657f0360146266d36890.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.720d6808fa225cb3381ac0ff682e1c9136d8ef1193933ce30356ef2252fee001.wasm", - "vp_user.wasm": "vp_user.f93b90d5a0226c79159edd48f2801e7a12525751b937fda58525a8fc8b42d745.wasm", - "vp_validator.wasm": "vp_validator.3decad0fd761b928cdec3f89ed241fc218dd402be300f5edabf511677ae3d37d.wasm" + "tx_bond.wasm": "tx_bond.340c5b40130afe30234e833ca56cc27e7d7682c9eeb6f6bec0aa9c1cc8ab8ba9.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.9b546039f0d3186063564479d39908e7152c763e8eb403b8ffe1f1062f9d2581.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.5e921f84f0ac90e498f013aee50f2bdab2989b642a8b1136d5350e3f81d8d5de.wasm", + "tx_ibc.wasm": "tx_ibc.198eee5e3e7bbb1d40770359910608d6f64ccc31ff155883a4fde9f0a43ee870.wasm", + "tx_init_account.wasm": "tx_init_account.fd06524b88d3198414e205371a3d502cfd490593afb7204cde77aa4461ab4298.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.5d0b84ae5937a0debb30bc5d0725e405c6df9e83f35177a031a6f403cd69ad0e.wasm", + "tx_init_validator.wasm": "tx_init_validator.51c3e74cb99da446127a5b86261ee3688abef81a97aeeb69ab7bfad419982e81.wasm", + "tx_resign_steward.wasm": "tx_resign_steward.ddfa5cdf5450fb27fff7f9332c09d326ffc49ace1c6f86107b5bf5ff486ea18d.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.3e0d19dd85d558bf193716696eea3bd51f923e13e750a9f47d3f69187bb1d3cf.wasm", + "tx_transfer.wasm": "tx_transfer.de1a50dd240b47f8cb8c8908ca2a1d5a7bdf5666f6ab89755ec766b86d511c3b.wasm", + "tx_unbond.wasm": "tx_unbond.1b280628bfa88bd5da7086f72d5c8dd110a41bfdf265aef9bd24f55aebc457ba.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.459c700dc2104fd1352f612d2b5ef7e921fc25fcd1d5a6ef23d66d8362656803.wasm", + "tx_update_account.wasm": "tx_update_account.552882be607d5c85b62d83198346751a318aba48a85a411c550e29f158dd5ab8.wasm", + "tx_update_steward_commission.wasm": "tx_update_steward_commission.a30918eb4a73169bc6649c0872e2a5c48347ff2f2c2c77cf245c271b9617c679.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.fb1060580449efeb7ee4bb2f94dd821d04dc1c6bc113505129455f5961c19def.wasm", + "tx_withdraw.wasm": "tx_withdraw.6b62ccb81c2ec4ca6f753b847f231afe1280a710413bdb29c40022f76c8a4c31.wasm", + "vp_implicit.wasm": "vp_implicit.0b24ed30523cf07e313eb909a543fdaa781ece0edb0a730afa1096b0b3f2f84e.wasm", + "vp_masp.wasm": "vp_masp.9fce62466516b80d0d4b9f70818e2043c199d3ccde8e15388ebb8ef84d2211ca.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.e04deff5842fe2168e077fc880352eb04ff53036e9e1025b9040456d02cf85fd.wasm", + "vp_user.wasm": "vp_user.242e0ad72e300d8315b8e9df667025c16216d16726c3e7f0467f036f85ba5bda.wasm", + "vp_validator.wasm": "vp_validator.0acfc199bfcd51fb07f4b5ad2f101f8c2cdf4d907b5c7732f96e66d50ff184e1.wasm" } \ No newline at end of file diff --git a/wasm/wasm_source/src/vp_implicit.rs b/wasm/wasm_source/src/vp_implicit.rs index a67b40d357b..09a3d32ba7d 100644 --- a/wasm/wasm_source/src/vp_implicit.rs +++ b/wasm/wasm_source/src/vp_implicit.rs @@ -537,8 +537,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[secret_key], - &pks_map, + pks_map.index_secret_keys(vec![secret_key]), + None, ))); let signed_tx = tx.clone(); @@ -673,8 +673,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[secret_key], - &pks_map, + pks_map.index_secret_keys(vec![secret_key]), + None, ))); let signed_tx = tx.clone(); @@ -841,8 +841,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[secret_key], - &pks_map, + pks_map.index_secret_keys(vec![secret_key]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -934,8 +934,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[secret_key], - &pks_map, + pks_map.index_secret_keys(vec![secret_key]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -989,8 +989,8 @@ mod tests { tx.set_data(Data::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[secret_key], - &pks_map, + pks_map.index_secret_keys(vec![secret_key]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); diff --git a/wasm/wasm_source/src/vp_testnet_faucet.rs b/wasm/wasm_source/src/vp_testnet_faucet.rs index 44b5adfb06e..53b039c81d3 100644 --- a/wasm/wasm_source/src/vp_testnet_faucet.rs +++ b/wasm/wasm_source/src/vp_testnet_faucet.rs @@ -268,8 +268,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -451,8 +451,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); diff --git a/wasm/wasm_source/src/vp_user.rs b/wasm/wasm_source/src/vp_user.rs index 5f0b70b506f..6e5bd024a37 100644 --- a/wasm/wasm_source/src/vp_user.rs +++ b/wasm/wasm_source/src/vp_user.rs @@ -394,8 +394,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -563,8 +563,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[secret_key], - &pks_map, + pks_map.index_secret_keys(vec![secret_key]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -723,7 +723,11 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new(vec![*tx.data_sechash(), *tx.code_sechash()], &[keypair], &pks_map))); + tx.add_section(Section::SectionSignature(MultiSignature::new( + vec![*tx.data_sechash(), *tx.code_sechash()], + pks_map.index_secret_keys(vec![keypair]), + None, + ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); let keys_changed: BTreeSet = @@ -808,8 +812,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -863,8 +867,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -919,8 +923,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -975,8 +979,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -1031,8 +1035,8 @@ mod tests { tx.set_data(Data::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); diff --git a/wasm/wasm_source/src/vp_validator.rs b/wasm/wasm_source/src/vp_validator.rs index f1418e38e11..6325f1de240 100644 --- a/wasm/wasm_source/src/vp_validator.rs +++ b/wasm/wasm_source/src/vp_validator.rs @@ -401,8 +401,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -581,8 +581,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[secret_key], - &pks_map, + pks_map.index_secret_keys(vec![secret_key]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -741,7 +741,11 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new(vec![*tx.data_sechash(), *tx.code_sechash()], &[keypair], &pks_map))); + tx.add_section(Section::SectionSignature(MultiSignature::new( + vec![*tx.data_sechash(), *tx.code_sechash()], + pks_map.index_secret_keys(vec![keypair]), + None, + ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); let keys_changed: BTreeSet = @@ -825,8 +829,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -880,8 +884,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -936,8 +940,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -992,8 +996,8 @@ mod tests { tx.set_code(Code::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); @@ -1048,8 +1052,8 @@ mod tests { tx.set_data(Data::new(vec![])); tx.add_section(Section::SectionSignature(MultiSignature::new( vec![*tx.data_sechash(), *tx.code_sechash()], - &[keypair], - &pks_map, + pks_map.index_secret_keys(vec![keypair]), + None, ))); let signed_tx = tx.clone(); vp_env.tx = signed_tx.clone(); diff --git a/wasm_for_tests/tx_memory_limit.wasm b/wasm_for_tests/tx_memory_limit.wasm index 94ed240378615e3af1d01743b5433366c442f3e1..8e8165038dc020c1de9dff9a6f9937ee4ddbdb0e 100755 GIT binary patch delta 126522 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∈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 delta 129302 zcmeFa3w%|@wLiXR=A4t0oRj3_{U-YyUJ1`2m>>_yjshY+zDtOqJl<6ix%bgT{C;{vlD_9wfFb`eg2XU zXYZLkvu4ejHEY(aSu=C@qS75VmA0iav4mff2(wsXBs)EB_yl7C#)SF_FdsbwEXWFk z50Tz~0x?YZ5RG{HWEkAQj|i%ChOqw`f{B1H1qnnU6Gp1Rm`|vbtcV2-gQX#lLH{^U zr1NNe+Z`K?P~5P(=$UeeFL3dB7yod)Yu1J5&6zjr>^Ya7CwOWDGb|RG`UZQQO*nG$xG{%K`Hz!MS$Om#Y;5oy*1_Io zAF~hGZuSqhhoybSK4%lNb8@HMz=CPFuv^)fl#Q%%$k4;5AA8*KGiF|V)t}g>?9>hH zckD4XYV+j?C<4RK$aXO%%L+~f@LJPvGE-RL zdXxlIS)?oRM!_XjPJl&?kgk=e;9;sRL)BDFH4mD?G%S9Z)plzlUO1R_CGIIaGU#MY zd|ddGWZ*|dO{{C}mqj0Qwmb1r>5mARi^`@GQi<2v%0i8eK=~RT`U4ZP`)Ss1?cRRB z^zkoPVrBm$Ded3;Ur}(_ElZH75S6dA8d<%`EEQ2?gdzr7fPq}=??Z}3JQ=Y>MI@Gw zKaEP-J^ta+?MrPSeyhW^G^pM5$l74K6y z*AAUHRuT2Q!~Z)cYl{Q6!m4cmYFiS8CrmH>l91{GuAUw;Uk(oo5#m5O03pIcC@0GNH{Pqdv&D6f6##3p_uk_oGs z*PFaj1Y;?6hUwRZ2&+ZMMq&YPY@3cPj0N4;#LAO%;|fqWJ|e#fIG_z6w+I~p5IUmM zjzDfZ0$Et4h{PzL&xviclevJ}dIRd}3Fs(cb!kY2Js~yshSbp;Qg;tXiK|YD5e-{T zDIBATgO&tdb-fxv5Qk8F?>5+Z%2|~Em{SW&RQ|R;^C#k`Du%iJ)K!#v(rK#6Q35wN@x%Q zqM0V~@SNDebiu)ApZ+bn;In5Zh=$+13*LXua|Gb)b-}03jn-CeyLO{7(lEvwkbYLA z-s(iS(lBaNI9P9O_J%vI-6$I;@(H}_T6sw)D@gqCSNW5E{j-i_j>39tl{XBCE4*Pq zyu}+{_A|Nh7LlKLkDT3A_LYgX${j* za?`!tY;)q8-`v2~C$jFF99s6EmhKpN6Lap%V*?UDzHbb>Epgv{*Ri`3)vIUYSFSeM z-7-3d=LObDBp;l3adl;QJy47c25!Q-EfHLEe(omqO-0-!tW`SYHERyXIJa@lq)A&b zidyu8p)|%UR*%t<*Aj|Hr5jc!eWf3K#kUx0MCkMB>4s@cw$|N|m~{U!G_d{G{l__j zU|=($aLt1cv~ys*e(lBh9ki~BZB3lKZg~3e$>~AUZw-UIjf_a#v~F7dK+|8rBa_nu z^vsQgtbLQ_M@A;P*An|8z3(>tl!hC@0;{`pCM>{#tufUthcaivS<8e~BIHL!r$0d0*LD z)z<=U`5<&`A%&@va zhI$oib>5Qr&7=3p(G3~M8d`WBKipS=&Unbst>`YdZII81E;Ppp4 z>hW8-u{Xz`xA6qD%KD8b$6PjNmdobULm^8o-6s;G9)FWMa>4J11#LyNJ2CzD6H0fl zqDll&opN2P4}Ym@1vRoF@yp+TNzC!fO+V!w*R3`Ga24lE?oL!~9+i0h$yxgKD*YIq zcy)7S=A;mHjYFxsm@G0Wk@M7OWK10O)Pv}7|9mQn-?FFA#P3g^CROv7PgmqARg+jM z6$3-PHP{plk=jJp)6X+2(e}*Q_|4gJ6@HtyEW&U0v-bwx{0(TlDDn8SHLN@F`LmN) zXQJb|eu-0_yMWz?w~c{GQ6uaN$(2*sF^Nf?f&2~Ep&xTn|LRHSv<#C|86P}<(xH8S zLVk!a1BtCpv{0lDwDg1$Kj~~`Eo=L~a6acxFH8LAi>3Zap_hH3#LP(k+Q(m9!U8RX zVqM~xmrmj z-T4TfkBi8OiMw7MQ1~V!KcvRGwRqgctrs7{^L~zxufDoDW0O5Bm_aD-n-ULf|FOf# zTN72U4PjFgr@vORf9Gz#J8|7>1MqdtYqw#FHTf^&FvV*8%khjitxmk~`k2XEo&@#* zgGk4$y`Uo+Al2#AVJpjOBJ9zr&txp#->_;?e~_M=M&xv~1C(qQIeqQXU7egdSn1zN z=`rqa{pfL;e*ENb{j`QmYFt{Ks}BjZqSAF-eV8T=q=tj%w1P|%57Lb@oCwm(QxOq% zBDw&RB5WN?Yr<5B3lt~@;)n=2Sx70RQe2?jb}24UntSw6$w`x=Qe2><>rp8#&?;S( zbf=IGyATcYM6e1vpDNbHv=K0<6c;F|m{f`jl(a)C#f1vBo0P*$Rm$3T-~6f2lyzYH z>v9&xkV8{XE9uCANWe{!lnT)bCh(%l0)^zf1yv!f)dfQ&CVIK^5m1yesEWjCrqhY4 z5lmZ)6&BT=5O*V55J7p|QqlAT(;5s9pwW}^G!vlD0UzIo_gl@;<8|yTGK+Zcm>L@s(C@hRl@6J|-_=Y+xeo z^W)g;o4>54BsYCtn2X7Lco^hKWDYuLE=`^zvlGAj{1+;32y{0Cl=pp(yx0G8T=8tO zX*9%`8JL2HXk^{1vEN;N2PYo;yg1SLWn2O6h1;loz$17x^*+VJrVyR1nrV&a%p1U7d5?c8PgM&!98&~Cp?I7k!N!jPwe|rK>~$lB^vgH z<*6{m`H8Fp<%dOVuxu7=-K}@96gl0;Vklnz(8q31KX*U6$Z>vloP2|^8cMX$&vfJT z?^*P@a+ja|LS^qs0r^OPjg!X;7ET}Kt$TZV3T%w*JUKY1YAlLb)p!+(FqrMWgS^NAid}vO$c&J&2K>&q^4(NLCiGVSaSTaM5ig ztU%5$U{|MKgp|FQ#4H4pT%?#}M6d2UuxC3J_QdQW`FtTNMj(@zsb>0l5gT88k*Dhp z@*-F)JImM+@{nS-g4N6Ci`g(@&M%6YlGED`yq%&pFYa80GfFs6L#dIp?NQ z)U|$p#A?gf_;M)DuDpx&KrEaMLuX>wF4ze^4alk#@cRp8>@TcAw)JDf3Cq{}0n3as z4@9*&4V0CcD}Nfob`vDtCI+n_HGc_m}tgV?mh`V}q#V zkuj9qVtPv66GO?{%TaQqcf71;?(~qg$Y-Wl zE7bUgaj693^$Hr{U^DI+Fuh-T1S-5=dIYMyUnmfFVRu4{PnOg()IwT=o3cm9%z#ok z02XT+t$p@r4OACXXam&(6B6qh3h6Ohe+$^(;yRd;Op5CJtYuF16;OACZ{#4&c83}W z1>BGcqlC4AK9RxP4}4XCEbTP?b&vg2}J>@dlOunlZ``=dkH(|x9D|HTNF@^m!i+Oe&`_O)G-!vZUNl9Qd_0Xx>Z=1*-;K?s($uFnXGCxnz$qYH&La%GA zW1l-98;@Y;x@93y-kv&{O?G2WoWknFq%fBY-|?L&&zi~tg?-Ob!;F#?%kaCt!&JK2 zeWwdyy67X_o92tul@2toH9}RG0#$G%!z@qRELv`LZ5GY9%1u+*%>8FrJDyes8`-zj zr9*w~!|Jl!&PG<3?EOqcd*uU1F_>hgv12fil4nd~%AlUAG;Ju>b&a2PUf109+*+*= z%NwULTGo)Q)0kSaNwrAfW=MF=%9gh`+}yP8ZcKqN0g#zTvjVcsr>gk~rTF#h&;9!D zJ9a&)r$f>@n$05{a;imoe_tS;1qfPVNmc7a`$PEhXx2=~G*5TZLD?rjy^!8GosrGH z{ZG@`W|}?9mg88#XaMGr0BVisS1uK=Ii z*888@`u6(2yAWxXLSJ-QscvENhU0Z}VFkcW(i61Ycswhk3U?u)UhV2aLd^2|!p{EE z6GZ#)8SFF0=Cuz#fgO`NcF!{~f(s)Ss1YVuyaJ}4EjlK(Mu4M1H>=5xNz*Z7>#gQ3 z?Y}vlJIcPRBLkl3(eBdC=E81tyW)oQGM<#66cFgiQtTCOfZ!h{G zo9*Mvx3vHCQY=!BY1ZHgI40q+gJd`*>Zomqia2QLs6Fj>|A_rVjM;px!c|9N5*&+K z9p0$*h>BV3y-{uLFI>qMq#X8R)XlDZji^Onv*FgA;K78A2)pV!VjCh*^Q#uI8yLU; z0~ub-jws#(?2#B#Ir|M$x!rFSDQAx`5Pu9I2Uu^d(_&$>gL>I8?>_7*_IR!PH}C)9r2b!>)^pG!7eL!5NGxaUdmeWTi z(9+xQT*l4_wa@xFyNbs#3Bhp6E#GCZg_wEZxMDLKf6R)_g+&Fwk$)lzmU%=`q5yso z1q&Ul%fTpgKZxvfs1sO4fZfts@j?d~(Kg|s)@ek#2wAp0eybg6ZRIdOo{yJ~K^MPd>4V z4KLisqB-~$FvF_qM5S0Rb;{7M*b8jps&@cqu(bsbRaNe(>SolCBCRD<)zQ{^H|*53 z=pGi!r@~=XK>_@-daKO`d8a!4J#Z(Xs!jW~uIhci)>VD&*Se~Kdv#TZ-)mR(jNh;_ zmhIFG6{N!N2}k70yI4P2u!-GH;2zwh!TfC#`x#&Hyqx<7R+zs2c`~`Tkw&=u7J1Vj z*g|%Vj6A_|*yOPgt zfD8{hj4XHjj%}d2-2EsUl1aTK1>+!Vi228}L*$2>FmLxg#%3Ovmrrhg@iBH5`wE6_ z2g9Dh2Y*e@lZ8*S3#fG#JqS;cRVv)d%<3JVk|;WZ`tLa76j}yTP6@BR-jQ@t0Qp`- zxYDql6rOoqHonC3<&v$CQd`^a+sY*8ds+MBm)SE+4J8>6uq4;PlO)|CzX$%AO;l`o z?kiwRu-6}6VdLqE@X_*^S6Lnc?dQD8_BjxOW|o4Gt|7=Dzs8n;V(nkN#u^l)`qwq2 zXI^JVQ07P%NoIhY^oIV>@&-GaKJ0vheafeAfP^3mfSGQEEH{v2g{>|27svB&`P*9d zS?m4|Sy*MgiH90lTJga$t=)3?TdXzcj-ao-#TKyT?K9qnTPB|W@ppC{A8T{>mcRWA zSiNAcYJc?|b_=;I%K7gx+h;LEPJBEB++nH0yVqwCt9D+WMY&=pJ56+@WRjTfCx?E* z(%OIUAzQ}yt{d9l_y{d8uJs2cd?a(^>@Mz;kzMRKwnEO@#fA_+{^u@sDuQqAVl80z zYu{%#63q)f0P6sPJiMEgQ?gmz>_6!FaJSC(*KRhV7%XW)O(87(;6v~fR&xdzp=VR% zhreSnIpPzr{+)8tCu|P8ORoHceThfQr|eg3S^JcKu$7Fs@|`_w&4}e)9W*5+Ac`HE z5q8-R?AYWDH_EJkqBh$;V{P9k<5QorA^q<5LPQBGz2V!bgk!%E@VovAsj{{G#ecGF z>U(eRWpQeW3%+0{vGPZ~g`m)fz2P-oGNS>#?4vKKmq}1JN;xO)gEX89Qj>QLuYeX2 zrRig^K1PG^I*ipTXdEa;07HGuhaumN04?>xKkTPI9Vy>q{1=%zwW#KMu?TEEEN|uf z9^g7r@GF6OyWpG#L-|`DuO=S&*vBs(p!4j(+6Yv8!!EEX1+vL%MNL$Za*3ZGOF3Tj z^9F)Y8{ogd>JB__He>Z4-U`6>O%i4Dg8(m~6yX#e*UG4cDG-t%p`D~9g+EM5P6_gU z1oVm^{|5y1yi{H~V(VWzj0(f3cKBrr!d`ya2QJ7ZT4bi}CZB zfc_*`^yi1m(E~Wml;mjx;LL|HY54#iQw41ps0)e>;#25D{UH9dXRz{n2dm6)G+4ze z`5oELU`0b6<|%(l$xT=jD`ezR=98xl;p5o7^41~zb9Qfg^H4~YW4`I|We;bNI_-->Z`v)tk0Gv59=nNK zQj7q&Rykq>zl1pF&Jld>!ShLG197;Va|n;ho zF@QJyTY8i@><~_)1S(;XfLe73KkVQ!NFSY~M8jwvA(~!2n(t!sWy2U=mijA{Y-N*V zylD)tfmC>E4A8XY^(t8HApGIerG@_))qI>~K}A>g3i=7gc!On5^VLE@;FcL#!&GdP ze6O%Gg4XRBqKS$s0lYJV^0^wm2y*A9T0Rx)M>lTbv3OvB!2ttVVm@+D#2b8%c&&~M z#zK=(1XKQ}Fp#DA;wJawg;6YKGEpeZ6?{t|>cbEkvXIb1cFPFC!h&E!G(?GEXYs|1 zk?d(KicCjNKOCK+97TvYz-!l5n$^`?TLR?d7xe)OZAidW33AXtQ7Q9dslHkQ)}vHd zk&z~q^fn|1Nm7nisT5L#*n$2>$!HR6h{u@9Yry`abS-O(F}I#(n|`nfPz}J3EC%Z{ z8UF&1#xdBB^*gi#*mBjoe)!D*jHoprzTYYZ`Bebwo0SV&fg6CrK(^KztP}ujobuZs zdqJ}%cwvn3!Wfo>;kO3B%%lN^i1ubEomQn-Lk9Qxh2jPy=0izP!AGX0SqtZDl~|TO$%_V~rvf`PNDO42pAJqzo26M-&5s$x79z^2 z?a~tO1oYWPMaWr_Ppa8T8vm`2-NXOJdOoQt{}NP~E=j-{(*l*9z^B)!cSfy13a z^+vfdRRY?RmI_0wc#th@|M@i{3hTw;{Ca1z(en4(*B{OgV@|l~UHSPWew*$<*ReIS z#Nu^$oMrJ*cr@$B<2uq`$1B^%9KmO?2@jF9!^BWEI9b@4we>&Yr_L1<1g-7KK#KKd zG7zwK{-=EYNPb3S-SwaWxn>hLvB)QK{A50)80+(B4s_THt-~6upq2&tdwep_qjloj zCiC;yC+&MD^ItQ*>3Vt3RDJ|deQzp{+^p? z8Zj*SJ-^-h0;c&#PvfWS{H5~oX&8Lh$hW5PoACJY(Y%(;lk1P>!x4J>XgBt6Ml-ukXQwt-j6#};t^pa6*k>?K1FS1WQc zm|W0rsR2+ybn94foDq_18u)-|DQFCM{U7W;0$U-53gLsQhHjD~qYb5P#(1KF_s>kpNcZEP5C08@pA_^f<<`a` zI~a|q%?vK2koEh;DyLIk$!}p{>Wo(W2`o<`LxSm9B%J!Vh2g~>1feC4G;U(!*^$79 zL&qiYTg@ln9sU^9moO6|Xi-19x{KpN49x-@V_}l2b=AxR5OUPDU%ew^KT2jQO2!GE zOGz@T5b1OqTA0fwKn2Sf57hA#<3JCSAIh7_X%^`MR-hpUeMgf!P*0>c2ziJHgQLBG zIcjDx_NaR$^KEf%XWcy|upnb1B$mY$^%}e0=Y~DISs)OHTtLw~b zmxM8_bE>kpuBv{ZpsF99s(xGUKbZPeN76AIV0S45166;Ia^2Rw67#TmHEuw})xM!GVA1hOtI+0E> zAaN1i$Ah7Wm$8nDUr@~aGtZSx*Nbxb8^J>)s7Wdw4Y~xZ+#V7n@Xa_(E_#WNk!u7G zI>6@;(E&cs?#n(a4_Mh`gp%k|j1)5;eq327Mq)3Sq8j8xgb0Ucn6%eQ!x!~i8G0X9 zK;C!>&p-Gn!RxQ;p$ZfziT^wBOOIlpKt)Hg{P70Eo2WLz6oGA0)kZ{r3XeDPOo$VI zjR8+26XTBo#fU87U^AN(29bs*Nn=yZZogu@>PV3n`nltZnM%_6sg~CSN zJxzan^rq#%+4tknb7}oy5}6{qp5uc6Cgpkld$y+indc#^@x1T_ejG=1`-^`Vw9%s3#Vpjr7sp*JSTIX`E)x2+LD*|A#qe!)VxTP|B%_L4Wd*aRkZ6MoA)6 z01Q?$IoY>qzJsa0ubOK(G}$4wR^_B`edWCVxfKsNx#bVv;3$cg}%3Lp-m7ame7RZK+I zf{w7}LA$klQ`6H;np_Jja9K1}fMzgC$^ZH*@0S5`!)OqU26f#3{FPtn#--@E+P}dz zyhdL6H$Jz-Q_>Pur({XDy~&H=_I&VA&n%~z08knhBm0HIC+43*_^K)N8aekpJ^-L^ zdXEJ~*#6MAY0lD35-d_d65R zzy`!1Y!*bJD9lWL7%@yDHhqA1HH=Ld?LgNWG%{^vL@~796tb6H{It_ec>~5GZWL5P zh%Nbtw|NEdfB$WMW~D0ME*q7O!T1HE6$*`|*pv7Gm5d4gWq;>U)*^5FJ3rP-{w`gu zT(??ZB3+okrZ`m^x`UUZyrXvTXq86T=OS$5=5x_?BWz@E-@%7?%iF2T%X7>73&7fB zY{NcNn~a(7@O~+}4+rIw@9cKP=m8Y; zc=sJXjX0HP=5Vj|F8`66?sxCY4*+?&(pYe#HDd~Ql8b$y}NK#09rQXsbwJ(egh)FB&lm(+x&V7pI*!^xSbRfL z)4G77H1x=@Bi&+TC~Xn-5zHXb14w%KBC8=sb3G|SbXW{h6!lD^88;Oz5R|cxcop@M z6F&r&&F`iQ@Zln;E&7vM2qH=nm(LWoF!{`GD? zf?)l5Hw>WYfNGoprSZf*4eV9K-ceFx%RcF&Eb3lCdDjA|e1slYnl4<^gx+qd1#Td*(@E98+b2Vl$Rdr_5J;M!UN<(*0 z#&|zO1?fF#LojX&gCeBpfyn2WS%~hI5fncEd4ZI)U@GbQhZ-x9WR!6awn1HM^3lex z7#T>GMAN9OD*71{c@jxX|7tU>E_m&d8qvb69UpdJ52_8ju^WLUA9bj?zGdL=777fO z+dt*i@m9(VRY;jtNX-IP1`fs|A%FqY`h=ENY)E0Z8@I4%fC_KL(hogXG19V>FhnM` z{sfb!;x(#SfR5q-nW^&OAXQ&2h5*&^E(wB22sH%jbU|8W;20}`NVJ}WH&#oOH3XGP zh9h#zKd>qvl+B;$(v`7B&ycB+$MN$~4-IGQK9pesj2kG7T4B59NHI+(?3Apcmy< zIcqPUcxqo_L0DgSgaHlR5XFjsT3v920g=`g1|VfGVIV)*%ll9Jmn}vL%GasBobv_G zEC0GJw4SPKdaJt)F}+%d#;C7sAzQ^F#v&c->!8U@W7K4r^_^DIvi<9#y$bT$8stTL zi!II(w_a&|FlD=f62>nRN9TBAFs(ogq@$At^4FM6Lxn3~NcMnr=yWp}kZ|sS5o*iJ zXK|UcMr6sZ)uPD6`dv2;3GmZ*Yp1fEV+xMZM!yDR**-O^s@cb@M`+dv+LLcJN;}Lz zWPk#L4jbgP9KDgprQF8{LI+sHgehO!$8+)ioKKY9nkll_^S4GtDSi(Zuqxepo@l`D z3u54i0M*8T+@%Qt%?jKwW&<=OaKo4i1mplFMzVk$$3$tC>hK0l41o-!i7L6E2(R^I zW842Tkm)a9VgOZIx8BslJd41dj^?EYsfh3zx!e--%{W5g7&*i(fTkO?@-MeC=Tnjh zJSu#M%!bCAd$~19MdrrRU`$znVFf7)V<8&|0;Mt9VzVHci>)>;3^PXV+zX<4@WOUs z48X=Yf{{-!D&n!sB#>d)Ku16dEX;rC^H?}_ltc@O;lQa%wQaCW&6C24x{a1(YSbIe zW+w=}%vskdyr<>DC*88p%8;jGkBw7X@MwzoRNkHd=?Rrs@|wrtlcAyicP^ARucmBP{sPy8x`xrTfsO3 zGS7^tVzJJKH!79{X`yCqY-f*ZhQlCODa>!t^RX84O>)D%iMlQ1Dmgy1aq3_Hx@*z` zJLD6IK&_I3KeUAGyDM9IZBln-r+)!JgB7>kO2`$>5s^s=hwkUI9)RbqBfnKA^vG{P z)*O%g7PJsb9$B_L2iW?MEnLw-;XK=`b~E~tJf7-7!ha2Nc&aB`UW8A_{#7CJMmz#d z3w+3yZ_;YcaDjS?zJ`l2Um>e$w4heof8g5S7sCqSh%zOLNvrDfo>A|%fT+9xBHR;C z6I7?7+LocmZp)ZT6(y${?4Jl)zNnxAVY#d@QmYLH{Q?tl1j4XcQ@paw_(?Lu*=pSh z!{x?5u@V^i1M>L*e!g4{lRw^$!^%*<6mc=f62Y=m@j81!&P@~N<8f|CjF2oO&So#P z|Q#+)UVsV(p`T!)Cc1SxpB1Tf0rieI>p4%e5(-wjab=r5bblT!< zu{3kf$50|^UrZGA+4HenlP${4Zm4M0{3xKJH|o#88zN|=!^CsP$8r}^jr!_T+XyiB z48nj`h69<@c~28_#7MV_g{b0>bHvclUKTAT*cH51wnRjU+?*pys1k4GIF%@|E1c$5 z;?rDRiNSfg!avS)(iYokbKJB|`8w_Y`4Lk6-@x1n4+6m(i6hYb_sfX@ZPR0tHj0Fg%xhZ^sa=>Fm2YR6|0BhL^=wH^wUzHWrL z7Il1TghKR-5rXWI?fE0=bbq*UR*A`Y%&EfaFyx2TA_qsdvno+^x+5*gSb*-LR~FSGm@k$>rbRy_qUl#UuK%)V zKw#2As#mW{s}aek2M#rDf;CMZa)>xSD_~)NWM|`1$B2meN}?e0WQ$z}!y#f|l;pMa2V7F29VlteLlk4CWnf+32f15oFZ99j79(~K zckeXIh#pQp-_Q|#%E6oFG{}Ku@Mj`_IGRdPKHL2mlwdKH^mtW~6nW+tQ98zU{Dx$t z;fXvrVJalGoWqA4#DxDhR^b4cygM<=fPC8`SC0`T#~;|oTVV>XZ1{QGR12#43l_l~ zFK-NZk>5j6wdXMy5#?irBEQgSN>qzH%!z2jjiaJI89h|woJK1XKosg9TFI|{-%Xsv z=p6tN=rI5Wq06XqiEIhC{CzF`9C6k}4jMwfd8m?NnboR)|DYPA08dVU)9wA$qF%q} z$&oc;AUSc6((auyf-YqJzPLsd$|q~Y@pa1opGKPtfuHgXMkX*Eyz4QAAt!LeBMM4v zb-V8rgxZ=#FQ!hl(AySVR|0{`5I$q0idaUu|8`nIVRI)TXiFV3aQPu7KZ0H z>06x~Ii1gDH8{6%CZa8iS*|+s7Qk zCH2oO$MOkfPGyy8-KTBLSaO24P8A+_93L}w`yP}!(CYpSgdCq7X4dbu3B7YCzK;QP zGXK(h6E#7WA-9YbqkYWaA=UOMapPfPB_4~$i#&P7I1$N*ElsOTdJWkz6-=t(d2;PI zQK=IjpN}4Rz;q{%chkvX<3*Z$WxNO>^378o6$&zW-N6u2N zk7&)L!>nH&t8JklN7QL@luk_(z-b~fOTIiwoS2%Wo%8lCl4l(u^7-B+@`YLqahKML zBe@gVts*Zv;jtw>{Y{_rhOt-fd2bkw-7kB?X1(>gH#`vY_a$=Ck>s3ciO2~zdq2Vo z|8s8`!2jDD2Jm~mVE}*78wT)p8~Cs~0Do(7Pt13D!vOw?Hw@rkc*6j`v={K}ZQ!c` zeCB#@Vqo6k4FmXQZy3NkyYOW&0!KqYT{Q*Mlr?ho6zxy9d5Rd@i|?^f+?*<|{7yhM6R1)0hH0Yggr^tvY^gtb z!>I8q-Y{zXS8o_Ke%BjDjXzkVdraxkVCp-(A3@GvdBXs{+8YM&hrD3`|D87s;E&tD z?;zmaBx9U&5&(RUHw@s7-pl~rb zFj+(9lHpgm`dhm{m2Vv{syLnnGsG{7)N#VrZmcd^Ly;IpPHWjeAZJ&}XJ&{Bd0Vww zGv8RvuLh17U=GJ)VGW-tKb|4R;Jsod_zRv>GsREw_++M<0!=tUD8H1GPJrINMz)@S z!!aIt+;_6LGnA{&n337Hu)Oxb4@81y$L+s3Q7lr^ zVutU*moRd#yo;5U$8oHV{-6BS+j&&H{O~Q7=T{MlQT+?)q;J~blQF>HweH_S^|nwe zqJ_Qok3cJgUFTbF#3`iP849i9I4Qs|Es~Qkf*4ZgF+gDGRQDAlpf=a zN<3hC+jNaB3Uk zZZFA9ZZF9&VajNP`7&;r)%+^V01>_dk0G?11ocw>*cp0NvbXDeZDfI~Fg* z=IO`0`G{3*$+bacVHyWRhvZRIE3d!1e>9 zdC%Ia8iIkShImj7^%fId!+%jh+Dw{3t^q_RY^bRMzbF<%>w)eyqQYiKaI65bh*iGs zg=(&e#Byc9epnL+ToEhu)zZsVsH$=xNqWC$ng+E=t%(!f;W!WWvpZajxYFIJ1s(ru z5_@D){B~UH$l@g8ew*4Zu_fEii+hnex%~ybftfK(rgRqq`d|)lgjopRm{@F_(Zp0o ziecj_gCNbIS%BQ2P|cN%~dKOkdTvJpI7s<{mfhOA&Xn@hpF2!rdK?FAq?Fej4F zqwNKXCCk`!$4mgPp4=Kc-$KnxXNoQIMnkAQU+Ug)W>0pGSj&?5OAE2k(1M2WWU0 zOmRm)ON?hev!4Y63(m{9teP1J;H+;1E?+&7Dcdfs*O5)ZBfc@SRt%VD3Sz*Ku)~)x`@>saMz-@%uPW&A1^YrZf)-qB(N$pj zNaBaH!^as<`c((v8Qg$bM!nODX%aiyclvb((Wu*-kzv2C%`py1bCJl4JBT^EA_cYy zQJ+;Lh_?3N+=4usOj2)+)8<-W1IIEmuTsFT3oyw)3P~CT^(Pb(N)GL`Qm0s=_Xtlt z5KC9{qg7!Tbo$0rZ@BPanu%d-FACOJIjBBKsO~|uwHf9I7gZZma-;{Qo3Z=I#kA9J zW12)16Z`#j5W+kJ&P{T2yl-}fk%7vMW}`zjXS&;{74s?`%Qp34OE@fO+Q;6lL9@*Go+I{$k$=Tui`{M z?W`7R!>F9J2))tSQ;nenC`YhRPS}|Ch$27~suVsIV*Q(2jU*8w?O=-GMq?n>-^#=x zB#0jk^VV=lStJ1Z9WU&q!lYV7xJkUMu;sKn?AOHuEuRi08E^>1*ekFcO~%$}I#2e^?}8wT9yqL_e*-U56!8cWOgGTjq|jim zX*82oV1WFR0F6!Ab)1HTY{D%_U4WTUcOX`}Y%YW$?SrA}=aM*t^7|MEOT~$;Op(Er zI8-5oqgD*gpcadhVV9B*g>p=XCRtyyY0zjCkSIYit>9$~=%pN@S-td&L5$3|3NKqg z1vbNFm_C=mYk@@Gk00($XSouf{w!FnoTnxVlB=%h%SE-Avuuffw)RX30 zxkwEk>*aRp0<6>_bwGp8x6*XtJS!XNK(-Zjx?I8|$H6z-!8a?G;^3PGE!a+sW&g{} zl(>U%rh{+>Qrif_g?5#lnjAG?b@pi#!VbP6B)0LzQfjN67>*E>*v2>2!8fSzgV@>)kqcvx;f)#4JZloLjA)s1}u|%@fm# z7bMM9B9kTKSJa%FQUfx~cPI9^=WrWFAkwXOp#2;gQS9axS4ZYELzdNgAMQG}%@ z9Z;5LhRk53k>DHS;zpOM4~`n}St$^99n`qc6K_FJ+C=Xuih`Tz6`oB1*h#O-dr54g zS6>BxZOHp=+opGU|2{7G zzgN=#78js~=+Xq#4q+#cG3fZIctBjD|!&Dd}Cb>(z3@)mqcIo-Rw1GmlhCG9`TeNVk_ zqa%Dzz5h3ShGIQnlkCq-qE9 zDvkeJXurM7JFry!zNG!7>i5+9Hge&6>U~c=ZJ%+BBj0nx_Z;y(M<~nW23(w`?Rnpi z?jBoXjp!{S4y@xvzEj&4%7qy--J|0*BM>r=wk@1Z2)R05BLc3Dx2Knm*G-Vx0`=JR zIxLzdu#)ASM<1v@%Jhzm-QoIgIg>{DY2XibJ&SPpu zZ4geHn_)0Qm<+aYZEb{c7ZJ2xpe>F#4;QD@(^A5IR!2q8&EA&jP%UFO%zAIbw0Rq* z6#=jE-I9)TW77}5Nm|msZIiU5|F1L&5Vbi-E#81;J(>h$>(L~jT+b!}^?Ec32-tU% zpgw3Ykk_3Mbt4d>1!}VS??AxqD_sb}49Y zpk^=AU{x)-SO>O2EwN04hH-mmXGX1u6*l8js;(Lzxo+G}ysr~o;>HGfl)&1$fx)^Dc zSdvdJfRTQ9(2i5zbKv(J_|+Wvzo(slHLt_L^E>ACub8cUOXD1R6>MRd@Mv>b9IJ3X!815E%;O;1MUcF%!IcN)A6oehD`M?|8?DbAX8T^k zjt9rpfLY;&n-KP!19g~g5Nk$6iaEedupHquv&0EIi$g>idhg1p5#6b33jn-@;bBaN zg40$3VSV}KzDd~T3?Jf*23S=p$d4GY`}PSHyA`pq3LI7#!*PI@sRVI&D+}u{-FCh< z$``a=NSTYtu~mFIIR*!DFLMQl`?7*GX)aEP3!_9NjHnc0^?eJzQ@RZVA*?=>s1I;< z7G}E6P@>|~Rs2?!A&weQj&${9fcgTTXkn)690OE*s*2xk7qNvhq^b`C)dzS^3p1oM z3{>%Af%1}{Z&oNj`uV_}Did0OtyyLP?W;>8@^W0cR6xgHC>L#Pv?##-80{>p0(8=y zPKPhp;zagZ+C@}A?a-ZySK5u`g?F&v;=SO3rX9wmXoAj^OX2cw;l8?lcnQxpOUU=% z95CNZoo^0Ah3tI**x&;*KiCL2r3b(QY`!_v5>uvN2NAc(onM_Bs5bS$i+8sN53J&&~F8ll|=#s;k>#;qHx) z>#I&X2qGTLd+#8?(w5pk;4|rTQ|)$~Vn*m)S&02+nBJ8=3kR{$yRv72%kl2DW);`O zX%j^8J;VS@aO^hqZlCJF*o=TPPieEre8n9Z4d?~5t7N{Jsgm!_FpJd7?hG?uz3j{| zv((F*8Q8-`A|jyrjsEqk_Z0P;rhZ98V7&xe%+R@Xk5nC*%7d^`JO;85P7#fh;tFau zg;%VA_&n;v?xg~YjxSVOTS};t3iJfE`=}WEa{vw!4alfm_10cuHq>qbj!%lKI7+f! zB>^f_E`1jZuw}>n49TR$fb-eE0E-Up=MH>UHFQ3wEI>DOKSN3Zm;0(4J&j%)I6 z#&<;&Cp*NZ+Qg$jLuLV*CwpiCWS$GX6Q30oo!qI801HzhG?`6Z+V-O)M7kpy@_i%> zXqymr2e~_iQf2KLo)_=NvAAm2N+7w7XAk0N*9|uBILu@_(R-{Wo z9E6Cy#TefaM>}jFLYz1fg-wAPu>xqkug#%o*Av42xE9}P&1EwpaDuU0YB@D6}# z24Sowd{HMFYXlH-(L>EpTn+Zuf@d2S(f|f7SP;cc%XHi#Ztn*9=oC*S6qnJqE!}F^ zGwHmxy%(pAzD-18JR9kW&1dM_B!{tC3OoG}hj$27>^~xX3EP|S3;E}6&Bu06x+((r zVEYcnK6M@}YNc+XL788*gO-jWrah3B2)P$*(k@7)yhJTi-gL<~xn7uVWpj2}>g~`` zE9y2%R5c2=4Km!>lUr%{qJvS%+>r(!&)z4pza^jrnYp-*0UPu6E_{#!k;4#~3$CC@ zY7)vFt`XZP(_)BpVjm}cya^E?j1yrFt}#AFLNk4w(M?ZPpz)!4B{0T6>6MyQ)S*k$ zKd~4)*l2q)HG5sS$s6B@?g+L)S71Hj_fUGUeSEK|3-tKXt-r8OMV;vJVFyWoCO>M6 zXBQ65VG-OoW?>IB)-r%ltG}*WBQ)u%SY{Fl`qtw8mQ^>p=_;*xZ;m5(#LViMdieoT zcOY>=@5IdqNW312qrDS1`RksC(8oXENO;6GB4#Gu>v9%))8k7U2{UYFhaN4gjz8c? zxid8JxB2TBzGGjz9_0nCJ1cUuD0zS|lG4eDI(9P+q6kwgd=C(+#Iwy`ACHybA|8rd zt|U*18Bn1PgfOhD>`5>?5UVdNCd$+P!~k}i`E?E@dvX7YE<(*7=u|*TNn7*$CiqT$ z!zvi^`7J-bVcR3^{z5hz4DAAQj z?hI6TMT#6ic~a##sRkrdk&1V9tWQ{nVoQ6UeBFqaK?P2Wmi&Je_4rqyPCa0` z?u0ok)P))@X`Y86{}b z3Cfnn%JdKb9R#r%v2uDgQ~BjfW953~7igajMk@o#&~h5VV)G+KNxaLFZC!SCtVm`( z!gKTUuZ|THGb~-alnO{Q^YK@#z7^(N9V=7cfTQ~AH*@e;roU!g9n0_W)n{hmFP}Iz zH(pMxL~xzF+$=(vM5Bkrt^)Q%fO3F`=1^i*g3vf3np^i^m$p3_F-U8<3t^fggVri6 z5!RH};TsXAVGD$$@0frpGL_XBKO;Q@voU8QEX~D)=_u``jX8}0ep5V$Hiz=#X^?VNedJ2EnVzNTcG0a?PMV(!OEnH{7Y4`Mkd(OT z%82!ZqkUU+``WEomJ}ztk!jkfbT*Qw!c_R>YDa~jc2Nj9god*ns1Cm)UsC1Au741p zTiw3;IB-Xfgg7)nIqEd}lbO2_=T3xoAmC1YyAW`uzH|zKyX~CV0pd%k zKwa1f-ir4+oVwK+ps{QZ*h!5c^y{mKh$iulV=_qi7?>5Y#uF4G~hy7Jg=0S%_6l&KO*-<`;bse!85q>oj*WpftalwcCeH+3- z)lt-Ug4L>r9&SAY1zwr`REOzAsKU_>aZpYmI!NK25*<#@rj)1>Da%u$BUI;UPKn}@ zL{cLcD=LkIvN|4To*)h?r9-)GqQ>|=^f;Pb(Yy$6=y27>V@kQC*-|y%Kzbg{Erz;i z<76If;{uUX3(!`4%q`ITINT?m9AS4Lm>h+1tDs9!=u-%}6B(-$p(JHDBjjvB=eBXP zgW%KD2=hhfWFWlL^oUzqggb+@Drt(utxd@&PzcqaX;QM2qC@7W{uzc0Rgy3|8q$xX zY8bsoDW{kcX6cwr8h{}WF zX=C6>TeP7aGu%m2h8QK02VET-q%g=asa%r8gS z;;7q#Vs1;~UMtmYK{7WE2djZeA#^=)&2dChR|X@v2|HmFq3JtX%Z1s~1DQz0)7=_p z@SDj_zYQVM+3YTlP_n~sMo3*jL_NpqK*;SZ1plZSv7W#;LVmG`dWCWt6Nhrl{i#Ff zt{M|1(Lo$mEi!GXbBHh$;c%vZ%TYvhxMt9ll?}Y0&jX3FEew=F_W&YXCrPJr8fJgG zKpOfpUeeXUK{zRqS^W4CI!p|#MEAm~)8p|rmd@_NF?u+JJDa|c-02B&(BTfqI8IUP z6DD}uhN<2hm^dY==gC;=G$i|YEMAMhh5MfX_Z0_Q6_JKQcd%HSuXRpLL>OnRN&9|x znK2Is>F5)z49I6HKDB|4LZVBBgq5o8Jai~sFqTS27ed2KwNFLl78zh{>$=APqt8X` zVSm99QUU>R^z$CHPN99;p8tm*bc|&1x-pqCqky_H#!b7gD&e1YEvGr4{eBr zJ!e9~7NTe!K3Iu~Ys>oV^fS*B6R6AFc%CTn)BR&XdH;E0$iZ{V8{2Vq7lx+ zsgEQq#F)DKkYp>Ywj6ghnwa)h8W@u3LbITiW!o(MR+g$E4)LS0%)q%=v>1Zb$1qKM zjF6@t-BqE76Sq^_Muy>;i@~4z)ZuxHd!8<5X5rT1Afy!sz!<~nZ}RxXIC}lF^F?W# zR_4g6Lci#u_7F(@ui4gW$+#aKRmadcbx>7Ckhs_VErRQRfUnAL=ghV*-&9v3QYEsn zp@fpCOBQtmbPz;TslwpKk0juG#8f!NXVdLa9ILV}(6RJgUA(105CV}JQKeC7LNB-s zQ1&V)&>|=sxGmdSg25Wtd198S7-$o=E)mbR?m|>%T~*Trj1k$^9V%otO{9>SdAM;q zZpkx8*BEW|Jfy~GrDt)C(Lzt$e+P{w8*?t+jHgAq0=kwiP{AX80h1ftkO-s{OyJ(l zY7A%!*;Zp*$ug)WF3zOeU;DX3%!)p@a6Q(K~3nHU&En7Wm``v1R-*5VViAjQZW$A-Ws*?8e;?H z!-B+b=?US!mY%uejR)vSV;E-xUrwN;gk+pi5e0A8&isgZa8r4M~@XpfOM6Gs)Q(TCPJY&kogTaVF!t~4xJ zZE6w%!RQ@%Y03}EwF!@?U9VJhIqA|K#}fB8J}~OdjV$ zsDCzRqT};gI>gjOhvz3ihs1jYx_sO@owW+e4W}c@p|j&AI(0-V)fUUiK|JgYFOVoI zgPoQHE*-pz-hjJj@^E-^j4AtzkK70PnJ~K08NMlWY;Pg1QKU0`alk61>gD5AAQ%Ui zK{#Pa2dAW(IIfq{s};C@ zZYQNXdJs2vykY9N88yaGI&hi}cpg*_t$^rdSUD8Np{;gzF-T<6G0=90GOQSdajdhO z11F(okl1u{K>TG`INaIELMO=2MWLp?K?tF95gJp?XX9~b4L=1B95y}!4;-w13?A_z zHT+0CWBMfWni``&Le({fpd(4`s_u7KHaeqyST-8&K#91Uh#xr7Nz6?JmfNo&!}$sb zxT8Q_$z+5gew-t`Vkz!qpaZL0aa#QroK|nOU5hJ>aBKJTW1{lI)wm4k!Zjj;EtGGZ z&HCj-#c32hPv5P@!Pc8E7X4}tT9*N%(;T7mhkU}Yo@y0149)vnsMvHb0jb(_F#*l~ z;Dx~CqDus($^v3a-@aq|j>R2T8!r)qPoo=ypv|MF!cK$qWV2jP%0W`+qSKoXO6Rii zbmlUvx3Z$RgA1Lq%$>^x)-wwiWRXZ&Ps0NZ2(e(D*>q0~k{h=f1n+@aL{-67Fg7rF zxWEOevAcXR%qH|^&P=z_rjvHFt2qo0CS)soYRz;dY^eXs{24qW#%s;288qX?Cv}?v zMp16<$7Qf`j`>x9(91 zT1EZW*w+I4xP$(YeWHJ)M!)tz=o7Nv3j4T=zAxDZ{}O#a5&S|A@#mWU-o%HRK38LZ zVQ=i2O?+UlZs;{EbAh$nNHzcwRS}kqBf!h&Gz6-P^*L$?wEMv}1TM%>`~x;3ZXz~{ z#c`1OCCWVtHJS$wu(|0nY7U0$Iy4*68Ny(rc_H`^h39GJyTVidt90vuPl$t{^DE}N zO6R%)^#|wSoMLdFm-%4Z!OhvkeB+$D)0Jzzm=6R0H)lSobDv$O5q2ifFs?h#64+y? z0ee*d(W>5!pnKo_hs;yorUv?;ZPkAc#DINOK`~&Hu7a+?GD!X2H2@1DTGgQG05w4U zsS3)*;I~FhO&93SXaPDO-sZZa>6JP@{ml{&qI?xdu*V^N+kQ|gC- zFCL3i>Eske2dOW)UYCyX4GvC0JP@yDxMaSflaWbJq#_WA!IWlLRk)5wDV(VoAk8rL z69nrf{j4sn&WL=8E5otPJE%P&(-A$>x6sT`i^34Z#)(LrepL)VKe%-AYAo=D?!mz1 z*UBdzP(>B#e6@tP8iDCS-39_%X!MUshd}nA>vPa0TtWD_3lGD)k1{GMlFCT8{sJEA zz56<+-cI2#2O((~bXW9+XL2N#f(kNnQqGOx$|7c^O+y4aY^5kfC8*i}B`&jCK}Ayi zRAhY8&xjC66jbYBs5sFzlqge;mIf0V?p&w)1@+C(WZ5wpDjCCNpvO_s)cSsO z6D+Sr!z7qt31B$rTt${64&P>}Rv@=a{{loX3-i;c-%d=IPlCR5k3DX2$E6c0=RB$g zE!*O>cMUg;BhlfT*li#+wJ~zxBA?3^EPx+qW8)@uX*nSY$}?Qn1SlAI?d!2wgXymi zLH7C4ZNgSnya9BAhcn3-#Z$`tK{XON}7_A8@Yhz zBvR9w|HIq6z}Z!mcmHSaea@N5%$%7slSyWBBWv$mm?R_t0=aU@9t;J%lL)yaiw#iSbmF@u9E&k zX|#KJSmD2*dBqFE!RG5<7}grzp{|my8tsmPYN;v*K_*RJ|eUN%4-z%Q`MtK!x>wkmU;&7+thZRi)u+h{n#f0O#OlPKQ+^ zPh^2EiV4G>?tVvxsTmW?Na%BF?IM{*MMpLJnjAGE4EYz_5gsX>Yp~`4_ z%U|4}%Uie{V6@Z7F5oo|ea=CR3&4zyF;ZjXcQ-Pa8mHe%N{|HRM@V4?Lu2?khuE3V zKqjT2j-=z$WmrHw%pMW$z)2Wa1Q18*{-Tm*hrfM!0kG6#Rr22?L9_eC;eum35am(k z__uweeq0*bt;YVc3eQ*3G~STRYF_x_aCOkxy!pl9l9zU+Tezy6$z!`Iy(^Fc&n!}L zSC9mnpi|B%H`0>0*(vxFr(0s??5^)V#@%5k0-7e|2EIXR#NGCDz|Jb1vw#R zp>BO6twZ>$_Yw3$H&difMO^zEq>q#043pPVFn}%aY2r?R)^xYPyM_bQ_N3MUlZA zR%={xa4@G|@1C>$T1MNkM~wKne$>6LUEH|$xz`oHg{v{ZhEHxW-gP5RN@I;@P@=qJ zxSM@%5~Y9nZ>zNL9i1(tOTQQ5^OxTLqI&ZQ!FOn=~6?@f@-XEvGwimRe35>Bm_P&6?|)R1c4L?hjKANYt%3$}S-Lu+J_e z`-soV8|E>eJw{715y-(rn8RoA{Aw3FrPsuw;H>4+}3>Q%ffk$W4r}z zM>ry@un_5IAn`(}{D+2)a#ggh(SAM0Tp*#;;Y*+tt!Gjxm!@FQ4&?-O zKq+R=N&OCs1eOqk!y8SyEIoI@y&@ympsshOH7PuqWUKwDQ_i%rCqY9v&9vbcE2$lx z4*TFX51N*uH5p1KYD>3ZCbfEPcD)X!9L$rUWRWK|2o(IodY-7u4ilt+pA{AO>3O0v}J^2~Rl>HZp60^s9`8q`~!mkU$DH1r|x<+^9J!7WJ{VtuA?!7 znH&5ZVw?i$$CU!^Q>5M$XE4&S$AiZ{V`9JZ7jfkEy8sE+0E{u)febCZ?w@aSkVEX` zI*^z0zv~#?gKd1P{&#^X9nH_Yk`qGgxYvO^?UX{_+w036CGDCEILPj=e5&mNG1Q^3 zizeY#vZ&$KE>wjY%I706IU2Dk{WW*J^UWRL5DO>6W8Cg==o~TEx5+@hA|*t8v)9@F zL62a7EjaTsp>Y5Q=9RmIB9cgqZ*d7_km;PwC5`9F@0v>}%VB#mps0pha`{DE>V@WQ zhwu4nUlvh(rQYH)u6g&rvCODAleATY+OrfZ6CFt!fkwcuXd5Z5-7i>WZBX7) zde%Ag%5Yp8ErOnsc-0Y3tZD^*t#-s|@B$FJr8|BMGObA;AgM>C&N9>V;LpATeW_GR z=~%hB?rqVs|N1)p&D)~pZ~yDsI*){Zw=;S@3w*}y(W`<-n;*M9dUv1SS03VXz!FE& z)4cfY(MyH054=5E7d|!X!Ee7k8V(k8$)E-n)uqBflPcGHLQ|^$>4P7?Bl={}^kx(WdY<&9}ch8s*_m_t)`*gYSv{Bj|r3=;1RFy?|hThCWt*qPb)|dTw?9&j6C8 z58gN)tq5lC{3#Ez?r_j29k++(zV}AwSC9OsUNpPj7rofchU}+9eivvrb>IV?wbJkx z{`gDxzx5-Je(V>`SHCY>6OMnRIsU#V4eoC~`absgckFIH_Wmecn2fuf7}d@rmYLcSkP>PH%qy?&z}cq1&6iw+FL>t<4vIAbLUmxOQu2Y!ZpKNgXJ} z5XXY_0IlP8f7H{iV+QZMs6NpA#eGq`=w8=@%l|04AXwd%NGy|wk)Sgypc84KoFE8c zX5$6uFIl2ln}}Aj3Ab?~IyU&*=1V6S@x#qqCZbg&_f14YTOY%SxEr8ymdD;{^_)N*wSx?z(I9|r}jOpHYH_!c0w06F|!-Gt-VSWDb9Wdop>0@tu@U9O< z-;319t@lPhU0@aGW{rpdTO+!ixzfD69?e_D5cO8Z6sLNr{Q|M)=}kBPX?OHGwfuX3 zk`IsVM;o3FpZVdv@}tpO>O9!|Xmnf1>>UF?YGEwTnJ5OISr}^O>L0_}u<59g?|D&kd zxY=HdGbwj7d})$3=>Ud09O4&yDIKnKS~y0Uasrco$AXdiK^~FTDsd^?I{m-v7z&S6 zlIzn@ej*)q)}SLjT$~T#w~(lg^w4xk!)_7okaLCn8XzhB0KKR~r!_uf!P zR4_ew+h&3X3=8B>U*biH35 z3dhu;+?U1z#&9zP1`Ee=kQ&>W9urGRyWMf_xU~C%1ymgmuQG3-VO`kFRsa{Ua$3d> zV~19XGYkjOJLLNp+saR3j=Cj?xb57aASMV;T;;FMUyZ+B{<`^_JzR9PE+;BO^=t0-H|-wEVT+^BSX&2RpDmV zk+fw|yihZ}C>8IjXcW#I-bqnO&O1W-4=as+Y z9EL3x5@g#-icWw9-n+9#t_!$Kuypj?+55y`^OK*5`WiY$P^mwP6srS1ki!KWBEVZ3 zgz2hDEy0mmjl{TMiLUBh91OR`&*@?#GO}X`6=5w$561A@R6CPZ>}MfcxV)FECG4_r z^^D|eiF%V2=*$8F3IFVCsp3>X#D@%Lu$=mc4;$fKWcM<+4+2h_-=s6`!5l_8UaFj@m5U#P zYX~1AcZ`XOhYfTYxh*R+wAa?>Xq1Fd%G@~6FR65t|a|fdgzi{C&pGK(G z94JY@Y#Nnxn*2x(af`NLy)1JHG$7yTb&E{75abPOkKOkOA;I>^NhI80=}rHNs3hTn zc&U@9#Utl1x*=AOlGYaU1_9&vZ1&ulx~2DGS?Y%B+~?a@Y=u>Bu1G?|mY*K*YmN@^ z(U|uLV031=;cZj{$QUAe317}7;hG+Pte|DkrQmwBLKe==Jr{l@pgwN_Hoc*%IOSPQ zANc0O^Uh&cJPyHe?VuBdOGXOr6{d>(r?|zp8N9nZuuN?XK-24Y1k@d%b#f=3>Z;JZGxESl6N_>jay%h%CNwe-0X{x=Zt~kXl0g;^>Zoh5E4!6iV zFPlchu_-NL#apoZIc}-hpqr4k-BP)G+tE!3qHkYwfLKa!0kD$Yh#28iP3*38CeGaO z7BNvnSB=0r_aWaR@(hWQf?StZL2Yioz5w4T9meJ86Hs6o~& z;ILz-aKOHlo%%A&y*mygkxheoND5kc$`a(qzJO1>eC*hlzQz<5t)3nX<$0f(&4xyp zURIYQ8xpnE&F+c`@`@&7G>4H@?t>LMo#%IF4>zCs6ekZ(P>7#c?k)B~d@G-(4<*+L zz(wg35n|MLOljlk5KlI{k+{Ht$bRKGm|(#dqG4ppDdyQRF~n<`?-qH6HwFIjFq#fs zO(S4q{U4#p?%oFcr%MpBD4y%Le4%w|aBVE)fe0u4xIM#@cnu|-izvmH0%NO7xND^H zMshelt|-~rGGm|?7{vSe0v?g>Psa&V6PAgtL@NR?G8wQD$#OC-a)G&u!Hb-TBERRk_!$~7BcxV*sY%n};CxH^5D&0DK%UgEr+%+*d7TnCr z*8xitxXx95#Mv5s7>hRXU@D4Nx!~SpVGNQPR46{ss_n@!8f&tw`I*0rPMk;cZ@M>) zUgwSh&bOzRvh&p^l38tbJrpf(;OP!@WBmJBuq_TXp+}XN3e}}8+d%yoQ-IEmc2~nF zih>f7(ow&7#x`p7ga3cX7JT4V^5DU7LCtrJ!Y3%@^Z@GwP`eXcU-Q62(fsA~b(ZVJ z;XoUgOaq8Q)sQwqfwD%t%q?ryKOOZC9^=lX-Q-+A8wQR~vRkP6=xUzwX-te=-kjAg zz~|hOe{=PxqeaQ%5e3;aK^*u=C^sp{87?>t-gP(c`*gJM1i5EyPiot)Wq?r%gr)*_ z51aXtDxHcTu?x2+ZN6jRQFgS}j@z1aJg{)OTU_G?fDQq6yA7<^(O3vtbv;PnNse2H&^(|{89xC(|~fWL0e9$syQxHrCaBu z3Q8u}NU8z?@l_spAJiMrpt%_ai&lk3s|JMraDtplL1@`)1`ku1F|$x$E{mg0XlBR^ zCSKn0Xget(9JCe1GGsIWgvBu@ZFFyS(-S8&&Dnf05B}6MQPNE4+M^V@wM*7mFLHf2 z@czfNnaj0EWl4B4s4QR+ap|IYHi)T$xOHsHPs6P$^uNPsg;r$&JL8kGx{~1XZnBzS zlNUJ8Hp$>5J{5~axuLz0W92L{&mC(epbATu*X0#qMy6k}l%Y7J3wFSQ=1K1|aZca9i8S(g8!01$O#avhuZUlxOtp;Hn{8pU0y7hP>t8+9+}1F@<^tQ)2edSa44K5Gz{ zSbi&$B^M)8OnOPbdcEoVi;#`eLej?~f)Ud8unp)0xap@Q>5~FZaW&l9BJ+R9=DP7v zHCZJq4^O60l46yY@LxqwWH27SkAN>LDJstJMd@LR=2Ha6^JKzUc(Rb9;v}CDKlr9R zm5N%zy?%;>eMCn!Uiu{j#uL#uLYZ}%NTS})Qm7YH0PRz!LPxXjSw&5YmC;QIYL|UCM8yYcvmbYl!OMMwfeOT#? zcJ3$0mKPaWym(q-wC_37VA#X=WQZi){yM`Y>&?*WpBL`287EKl~^A9J!50zM_a)DuPAn1 zQV_cu9*x*O5cm^SSU6G~`BFzuLnGOJJrP0!k0fCtdYHD{YJ|y^=fZ||j8~uMwy4kT zG2ahn9RuKb%wiTpKYu+*=eF8BS+mjPB$pa`VerL{I1{~AW$2}iy_}E{5e z3de+y!marR5r$i4j}dY$r0gi9kxdn2~Es#sR-XquC0=edL2zdr_3Aa$DSvk)B zjV8xr+Sp`h>W2f64mX4r9GV3^f_p`Ov8D$I;W>ExHNA?@)x;6Kg-_r9ma4FIwM-fUm0vJ? zY-#EH5YvLvh5({rb{Xt!Euk5pkFw`vwi)mho3V&N`gJKrOuhdh+7%R#W{kE58-g#1 zu(mZItI7baDEGmmYE8V@ORJ20b!h_mO5U+d3JPLK&J z7%pGT_7;2;6Y){}AN3AcYBk-T^p!0PKeom zZ93;4J)KAK0dm4S6Ac?erA{C~hxo3!RmSmjYSu`djd*q=b3_xXsLx~- zb=g@dws`^fQTs))m~+r#mQZF9?>siy1F`QGYHAFbyeq_8h%yGauMO_#*b+$BhpZsC zih;KNFCch)R#13Bf4G%(T(~y)^MGL4$yK&{f^(aE19=g;6%v&P;x?&K5L)So zSk-VOVZaGGYARVsI9qMV)hu;r%F;;Bf``kAcD}iWbh`QC>xlE6uAc_`p@cIeP7mhwZ#1{WB{@oKOETG5L?(j_@LVoJI2j=sW8ZIg#m{CoW3{wXhY1J-oR;J6 zz7Qi~TG8RDwz#i(_ruY=MlG$zeS8+2yp~qtJ_$OVe6LB+r){e(b8JU#VfK|`FDK2~ zRzQNrbtB0dd+T+^vp6r!B%?$2u~ry4TX6|RKRM5}iyi0ab*Mqv8I&OsXJv$!QVz1a zChfWaQl)-qvUAjN{%gp!uVy0vXY17^7q_!OeYhDH$}03%YAGV>Y35g0#Y)ULXeznN z+=Upt495g^U&Fukry86SQ6t$mNdHaUS;eeN?cMCoE1ro5mYnX+$e*>A7_mjZY1Y*i zBz^Yz^4g%=c#VM~wVR;F>OiYebf9%`{TJ#}=s_z`^nk#K zI%X4x>%41|MTGhLDLx=aH^{G+6iv|J#%AyZplY}EE?q}cEi6)s(0RRD(TrOOW@dB& zykfkXu#l~XU_?vdk-26=SmVIxmLV`}GbXKN2sUXOO>MGS<8v)SpB^+Repr3l;b1sK z<2Y(qS;FX@w-!PuA%=SPz`eA-!6WVlw>)+(fF$=~+iZ`k4Ux?B zfx!GoprHINOa=@F*X9%fypbUiN+*I~b^2N7%4l~O1|_Iq+6D!L9P~jUWCyft1%k@1 zcPB9_a|&_n(~j|~F8I#Ew820-+*%g`wysU1+@Mz*=mSn-J!V{m;fB_0nQ09pt(2yRx9}S@ zbO!POpWs#)>4nT(0P#lJb_>tZCe1=93PSlb?0Kj(PSXOgEkHOxKuc*F{4y$Akh$n##1Wm!^lzIhf%7$52In~LtPl5YO@7xXS(}yD$y`X_1ibt zIv{Pa2`mN}^-SW0V;nnF`3oiy8;59^nKcHq!VMIZwMdrnLN-a(iYE87q>i``OpwSn z>uclH;u}F6aPtl1@|S4Rns=7F>_2P;ou<+DWIl~)NP?dS@U{nLiwXjY`0;bO)qfu+2N(*B2piuEDJo;6+ zcoiJ=O06N0ZfOW|nWn5Q4hZl)LQmk1PchRs>SBoGB^KQVJuViI_4}=X&cJaRXi*K= zY-OIyPg_9A6HG<+;;02IYXJ=-AnKB1NOY7_;BV{JM!Q-+4VR2xzr4`at?U-En2i8r z=IeA|Jo_}igc5GmcfN$S44Som0RfXntc+~ZY$Qmif;XtkXtK}@_bio!xcOh@3NyA*+g3}EEHL@*EyInyfJthfja;6=A2`AwF~cK0u=okzj~zyGBBsic)e-AyGwE=e zz@?KM(8{O^GeaP;7NSO=u@-vwRi1iff^AC=l4TQkL((YX`3iBdChbfgI)qc~Jec{4 zM(YzepFW(uN;BWk@o!Re46k=S(&5R(vnFG4GyuWebQg z!waCeUl>`$MjWP^xE0MWel;3c#;0T~Bec2ZLt9ET-%Lic_Gpx}4{A*Z-B5GGqfy+D zH%X=L?L!A5h+C9?88dg3K2DHdJhfSiDE+FHe20?Uo`Y`nWday{R#p}^O}>by+N9;v z$Fkr3ojtAyA5nN|^3oXNYIb;`wiNk@vPr@LByt&$1)*vV31UGtncYHeQ^{1AniwRG z-qX+U$dDMS`FknQ29-6L>1r^A`Y{N(H4ZqSj1uL+uDlu&+-m=T8d*F+EC|{?prD8+ zsI3E@kI#%h!+|0}03I5aoiUJPr_oF6ME4J$hyS;<_uyXWNq1NZ;M1nO@ox(N3S;j8 zKh3UdJ~UXRkSqMW`S6GbaP+4oYTlE%w*h>T8?@iB+?qAhly)?Xe}jQ05KCv$wRqa| zjn6^ySCvp`|9cBd^NQK!fs2oJE&c60rXWWOg)n1#s`a8M{f?Hpt0yw%2o>?WM)e}2n8mGQc5`n9>Kp0Ay% zvOC|M&(V1~`Rr=*E@`%9+S9!IpQ4_Ib={NhtBu4bbNK6to{{)8(mnG>;!{a?&BI;% z+W0K8KjGDRq(7aFHjz^Q3|T~M!iWOvo)3&x9LKv5iu{@U<0@?b>dOf ztHevJ-inrbE8wk~n4WZs;cs-?GW1bE%%1cRWo63Z9A$dkwiPALv>wzEV&5)NLSw?+ z)Bopnzo4!&Xq3`g+(_zuEQR;aQ7s4U{=hi*XbubFda)u5_vvU!(L;E#_7^^t4)hh0-In_+?7Ry5mwfHqk_t#>20-d_!QKgOX?)WlgCc5KGmG172U#@g-cYJ};eciEB zI@ujF5Ei88gwlcTo04a#aDVr$n1BfQ?gIBLvJ=WW%Z@AiEO!B=yL|TLWOw@PrDVq} zyTM&X{>VJ5JWBSk&yJAY?X#~TJK?jhCOfX|tD2WjMJ{+{^Co;Yf|oVpuSJU%AJm&G zhPi$7DK6c3)~#6%)Ypsc&ByeUYnngTPcGL_h8s}DUAz>S*WZBZh@S}8a}ZxGeR%GO zJByG8rnFJ8ny=Qo!QA%hq)-S6iTVR*6`REg6g1%o43Pm{0>WlQxF?-tjgwZ0*k4ezr}X% zhNB$7v`x3ndi}`1=>+9BGZ2}_#8b(HeBC_AH*iS(*9lEJ^N%Pci zL_?jjh4iF52~4%IdCfPXW9Mj*nV_QX_wl$%n|raxf<++XD zSrFkg>dXl^YGX$+5}vlPV|-IyMvdEIW`#*%?~E8;M-#qY5k3&2gi_bL0-+FG>q-9& zgu)Fl-|Jov`13s5$RZWa;K36>)potM*L8TdvMWl+#y=vPamT}r*&}tB9+VifE#9WX zx2%*X5iiq#m_;bX8s-s_Tc96B2}NL7R^(2$+^%^hGgJZCc5X71H3BgtnUls>abGjO zhy+T4=${-uP!l^mIb;DZIG3-cVj*+&A}{EgtdYdaTxoobHXu0ITVNUSZqgF}??Lpj z!;@5Z90RL1e|RWbwT`KM0Q8pc^IoM!=J07SlsAz8#IN5A2-!!=XQ6q)w{a6dsO(@Y z;?p(FGlWV6;s6jRFHz};Cb;*c`zh+xH(L>qWsJyQ@n%J=hs{Z;lm_t@UL$@UMkbN6 z{Dfo^^mvm|#`^8YLeb{;za5=C``*ANF&mrQf44N(e+TE(E%m=)$av=s#8u%8*+T=E zJ*fFGUd?S-YqaUaTr%J04GQbp`+fAjdFkigL9|(^6EL`uWW)3)ZqO&@AGbj?KmV)^ ztgpW$gb&(~Dn@elMSR5;>2q7`ljse@R9A_Z1JBf3`j8e$+G`8OquAQ0&5ssCLA*s? zIU5`cP;ztJmNUy+LxMx=$$2{Ih8lt>z)I1HWJ23g-imnyL1Dx#LkZfh)mg?ZlhpS^ z(jZ5ZEoQ`MPye+fIkxKXe{P@tUDBKVlAAHnS9{awbw$C~ONL{40Zw!rsiaDfmn<7D z``(C#!#cFf7RC`v+zg%8XM=`cW$OHDbb?r&I5ub7wnp}5^DSHlHRnF}=B#{2jHs%! zqsfq4oTFDd$#b;WEonX*Kj~9Fkw@ubw_=(p?&o=93tODzx$FjuHvXLFL6%%;rem$`%jFGv0sb#ANqwy@-l9vPNN@A_@3U8CenN7u*Xw<} z7CSv2K_puMT^@jl_kUzuvN{vYV;fXG6j;p1E~I z?vW8q&Mr&+sg0><-iUj%&(o4WCc?c(WH&Uw_Wfv1&yu3&y%cV2R(=p|3I>~}{~($> zBzPjm8Jp{;`%byMn2C-H0024g$iB3B(+{HbN};}F&)M#L0lYg$AB-!9bZk~b`ZQkS zJ&=1AfoC!MT>F;H#DCY^3Nes))q_hBKV;6!2vi<+Shia8bsvt7ThoHSf+z3kE|VaO z!nT#X-POPRNa(e>^Kf(mrX_@~NCu(gM1F%ob*mCPg!f2 zqK3uW`FkZ$JH-tnvzC@bi6KPh7g9UQ%_d+VPZOV>HRCYmZ{}wEo7pigDl8Wl6_$&O zm}HYC-9_HYagkX$O!l`4!?QNN0shKPX(n9Bn4v|wK~{{}?gn>5IvXp-ru0DItr!+F zXI84?a2L8+4*lXeB%2iOWR~t0Am-OB-G(On#RjrZa@2Mm=|L=QuOl6wH4J>Urxp8g0p8O=$&mrX^*!bC` z2Rp6W^Yx0BPbU2k#OX9yPPXzej?>rq1=_~tel`8SumD@tUR?`a z5mj%MK9PhPnkLpBa~_bF{yfOGS1Hm{ZgYcUoMR^JQUIY*LwT%N;KgQIwTZe06P6MQ zi|+7%Gd?w0%7hA&yLa&{)x^-gedPJ+&enpl;vv&6ysVPW6Dq>;r3O~@RFc)WS7sp0 zkFxIgQB|_ft2KZ4BQ}+K(^4aiOPKbp4U2ZQ9MBY*Nptv54@cV z&7W!H>?7fXMI?D{6;6phyRU<1KJ8~+JVQ&4kdoWi!Nl&Y`Fxf94xdNOOXvoU!1= zPC~fUZhv%fG5v`JlZpi|(H#yY5`@=@V4Go1$ImTq?j@i6Y_tc0Pv~Q`$T~!!DSfJMyRuCRuT$n&? z>B7yW_p*T6SsGVr7iR)tEDo!etz@nKC#)7hK6~ODU4zU-kHCh|3_YDJ0w;H|*AsVB z`pf5(-U!35d$Of!6IIQIA~}ef5W+Vd=Ufy89K#FiAGNk8x@8|%rS4=2F2C#YY3a@~ z4}oHO+lZIge2e~C8{KXRZ7>ChGVu^|S8}}z&|q$Ko0Q=nWGyoMgC+X z_F*ejdpw2uRyGW+$(p{E6#~@{k=hn$_G~1=_@2mwUj(W>p1podzjG&}Eh?SWNR7H3 zWJZ18kLys7HOw#gypjfV$N-2<+D@Y!p=Pz$&#HMBfDn-kog=Y6$Ioi7t0k)FXBE1j zDNF`ElJh;VM&|hvdhJs$S%oy4>}^l_Y>pv9HtRMY<^?#K z^w|^>^|@R=4&O!QwPqy-^O`77IGU1h#yAOe9%?esd^>T%V`57*>A7>CR^NU#CVUgG z5VDC^%tX59*WVFnjt7f@>w`4x)27GGR7kU&Ic_fX3r=hWs~O+W+kF2|ql@_lHjT1x zQ13bCdZVci2`h!N$M`n_yKH(=grO-4@70QGk!zvd}nON2#x1k zkr*OaJgX6(uFS+N=8N>6SxL>j!pQHQg)xO4_7jm`fKbgI*ubn&LpYN`gZ3U-$PoPK z6|RvjVB%t1bZxlT6s0v;W9Fn1WU;2OXvyLg4ZlD0S_)8Sk|kzh6?Lo;_BGjZFJLT$wPz*2>pn!{@ zg8AlvV0vu<1{VF-zv8O|1eLAwnT(v2~=dGdH)YmA9gbcJklq= zS}yX!HmaJ}ioKVb?Z)@Il0PWL9RrErPM1s9`l?7P>bykTllCxvhtwhE^b!96Uo z-e!Tw1yZS-9-;&Zd^ge`vILB#Pt3f}Y;?Iu#rTJFQHcSIQ9ZMWrLe)qxCjaYjV0tV z4hZZyO2Dc#JA(3p|ECu8XV_Mlbz6QyuKBfd@Bo;l!$eF?VIDtCt{P@JKg~4eX+t?! z%ybGCOPVsOVI6B*`z}N=UY~EN z&2p(JGq{juMI42a#1L4R47m0xex=>1;NC)X+tXo7At828hs>g(yHf0s@udekM)K_b z>Fi{dWf=$E8`H*-zeAIZhu7T$5vT9X z7t891FM$(bpQ)r_C%B3Ad?fCP!1nC_MxJwnnZUVN0_RC4a5gSshA$CTU&7g9Nt{(- zArdFL3W4^C#D$d>YT|UC8T5lnW?VX1zZ%i6GSP?~vP2cVXk>S$5C_OzBKC>Er**1& z22@BDw0>N#_3q`NUndAPuP&EQZsi=hdCAj5jjE5Z>|rX!}ovx-GBP|N4~l5TR4H}N|sqN zSOyK=eB{VGzjgaRfAZiLi#J+kUVQk=@4scwQ}=!E+r&rn8)?-%of4SjT51yzILTV(2d z-hDSEuW_%wDOooBiwA%5)Sr%h`=7sDx-nUb&&8z78COt^n*^?L!A%tHqbTp_aA$IX z8a~vS*t|}4CZl>j*qL0Gcl0tkx@@|mOWo*A#NcV|D4=ACMTXxBP zj=?qDYZ&H@T*{MN=3b?tzIE^0{(kJ1f4_SjBXw8sgZ&z-t&zKw|3@#$>R;+c)MHEi zz`cz6rtSC+E^{=R)pswyX?XvC{`lcfeCON${-e^3*7Sicu)n44k-Y8&GwZ6^!=0w# zi`4?{W(rEyaEjYS%$2j}tbi|UK@=;3-ok9f$a#KZXRmXd=8^?S1tQBTtz`rO5gDjz@gCT*x* z?D5Gn5?P#T6!~3U;omH8{gO(tx!CDBqu8-{k)6moYChJ`pXg5LG#7pDb<@4}@=)v# z*LW!Qk7v2p*~qLTKXEujp5dk^?HT7wNa_1wCZt{o5wfY0UWF5v9Y03ef`HrUDg_Zr~l7dIc27_9byK$pZ~u<9>%}Vs)vMEY^1U604)_a;&uM zj_1F`*oaD;8J5`@r>)kVapDBbI%;p6>aLf@1&>Ux+GL+6^CQh8=Mnk|P{0yVp8n25 zWjk+br~n7~8)jvQVZ^;sukA+ypVdq`wo2Qi?~tuD-=y#8OdET@HglIAi;6aYi^&>l znJg@G%vC;1^2qX=yv&b$EIgj_Fs%SEHGSHo_X?+~j?0HWeOLn*_!h;(iwL zV*$Q3L6^*)S^;x7=tW4YNwVH3UzY$wW{u@$g%_g~kwGmiIj0xM-b>_m!1P_+j%+CF zP_6mgZtQ_FYh@OnzRbCx*DXQOlx0B6MJzIGE9REqoeTQXqnrz{mF2Dk-nW4Ic>xFf zcQS%dH|+pEHSb%{TMINWbi{_+DCM;m^L*y)0kAE;&uuUK2(}A+cJuMf1lKUr$eeU{ zMy}E^oa@8laVWe{+;k{3t(J)+*8P%}jRaF9x7Cizw-NB>Zz$j)gvr%fwh{WYi-@Y- zmwxrme=iq%`N-&K*%t8-JzI6Om;cK*64dOk*hqjVl^l1=u*zkL;I@%4uQ9!eaA8c0 z*;i&8%q}%wI{bI}zUQD6)4e7m+pqTog_BI#)P!z3!VVK})^{zyBz_?nUZiVt*v{)f z{zfoUj69kV4)H?Q<8C;MUAK!g@n>san_Xu8@FH!9qr8Y6hsbcIbP^KV5Rl^Y)Ztsj}1u@#wqu=V-9#l!SYBpzIibk2;eNS?Hnk`~*Z znY-cdym^@Ia~`$p$wqC#cj2Ai-4n^wu|O=PH( zc>(c?lQFid0Rd_EW^XW0TNK7xo z{J%P*vDSMpa3WLavbOMaSX+2HtToOikiscZP>Q+z*ZJdi^uX*9j5%}Cy?rBbLb|gbF9Omr z(jn3#ykAU;PjkG4lv55^o#&)e{rFoc+UB4cC7;cjOmjZP&Y$LdD`dL%tnap8!}+>z zA;{>{IUidwkv94(n1IEHW=sVfqf-;fry->zn>UvxdnC^2f48|i#8QG0Id$j44GZ23 z3b%}K#sC*&_OWN;&CTDR#EHw?e{n6;FlKOQ##zyl%}F1bJ(6ZK{TNwWX(sUpk|GY^ z0w+?rUuid6UOkMRne9Q&<*bPE_<^v6MtQoskDJ%h{dlc*XDA;w1- zD+nGi6Ine5Q`S|9nlzYtHfbTEQ8r)c1RJUN>gHzbIq8S3z@G_Y&6v>@Tmi~{#O=L) zdO2LQlkIeSp-p=tXAWLtmeD9%a$no=55SJ^!C zy~w8BSOXBK*u@MuR5kXuC8+r-d`;$KsBV|t9m>=xi9T?RIq4rV(9X0YcL<)7?$XG& z1RArfwcT#W+u;`bWQk8U`UL2mJ(6b+=GinWQKF?$y1SqBoA-bA7mx3M{I5>Oo}%Z* zQ}=vo=U>0;(YL&xqh;eN`L}QW<-dOD-k;z5VG4Gs;D0~-p@UyJ@ZC@TB?UVvNXI4- z()TLIQl{9gf)P4hUHSw;5$X$=9rE|%ojqkRrxQBp1X+GJ`2$&g zf;^it#oA1g*UvscrVe+?KuMR{p71Sd8u?u= zHDt{p@}^@eWlS;5GYn*aJPEVj8Ng-coE+}%ie5A)29UopyW^4!p1dJ4)VK&Wqs4v96-SzD@Y2_7d4A$MDgSnTU@Z`vxY1f_BX zT8UnB@WZ08gF&v^qLg&f=~alno$2Rq`_i<7@#!E4$0l%T>T&Dc>8d2HWWAfy{G;!2 zxLM7tM?3Z2OzY`DR)11?GtF_H!8RZLUbMKe5@cDA%EzD>NSVEOlJ<(*YF)e2HHk~* zK)lR55KES^dCX_gs}oKX&MO%tltypR+!mxovBD7ozHnrU_X_ zgc<@=n0qxblSSz`O>T$3iC35*ZIn*P{>B?ze2X$1BPlu9Qlec`A{@@j7TVd7@!im% zU5Wt_Va_H$mgOhOA8vQg84fREuSNdb4bx%p<+k~|iLyg9m>cDzbjq4%aK#V~SP26u zN+zv@fp}Q+-R`2RgM_Tn5XQ*w&+>H=;ZEK(ykJ8EFswj*MO?u2{e7{})4xMKtrs|Wy^h2%7#AlejrezGf^ ziBRf)!7)qw1#RDFYVeuD03FWLVaHqTc8J(%9U2$W`LX;>$Hne+XRA2_vXcNxh1OPN zZCwKSLW0fb&n?p@$Tb1n^)+KD z56Vj=@JqR${LU=DkNg`{JXE?L3V)5V=>z<>R9auUj=Z8KvFz!1OCQ*IV2d_(^{YJ* zz?VY8o+u7_J{XIB*iJ-I>rD6b7-{@c*7q*@1~MY|7Kr4Rl_5CXKav9Q0o0Ws76*ek zRsf5y2CN})U4nz=t*28w)p$Zq)&Q{F6-?bgb}!QWg}l%eNPWexI8JhA{-CbLsl~lU z?79}r)_%Q{@*&C{=T=&g;td-jf4@iRy7i^mnyvSkM7i z&(7Vl^?#`zm~X#sFaO)=(MSmE%X9@F62FoX;hfdi z(02&@cpOt06As05O9dwv*1)xqHqnhkT-VOPf^g zL4`k(nA7I!&GS}g_suB!mltys>R)0Gsl=SR-4;mI+gFztHOgD@Tw0$62u0OWCEO?}O`LX!?92TYprG1J8PbvL}&$^wb zmVO*S0S9;9D-hsz1!4>^D=cp<-fYXu{#XHqy+?s+FY=r~bxx+kbg^W9byzGNg;Ho? zZpp^w$j1}@0R8IT0=TI~v(-gzB}_|xZM*dV+FO*|^ZhawKQtZEeymlns%K?Y=MekQ zrhMbIBKEkuiLF=_`T<*EKd~b?Ne3u_fx}^&N4$ zEQ1ku;ULj=$!<;ge)cRY^*;(UL`~l6(uIg@cEbTTI5aNdo465EID#Ekmpxg~;C`ME z^XfcxvGBTVRyiq33oVB-BCzzmu*f6z{~5Th714!wwWMQMI)qnz0j=9EMt3?T&|ZS(Fos(XE% z2B0OV>dJ{B9k1XZ^!(p#-F=cCV_USzUx|Bx=3`J6Wlxug_meeI7g(IJXsF}OlTMM zWP{S{d{9{puohibu+=W@fv&R#&7jzBiiK_h;K(a0WBAj^uNh3_-Ni{YkA1r7D_)&REX871)d1Rr9H^Q&S%t5@zy+lIlM;zt^g>W_vqM%`X?2DgCbhy zTJ!D8;XQatmIPnMc^F>?&l)MWL$ER#JooB544%6Tp1ahkhi7n|20c6jMBThGE0*G0 z@>K*lgqTn`5_jeB+$(sd@#osLs~oE1DT8PEaA=|op4rV8JZC**@SG0{SBGLySq)mkaL%!$y=hmqe!-gRVPefJTWZ=}H@l9S(6N+eL1v<&Lx&a2s9b1(#@l z&`9^CBHdF9Tj01$Qf<at?u|4;&nNLy;8=4nd=Q!CGc_aAq88%_M7oWD{idY*q=IxG&+Z;nvaWmEGSXd_Wo5uXeLzEhI_Wl%$|hc<+rAr0x)Gos z#{e*pgL+Q7UpRwwzo3;@Wu)5%rPsz?8B{Cj2Ea4YP1jT^Kz*8YkF~duZUqEn zcUs_%d~R@_Qj}d9JKt@%HaV6Vh-7_vtR0k=!iah5M@U{NYJ!Bo6qGz1n2uuC!whj1 zjK6R8n66&x`wJ=L7?NkDrt-V}4H0e0lg1n{Tg5SmwHM|vdud5gi@f54V4cZA+!6#d zNfa}ATq&qpmar;0p@Q{B6M)2^S3J^wsrYpT^)Xr3a=`eEt$3kLpD>n)KiySCk2|a+xS{Wg_8Cbi?ZTu=>m&7)3XNc+n=RJ9JK&M93lEWsDDKnq>~wc?|S7BV|M1TgxmZ#X?BrgtHutu;5DTs~zE zz-I>)XER3Cg)Z0M(|r5MTqi2-fqvNs$B_<6BlUC5xUNe`6ExiGv4qqCw>rjkNx!<{ zln|Czq3+kxJ3oIt zUT*@aL*Yx~Sjns7HYHc;{;S!pO_C`;k|s9W#m!G{C?DI4HH{j_OT#2RE@^LmcLR8) zBfAV`BOrss<=X4x8oI(P=oTjCe*ri6#SUV$AQnYp2WA1HMRglcgZq+x6n93#l6htR zB^}gxjT7v=#yXZ|9W;_(a-?oA!XLfqxW*u)SGTmUBXAz45xKmgn_WL9Sk(fN*Aw-_ z5&bX=lb=8=bei?g3Avy{!rgjZb?XFAVO$rvv5mRu%RqD`JQZYNr$Gz2Hp)CzbbytS z(OV_eAz_4D8(iJjU1!a=<%fjp&8hDM3-3G}Ri1_MOTNApD)1eADqnv}B2k#k#<-#u zc@S5iQG^e^xJ_To1cMQmvKVd6U7N})8p-^kh?NpDHDRs&$(`qz-?UvQo_7xy*^? zugxkLd@?2AWON}NG5qW}FrRyQ(q@-a(w;F?hNoE;NFM@zaboJ;Ql9s!mG#@~oYv9f z*7wXDweFn3!*k}S{d~^&;?_^7S`cr(viZR+<&DjWE#=t_t*bngvTx8@84E$&W!Ia5 zX@zXmSc-E}yc@LEP$@VF@tsF19+00(fb38TE*Trh4;(;*DD9_IBFGZYFX}wXn%ze# zW^hvT)u-S;dx41GPUIJX$~f4d^lt9li@9w^`3X)txi*c>FN$DOXvU;c$5^!op*DdK zAXfoVI3I<$<3Gs*(vU$&f|sSm*5<|vZGGe9y_i|iN62eMoNfuv8h%&yd=k$Zx9wUR zWwQX^@Hf?;3fw&UqD#4h$4m3u3}pmIN+2K+=K^eFvX>~~CG-cvT9XiXObPd^x0wOC z1AOMhYoxx54TPA+Ilq`rbVep50zu*kG6d_;XPOQmq2Dxel^WaWw ze&#fw*pnmyP{k$iWXWCD+(uiB*=TBPZqW>TVU{A1$U<4vlhnhqNHgSpnY*n05n=;u z=x}!`AgKu4J%~_O?5`py$uqPt;o15Zw31-GY00@z|l_0nbsoSuFza zb95w4jBlkJD&_<#T zTCbA;n~SdNSbZN-5MW-%q!qhacG9MhQ@zBAl5rvHgIrPRYHm-vXHNUCGR> z&ir=c)e_d$YCvZ1Su1G9d9?Z2w45|PGF9vl*&fWV_Fx9XrQ4VTbD`-x&4F1S7{6ik zqcs9Vh)$S}6$8nf5a~;-*y1+jeKp@TT<&j}y{m{6n(bfVvb>DXG}{$l>#rqVy+f`f zp@dcRQWR%a5=b+{Cu?6Q&uks7F0n5F@Y)6yL16}gJ3ivG(_2p3fJy)2k;w)5mYQ~G z(oeKj_-OO=Gs?#_{1!>-nCI+cvIghK`q^FhNg;!2DY)K3UTD$^^-r0!x9qbZy{Q6b z+P4bYB{H#Irst|PPo`VD)BbRGCr2Jo&!x8K`}dhafD`WR$XOuz2K#v1iNU3$J^dCR zk#^O0q08Hb45_~{BD+~q=h(3qi<0o~-FClZ;(QtOhO&Fi3gP3gHn@-y3t%8RNo}&u zXYU~kv@V=>29k><5VJ@6-A+naLvC*zLz& zkE%5m`psEjgDZ?ylrHj!i7wNh-tJk5VJhUTKfR@;U`Pc&@i8q_qanK1pZ;*VM6|6x z{dP+M^sPVrT1x?Q)t`Q~DByx7**g0LFURr5EcpFq!SAQ}jC=OWg5OW;8AauDG2p*M zTl)67x)*Z*pD5eEs==)CNx+!@KG{J1r=z^~XQupq2(;~SWEy@J8;sqn1S*T2G&kkH zs*a6jtbR@`Ilb!RfJt}33)!plZIo(x`ru^Gtj>eVRDVWoUe;zKb6w3_R+bm9STe1& zGt$hcuQAg--(W_4=2sU9v2N-Sa~J)Pu^<){I)I9jn; zJqPB_lUYxvFC3L0pAE^Nj3DkYj>tfw(KR+kzjO`?tsQ)oInYlkw6~Y}MrRMRX}1y_ zS=kxN7Dgpdd=hI@ zh@H!P15VqcIn?7&#BVS6?Qc~{!{$R;80PP-b}EM#4#v4U~fH?7DT?@CW7I^2{E zqE{-7V^nh3WL2H|H4@^_j%S2ALE>@cs7V-k`mZpQ3vxS zC3{**#;xRmmXZ%x$)_msxC1L(Te_uD-4aZh!(Yo?&bj$r-~++`95RaxaKxvx3!?}H zY3W|2n5_0F1!Z<;>4Z`&jdzopK0_*F0l{h_w|+g`*r#%%X}E>*qoJVYo(CCY)gRDP zr~5rbfU9`C$7QM$VtEZ}J=Zf+!mDja1@^Wos!nj<$>xeC}Woox>fP~0#B?K~f) z&dsa$#Pd4cJY(Q1HFxc9r9&<)lSqIIq55v2%&S}yIT9xbn-lDoZy+7xd5Cn96a#lU zhB73p!vxQZNvDX~x~Jq)bZ;iTB++RwZe zNL`Qm@JJVWE{GI_O!Pl7zUDJY1%1?4540nJSY_PSwv)m+WainMn?6@aXGF@|D!z zP^%+x?1qW}3wD+}ndbC%oIBC@ye>5)K9PuC`e$_^=iBald>b@FYc)f@!UoOITFp@Y z%nYs73}r5b7Vv$orYNt#6s?^efrWivJ3Rs-zw3Q5f(>qM_RA_?IN@h$F~4_9rW?`e zU7m~2(DfW{2`2WuR}TMXt;iK7YX!&zXqiu89LnoyvcR0ia=~kLALkV2FfRG^N1<0b zu4qG8ghO`0K0#Q&_o>6i%kSmjEEtX82jg0vJFParbi3f*iUGb}sZJrPQ+|Eg)W6_k z9*JlQA4FqBON_>x=xK~Q5t+af3t~fYcli47E~PJ69~#NQOVCKpT<)5{^&lrA6z{0M zgnDOW6bP46Q5BIhT_hVPP?br{o@J;C6r{^jkWy@ljd4;aKzm}8q?`dNT^fz}#|P&5X5cPphp25;6$M|_Zwa=0zq zYKBZ^w)kZslkkP}K-{E@1esxvn7*)Q(9O$0W>C;JZyMSL1#R;(Xp`UWpulb3G_SCe+W;gO3{^cOWZLnfn*xwelf)vFDQYU2~wKW5&t=tUB7Jm*>6pN`T#F%)R1>znO zZ;D5gl}k$-W`I#&CRG{`Ez*C2KYJ|j=RT8 z^nwcTrF0+9^GJ8|JV-iD^zf?Q4+3xi8fPE`Xx%xW!DLpZd(j&NX_*(qN>=<}yC7|` zUJ+`*p5~L;IbVnvG;tBc;4)gcLO$v;h!H{1Qc_py))j@^LYo`7q3O6kp2Q<2F&LDW$Y432ZxML|AS0#VZ@rj%Q)0k$b7<`fW9%POk}Cn|8$ zt+-=_sZsim98@y-QeR(^ob<0&f_zz&eAh~lFN=~NSqbu`eZT$er&ff3SyY0g&>RA0 zi)e{dxg`)1ND9AIDI?;pZLW({K1J?bt>a5?5uTuE8Ar`WpB{mAi_aDXyUN^kGW~Ul ziN1EuV92tEy$t*IYUcTGovaOZBHqduIGc`eCvGg6X!QyG+8*nIjSrnE$^gZw4+vyLe9Mi>8;%;0q)4DZlwlr3zq7M;Kt7Hqy z+e2)MvfxqrMDaHAZz1_MtS2kUNmk>CY9J|{1T^_7>S(_S^ty6nkO;2^cFd$L4)a;e z9KkcG%!C#tpQFU0XJBO`dzJxA`Vd*!SE-Bxuv_D^50G7D*@l4hF3sgB5Wj3rb*5oF z%O9S#A-qR<&hS61bTbmV((^e~tQ3N?ODVsZ)FBIPk73LgeZ-L`gv*9_td9ltp9gH! zvlB4&gw0uesY;Jz>1!WkRtGd&b9cZ3(S@}`t;nK08L%`Roy37>libCUCC%>>;w)TbsAPupD3h^nUMpl;QOv#Qf^v-Sg|KHUH&> zFtVrj@VV@#0FV4;zo6O4BF zj*tG?)Lq%+Q>68{|4ZL`*H7R3_`f&*=<;&4(Vp(5?2ixrup~&lG!f&9{%C?o;>p5?D)CrVJjT|*x@ff`KRB1=)qG&S=+V4HvE_W-$y@k zFguj4GPa#0?zipwR1jR%~pMBSo8Y60l+Rqa<$W?#1f zgi#r$Nm|O$(;#d88^;!EBmV2exf7J8+GwRya>=63Qa-7RzaaEFiloqx%a~4g-_ii(4`a#74Ge3Syycs{L9JV1i&{k}8?WM}xFfA5f07TivR&JB+VTIuXV% zQ_8;jE0yjF<5wwVzx~xp$3kujB|Q?v*7o5b9>r~{Uz8G_EkA$d@UJ==HE!SiCu8qv zJOgfg^}|2?ZU(J;0o?yq+-NR(X}Jv~JPIwCpx+QHw2>}5vdqVl0mH3^88*{T!;HfL zh6})*<}=&?dfL-Qfk(DP1#%qn)oHyQ@A1+T!TQqU`YHKulmD9Xm#a3=XG3hS_ z0(k`E%+oU?kl>>s45}WDLDi!%sCqPrV|E5q%$x`U;1RrSO0LvSL^TukT(UN!XY-J=6(i^Pd)H|GJfGP@t1#~o#_yb z_;33{Ee~W;lYJBpG8wMXf`MX)@nsoCU7BIo%aww0c9b0qT&8C*a;Z`A#UR&ym6OJ7mq`I+$`BTm!?ZReqFWJ7__J?aHnQgE86;us~a%hj8%B%lx@wnN{tVLc=37s?BJP(C=CnFWo$z)f4SR1~|Y; zPHY#s3;?!!+o&Y&NtAD_(XPVLK%@a_JUNkTUVUZxOAXUbq3^_#hX~4bj)y6Guo4t8!82b!ON@@6ci{}?$;$%loU8vP7ha`_rI|` zr|pnJM{r|O{3!D{Ko#*S`Th$l(#U+7;rlF~OL+FO?gocDi zo>HAxBP791bR84NU_u@cNkS0umD@3_Lsn))#T1{Nj53;4R^v#V?9k3+$0jl^Dl;<5 z&Y(sI6(hQth%PhY#+ljg?|-W5RyQQ$JeH*T+;i&GdH$d0{LlXs${Zh^S;zPeisMHI zQHX4b(s3eN4Iv@dq7loHYtddy$hC;IAUwP7(B%#+wGp$852!xyPSbW+kn#zVeRv zseAlcEk$x5ke~ujiJ!d3?=MZ^&A0FIXD@*OvF0-c)p(d=zL+7Z8MH&XtxjS?O%p<6 zB{-0IA|6AjehpAgA=%j5jcs^S zaHB9KK4*jVsQV#*?P}Mf`Pm3rx2)qyhek^3P$?rFD7Nj z{zz+~;FsYj*eMJ|u@PcEaKGOJ9?sMc&SXmzFzf~sIk5}rWb|+iHNj@||96)Lq$WV| z#`G!IrTmO)s;0zuJzz7sQ-s-U1kz7Ln9WEaO%P!=D}f}T8v_OX+#$Q@ zDO||z05*fVryq30`L{PEMEb4%*XLIRnyi`6A{3Ffk61gOkP>OFLWV5kwZ(7V>@O^| z#XC3qRf0d-j5oTr_?w&k?sA(nX&~euH~W30&3~I;-GBp76mb>`9nSBV=uT|Q3S4WO z!L@DfhN@Sls7Jn;C%mK3cM8hL5@gGfr33M?xA{{V^a`5eUL3I(4Z@$jIG&MeF^-Xv z4O^pNc$!J5TfhBl)qiSCX=ktzUwkB9y~XcrG%@2XJL8{i@uysx)t$X~;@9i@)AoI% zi`n-F#(b|Xo@i=}o#>Huac9;=xy(V(TGpVTc#$C?$FoK(AxDSs&O?rH-5XL46z#E; z93k3m33-Xa5^_unsZek`(Q$-?X$1~^;V$2OyJ7CT-vhZcUbl?zb&FwZ-PB$`Qny?3tXjR!9ehSyw1jcJ*0Jn#pc1Q9*XxW` ztJg+|6jB6zIIMlGqgXUR@!~hE_s@ZU|4YUK#>5CwmX6J&waY;e3FD@A))!`=Gu8CZAoM2w_f70JMtpgI4YRw zW4pKl`?GdNCppffTr6Q+)7GQ!oLK#I9iwIKcr*lnIyAJ5swSp(O{YC5IMGzYoKf!a^;QRoWJ-mq?ZaylP&^3^adh(?!+y1s%-7Nd zcRQd4B`hNMRI2Uq)5HFS4GIk!Ituwj{CC5CPkqW~LQih0UWSf7ozYQS_ms@{@2WC( zr8xF-D&sjPnix>Y`|RJ?XibT~^ROS*n~?LNB+2?x~=%u9X55M%#Z0r5LeN;<6+2a1#0v zOevw@wtL{TS-HFA8i&F7iO=td(^b$GnZdXng3tfp^gkLqXwgL-<5od&azR>ShoE2b zDh@M99J@u(5{;5JW{aRD-v0=vVDQ($o1_MmUbidIqLh<({us0TxmT`0*c5m~t~#_S z@UVXDMUd0-r-`Lh4zJ9uu~D-nWIUinXq7FoY2le7EG1(CE!y}XOU4AK%@Q(3*P<;C za%4P!-5|#UWRFT?0$nT+u?xnU%mv`E5Jtv8~xX2fX$|2rHB>(c>wQw1WWJ9JOL^Z0jCdtRX^CB56{xw(MV~*@qW`Y$#5|g0zzbCMb1nbMgL5&5% zZOITEWc_Y9`8`^|4c!(uG#qU!-S2+N1>D{4=N^9E=6>$x=j+{1?Ub%|KX>qxTMJY5 zL)dh%xNdOQ6W=^`Dt__(pEEaez#wT)J@d%^k&z$#!(S)BK0?|@>tlA@=opC&d~)c- zviKS3w41cC=%mG%aXW6HENMw~D7-n`I?SjEx9ZuB+YS*1kn0Bugg*&bzdtEbl+vg(Nzy1w3KPaxG*TzE%~91{UFgKM@>seWg|KRf z5N|4HKm!_bt?3MSKuxZ-kB10&d##v*2?va0NGfM%7!Kx>Hpa4?dK4bdNns#{8L zsvW?*EFnkswVGr$;Z6zxZ!IB5_9fz)ZF!O-=^Zu^wCPxpCb&J=;#h(u61A;P&-Y?T z_P+gI)JK!Wg-tmVnmT+z-_#_8?63 z6eUJmpL1$`>uep=ANA_dk<_xnWGl(e&uzg|=<0SoUWugGFnnlPb&UE|obPhixv%3Sy~PoqRVu=#eRrY+4T2+F-2COcBO`nK zDt^_lck-(}3Xdb}tDF;lbx84(zO#oq<;xC=E4BRUN`=4Te9tY63c6T!c(mk>PB>65 zfh%Fv@LHo7t_!<+a|USgER0u7Ri%|5oSf?CVSXl#O&^(3{)KtB3#pJ-;oc9>ZElvx&L)J{ORgpod9j_>-+sO~DI zbc9zSpC#5Hk}$1ZHaI9nWc z#}E7thQAy|fc|`^fX@-ebGS(wVrD=Fz?lIV09t%VdMRgUq}RIpKhQm88r`^|L?>s8 zY;i<~-NPdW4DvAF~1{z`2GI$I-j^3LhMY6JMjwQ{gk6Sb`nD-rNd2hiF2q=0-OAT10_bX zCHbYtWSex`I=0=%#tk9YwBg7_0D&15W@qXO8QIx!Af)rA@$?=3WVOF<2Ui-q!92im zDjlD}lL6jbbhhd}5PXu-BQ!@L3pB%)g&cN^tYiL^OA-BtIy6%3Fbu|m!`2B@Kyz`L z03rz9Tijl6(&%8f$PSBK@#gmc27!GZS*;@``qsVMZ6wQ#W4`L!Ob%WZXa zun82^!7`y}3#Xve5IOeih8712LKc#b40pt~EjOO8U0Igg0xj#3Ge2N@vo_D4NH`r82N8xH)s%Bi>PQgQK~db>k|3T|70&`ku_d!n(jnA7R*KRg z%W$PfxFRt6pcz#4HLk&M4uSCzC%v?ofCyk(>mUgs#wBTT(QJ#U3v5^~%V2WpntgLx zhNvVVE2YI?7tDdGRtZ#T5=^(IBZA8kET?0A=4issI=5QB!!$I77(0}mBaK`r;am<+ zLWUVTndXK%M;o=om8XrEjJs^^2HtZC(}^A??hyAFZ`^ajyL+0k!$L_MXIY zv37ZmKAtAt5w2`BkoIA{z86ZWS%5zo6-FXs!!Nt=L~d!zjA{*!3#^>da0JtuT)5Y8 zw5YonS*)?sfb!iY&urxg{KiIcLpgfk@H1^ISRt;WFx!Q75?^?$W8CIM7C9I#D}S0B zP1~HaA(&IHIjP-V;A;)6nKG3r-Z6kEG8G8X#*9SgUPy@(36BPJ zsYNx1Gc}7n0tqh6k`K#vv7^0(%RCNmL;(0L$&8r8-ePz;69Ds>uVA4$xv7SB9tcjP z$*SIFdYVFi722aY>$v5?e)T6VAKJNo9kys`m&-!Tez9HPkeY+0^!lh2#~R}UMXhQvzN)=> zns+#8p`A8A2t$Xw4G8T{@T+iXs7_hA{}L*6hA`J%8m~KX<-pz0&oZ72oj+ISOrs|W?1iHSX&Si#g8?HXi1VLttjBr8F6QaE6&7ubUXjv#7iCOvCoyM(-qT+ zc2YE7Nv-ZvN9AbXs%jg6! z^Er~3%BW{;>K&6MiH)hIe@u=fHYUfwm>fxLOpc4kkR5IDr0e;7e|llGvCWprBl@;wXU;Adlh~C#04eOO&@$8fLznG@2_YFl-Xq3M{KI zMbNh!^p!8Db}rvJ_Pp=`~Jj&Zq;X%C~Z(Xk|HSULnX``2e812*hL8 z4j<7Yr&t2%kB$>mN)*-3?S0U3E{G0itmvwdQJ}6WK-FRd)C=IR@2Y&aAhehk_Go#j zhpjdv1LnN2NB$P4!Sm5Md!o{&THRcUhmS`Qh)^XNQk#;*Visr zAOSu;Y0fFkPba7eiS1 z>H>bYC9ue3Q&l1wdy0D}0P4$A&B9x7otAgE_R|g&iEm5si)cQ$Vt=LcoDXbv_}JRn@=@-%28s@v%7stAw4l zmSRE+MOt$tflDCK7L6RWN{^35Sy8_n+014Ksf3p}tOzUX>CgtT`mmEtNdQ-0Gi;`( zqTD$9pprDDT5F=}=vHL*F&cUmnjcQf5&N{RDh98^S*e0U1a@vt?CcGGdu&UANYRy% zlzT>r$b-eY)CKzvIk8a);$vD!MN(y2GkX+t$oXc4%m#+Iw&LJUZL%H&l4Ss)^`{+8 z8qMoTEnN42n2b}cleXchY)seD-p6;{ra5Z?pW{m`>%2L9$r^6XUb2?IV)qS*(7Dnf z#R1uvVh<2Y$D;)NW&;AE=;ScK6V8yw0E3#=1weGIo8Cbb(OP?8#6`zEaPiBlaunQ% zvhZ2EI)x<57@zb-C61DTa0q2{?CBh+-(qtk?v zYN98U&=Va>;@~!XU&4f-91_UL3Crc1SctB%0sTqV${Z*vT0;g$1ghNz7Y^;oVrWz2 zs4(=*2#C>$f;W zR&q1?#hdON{TeM&g|ywGNKKy@RZ3mzeJC#3Do!5?h+9!1UqY{vMWJ!!^)$-s$(M&J z*(k0jR~(Fz?IXz;Mz2q@wtU({M z87qMa-tS64=F|rz_j%+mM=y`+;;eWotgs}chHC9N$t6j#7`Vk`UkCS+HA~994)HL97`DA=W20mkHaFqfTsdKY4e~JV}=Bo z31QTxjQSFKO^*QKgxoEOJGP)xK#z->&F)_tzWBnJj1gH|+@f?N zatMm5u2V#y!$h*;a;Q4~!i_F;qSb)}1f}J5)ry)&VGdFgs?E#-UubcuYj6|{wbB(Q zxIQC4ItR9*UvVDSVS*yN|7?=GJ5_y0Cn=ivY2JRLJAXgFJ)&zQbEs|hAo63~f*?Gbj$^<|ueA?IgzGqA@=Ynd)1r7s8quP7x`M5=;U;y? zL@3s|1qBk`Y}u9w?n{u~Y*E=>A-$!m*h%q8!DkeS^p+M<)FNM_41~9|jAA0ZSu^4oZe_K8CNu}XTU%KDw;N|A zR}BBbjwA*-8I-stlXK(1Y3`%*I_iYOeOn1|3%$z0w^;9UGjE>vI zFLFareU(P&Hklr%kEPX1OCi7DFgFw6;$$^J_mbi&0*J~GLCCFE1Z2j$`rT|+_KIUL z22v&1>FAR6Ln%6zOIW6a6S)L=gD2Fx!&{BLW5TfOts_RFOUE<_!t0nqcU2@hHzD_=cyX3BI3c)IwOm?x9 zU%HI|a=%+&K1BOeWL4gXZKrr5EownON_UT=7u397?_6D`PM>;%HLn+F?`W2nC-!Hyo`6a8Mo$vh z!X$f{IJ4PGjAfHbP=`~eH2+1HC5>-mzuKh!eZ?_+RZl5Z~<#*Q+1j#hA4#t*WyN&ygOKaNG`;!%<&{Dg#%*rx)23% zi8Wxa*5PjBDq-|cCE5tttW0pPS=PC%=QT$sb7{LttB}T?WtMLbX-%XJ zXI5^_G73hcqOx3?HhSAhLx<6VyauRQ4Lgbf2ncJx5AvJM*yiX(O&#Hviq7stjRdk8 zmS)M$2@&9%1%(5st}pP7${OK&h|DHuaNs14e(j;P^4(EzCf!%2|A&dD+q%tWgzpSP zRh2C8oyDkPBgC93sbYJHrQ6kvKQY}+mURbbO(h7YHAj25xCv{H9wV2ob(03eXcsth zu8oW2qXo48vck^fBd}Q%8Hm^_osxdDv8&0U{n?-&BTbV-C$hAoq-k<$TAZQy6 zI?Tv~#v~n3U?(wwlub*(@@C0qVZims>FCd+151lnli^L5daKFs4KhqlJE8KAVjA=s z-rpp44dU=VH+w8?m4%VbAy~JCpnpkm69IhueuC9YK#LxLN z7nY*~Hq0ht+BG_K5i(&mie=3!U1D*tZ33g9`+DMk*zdo(UdC{8n)o zEmuBk+><;*E=&B>AL1*5lD+nl@A*(QQPor<5G78nWOUv>wP>k0g@NnM1=gs)YEmY} zm!%e@#x3Ria&Mv!B+DX2S4w5@ZUd{bx}^rpm*q@o+ghlJpMlpiX2} za-_{wNoq6*xHQ**B%`e5|UQq|3PKj6~fOAKK^7pZ&*= z?)MgOJ(wq<6%)G85lhP288#>yk$$!svThnz841#p3vke2U9@K#YjE3Xrny+;PP!owd^JPBJ@wbLacNfg zCJA^lJwOa8GCr%3U#lJACR`tx7)BMDv(aX@Ly8a?h_QKea@S8Wh=V|2d(kVfrtVSR zO_jgqwqxO9bM%+CFC0zSR2@{5HTp!Z0z46PPP+K(B~KEADRWlGDpCBn-bxr`E=(RV z-$%yfvJ^3LI4G^mWP@Y!JwZ}-(gZn$B*`S%Aw=ZA31;nQC-BuPRX7aMZVF{VmbKwD zU&^Q~GXgcfO@49mXe(*}T-3hhr!C7ivy_{qzQ9krN0>J7b1;09tv@0$aYv35#gUYF z(~u_)5^D&5qr_5!WhRwaYOstzM64lt>>-xP9`b(Q5Ct{nk_7Mq-aOch#wfXKFLwt! z-q9TGY5d&X__?d`6NB}X&)8TcOH<8KIY#j16+QPpkO5ppXVHt+G*gPS@W-w(eHrErY zV%7rL5^ur86tIL6OqPmD=_sk7b-_bP%p>vuwSngY4$lp(CEk~FhrD~& z7%93@B}+i4ubWDcLtIJ!8r&S>N=cADkVD*)B(*b8W_InyU22FRB8Rtvg){LMBq$#6 z8BY*Gg1+er&S3T^$V05R$hHcL+y1`8;pU{?nRn_H?L^U)uF z?@u{2Kj_5Ts+J7~84w1%Hjo380WksACX5LXa04aP%ki&j<87gcjD z_>44|J*A3it-GCkAo0`H-Ai*2WC~FsVz&+d$}_Yve2xtcVk?^$3}N)oF#c2uh*~+A z^UhKKy!wDX9f<6zxq&DZ2?k6g7%Wu_gC=vct2abG%&IgH5HP%uE8lb!8L30w_#Y7PN`tzXfG9l{U9VWrSEyqY; z&0LR`ifnKTCteSj>~`Hi8aLT(V2tdh5^t^!v@jV?g;c*!VN+?+B#T8>k|e6;_v~)9+nda8E3)PGmKqS4B5$Chb1)TWudpevV7my5BOgQi{ITIf9QvP|E8si6qE22FBHW+=G@k5GJb~z!KfqS5$B9XbhRjC$ zi6^qD7k&N%ao6*HIO!WIrcANnx@bmaRs8Db{VTgZO+(c-mIt~1XR_PhCFVt+ia-9m z9~Hl~J%0Xq|Kh^pxa&v$%EI3Gt{?g56~D4Q-u@%Me`eA&tCXfiNgZC)MFk%@;djP= z`y)Rrd^&DF;dd2270*B6_cZ{1bn6+o=!YFNHB<@DG0=e)1>&%Hk72yzsHo)O|Pnt-rsC!K<9|S21{R zJmt?Q(x|te@@KW4+F1xFYk1Ua`Tcz#JLO+r2o79U@!lAp`a6GRXg@vA`zB92&w|%J zxOU@%3+~*w=Jwmyyk*UXcz08><6lbZvv~aY zFZ>4!tK-UP|B6Xx>C8~P`?Npl{HID4?=H&xDo+nj8viSPU&6DrrQ)rNkDT_Gzic7p zc*8IKiPyZ#uizBH^XBpdJZT*NGv2IRJmR-{oxZ=3-(6nx)PH7Tei}dXOMmFK>8pLb znv=`=Q-0?^{rhq8i3~u#s&3-*)9>To_`m)|;lr0#ytk0l*W_Aywy__IPyS!O5>%Qh z-r6{L$?q#{ixyyVX=9E|T#;)(dfFZmbY73#|``3nj|@h|mm%f8NE`JXJE zF<6yyaKnc?gGuMxfYJZ~OczfY*U+7x#{c{E!BEo~WdMRVhm~_G-kZs{iKmU{j1ExK zt+lP>x`($OAf^GoP`}TucnpX)@4^ecwsYg(p+yt>Nef9^75}gtT=klbL_3MTk5G{N zdxWio|BbLjcpJ~l!uG86>_|hu#d1cX--^i3Eugkf$s(-FZzD`(U#!S^6t+9YX9j~ z@v)Ymzpy)QYYi@%cw}0|o55!<#w%Kb1(T;vuXrs)Lqb(@D1Njx=<8ffR2cl5gg)V$ z3Du-S@t?N_msQiRc9JYK_+!EegwGNJZ)BU-7Mxc&8DHNPEInstXT@e*5Is{*=f20< zf-eP=k9AkXU%b^k3Xko3%elcbXTp?`q;=DR?kOi~74HsmmY4wHp8mxjnHJ2fr*9tP zjhd8?Uzv-)#QT9<{5$|h;Fad@Cw@&XegSboO8Wjw42L?A#{YsikW^W)cd26GEx zT<;8ez}QcAG8^~DU+oNTDeR1UW(1$TWZPUf!#BTe?V9!BeQ(_q-gjqckmz~4d8aO{ z*syucz4r(#@8|u!Yd74r>F#IZNnOFTOOKL8txmISTzmU{o7Zl9d${6i?9A&ODE1X8mXf3$8zG=%ncU-vfL2sz9;;pA#cE$`&)A%al;vi}KdVUK|)A$Yi z7FeWlk<}%+_*#B1%Ej;G_u@vpZp=@NFD*cg$XD#Q8KTLdCF8^cW z;=70oh+KVj&-(}w(Ui0SyZN1Oz{iL;KJdJc6JN-a=Klo07v$of92eg+F20|5)*_94@Bh8V5LClP`u&1 zU}oDn3moe2<&!tZ@p-{#r>Ae5Vv&E;91?%;21f zY2L5I^_fBEd?;XeWoR>&(4w`pS9QJXs*3j}!fDhk7>)n;FZ?;h>5GlPh`@ROl>9qz zDWe&GwlA1AQP?BV^U`=_U(i?Fwm9C>7tEh9vbbWxVEjk(gE__Hi{t0!2bWF_msGqf z$b1#g)jayWJpNi=Fm$$A7>d{R2bHVOj}RBvPv8G9 z;&XEGPI%DrT>MqURc@O9dg8AmzUD!+t4;Cfg~8m(>ATPKj{m(a@h>h6UKOUvze|#m z$B$-g$T@#uP?>75Ll%js5&<17-MBF5nY;=OPg3^zJT;!y_zQi(dGX)?C-xraok+$R zB^y#bIS|a4nrek#1D-|Faz!-H3+A2y9Fp?mN9P5Tr>1(wpVIcZW54|V!eCjvtSx9; zcK@19o7QgJpeg9RqT=01zE6_BN|?s~koc5w@oN0Zc|rdfmDB7ManJl<(&WPwCis4e zXN5lA_w7Z7yH+h_IHVJ?2rn|lA@n;tYA7UBdswKe} z=G{A(ym@ewwjsZ41L(eW zNwB7P$F=*GUmEFbymoH}?Yk%bY&{UOy z9Vnv*y(?<-n&OEo@`~EBrZ~`v!FXJ8Vt^tQ1|GgMfQ_7P?jc5Rw+t{>V}M6v?w|%A z_WzX*ly!Q5^O$WRU_nuR78YqbY+7%#1Oxd0UQ{ SSamFsWq1p#UY8@*!>3kA?%V$dQ4Mv*A7v^)Fod4%u&N=t19CTFm|~amc@p(8oiE z_|8Ad=+Vii6n7k9j;AXa&~rXD^X)gZCFr&9t7gjcP6fjpDPx;blp%-O*2V_6l;f++ z+8DM}idu-o+CuHTevIMZri@MK8DBZPc#Hz?SMiq90c^gjqL)7g_?LX@khWmFiZ`wN zK7_%`KQYUDp}3Q$;{F?od*T$g9IL_NsZgH&n!vAy0`JrXKJSsq^JfCTQ^x>5oJr!Y zjzONO39d;N+2j=6mnCI;$|}0AO3I`(g^QcKO>QD#5Szah^R@Vi=v{&E*@B;iQV7-0X08{>i_@% diff --git a/wasm_for_tests/tx_no_op.wasm b/wasm_for_tests/tx_no_op.wasm index 0d7b20da7f085ebdcf8e2f8cd7a883fadc6df440..85b647c477f17ce8c3940a951c5da48d99950a72 100755 GIT binary patch delta 126731 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 diff --git a/wasm_for_tests/tx_proposal_code.wasm b/wasm_for_tests/tx_proposal_code.wasm index b2cfea8633d6659dcdded061dbfb7f0ccb17b332..238272934fec081ccb9c33e5a8f36818c37c3ae2 100755 GIT binary patch delta 131360 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 z�w_Hdt|(qh>p*L5AWgUAuY`#wT*jb|88e~ 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
ZZVD*(uaD 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%0DShqTKbpg(ECqvS{h=#`=3gRyHQrZ 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

>sX*?8>|X6VW6JHw6lzr3y5cxXvs#ga36 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 z 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 B?fd`$ diff --git a/wasm_for_tests/tx_read_storage_key.wasm b/wasm_for_tests/tx_read_storage_key.wasm index fb483a0b8468b45117936a3170589728722b0331..f1bbcbceb9a941e2ea2e25072f9448e968c05c31 100755 GIT binary patch delta 152946 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�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 N&TE=h7C$Ba{{h(kyhQ*2 delta 155074 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

oUV;Ddg#2Hd5Po(359ONYNEL^Yo|tf{p=TH% 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 diff --git a/wasm_for_tests/tx_write.wasm b/wasm_for_tests/tx_write.wasm index 39b20ef813c44d098de827202db00ef86cf65d24..048f3a46dbec13661b8b9437916ecb5437f262df 100755 GIT binary patch delta 147074 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ʐ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%0Dj^m$uDnsii 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 delta 148000 zcmd4437j2Qb?0AIZ_(?1{kmVPTWYo1l5Rb1-9oY!TZ`pQ)gUj}#x@YgECXbjgtQF7 zj#&b>t8EDoi(}yjV?mfnCo!=m*ogp#D1$R;6aO=UF+pG_k%>bDIG}(DA~6#I0nhh$ zZdLW`mM}~B=QH-FRdw&Xb?e@9&wkFmb=N~@{N<<4IQWY2sym|Fqp(yihhfkcL}3t= zy2DB}2+ILAl!8b%&8QRvVRc@AsT9o*OJOw(E0wUPRF0?)f~x%+^$Y|-`(T))LAex$ z^FkWxpLt_0ODf=(r7xl9^ECpSRretlxk+8-9 zqoB;cj8pefbVd}-i`q9vBi;Ld_rai^2FcX#w%;3VO>YT*3eJX8)U`w?wPn z8tsi1FIgHlmMwqr#Pct^>LsuImFw;duY4-}O!%$vwrF=W?**f4p7o!8Cv2=b5dQaY zRr9(N4+0;MfKuvT~8}2?{MX$IWZaqE=nplCSkK$ zcjeKj+=_NKs=5o}k}kFOg|#)|!|jRM>eeT#u6h|yR+Dfd?umA|c{|HHdcwM^xSk}s zaUyxR{gK+UX#DrJ(H#$0N24G77e}s?)ONK>ji6png1E<3b~d`zQ#E-wxNagTx1ZDX z@Up;0T1gI9C)S5STy^vG>QX)0k^CDC+Z(#KGvoGk-QQh!;&&blTyskl^hD}r9s^2F zysv$8ef?tlsfVBHF0%K1`dtqO$+MEFcYNe8>i;W@o(?~9M`LBAo<7=_^|UbSsp=|O zPyef#^)&BvJ++(tuTuwm`?C(}SqCL%H!S#vFl@E29eT$yO@m*yL;`)qg+Q=pB6;+^%q46-8MdQEui8+Q z;-H?`yi22zrmkfwS7LUf-OPd`~Tj5c`z6Yf~{8m)=VKv2De0`E^-WI z1uvlFT$tQ`=Y#E^S^nJUt`D|gZ=|LxB9npHcZN8j7NZq-uC>>!?!N201EsFJ4!)^8L``+%mN4ai{X27~8p`eUtA{IA+rD!3g7(j^ zPTC(>y(FEiOh5^f;Y4%L%^NFCR^nGgJLdd<%bYS~JsM3{T0fUW7c~MNKRi#J9I8x= zm4dA$)l6H>!H$|kR&$`E<{&lQ^OC8osy%OXG(8fjr-v)zJK&_7r$OzlY%T5Qj{E2# z?hi+_`3r0LNM&MO5Nv1Vd8gGJ>wI>7@R`cF;X|}nKSz1?5clhXBb9i&Ch=$`zC_n2 zD)CEoEg!GM|Ec|*(UG(ld|5P+9Q%z2gY`jhE-#3LdPgZ|s1^yek93v~7louJDTA`z zI~%>OJ6SAB=yuVTsO(EY_B#}<_Y7_iYFrL{eVRE#6s~*AVzJ%(#@$<5!FXv8NCj~+ zz9%d3MeRQrTaiAid`r^np5>mE^jza{)N_-pdl8c%~bacQl%; zA`BO~(pa>o3Ssm#)Zm>}VRvg;QhS|*oPLYvkI##D^wegaALNJ9WHnx;ZlS--yM9Gd_{If5sQN;!|In+_%RPm_2*H41Z_cEew%!k{9+>Y8U0(omm z11?QfI^gubL%+(dv@V#eqAf7c->5O%b-`|c%&T2#eQ;~_-0+>XNQ~$f ztp`d-Qo5qNBWXW(UGw?>ZX)fUOQh|4*DX#vZ~~x>m*V-5WNX#FZr|l^pUv%i{B6SRdsz$`{45aFa=+FiRkt2m28u;VIYYMYq%1sRs;TC>42VD& z5=qn_^9?Q9IF9j}7+4^{x%x-HSYx`O2gxC-s!#U;VlVhzU{$*F4vcoFNIf>l5k7(PNtE( z|LqR~slB?T>fO3hp41f`aZkmiV4m3HmS`W9+#l%Teo~-3QW8A@#%A}-kQc(@p_e12 zt+0u1ph%OWrA(03vv%mP3tYu>{7S*`nS#i&y3^H?^2IlZ3YsoOiALuZ-i-%RD)NQ< zB-7YzBNq{CMOek|kvMeSBA-zZ4Dx8cF7BSwqwmml-xr?`CIiCoo>;h7d)n;4WJ@&YBE(=j**H|{ zbtCQYZ3|O~)RhIMZr2ZE7Ai;t>uuf1tx(4sq>LbP*GgAT+{6kHcoZ6l*Xeq&!tm>K z?$!y-Sz~0btKH`u1nuUJ*WR*ckE=@L?vV;3&D55&qUA(JrxR|}1I9Xcq14UDfnBgm z{{jPoQQtB!vb79LLR}oF)LY@W+j~!Igqe?CH-V5niKdRSG#)&^QA+k=K8{Dcbv#6* zPO1dZ18Zb=<55p}t@_f^&L3~?WdY}_N0yI~@2z_l%~Syq!0c}S=BDSREXuA{S>}vi zJ+qWhLl^?O0@hsRKEz8f{&cw8ozMKoC%^ynyxn{1+3nMPyXl-C_qbJpN<6=(Qn%4D zaK@=ob5|EBCQp{ojZA+5=*e+PL8`SXiQyjsb7@RB;Z1^VX&jz%44}FBTT4evZlN3T zvh5gjMPXMm`f7TC%9>wcmBG@cD~l*b;%?b)MhHoGLyVas&e~d%%$q>?@H70a8{{7a zKT{X23l@QiWwEy?avD)3Qbs^z4S?n<5xuLsqlB)W1W?$aVXS!(qpqr2h(7mg3_ZMpHM zgWcn|-nM7&zNzWS@Rs--*8s;%e>zv~-&uuPcnQLImCDCT@hI?U4aHHkqa+^O0}hT} z-&!p3(hA)4Mn5^`@9ycWTmj(aXV17BxlUf{slFWYs*(vlwACm>sS=MBuglt4&{gq7XCpXV4tb1Q-uyIYm5oydM~UO@^!0?995u?MqUubOrpmE2?OONDD9|M zfYi#zk@!gR;~-wQTL`k$wcfL}bcDIM5UWKK}Fb40_;Ydb~M#e z$`wQx2Lw4@Z;g{FO0^6IOmwU?jZE1uR}L!Ry}H6~_vzJM0sNCp_0GxKC=*o4)o>KX zR`2W5OWo5v%Jp6+^-+KW1^ zmO@=d;rVgB3~6$Tn*mH*1O}R$0R)oOYNZZ0gI<)m86N%X+|5u0Z<116PQ35WR<)5? zBQ5JDGk&YyC;``kAZ;xJ$jP*~LZ-bHQoYf<4ip-J7oU~%_qwfEp%DTT9(qQ70F4cM^a!k7udKi zsai;to2fz(X$?`eXr>C*i126mW~xMqOQ`Cg#m}M%uf-NJ?&{4@#0hH45t#*Uv3x?I zSBsferWVTqRc`(^L&sc>yj6TSGPSdMqZ^UhY3{LZVPwsnNr%wZLS0t5AzkJhM~j_X zqS8vi0J4X_Ih>>CaS66wT9V#cTF=|h4WOOm!U?w)5uiaDPh2U+XYA7XJ2)wXue#9* zv%k5+LlCy#wPPSX9A#Q7tJR^k+5|S6h364^Izsf+UT3suh{6~|@mg#g6#VMxhsCZY zh7JlB@I)O!V$1&&aG?gBNT9y)hAq*FuqW-7Z=ZJN8$!6%0Zi2z)zm0nW?U(=_6xfC zshFAAD?=$GGP=R-Cc3dw2i@pJr_haAA>KQ;O5VBo;sc#Vym^eU>5(!47Z-rDyLG@=xl20_C}_t zse6W+x`bzJl{>S}zneb$j{=J^ifm^fTYB6&X1F?-Q%qZMsYX5~QLU9H8a1fuEbs1D&n4O>!(fSYh@1bJ+3MCKaX zEb(ew1iF%Nq%Y_y!wcvNYw|7eD!Ov3WTNq3-)^i{x`H=%xy?|rC&8XBGoN6%qtVF_ z+aYJRe@*w2e3GVKwo*Qb&s(hc}IEikBI?rE8+zwkLe&-rqJ*>+(+X+ z*ri_4(=>KXFgav3ye+TstGKmwP2g$WdH%7Sq%WEDHZ3OLz> zem`bh0nWAXhcGU^=#;p^sf;U?%h~w(nLm(&8TX1=3C#BB2`22em>1|BupFF-=2%?o z!62i2YX=v4AT)F^RFeUZZ?{`Y?$(?YnE(1D#Jte06~`coX8?bisv)ZStjaKEt8s~U z!VDp6wL8(3!?^FVMl|DtTs#NH&jex!-26DFDpkOE@mv_UN6zhZ3(tTPDPX#wkg1LZ zjyG!ZHM?cAC&#)bn)ik1ff=36H#j#tV++CnF%7c@0_gzK_5sm;IBc{}s z`X=Cbe(=PPjZfVs%!Y{H*?n#ZYD?WmPh|mS{jcSIqN_FJ*~+o5cuBN_6&qR~el%<~ zlh$<>&54pUQ_mu|TB>m~Hmf*t>Cl9UXrk;gR$5rJiF|^h*;;Z4Ux33T$EzG%OgXq@ zq_r>!v7qX1p~N~?cHJ$Z!zD080tJ#fN(?w?MpZln7=cu>AN^}s*TMjVsHs~5#dcD+ zB3Uis5R!kLv?=p%60fD02LrG;C57KsOk!wfLq^avPsVOIe@fxY)>0E39t8092ECyJB=4n(`|% zwcAQ8&pr10LDV2Zc!N6|E8Sp%e)-W*R~(95v$yrTbRbE84dG`$dnLQUGw&6u|`i7Pf%69k*c^$ePmORLA=3j z%K>e6@J3fJ%18PAY_}pSOaC@6yEr=Cy4ncH=BHoPYY_}`NwxZ1&2W0)ibg1n*_IDV z0-?7DF_(qg1IK`%D_dm!Buzl7x9156eM67HGDbX%`;l1wEv&6~b+!5~1)u-DZ$O3Y zXH5)l>UbBPOThOwz&C5exHVZg7Z;;s$V-a?lUbe@H01*oO=XCV1$_~luJ}Z6RL}Li z23-n|vkVKA^l%)QQA0)?(1zb=(O?Vs@u)ZiO9&dZ#ZLB^G+wd<_mVvki z$`(vz8~!K}jEo!ci~bpY0TRw|iWL+(ctpSPh!iG)C-zG8O!Z1P3wOEd#f>$t-!lm= z4j$3uM;5iUTAdq@kh8Af5krUr;kt+^;}K1&ga$$e@rc#x!v;LV9X7f&XACnep_3!5 zHsFc@#KLyQ+3kj1gged+X^?C5%Nn;@0*C$)4PN*#+Q{BI3{<0%R*J{;E9M2-2?Mzw zTivb3{{TOR$6N`MM=5vJOJ#~w;W9|B8Qhz}$_{+(K*FY5?FN*(p_LeB^~JiX5{puX zq8ZkOB!}M_9amj#JE<40s<4w|dL4{FHdw(3WPRm~KqTzfyFYsi(GWoa)qpuJA&kx} zigyqb^X$=HaVoD#PsePe{NQ`H6^+#CEbjHp9iFbg&H*(IA+%UagdQnKnRBmUO=DsH z3#$P45))JOj5)K!2!mmCO>luhDKl{iOX?!?IZIBkzBXJfzA;2l!cZ>%5qle1?uM>x zl>NNY)x0z*UEf+rZyJ*j=zhHkT9@xr4ktsFAq5$QD>wo&p~M2C4ee?zG~e**q;x6W zR+AFHC%3raU5r!HRhJJaWI&hT@GkW#JGHdy+_3$PD=Mk)m{l%*iuefxt!3|ohKirU zIX}%t=)9|@uumKT_WnRv(T{T{A{JQ3qww~|;Ei(Au=N4W89oy6- z^R%#1jrHz)VQm!zv?am~fV>15Y%2?tH4>IoXgH*m9kP|JX=MX`U}dYU?0{5VG!E-i zE4z@DU0AFv7?7`#?|5OcvLM6UpUS()x)DOa<>vgR`Wf`g`(kMq5&+d`iTn7a6{9zY zQ0#K~HzWDx$~+T!ZZ%q4VB#$;noOgpE|+8vpzq``rJNB}lOvRJ1*@7oMyXd`t7>wTTSCERwM&3_ zL?f>h)i*;9G8Z%_IcEUD@h+Rd@h*8{GWBb=R^yYtuy-&?=2$z_bT~3(>QEy?C(YC! z5z~yNW5$hHJn_OFyhKq_PagOhska-=_UI@Kk&W_j_DhnbI`98STFxgY`2Mew(z+pe zf{T?8@I&H~r}8ppN{{RmR#f>KE8F)zfB0%Fqu`LlqE{mgW~kXnNP`)wwr&M;X5bS( ztwwM+%Pw1q$Y2j7+6!OMs$Hnnz0hrG?|4Cs-l4oY@3=Zrf^U|RN6h{6M9F+l^jAtA zvzo6`lRKIK$Rnlg!N=wPA%63j(z)TZ-6xM{&;4&Jjzy1_wg!LBy-eA-MtaMU0JUKS zDj9Xtsn`s5w%iys%hr(4ixj8qONMhx%H(BV(mzv1D)%K_MOl_s2BT4#L$!(K7Lc1% zg-bA#%eUx$tTZYNuBq>c>^{M!1kTkY@1tZ}Zt2z}@*^C%)_|mu3LY#(pN4fLApa#o zjnU|ZCAg)cYZ{i3Nd^I&qc;jdR0A_1`L_f2gt+g7QqAFPsYdu4)69iNXZtX&kCetk z)LdHLoh1fNneUJc-6&=RbZb5{#a40#Q|M_&s^sgxev?JY*Or*fY30PC+LUx!+^GInC z7RO12J0%3iQnKhEP*9`-%*(r4OVwW%H8W8{bYYPP{bUUd6#b3`T?i$;{}VyxRU78kJZfFZBqSrc$vhoh$;lyA z6yA`oH0~(Dg(kezC468}U`TPWHxE>$mH2x*s?CXtxS=ar& z@hf$m>WzOz*8{!r>vTQX8^2!HL%s1Ebe-;vf8BMl9$g!QBfU4boGK6Z?#4B}7%Xz` z*SVeYw{PHfzrTGwxBL9<>$u&!*rjUxE8I`|>Q{1ma@e}~Wo}RS+h5}LfWLh?w^RQ1 zKXbcZw=Wt0#@pZh<@bH?-a8k)*}2^vCE%$BSC4<|x4!ug-~V3wFWyU*5-nzm>6=Lk zQ=6;CZ`*hK+yNX`gPk33oHc-y z0m0(bX8aika7azAJk0Idh}+1+vgmx742`A+tz{TjJB&8^q~UCF}>C)}3g{h`^s zRInGJSHCSyb7!{0od`NZHoHU`1v?o;9JGv`EXU3-eC5Os!O_7^j6Q4?GdS-C4WSP< zJSy`qXbnP}a9ElRFWqYHS>DZ<_71n!=fhStEVIik-5xNjr79~P)1+#>Rjv2o8RXTK z4U$^LO$NnS9NAB#uGZ?w0@7pZt=^rD9@h(pN-4p7BKh;;Y089F{abcf3-z*!fb6XTwI4DZlb-B+7>~z62E3 zBq_3dI9o-lK)4KN%dD~(p8?EP50An6!PkqHyNC>*I~wE_+?PLa{m$T?g@~^|=8YOSFdM z`*!2k7{5({mOr|qMhHI2Q>^iyYc(wRHJIetE~b_%i9f^2dhF;)sju^$qsLN8p6j5c z|L%dsufRBh6wdLneZ&Z1E3GInDIlV-)pMu=YI&WQ@4kkGrn-`Mv%kq^o6oZ=**j12 ztSbRj`6J0Bb!-2(YdQhnY87 zoUJ}P`c=}C`sg+M6NWab7?$3+L7A65VEYqxlZ=A zuJK!C0A4>PUNW6i$tR$&t;weYBN~g&){F)Wt8ml7EKUJAiaHL`iwT^cNbO zWs}I6MFznW17Mf|acl4|+-HgnjHCHxK#3G;z{Fu2x2};A$c8gU1O#DZ&jW@bsCwAPv^GgcN3UriA+BtM1+DkYBW}k3Pksjj^#U0?*i601%88cb9CY0! zP5t48T;na#G%QDK`~eceyBwzaAyt5=_v;E1JgBSjYEo;s&p-p0YJMySjXWj7FY++D znUrim?x)#ofH!_mXcCBJ?`9-W5;Vns9GL=wXKa3YW`Wx=j3(Ua0k2|b&BIyq<$cW{Z5UoEO$AC zq%`CZ(yGc&z|sOD-i9;PHcZcbSt>k9{!M5jk4Ohw!dYU&hG!~{i~5oTb!;EA%m&;b zqJY&Oke%kd06{o`;+G}yt9iAYhJ)oDr5(JT;mf+dUZx@m(I!f!C~4>=KlD$jxE{>#yR|<}@dX(Q zMM@6#xRGN8aRf3}uJL335VuH+0zV)>l(#Fzp9!4aCPi*tu-LanU(;(Aog3=Mcc?TP z3~aHccc_#M&FE)B5m^#-w@viuVhxxyDmj+$_XJ$n7tsYf1Ai#Xu81?2lQdoadrgXt zS|s`LBnw<7y6o}Nq%8pS;ioL>(k7WTy0{!mU1hue`EyolG79UiWrqOiJ`;4vL=5wqz&FcJhPh?v){ZrIwHoymfqApUg#RO5fEx;@ z--g2Jw?UFePCvK7I|w(}YMDLAL|c7i`o@==CX;XJCHKM<+{@(v9B`Mr%aZ{dfGcoy zdk0{@1Pe;dOSeQJ^Yba@LqqC{=NT8(?LeK^3)~!C};XCN#PU8-p=ymm)g_UEm;Hq zkd-5?QL&FcIWeoQSI$ZQ@=E^l_Pkduxek~7r66iA&UhrW2G^DUjzH2(i zC!hRJFur}SS~9j}5dyFJx?q2o87;U6?BIx4CPb_psFO8Mh;G7X zxfoTV7S)q|n4epWnFJ6j%27SpOV!q*3Pi0ZlT=wkOBA5n^iqQ=c}xR9H-5Zj-e?Yo z(DgvyMC;a2-JqUc4>Ai3o7(ridPzFK(i`UR@BY4t=A2=p!q?g8U)R<=(6T-e_jSt2 zUX%_gXqPq4M^g5QOyF@hl4>)^|4WgSTuo9AvQH|eI@=!{-54(iKCzF;#{6gkQrfRX zW}od3Uh0->fAG06!CZ^P^=WFeWM$ustOR$@4+>eys2{J#ar=M&>hk6}_yOc;xX@i= z&~JbLSBFwuRzR2WYuoN^p^M|CMh8pR1&-VevkOwUbTnGg>hqaEy?!?h4U{p5t7vQV z{yw(_-$~&a*-D}Co2>8js-UKA58m6w>O^cf?Q+}dnd9UnB1DkSR-v!?r$Bl%+TRyH zPuHnFy=#;=Y5x(uv>$%W*c#?q(POLwVln-wBXD6!}|AK!i-d2KD=zmAPg{f<1(In6e1pgP*_&O8`*|ri8UI2;VvD4~3K-z}aFgr8GUowW1qwA@tj8ww z7%YmDo?6&$Ej1(!2Q^n=R{TRNWSRAoTM3CNn@%D8du;4xvYOG7b^^b^%~I%5x|^* z99x)V1ao(Yge@M5B#wRGz1DZHCJm^eu;W}=u0OxwWoe%tIaZHFY{a=Yxjqj9ODbW- zDwfSgtVLRyK+xxUTWaV*06l2Fn9G(*%R6Dv0EI!B<&yoL!y^LLIMf6WL-K*O0tjw4 z0c5~n57iooY|Ow#Z3heUCXWUa zt!?J`3Sb<)9CtR+x@?TB1L?V2sXzh8e;|iy;MP+oHZ3Ik@wA^2C^Ipcx5j4(czZEnz1>5Pzekv^iS2}#@<35OpK z!L*Lc8Qzb8U(1DGn>+CVA2m&hM}nV!82fSQnyD(NCb5%XAK zzWF}J1Z%4&@BVxIJpIYkF`O+|!y7NGyKBnn4n*lSh*H1JSH#5m22z~|oVoo9eJ7G1 z#j<+AGRvvRH62UQ&UGB6Pk3{cX2N{546MgvqBw-sfIl}6_3BW!Hu$!`_Uk=c#e0SK zhq^g_Ve*#UIQuiXPk=|A*m*D3WIst0#731TS!tj7#-Bpw!D;=%Yfk4sFHZfEPt;|) zX{G)5Z`{gJZbNUn@RyBc0>YEEIA%eP5=DsI&3U-V)I0n!H}SL&HnP`QQputzl7Q#) zkRmqWJuIPD3-0YU*hpo$w>!ZD7P$-BfBL4ebkO}wa`G=x!b^c55>P}9pZv71v0ZpS zBSn30Rx|F~pepanYIdsTg+7Dtg<3Ux=!H^St?>)x>a#|vBuL;ULw~)1g7} zc?_Fc`+K*%aF}$_=G#?;je^(1bmQh*Llm%yw6$}m@r9n&{5^a2a5B$`Ab{&dXA8aN zn)_~UUEy}#+)>WMkyo7U5NX5_#u68fy z0s3@1+xJZlU8~6{fcOnwt?eXTb9?SP<)ZJOuZol;)Bge#&`T?t^n}+SZS2wrn=CBo~R3zO(HAk%G zK-y7t)T$0e$RK4^C-O#HXxTn*_vTbvyIvsm=}kzPdwpVq37!L`Jeg(Q z6_{E$jWAZwfY3Q5&SW+CaG!RnDR2`QYnFV9lttF-6m`O#PUuj<$5y1sp(2G*CJB{N znSysw=14jA8WsH&)O7AdjakTAd9~ykYX(Tg*nJ&tc`Xwm%k=YG1hiG zs^qV+WwchXN$;<*^$a@vHIofLgnxrP<@{j%>&bEQj|V(v?Vxy!;-(x&HIn^(aFTKo zn>}fCN~@#gBIGyYb%Oo<=QpoPdlk_`qxiR;xKEm;lnV}mmV4?b$&1|<(E}8$Q5Mld zSRQ<0c0do4Qi@0ciKr72rpe_nFikF>JxIX;YuUt^Y_7^NbE1~HDtF4;SkEG$m;Av$ zFq93+F)q?MneE+u6Xu=e_Fityp+)T%bO4H$*N#T^E1v}Ix4osF-pg;z6+u0y&twH? z!apo~;?%5wQjy0%1=tQ`3@I zw6YI90@qAEUaHW2=)lAH=UC5Cz)l8h1sEqjwWK}*`_E#?F*(*Yl~>_bIi&@v5{ z%4X@q3zgvN9|EFvLy){66PC$<~KA<;X zj>_e3jU1IdgP1$;nSje+`=5SkNqQm3szo4p$KbAtS>P+PfRBqUC5g-zez}~t)2HTW zTDX}%une~AWK)a?sg(|g@Hs5thqzkGy=A4@Ml-K=6Z#^!Y2~9tNM}PPoOVSRHex7=Ep&W}B`tZ<&o|G@lNg2|G zuW{lZDQD+oDQxb-Ea433WSx?MZ<;0B^;a*5cfKK){!z^RkdX7925z*h8L;`h$562-XZ6T== z^Q$E%%0A{dEWRAsDVfSMC2m#b!e~|du7z48Lf`{R`iETSPms77C3^=apsy&IC9upv^23PBRA-b@Z)nM5_4J~B6( zeofhJe&)#(21_j&%pHYM@&T*xn;%#cU^5n!akm6-<8`jKE&wt2j@$iM&_lv~FFauz zjCd(diU6mD2DP_826C`{G|Meqc}oj^Zl+k2{D0JLZ9jM4NXi<-{mJAf144(-B22p& zHLE7?W_%V(r76czawj7iNQ!Jzas;S2%kmy1NcQ%+jou$~w!duhm-YSv8V*e4w@35a zHCEGpV&5-baui)FLERGO?(LmO>dj5O9a!>~LHK|jC?s+?U=^5KkvA#%6+_Dxu&&zs z-nDR;xHl~o>eA9cBBq$W$Dk*`N4lQed(3Z}yC6KbeSMwV{0}4u@ zEt(%%vhnT#9`jvf4^zO)P%9z`QL;os*b3s?N(tzPNNCd;28YOG5hbyB2n)Z!a9%V` zx&03_pe(^SO2&jlQNp_9s{+Zu9=7CbPA}}?+&c5btrX9iY5XlBEI1wVVIV9FG6nrs zzD&i|_DkNgI_>3#MRT=)AzsKE8ICm9vu0_oNFd0pH~GX{KI>D_ zp2OqA@>Kd%G#$!gwx}qm)>bT*g<9d5}akZ2G$1=Ey3p$q~;{+?J#!LC@O(Uk<#QX|0yDX6L=| z>yb)YfWPMA?ZHXm;kQZkiV{GZ1Gbj@4aPCsS0w2^&8SIRM|I_u7)+fdUQs1OfZXko?`A z&a|~2WMm8-_8`x&3tie)AE~ukMI9?H4CsT&n=V!8lt`o@ExlJJAz98{BOPoN`^TlG zjwDiIYbdd`Oo>H{+NJ)L%BFEJtXzq$nG!491b&LV*Il|+!x(XEWgq3E$X>y5Q}&M4 zN=nP#@eF+{O>S1-92Yf@vpR-~3^~L)+huKc>p?d5O1RoFW>ZL4Z678LE2CKUI{Qtq z9W{!XakyMprY|_#6ng+>vri|hvAgyN_mkQEH1{WJZpV0ZH3>nMRtGFN_1(|yWmFv( zo#d&t95-g&GrD33N34c{6gAUU!$9au*k-TY$E%J)*c!ql_lL9l6EzZVYn&*kua$5- zp{%`CAfdks794t(R^#&pl_|C}V|Ffb=i~eB8Sp<=X-_1zSPnK*`!mrn896a;cU1@Q zm-JN!9m3B+zB=e{PgSVNlb}<_A%{Bka2Y5ubHpJ(kGm8#Xfro8u8~`HPrQuWH4f_* zR*Z7?Vs;uLeKETeA&z}nu$xh!{1Y58Z%@$qeP*F;7G-EBi#8+ewvPiq`&tKH-r{e8 zYY}$wfz0#AQ@S%G8v`rz>T_v!F~^1H4_lLNDgQ`b^4`FG%Mz_iRpg|C934V=x z9Yxd6b$`c8rm5o$dM$17Vs`CgwcGjAzRtcC!O3$q4s*1Z=^HM_3qPB^dmrz%lO0~W zHF!jIyS4{^%N2YNVW%Y=T4B6QJM@lKKb_wjY20 zqI7d--F|?)jYl`2bamG6rGAupN5*m|)ZSnpz7cSKZA-xH#H(I|;KO*^rNf@%2%EM~ z`phD8qsYB%dmTBVL&wy*=n{YOTUkkm-KhRL#HrQeEuS(Oq@uMRZJQ1_9h=?IoDoSI z{M|(xpL*Ec{vZE!G(GS)(}C0=WQgt7nxb5228hM|o#lN+Au~YOn$qo_;nP!`(V-)i zO=qj-J_=X0(@T*T%X+#+EUv;QQo_65^}1+z`}Y4e6M{pWS^2uV%6qwLwJIh3qKi64a zFp>QI-=qZu>>P|%BU$447jF7J966%mWVP__=mM}LX8+7mYsq+?6%oP?4Wh_4H6zvJSxwowXrj8 zICyrM!>Qg4Y7FLb1xKh9=(T9h`O(+rcb{n@TFT}j!D>g0kYW)FS*J_pBV+O$+Tlv) zCWnc5Rhl0Ly=*+V#=2vyrS5L5TN_Mx#pZ z)oziv;R&p=A^?nhh(Zc&?Xt#sN!h+$!bg4}GlCub--qR)q-pug(TSt$$a$zGfAI%T zMdmZdZ3cp9aNhI~*PxLIui_dVgoh&~Gd)PvcKvsSJHmx2uk#MGhQ14A)J8u>ZH*bz zqp`Db9tv}%Fg@1B6(dZh1P2DV4DTXb$*kyD2@h!5RSjHK4Mn=7KIiq?>D!SqR+KG9!xVh-o7SeNy9{C%yH?WDhhIW?^ zN{l2QRMrC0G9FWQe29XrBfL865ssrfX>?*O?5XnlHY6fNLtk@f3f0Gih!iCJv>(Ip ze)SxjoYaYVGSxgzo(?5f|L8dB+OPe<{M8)rRNy5G1rzGTOOnN8T<3T>6`l?+?>Ck! zVd*WENgd5zC=I`P6$qQZ>B9MRy8b(&(A-a>Nb%2jL|{IW1m#5T1&c=#&5N z;3d(j0xwI>F!D@O#Lyr-F2)%yLh^AByk=4f)`pAH`>>s0kJVZ1@me&2oISpDBxbj` z#4v12{1GRPYixI0iL{gL6}wc?M*&M-U_!NUrqWpa4#{&~VfJq^`w6OFh3 z=)iV#pD=D1o76BOQkI&3l%eCbhK{^;G}_?VB#FK?&nBzJCL6Fb*kswWNlPSaicR*r zGXM93j$DmRmU;hm82#nsHy-#6@1Pk08=H$XM$aaza3C599Z^QwxBl)>sh^Le9h_d6 zHbHNgA$|-U1ZX@_XF)>h@L#1E*+)!)e#f)g4t+B@Zz3++S{@5^A(Ht zx9NPd=XenG)Tb@DLs^OSJyiw54#H5oRs@)(fwvkekx6%!mM@op8a)~t5YVTCTYS`~ z+(L2%02gSQn;3=FegcmGeDQP@Gpn^AX?!oluJE;PLHqL`Tr`SZqCHURvsIC6e}U+N z6hc7`4FVUbFl9k|>Agc~$DS**HahlPnR4E-=Zg4K5n#=LM5~t5Y$l5G=%tHNTnX&A*BzLJN zGiJ-^VpQqG)aBL(!5z&O=s%pCIdtlccmOmvO%$*@o2|#+A|z+WBe2 zV{O_UlZKkvi+YJTCq0vtk!hHobrLnqG)(!n%~&!GbAd_n1+ygiw(G#B)wQJkiM!{U zByT}qQZNh7Sx&ZPjI&{k6F-hI&eJH9IpdtIOv;a)F-``3d2BpZ!;f2<(g8N`>0^dK z;6T_~X?~`PYbk12b}e2m?kRT|XLfD%-)R?_qs&(LaUy;;AlPp)dN$kwigg|&+OfHr z+a0^&b6r{AUj?Lmp2W>;LIVj#TLGeBgBGH-a?e$u6EZIe#M)^a!^iBc+9&`%(6rc+ zmKr)x<4s5~!jORqZ)2)LA8EUl10J+DZBo~!tW6M^VJ6) zpS7b6c%0X2_?3a2)jx&o9grjMXaI7-9ENbMU*i}0lGulq0uJI=g%;UQm-B!-cT4nA zYjQx$@siRG&S;T^3#O>E7wQZV?nk3*nKGBF>_}vSeZaQnVT&XIw#Z7pfhgE%{26R( zuA%*LIcNzh>Y(A4z7q&0m_KumX>N+im;X>K?(9NT}97~H`^!2{9f8ZQDl+nz+^lh z@DbP1{xI=M-eM)xOU1V*c-Kw+bq#! zlBKng+D_@zm86K576d+9Lgn&Nl2@{kg^dGM?v3J=!k7Knle)e?YBk~rSa3hZUJcjK zh*6ldc!of>U5_^M_GEa}5FUYd5lfr0y#p26&(u>YK|An-y%iWAnqXov>wwT&!=`qz zaYw$~LK$({+LVso37E8y*2icgVo1^?tq3kp|=!UaXbmyqZlu_AYF-aug9mI=2}eZhw&1h?#p_9Xq) zw4WRWVNXa?{oZuX&h`!p;Yr!RRxvcOqmVNs@d6m{3R;tdC|E0uhj)Q0Ma^-m0a@}I zem^8s%TYyL!_wl7Is#3(zr;ylo@~knvC-pq#i=9%&&aDJoG1O44TTHXP}m~@M>7*O z0~l#weu7}Ky@cm^LDa)ib9#6K8PYOwm#~+x!uNj8)8~EohtK<*mwn#nJVmP!&?Ih& zX)EmuGd7irtV4P!U{E(i^u#J=Ox1W0vt6eSUIzI#ik5q`zGRF(!T;J#aZ~FYHmn5B z-E>oH<(qep2QPv*uF-46TO{vI0XfGM5IE}sSB)z~rkNV=JatbZ5zEu)W%^ccYeBxO zm`BpQbDevERFYiVULb8dN8trhvvUkyAO+haFp=Q}LcSRUHfN3KG5pCd92WoFXh>S*^3s) znP1E$pJPw^gAa^w;=O5qE%{-@d~m#H_K6(Sk=fzgFk|-?fAXTd8s0gP2lg`$2)aYf zr}mE7>@B9kw-sy2R~UKH)4Ut!g@sn+#DI73Z|Xny*D_XB$_{dWzkT%2?+C^3VGZy0 zP8M(^;IVh(_BIAwO5V>cpE*?R-ExLo1C8&URrQMEz-ULKy{zkAd^39Not1H7!gzL=bk?4U+Q+xr=rKWzN~HFEUuFODBK*8IZ^c*Y5HHxY;bdk?%e6~yOJkOv-R zB#7<%siR@IN=Ff1q{YovoU3s^zYesW%yUq-9Ov z^<%-+QU@?9B~;$#MTk|v&d84Hs2EknxBdQgYXMt}l5ciYz}lkZAM=WJ^ePdUd?Bx) zg1JY@V?_mHQA`9vZGY%@Hgoc%j9Gmhuu9?*nd0Hxh|?dKE7fN5qr{u~FKe8gWZr-g zIZ_v(clA4Y1Gt(amGsuh$>ybqf&T4;<>G~aYDB=%(4cFQj;c34vrB)WTi{*#=x{zg zyrB;oKSQYLY}n5a3pKIlKpstnni9Twf#tGTw9aT)Ky**-Lnq9Irsk>=^n7y}fyp`& zxXuH-4M`<^!__z7cUG~=KSh~EgyYPVSws7Bt958%opKQ{mS#wKCZKHcUx^7DaP2+^ zw?kj%#AWH^m`4m`ku&+4i|N2wDMG{ASdoXPESIm+u6=x2>OT=~RDh>L_@75r8y=_m zS9Ek{K}T5po^-_Z@PT;Jv0yK`FXr4$W<6S;dDIf_0z4+xoXi$JoC2k_+~P(_qBAE? zW#VKGT|&9}EhnHFnZ*%Q$%)Caxokb-X_*TjpKZA{!m-z&RS)>&_vsT7WvE2Q95$^; z5T$zrcmmuDfj+vP=!XQFo(%q0LqaOf#Tkzbs-0Hn{ z2Ppr5mx3?o1%c<-6`_k%ke2bjim*lcNz0URs8sjZ4n2I!f$J>>< z%L<^WR}BZgs8l+Ad0oK+`xG4ic6^0a)+IHb#|z3}iq#;JvSe|-G-5UPRyplI%0$C{ ztGd6V(SNm?KcU7G3+!JXc|SKiW@&j6qxQ6%{2pzDDd=7gfz0Cwt_Qe^2snVjt_O9+ z^L4MT_)!m3l`zH4lqv|+yq~L?EnMk61SE-B| zKFy{uHm+J@H>S8X#l0$mz{)#1%zg4W$Ht97x~oCwbc$pQBKT^6Ac3|niP=Cf8g0V^ z7LDNn0|7>(Gf=I$^u!xY>4;Z&r&xs0!7tZZr%Smtu!~o|TCOaegLSbkj!#E2tXIRs zD4osepoB8haJ0)t_z?pGmfeGwgTS}()t=-dUw$~etg#VBu5u`WiAlQ}5md`u;9LR29B}LS_Ndb)V)MF95t8YF{?bV* z#<-d0x}NJKX3hm%rzoR1CdW84Z%9`jxKO|M$_%1?&qTaMSK?Y*xlVD|S*?W9?k>KF zmDzOB4InEVFhd1>@F+D9YYZYwZ!e9gN#} zYX{?I#H67%(R8PMuKHGdpOgLwY<|PGX_7~LEX`{8@mQH~r_w^8udK9~n`yQ__(TU{ zddp!!@-?d03DWb%+yXd;h-^&blkroO8K3N*q6{~e1(cQb2GZnHlH#)g_6S6hZ&`~T zfk^VLC<7tMx1tP$8iJ4?fp{k6VgzD6l#3CF@lq~E0LqP#u&cpe$PA}Em=>y+p_yJ5 zs+XaeUic!H%0(}H?kju$dQMHuIw_OPKUo2sqPn=uR|bLBYL*N6Sryoc%Yc!%9a6OO z5m9u_jzrsta{{XMkySj-F1SZKJ&5z85!79vFoGO*>;ug81nC)5{W4}E?N-jd;&kkb zq=e5G-xNI@fb7LijLonkRBVR)nazC7$T$W^!cpE5y<6AB4!$WV1JKw`w>y)06`X`> z<3e%9h0veHS;W%pJDPY9;49PkImK3BAw8ajaH`vErh(6WG)f6??xOowlZQufQEN<> z!B)+44FyZ8Fo?2e3>KU&Cx7+(e-()_l#|KQbzrP9hH~=PR2yR;E)IzJfF6uNacMCI z_+1~I#FzsnlbAyfJOZ;=FFYfbR)~8;OoH;-mX?^6gTPtAreI9k`)aNn`x^6&>|~O1 z48hmjn6~G{P;iFGkQeJKcVC7MQZX&r3LSw@i{_=pd^(i(i=LXUoMDk-F-)w$Vnt#o z7g(%74CMm<)U!@2J2QX#YP!$fTZP|EYL^WE$|3HL>9T>!pQ-Vs(k>Us|0N{?6u^Jw z(XNYMGen$0yM>@#fsMvA=iuFmAB=Y-c^TgIlL}2A;0$QTSA3~AylZ86w=BcEWsdVe z<`sBHwc#C`m?iz}@KZCB;va}Vd%kWHv zKc@Pb@Ju@1Ts%7snpKjM^@-Gk%khy3G88JwVT4MH>!C9|uCZ_0aPTm{3kMJBL`|*- zDED*K!LGu^!;4Oji);z3BnSJIS>6DaV1g_R{Es!UdUn|L|B<-#RaF5G4oYECV%=o?u$+9Hp68B(y= zq%XJNqfbakK{)I~IO0FxASAc>Xt*FbR-isdFKYBiPUcA`j$^lV;CNc(v3Mj`NQ$v)mOGrIv(acvtxkJom+^85B`me_AESs(62FIH-g zKUvKF6MkhAogD4ft?jyCWh$Bn3y8|-r6|81uVlYIS^Qe^zv{428`o2nmUn`k^i9UV zCf`IaI&6jj*~X-;Jmk?1NZR56&jN6qFiK~6P; zLK3pgoeUeA6tWO5CqgM5vl$!-8N#gu_d?nb$vJCfpv#?x)%QXlp>W zn{M}UyTRY?<#yEHPIBw~?a6R!u*lz@;I`>+k8@ii)9}7WM z7akovP5u3JC0M2Jj5I6D|blfng47mNO5V+33siyW66nanl!M|Rl zxcEdeIO{J5ZRjF$oD~ z;me7T9Ru(jMygcK$41~sk3Dw&Y}|lkjV=8E+|bm2%DC~IA9o2*S%e!X^)tB9e(ZA_ z(t;LQ6VGez|6I;%e%hlx&7fBb#eX11D|W<+G~4(6?b4L9Lu{d+n=Sm6x`GJfx{_0| zQ`dbFpSa{oZpDjror>bCbOnvB#!R?POhMQsH(fRP4xT@YL{yW1=JqNnIMw8<+`ib~ z>V&8({B8OlW9c>08w#cPCbpu?e3K zQBC5^u}DmD!e>lW<=H&ncY_kN!|vS6wzfa<`0~xCuGT}vYH6BEIv_E4cC&W;cf&85 zT_qm zciQ(%;g}Wd_R0LVoJ_Ivq;G~xDx+K#1(z)ATOd>vQn;)S(@|0IA}nmHD9q9FMf$1) zO$shqPEJ@w!6n(eZv67NS?fIt_;?0U))@-8c1Do1o{rVZhAUo;~ulN@UQ_LqiphE~>y{0rV)yucK}4iyl1 zAYD6DKyb|}I#zX#3Rs@20)lEVmBOXBQ0dCjJvvlCe8TN3pE#GJz2EV~Ys2w&_zw$4 zJ3tSFiaDJ!_4Wn-aF_?@efhQNI6Y6p4h?1f0=Ot!!|8m<`8;aHaO1F{)=v?EFVxI_ zbPP6$b7g~XJ^ArA+uOggl$pHfE3dsYDdu3)5jy4*IaCrdmJ0Sk!cb50ct)+JM;Mmn z6gzbMk(9_6shEPIeMo5*)#{^8v#1u*p`v4bIWLTg4ywhXqN0Op4_ieC)yis`p<1|M zMz)7a3VUHSl&)jgkSSa4nkW}W$C&%_=Vo*$4c?Or&f;thS$ms$(cFme2e-s)As-EsivP z@#`gE069?NJvj!v>T6(tYxwp5sU!W5g!60;HU_>=vF9e=;bnv!Qswa{#kv3J>-zUM z{^?Wbj+pVpDOi8pwuFj|kBgrl!hNgcIAdP&5ju|k=@lLsD$Ef7f&ytg;cIWIXYDfG zIcFQ0mZOzt@71Ek#lFc2nmiiJ5&`pyHd+t9ZK=!7jXbH@5Dnk!}}y1y4ts&I3w3=I@tE3k9W$2Y2*SkDHuL4f#HAt z#PH0M0=c)A3x+R=BAp1XQaowR+H1c#JR^%FX6?y6pZ}rnlro8FjdHk#bhi!SOYrPNy)u?B|}+g#PPOKf;6% zXW%tm%u+ox(pjpu z4wn93(jYj~#27v>U-qw(9~b=VYkyYisrZ=r>%AbA27wu(Tw}>V^aybmB5K;TC94E~ z9u`hd3HNNj2AO%v@vdCvLP8?_2sBv_sUb`cqnr{I44hf3!s z5ukH_h;6-TFt?^8U1Ym@>;>t95=n?>Y>Ya~d#>2%D!ysc z;%r^od=t>5(%$&(GyHCwiinuLtU(9dq>{0Micm9ZG=b%kl9+)c|gnn(-&Gx+S%BN8?UjYc~eG)bK z3lLgU^JMqe*%Q;g z`@73J;AtZDGvDoyA%*nWlR0SR@SO1=QR?s~Q7R=Lhqy+VlSRZz_NCG)p9@w|*eOQ? z=MMQ4(i+h|oF=|CArCw=yF=V}7~balHP4-*gE~%r{I0wIWZzwH|JomhJ+Hr>5 z_&2}))X5Lr^SygMkhPnp?t>>DdFl`U>4Ef*&-3p<9~=MJU;h5@9X;~3k9;g^caplS z8?0J?{w~?J_+2mq#t+>2ukU&K;cxHxDisH*(C@poNpvbYH@H$BP=#@8d4AxA~DMy|ti~gCqek$*pm}-z5&ci6POAK_f0!utS zn13LYvz7j7f*D3F|EqR6O?LR^bFdoBun?IsXaxR)Wh{^&eH%DLR0n9R1A$r`$g&sk zspVl5+sW*Hn)^5SYVB=)jlVs}?JNE50d8O6Z>PAu*54|Aca^{0$L%Ey4}bZ39Og!L zhogz{{dYfh?5Vr{>5dQQbVA*S9@zchp+jH#-rsmacu#*gAe!Zuxs-N*y1A4#MO{W| zIiV4tJB84WQs?`Z0n|ZgN5G9)gtm{0R1LnwjZxYc*iPsF7ua?XbDNFKU?{V0%%Gh4 z?|W#~iJaC-+Jozv)v^Tn!mI3PEn7j-X;U9(FtGiU*ia6f({Uj&#P{rbaH?R4!2cL^ z#t|R;oo{|4gWT!4)m$!>v#(RR)pUiJ>FhVbkf^N9c@=)sI0}au242rr^AtqDan$NN z1r_jrw)*EH19H99I~N^hEjW8HP^Vbyy%lg|JV-)MBZ*5n`G81s7TufDtv_FnC^fpD zXL`Ez`=s{j)_aC0b?f&?ofPx&2l}1REwr|`f($n`&~vT`bq#DWDF=ofC?U#(Jn1H- zzA-HR_2?r$=T%do;$DuBka9yW<~G6q$diTr!Xi=~b#nisR?)%z<)4aX%oli@Re0{7 znrxi5nhy3aRav1Fn?Hb4tN;x8zwEsYoLyCQ|9#InckaB;+`La_Cgj{pNG9Zk1V|<% zyyOf*KtRBE@dbRVHUT98(N^&e5Ok0L;q^qNbx@QbP-CT?SZNt5+JLFXHn!1X9et>c ziV!Ml)CkY_xAr;b-kC{|0QLX;pAY22oV(xmUVE*z*Is+=wKJ&^^HddU$CWqIFzg6Zl0lN8KE$7M0 z)Ms(**UI>Ti3W_}OYFd(9&w#~Z%>^25oZQ0L2t0x>|BuZ@=}Lbyniddcko-@@+zg- z`mslY;Ja6Y!q{Y^uG;gxDPNkZ@1{H^T2$JT`z|KQ{Z>)*2+hga<`o37wa8=DMb@1< zZ|A!sk8LvF?RnjE;C>UH1=PfFo}*X7_u=@#?l5f4W9dZ1z4?+kuHy>+42AE`W2(q^ za~|_Dz9ackS>H$V7(Y|d?mTC@g!kl~b^D|PrkH5-+lSgDu5z(?C4maTDc}c zWd$(JZJU`vHe4Nc#`hPzX%(qiaH^?BcJQ;qjr@wn%#&t+Bd#?28cHi$+L2+C%NFcA zBkiKv!zi`?;clp6WCh^v!yx}ELYmmj0+IQ%ySVl`OfH-mRt}NLpfmj8?QHo?D@3%4J)$D#CGBxi7y`<7RnQBA?#5ez2DN4x%I=TpCW6$`gLH3#4T4m$~Ih#|Kx&h z+p#6eRa)$Z7e{$vUGXQLk9of?&`JKxjF~_;GiCxk{SWI#O1>H}E-b zi)voK5PykkUcbOJ(If2M(ItUCpL=ZG+c&)aIXaZ^V~j2DZE$ z3MW?urBJsUHa%#6d&Icd6e=GKApVC29PMqy9YU#)E%$z#@5>Lq6^hcEeyGB@S0x;A zZzl}MzJ&Jr_0`=6P?=vWU5ULXmoenD$1c$AL0GVp&>~LlP#4%RTA4-gX-}J78#J$Z zvaXBY+URv>&vuL*3_g0SBIe;cn27222*z9HNk51#XVD-ky+R_sPmj3GAx^EXYiVEr zH8EO4U@O%acNe6B<(&ygq`F$H62(WZr) zV8!)X@#L4?3#dz7t-i!hSfj`HXC#*WhU}@wooh8?B!3oitb9@D@ zL4K^<=KTu(zzY(&@=WmuuE_Oqld*p|2YezNU&Diz@Rp2TAU@w{1rOzHDzyBF;C5-+ zxjVG8PFB|RMkpfODQUsu?h>ZOMk2b7*%JUBnIP2COIh?HOuB(%2tVwpzRX~_T5dA^ zN_K$?R7I6$w(7oNjwTpc$#?cuws5oY%1fYf86acI=%53kD~-a$6|bRkbd^Q1V#`Aw z!W+PG7Lq+j;1b!hJGptwm)M>PYuH{vl*U=xjI$meCGLjX|KNn~cRov}crz+)K5JhP z0z*`x`A+tuF>JMLJRh@xa+73!ag_lAroSMdII%pD(`F=IaS>xXO(~)2c_qn2u5h1j zs)&cGfb-zX*38nf`ZrO3OVXG=WM`@^I}Dk%Dyh!`Tr04qEP$c4X(`NQXu2NQ^;2mE zZ4pS^;p%+}$KG#1bmGAcV=)>XrbQr0wfp^WD~=Y^0qD3N^ytjOlE?9Rl7-orf*n;J z#NHLuNc}1Vm52>)c||xOLjgG7MjVZ2{_^2`Smw3SA&FDbU(=se;iRm8;<9Gv<^URr z!?xA*SKM_CvEmBQlpd?)^vCe;RQ7v-b=VC^BlrN(LXG+-HmqEFVIq) z8TpP|zC7DO9}#KIDmOGe9V|*NXXGYec7!&ak+PlUQnQ5M;|pN}SL6z0kr&;9s2&Ag zA$n}beXXaWn=VbFyl%uvRZXI~O9=o?RAW)zN;B6;M0CQYZu+uK1e7h63xRlVsJ(tMW72~$(Ca2=V zID0|v6y8LYT*eN`#G47>5?DL@+&2+5&%BhmE~T@4o~noGGpB}S?$!^^#W2H{@6OVE zEi5MCxw_=TXg_tG!RYo^SE#Ch0w_vt<@xyKqTBNY3?whT+)BF`?^CP6Qhn)SXVY4m zS)scV!kOS0Osd=fLkHk;e29KRHyg{1;_*ycqnkTDm?b>JBNn1@d5V5dmMb?4C3(4f zrfTrclteVR!c$}>FN^`X*p28{MYpb12@YSVG6^ZoJUi-mpt~lAkj?Vf?gQM&($EuhS}2lhCLfkf5?~4Z}fR;kijyxLm5d#um&YD$^}jTW|>rTB4i5 zI-@3$tx$X>YaQg<3Hi!R z>WM6hVOi>^GADM%1~`lK2;pn6h#ER<;&;Ha1n9Y-i6)BXi_mllM+7cO`vGn22C8|O^zpz@=&lr?1aQW&mh$J0qEv!DRwO-OY4G0!vYS1lh*btBT zDF+9p3(_g5hc5N#RDrysAF39D`>wcVC?(8B>6FME>w1u5raJ&M| zbRxBfbsFGw6)yG2ux;{bcKECFW+bmX{b8F#;j&5U)(d(|FR*b8J6Rd%1*o73Sp>@X zfYzt;)bjMCRjQV|uR=IE>^zeI@SwMxi&9AK5@rG6q@)@9+jJYB?A`IFpgn}-x-Gw! zy1=&aJ3syaKjoAl+tIUSh&GA1cr2M{wiW62|6r;>xJ&DhKclTFwKA=C1qK)XNK({Pb((TKvdau1;d=E`O!b;>>Nt6 zfS5qET}0iCn}gOiY1LPF4}*jPWd%UXF@#;XZY96X4(v~0SAt!A<$7+vVE;uh0{JY$ zSA}$oa(-d@y6gF($BUk1k2i-e>TB_#byDg@PZ3!LX>lOi1LfAK>->*gfv|wv)j$uP zZcMa0tpBLDC>)4o*}Z6#C?>Q}rFEwjRF^39 z-lL_SyTk&MtlI&~2Kt9#9+yC)wap zU=vC^9z=H&N_(C(vH#&45}`{@21d2_jjHy+QPpm*Rtur%vMb0FPL*G0Ej?lW2r#?B;Y({agBcmCyV2p7{DnxZ>BCSHiYsx*4sjbsZkza9{IxQ1#hS^Rh|1BG)*^?;6a zd#-|s4Ozv?4R!P33My17#i)TY9L8#}bf*2})_P5`Rf1;Z;&Kn^@GiabwL0ljCrvYc z`oX?WqtK4T!_(Q^K;~ zk0LhqHsGTv-aDCL`LaYx(CdB4PjYQS|Ha`;0rw3R$%#GTDwpap+Y8g5WVy*Q?xa%F zB&X#p7)h;=@)Xl4q#7Qb%9T57_}4HhG!gKyFRs+1g({`dN)HKPHn|3h=!dUG zmeDDi55z#`-sn+3ZKYyap*`EV>oo_f*iB3)Cm%GwZYSQL& zpIab#lxhMCFpK+kguP^;i2;f9r{ZlpU0_k5aD14Q9f0rU z{Y9s6GZk*I|LRMAP30kaNzmEqQD=1xG^rWWqrYld9r^175mO2e`x-KC=f{q@#0}lr z5r+^^3l7bzgJ>R|fmIP<)TWH~5`Im)5{MnUD&b<6n1r>GatDd_vsK)y5P|CHz zeejE2TW(_;DXq#UGBccN=L5I!f-As09dO^H1Q$Vf55bhn=j7 zUP}90FoaVJ4vWR>kgEs}6d=!>d>Bu?Cv33;$@0YTMBbh6WLvC9JNxQ5h~crq#6{4q zRQ}~)rh?WyXU8=@E{AZyB|dNGH6_D&6oO6m99ENa{GLj0(l}@QPP*S z@_2IQXp-JsoW`MuO4FW5(l~ndC0=t#UJRUM2BdblC)I-W3il%L!1U0)%*>G`J#kB*+X1_y+d0Q36 zUD$p4;{9V--}&~oOov>OZc`XXg4^|d3&tw?;tgb%zDt(+kLb&~I-)Q8%18A@<-VJ5 z{OFxd{)W|vI7Nta2_9+^q@+v#;!&+&Xl`j&T?1e8tKH%v%JIc3JERP{B0PmP)O7h zw|-3Pw>HOG*=$qHpm%cSLJSLUW?InBPn`@(%g$ejv(~ae_94vnNUdQ37fO5L;}7#X zn>YVFvy+J5ei*%4|1+3zPjojQQykR8%j!7R;Jd31{@HvsGG={vv2#sSZZgB$i!drS z(Vv5nU4GcDgP$hJhNU_zw8Qk^r&}@%atoRUcLdBWgo`;3lQLbd5&14m4t_TAd?E?a zx3Aq9m>;SJh}ir=yJx|CWF+$3c-f~82{=&GiBE+q4(_PK=@3O(QngFAtE;{ThDvgh zmT^?svw#imdi>I<`i}T@VK?r${PV+8r8NTi#lewan^HeaEF79;Ul>m;hh^Eo!zTQ# zj`$j3H>l@_^Tc@PnU)36`E_=#-S0KC*wouOAz;+)b#35js9tx6*#Xo?n``1WN$@6a zOHJG$aV^Act%=)A9NzEi<*G5Oa0`(Q#BHmI(*b6lI1UDZix_Xcrj{E40hn*Uw_*6e z8Do9)IC+bFzwWPIAR7yH63pS?ns#c-AK^X7)-8T~j@SOGx5Dq)GrKiqo)+3VvhM;j z(^F3xCzPIv(mg`y2`Uv6vK@oLWGkVj_^ckU%ge{-_jrf3^R`dY71=|!$AdlI+{zY? zPy|kz$wrUyOw=CR}$J6R1&a;_1N0Lrp_isSguD4 zvm!#1*Z1wNFM=K+X#N2{^OpJ-^MU_f$misxkWYR1=B56-`S8NsJNTTUC8j=HzC3pp zpSLcBlQpI~I6R7Iw?tE)|d39ssnhURDV_dShyhXx^i&rR_;eI&-k59;6Gdsab1^_v>u+S(=1o$2Ixj zs3v!$=8k@}GZ`GTKWcDX$|>b_=Bg1z{oolB&Xs;e*GR>Hh2~U}9VK|7;p4q0pO{m& zhTZN6xyh{;Am=WOjv1DAoM5A~!-U;^M6WTtiG(+YZ&F*$;qu6C)vwREf`e@Zy< zmFGu4$^upELK#U;JV(1^1b;KxiY7wTNrt3idyxSoxmsdJ9;!kz%#9mSG9Y<8ffKX- zbJZai7f-}4Hpdtek1Z%S6iSG#Y3vA7bIj6t;k>ZB*ccjd&Vwp5h#G_FuS*TO>!W@Q zx_4fVaPlaB%%J<^2&bq`;mHP_mXj*2*rhIqJJjpKC1}{fRGf@h!r9|n5lC#+rHRZ7 zAWTb#<}7@XSEq}Z6P$JfAbV@t{G5mCFh_l-6sNj}*6O2g+o&;!Eg`ton?hPF)|6cp z)(iGUgkSF#bQWli%$lqX@$H+jGosLcM}!~t8M zvMX9FbM?46Wqx5qS%WP6EKl}Sy2hzKARm-@3tjamQR*;>w){wk3kO%mZTv*s)KBTh zlUPn; zH%VI>?hW|N143m3TT66P5;U2xHM%tkniKeXRWV#2zQ=xS)iS<5NoSK|aP4R57hZzH zHoN#JDo!i1ODInFF@Iz}q_Kr}blU>gO;(97KJtLEQ(o9Dz{$GhKQdi8;wO*xURK$y zp(C0|Fcl1uT%6#_H1M<9!9j^5+H|P^?SoSD_(hMbCu(?2sT-*kk+U>Unn&vs@@rqS z#Q#2a|HA=wCMX3pOUU)ew}VJES%^ zX@-ar0wwC!5Y$$p+JQpHY7`d7~}kr0=Fo|rifs^xxq znHv3pxdHACvaakQYq9aCO+=#dayQFG&GK@w zUt8r^oVd5ZWEaDxaJg*+VJgD`sB>wbe-3zUH5aGb{RR=j2B5}~nBx~boWlmqcD;b+ zGCPSEmck?f+%feL3(;eg3YX(f8IZc#$_#O%;F_SbAtdEdY8zUYTjL35c#|uSs3a}1 zFHKtHK-V?=6#F-6swuF(e@wIWN>QuPt(GJaUQkV%WN(X3fL$oJ{+cAR-dbO7x<@kX zV11Daxf4@w!epfhe6$6gxPHIf1T@qW7o{Q5!R2FYvataI@1l{~b^bZtju>@0qA_f0 z8+|+C#!vqFSWE4`pyWxd2YjWO1yc-UT$^WzyL=c_v4@quTT{<+SYx04c@NU=jy~^U zp$(xp18uIfG}^Lh6F8{(LI-oJzRaWM@3pp;>wO$}8c=xzsHk%EVhdhy@^3&9J*N0%v27Ac*lnqMC_6bAs0+Pkg3!VY|r$OVfqK zCv#h&b#kA~xIvT1wL>N)n2C_7xVkuqZ4-={snu8az1V~Z=vDoU=8-I{beCcEZ|}9M z6G+ld-ab^_zO^1z5Z}Ri$~V)EuvN?HJUfaD8{!LAqF3C?o>hAt7-YUWdKHpNhGqxZ zu`<2oZq-h0sC@vRR3FXBu|Sh)D;V&+D3Fns);b6RqJPA<8K)FD(NaSV)L5D)W{7cV zx2(b75n*?VLoGmv^}gGoP`CIc`w7GHc_+1M0VYxG61o1Ku=^hM<0I=~$W7?jyi$&X zjOK(Y(3r5v8fr9SHrqMGq|w&AG44Ho%LdmBS83W;HwvgduO2%=Q3Jx5E`#1+kZR zlTHR>g58V?$wNZ7xg6s$gM=s{3N{AXwBSI^4l8taU~>n%aJ!CnSotnu;KMFFQy^{g8G=N7Ot^!Mg zj>JFA@r~QwtuK6Tv%d50kycJu_)xH?OK`IMxh1%|EMmmc>=wr1vFmYtgy3MyF+!@n z{;rkrRJ1`gYcpA@3uPJp&r+$CdYhI_TT0!k&0D{$%ka5u)z1HcRl9I-D|Xru*9A;r z4!l~=GgzaxWe*OI+|Oz)ttp*F1DML2VjxoXiJePZNWAf4G%ic{37k#C#O~7erLaf= z!j{ltq87v=Z4fcWsfW3GyGf!?g`5JQnCgJOdyNp+^OFElnu$gRPr?%7vE!HYp@~^S zBSjx(Qh8-wl$yJvJP#%etFpu3c}{NAKuxKD+~(g?WpELvL96$mj3@%}}bY}u{UO!m0B##a0Q zlZ{bli%xoNPf$B{@g8jg}cE0byXD_h%RDBn=Yx5 z6)Y?`CXi%FP}G)-S`>9t#WnPVvU)W2j<9Sn!aL4wlhq6$v%l4{j*hRAD)~&>ty#^Q z#;<0OkdDi2HFG57LNye`YwOXt?umlb59tpqP$vfsuqO*v1R4 zV1(}W$jP=?3v?mfBR@5MO~x5rvL>@Q=qbzU@>|^)YnMRplAUq<^l2C+CVOJGD2}Hb zG%%`dZ5;)OXW19)0HX=~WDYB~?2OwNJ1x6Vh4}|6poY*bm0I=(l>0z{WU=Hc{vV;K z+%HfvDJ1G|$^?%CstaBW(4^`DW4F(yGN{zRX8)kkD)HQe2r`b6A-2QYp#~rWZ1yih zcxToM5n;nUp;ts#WP*W&e|`bcWH!bUKSbZ{^1udsBYxizzm`pH^NjeDGx?PGrRk84 zFx{KksGlS8GYa1kr{{ZQ7$ip_=xfP85p8 z_LPl0g0ja3+YGtgr+&Nn-BTV$TF9 zQOqJ)LfGqIV60U}N3-mGw925&P7e&KixCgkIbrC4`V7eo4~hFlo>8+g8I@mt>-%$QN}KJ2;wtA7<^p}2jYKdn9q#<%^K zKed7t&K4HeHtBk@e;>AA9}Yd;Fzcul?7fpP{P)JldR|rAV9Ev$^sLpvdE=E09jd1z z>a1v!jX9ZSh@fN+{CjVjc^jVRc%LlQ(Cv02d_h{WDkCZcI zRq1I6QX-*lQAv%9nW!o)L3ghds#tee*3AnqEF;pVr8`j3NJS*o1US%`i2kAW)-sVZ zfggi%)LU&bfeTIMZ|m`Kq$AH>{`~UcnZ)0oO8lfq!tdw0WF-uj`X6%P5AZo$F7+4} z44PCcfVe;4h3#jd`61oJ{g|}qc5k&4_uEX|*WJsu2%9>yFVpW>9A%TTGJ<2>=V(4o z*k8o294|luIDQ%TS;mh6YJF>oJ@ibeN!5mN^>{tM);P+s_Gs-Eq`FRh{)`mj?Cl(4J84nru{)Ml*ECbH+GJPU)y?(SoQX)3TJZTTCt zxFFX96KRWPGqMFaQ$)8hgT!z{9MfDoE^LdYC))W{`+s`k9%*GAdGz;5^+^4&uf~T>x0r4FZFT+nk;b1J;!-w?<(UT z)*@3qC!9M-P!Y#%Ld7GN=QwvrrsRmW!1rN)gj=-Mzmoa;%dzD+&|T+KcSCQk~isr?jTQ8d1k|N1YC=v(diaX%E!H zFFqk3G(?ZoF^VaA)N`r7$bSC2equ8*CEAM&It9Zf6G1ClkkKdCvpwa->%As}n*HmP zs6P<#&`5K2;bxI=$2p#pMYHu=E$8_!x5N&zq+oMCgodZDQ(L>0>vFw?99%2ce$Fwg8b+xtb$UnbG{6*$jaUAWW8nYsLLHI zayaZ12i(9lnPd4mRUQ@na8hp&a!o0mpi2stfg2;N^?rEh^4uam?Y%+K%>uiHg9pkV zgb9QnKlM6q;yAEOS%nFhTs!E3iB_A5eV9q-!inlqgYeu7OWD$D;^<@@JlgFnKb$PK zhWvWJAAhKjpI#|NW$qoa2Jw`Gl626hW3%XKdsWX0lvFB|^F{rbsjD#haYz}yur}(r zc%3T8F_dMVfd@%(txGIVchu%Gcagb$Z8Vk4aJQS1%$*hdbC5gla!-$1T<#8XpRhKX zOl~$)o08nqxF|;Eg3CNLYI2#UL=(x!`O&ROzRBtx&+fY9iD`c)lu^jL{x%`BT4p?g z7u8`@)2`O`w8L%WPCCrl(CtapoJuQm(%+V}zs+P$`pan*zDx}iXtb0$>2G7&-v;Y% zJ@zn-T*Xpf>-7gBbREV|i2IQ*H>MqieQrr=1ppU^jcI><^|y>;oqHRJ#9Gr^#kGvO zwPDlRuwiZ3yf&;~8@8@h%FI>kPU8GDAAP%ib<}yu>gfJwo~g{l?F#rE@kR$QH}366 zF!=juE#ls@_;-$d)coPb?183|xy=6)GkxJFHV1Qv)a8tnhq2L}GSE zm}-)2nRo*vF+C#LVsJH^#cU>q%OkD}YG?~a(+~m9VmY4RcQnwRb+*4f>&xD@?B|~9 z&)w4RSCy(k44CItoOZi#M~h==mamlRyGL_o>$eKf=l@wY;X+1QMe- z21UT^@ED=m*vJ}TfYo;+iA`a1*ib3nqz2etj@WqQ(H5tRTs6{cvxmP4(t1$8QN~cq zHvM#N>UQX-vqapbpZOlGizE6;xqB)1sD5)(D`!H@ZbEA4F@3k;j|Q94rEjyz9VXP6 z&fZo6$;Ch3EGN*CrfeoKEeYr|h_XRL+OF>)iF)RP*I&vF0$T#Gd|aBBpIkZsD4I~A zHwXsJ@dFd`lf2gWw(0pvm1)Uvft}4Ur;*m!UK&xit=D@9WWC-^AnWxAfvnfN2z1r- zdPmahefsVoaavfc?Jrs5S@ZG}DhKTHw4}?1kY(7e99PL5M49CR-xxM4WtI@m7i_Z1 ztSY&%%LY}RuHVV9%AH&qQ$IF03+b#XKuMrEJk}}$kq9+vK@zEKB!I^f7Z@PW5+?Og zQ@^g@8E_oXS08W$ESi+<(y(!HnvfNj&68gkcqG5fb3aq9kvI&@`aZtBcO0<2|9e|H zFcx%$(}cJVehv#91RWMQ7&cK_Jz*P*!KSSu;Bk(OMfgZV1z7WEj3usPoRngduy>^Pc0Vg9)krV2Z046 zF9H^fZSQ{%3&yteY;#k55h;{*kpybzX3MC#*-R*-&_Mzjg>E8HOQ9R_H~(Du^hU}~ zdx3m)!aA80(LZ>Qj%mentCCr$fJG8t&n)xB}& z0{A^huJ6B)g8|o3{vxDG&^FN3sG1o~t8--F6pbj12uopGaoR?dyF}=az-b))2r%wn z_iXUoRy#ApHZ#e@Y^|M`EwvM~nLw@ZJ=n@M`PPG zt4~eE^0{BMF2@u@>oG>CN z+Rg>jBN_tPoNOYH&B;ar*_;dzsGXDkwy=Z-cJHIvo@ z4`lB197wbm+u3|LKe4?;kB4`KF_?W`c9 z-y>~Yg>Lj$>iSTR%!>8Mqb>&o(bG>qbHe#%INY`dtxAuKhlzdWnZROq5?k(xre0ER z!2H}YR4`EvqW|2Jl-r_m4cL~S&*oU>5L(Q>p{`gYQl z?>^Ol3owdySppW$JVNIRbXk0>#qYENcm{e%n~q{4#H+v;4q61)|svRTAqxOHT_!pt{yepTcy)<>9$GW<(YLoZ{-w5x;!|I z%P^)*aslq(nGLO_aCI|%EpD3TVNWBObjhl=zJsj}M{BA)s}GnC=PqIjcGO>l;eUj; zpF{Z3vNr6}4S;ag+OTnLco+jpZUg9E`LyDVXqbEaEd_9Z!QxfvWW8DHM>68aT3kPM z4Zv>I;p3WDXY$d$XP&{Aq72TtlcO9v3bA*5ehLprx$m~*`(W}NPQLdg->u2_-a>rx z@%fpRE!>Lbvd&1s?joRHNhx?oYN(INdi5uYm6UW*tJDy#u>iCsjLQu7xf8&+5_@rR zgG@g!Zjksq=UFImgUoVY+@RKyc^o&8?vYDJ&dlAN0%S(%x*d=irR#P;W|Xem0hv*{ zZU+>zj#tKC58w#P?BetGCb}~(t`Cc#p40l{xlq4NZ^fGx`fYkEuvzF?qqRci#0Wa? z&@``a2OJQw?tt*xo?JW&%PTY28WOav0oxtcw_E;wZQ*qL@l;zl)qXtI7EZ7qkG64> zM63W0O3;V>x9S-EkJx#A$$KgU&e3)b#VVYdO4sy$q;YQR}Q+v}o$S_OZMzX;q zEe&_H8#^=C!piYjM7lvMO>bTYZ_A4BAlbl}CO4*xszsTg-2}Y4i zaTO@L7S!mtz{%@i1NiJK1$L<{+QYK~c0;95y?e8lINh+}o=%EeQ9nx+ZY^|E2R7ii zz-IE*69?-^ZU>W2oNm*=IMO(AtO4Fv+D$yaVH)87CIYxgD{v1DMsRn5YaTpy>T#cq z`@&vy*~2+qZS$Ap?om&^R9L+@m+M>f5q|SN>rwp1pWu3K!%+!ubwQzX{o4z?1kCr| z0xuBry{}L@Qr`y)rK2dfi=N@{UA^Z)IwE!uQRld}9kpyD%yp@3$a~F+dFt&L7GOgg zbt__b1E;KRSd56p7Uvb*#w#aR7biz$ySm6>Lcltd0j@Gg(B0}$M>Y{kFJRcZJxo;_ z0ZcSNN=*j{W!+~6lFFrCLb-JO8QC#yQj^FTD?ixu<;wlq=`wQ{nH+Yka8}nL}borD>nB3SK zu=4U41ZBhK*bMW1r+_rXin@dqC zo0F2w2{-UOJnK!Ko6DExFviJ8 zPN+OBy8t*-=q)M<|k!~co{d-k)DHS^EQ0m zTB9YwLc@euRMOqy{GRP?+PGkJd!sOn3+xaE3XJAT$!57=vbE5D*$DAlCi8x z{>qR?ZYEus8V2YTx5@T-WgHB^@LYzeSEdFvJIKI&YgI8r8Me3#Gp;Ppa0>x~2(fMD znfh*2`!laB&vd80bo;%a+YGvlsMBAFy1lhE{hm>s?irVsr^gq9UsI=E%Hzgh&6QVN zsRo+Dsr>7-w2n!amS}!|8;D zMKxIVA$l(e&7^w7hpuogfHpswcW^D+z|ihixla++{uo%>suvS>kapqg2y5{IkV;4J zH89QS&3#nD23xfB60A08L2C7){aHS}1FQX6Avt3Yfj43ZA}}rscqJTfAJA=cnUx=; zw_E5{KOy+%N*#o3c|w9t{$zPeFwfJeZ=%Gxf_kDIp=RhhZe(9louKOU*uVr|gLFyv zXv^tjfNzF#%sKK<&4kRf;Zv$QXKv@_=Ecq0Oo@M4T{bzoDh$RaHKj~vq^&%r`jGpbC*&9iosCcBBT2BCFvva?fYa25*9DXg)z1Mrv~<*TCqR^l{Sl|40)!$fM0 z+*=ceqX4th!L=a6F~W%U5SQ(bcN56A#3KaKEwNM%*;R941We3ip%HF^Z{~L&p0aqx zT@8X!CY$OnZ^2(^8(?+*(xT=mFmWkiE!cXGr z4O3mWw~`w;%nf$1Zh#fhaGn*t5Q@3Gh;8Jkvkkfn?;t!mdp8K-f^dV;ilwWr&2A0y zqi-O{o7T^0W(T33R7}MEO`$Z~`dwdIpzlCEPZIOpRH-j5)Q^qzrDZ?|dGZQ_(h*3l z_@CBqWXlwCyMo@_R}tuJlhq_>_CRw>bN8E+sa+HAoJ!!+9%EiMEd1?^zr4X7!;kh% z#Ai=+sg)PW$?@;khNn-Fh2J3k}n@el-raUMySb<9V3GkRGU8Im?H&@{Zp(+vYA|y#HAz?z2xLjx(AuV+-#0!R1<>Mzb>KNWE}kb zn*N49GSF0W7yX6p$0{EuDph09`W1!cIS7}$z{m2+*$pFMQIQ~cDx2+P19wQZC!brT z$%gnP@<2AF3FxJwEd~y@YZ-z4jm6MlwIxZ?EdPF!bAkpst$myYfB17LM7pjR`%~WjS zf%`=d=@rJKM||wHLH8J1A2kr1$jRl~EQu{}r*hss8)c}?Z^wliM!67_qvA* z`0CQPc*mVxb!&+4E_tBC6(cVhl0$wNo7^usVdSX|ydgVKH^_z`5AK-{T{Id7>=wr! z51Qm(ajqlzYtHq$rnfM`4I*`%VXK9@gw%`i1Lt~E54P?bfBu>o@tSk-S@*=Z^0jUp zZM=E0S$G-V_#A^p0qe^@Gn?1BIaVS3Gt!v}iT<%JnqcF^=bo0Y9PX@i%)$9#3#V@g z1rCNqy%BE0TSn=LwqQ>C6=1D%_Iu$Kqdmff6V}rnER1LK;%}el^;LAxCdI7&LafPh zCbZg^NTX8DmlpTw0pC7El7(XQj`E7(M0L{2CnYCFNC?ENT$4q}JE+flky!+?1`&%a zLRyk}#niITYC&31OCZ|BXg!NEy{n1Y zU@=GyiOf)$7=4PU_P#~DVxl5{VWDu~IEBLY<8vSP_#V}p;gP+$&H8rs<_7g` z)~joLr}xTVG6S*d5j@ldt50$Pn-cdlx77*o_ISOyt;*kDF|LLPlJ!|K3_F*am^~JQ zD3awNKY4c4#7Jy`b=1U2bb)VFV>D}9y-^?2>VP$5oKd2uwdi_oMPGThb zPVMy(l_o|HSqEXh3EQ0*J!mm7=yZ&#c(dP|yHDjfQ22_zu=y|PJ9$O!i~4Hy)VKZ~ z_p;skUjKZ86&A*K^Iae}ixb1yy+O!lv4~<~xKOAsu_D*FH1};vM?0-;oUrF|OLOi7 z$kyP*PhHI#oH)Q|)03TCKQU|&-CB#Y<^9S%M!+UZ*{?+I5kYQjhrIoj@*x^R);`ZA z>30u=o%%*yv^v`6%jdg$ow;HjQZ+m-2I<5pxtIdquo6jTF<1FL1^r97D8*56*)v^9 zUZ?zrgm`b0mt39;f#F}G~Zyfh!iLT5d zN*|P))%|!`ZD(rOTuu@Dn*u|~CI)Y?z)UbHYF_-P3FbNl79rV4^HQ?_ItRd+ujXDq z4-}ZGLrh*1JVxroP0inNyLoTM)i&WHyjdEwQi6tFN?6?aD{`TWJF7Q0PoA{pOnG+t zj$$sFq%hCECG?RKkCe;hgo1KWSz%l#<6lz{&dD`to1T@;O2F^hA{;5FMdYsid>Rc! zEjWYM>-D+t=%xO7e3tb3ujhj&@3Z*eX8v?OmBV}em+>t-H{ZRzxkCvp?akS_ZZgzS zUclv;8tO|NQ*%0apiF+2$v<$Wv%M@AC^xR5T$(CR*X(d-@lr_+`IWRq;OKnm7T4HA1r~$WF<<;gMDZSfSxL@W+24d5 zocVAq3h~A~Vwbf*Js}=e^>&$+RNDSZe(amK{!LnX;lUM;qxbR#`Z6YAz}7wW`#Cnt z_{VfO7j1Z6mAp9_wg#Pxo^lV;Ic_{307@pw8wdt%-GZ8PS~Vf(a!~vy+tdttJjTn` zv^5OKDYvJk#sH`xGscTA^bTnQ;OGJxO0Yl0z4=1#&$2k|5ES?5h2ApnALAKoz4MpW zw6xyFw7-@lUA@qz-fS{0?az;k7kN`@f6hhTEUzJMy~vyHLSg)oi@f6DaApS!jSw|h z6&5=kELu`n#D9O0SDK&E#cK`O8saA|a)7{&p`nxvy6a-E>*zsbj^yPQbV;ay zniJ-Nds#^eQZp5^C==_p#;Y&(dg$Pd7kh7RwYIW$et)soO-kqcyplH9)@YK+mE+Ui@6D)p^x6==_x)b^bl0|C>jX9e zS3}a6o;FRu)tW`Q_Q}WOudp2(D`yOs+oQ?U%V#%@CUpFfd1|ecwO+cZ6ENC_MQc?+Ig$hp^|A68{*6V z%=@7CwfN~j^Pb}Ki$ACM*W;cKdT;dpDPI3U?;NWB!3VvM@_E;Xybo0z)t%hh(87w3 z4nixIuay%fXb751ME*sqi@R#*R3&IRi0a3epd`7!J1Td*-W3j_I&x#2f^x~V5x?zH zZ`!*S9hkeKd4jTz4v|t4W~JwU%eYfsCdo~Vu6~Uk%~hLWJtve3VD65&FtkBkX`PyD2Yv?zr5s_PHX%Zk64u=P8c zj{4Pd!LL`J40p;vy-&*iB8x1@ZtS4=00P70nk>!H2oG3~&0!Ukq@QkxAFgd%(GVj81 z8HJGz@!6Mq3u&qUa@UeAH<}o=#3s7Ywe;ZS`)Ns3*bw_ySXYm_!kb4+=U!oA%KNYI z<|c%;3X9k2CftfGQm^F0es48UF-12ax@|BL@`_N9F`AtcAXucQcM&U-CBCdBRaO-C z{)<_Av26tlRR@vZ=OGr5r>!B#*HsGjO%09A4mNeSk!5l24$lngj>>(O_q1e9*W}1a z?G|Y_tYa_N*PwTM2YF)QSHrmo`#P(77!7FjATjpLSuV;&I~6!ShZ!;~EtR$Mdh$8% zP&59^^Wy|lJ1?@F(?!Wl?vfs6tq{fQ8%gAJ4)(T3}JT*FTe3s$a)ZmJEV|A=m_iBS31 zhrT{%QG9)xw1@yt1pzTe#pD^V%PgV1#g@}BZ&~7n?^Lk{vVd-@i`yV3W#mPykRmN& zdJf=BnxzO8{(lAnbMJis5X6-Mo{}&;L%6TSGr`utCIS;@Uz}T1ZtBaQEu`SRcCVBZ zz)Sum>E^2<27N-qu3l(ruS?4j1B=iEbVW|AI?ryooYhtUhFfv_RbJOg^!ZUS z5W4l+u;4F zcjh+jix@IAA%+u%UdE@0YseTLf%=Tw5h!Gwj({mB*~>rEIMjEo*XMP$ls%}80}63` zs;s-%tzEg|SBL61dSCKd?vWyz90-sP#$UhQyUn{Ne)kRDb>98)-W$C8E4wE**mHyF z^Miaj@X#BBw$1lfy7P_EPbB#?bx`LU^wtT8v&RhWIi2{uH+!u5 zdS8llR{i39mhETKA+L_AZdH&CN{Ly-%ck4Lg{snlwAh!`!i-f#! zu{q5fXMi_(lJx!P>r&VA-pY-M1Z+Bg9u-7 z8Ar91>ZmyD<%dDNnup*yr{nA*q_0DBTiE#WmLf(Ne=Q)Iu*6s3BC=m6euGMeHATZu4}+S*wPN`Vs45Xnqkw&M7uzT>dVK*6a;WJ zs+UQVpY9l_7UU7fKyOmL4l{*b{9Xa3A#o=sk;1X2^g%f&zYuTzm;7Pz8P^8cV`TNr z4fgP7#NMmCNeBJ#U)ACuwc&Ux^@%e~Nhmzefq@$hAVjB-fr|?!FzU%!I1Kbsr-2Oa z!QhJGA}w%7?warpanx3-7uzYsx5Wp4v|Vc{)5T)(;&-oAdKhNy2yg0&oX0P;I4z3k z@rz4yMVHjFA~z-EhHYJMPMaT7DRFN|h}4lnA}7fBRmkL`X$rR`>26J8=}1xI;IU*$ z)SRG6k7_n7sZyW>H7L+tXH9H%7KvhGuaM7<31217k&D_z320+EixMeqNe@6i)=;Ps zUL?3Ak5l_A^)JlTm})@Z`7$rAy>1vkd2TShvJ4>WBu0|7IHNi&MB^k-l1lo_@v?|jSM#xq>75%aW0gdm0`t`Z zT6c$CI#oT|56*>WRTt5Ew}`${SE$*JOPrF{!g1GJC2cgaXGU$A6>Fm(*itIH4s2Ow z#k^Sl!fKZ~e4e&H%hVFdLd#t=y{p;em;>wVe9E$nq8lJ(4sh<_O9bXb`XD}4lI4|d zt9o>p{OBR)DSQ!oAH3=TwY<#UTlQ=ZtNN3QRUJK5b$qBUdEWRr)YfVX#md9i*a8-g zTE9AagJt80XIZ@D%lX5)s}@7)@`NhP?ZR8)OTL_+IU5_2@kfTHXnBOer0YWbib1ct zZf5i5`sVohQ-aR;szL7!bAIG8hBhZkPITvc`zT}}6vSqc{Mc0w#ErLkm!a#s`Zn)t zjsNmL!?|clH1do14WIVjiRSM9PkWste(%%XMSNcI8Sl>07nJAFXvZ(uX-!1aH72~b zE`ICh@{{6!{)G1te_+edYd-1K=ev*3yuU;Pe|KHoqIlKq-aGxLu8n7Y z)|(c8?RM|=NnmFC*1M?u^|p=c_oA)w8K3o*wG7-T;i-jg@BDat{b#*H8k5J`@4F%1 z`dRPv))Od@gI(~rVey1`!sooXb#t1(THku(ZL>S$_V4EFhTifyZ&^@y@E&Sk5#M^J z_vXS*_xqVUy;;-ds&s>BL$!qPT|kINb@}JncP)%(JQ$oD7w__xa1L?E5Au(DbK?vC zGv6V&-0dBj-{?1gEpB~FzCzY(-;zIhXvIC==|TLfSNkWDW%+CT)xp5xBjdHxgCpa? zEr8-%Ti9S;9Ut>W?<5XyD_`{fY}zpcAEj%H7{^?Rh42K6Sj?HRNLe#F_yuxY=T{>h z`zuAniyz`lfU3ayGJbT%st)| zBL8E=JHN0&WZWN@_IQ)s?>+GsN4!ZSFL=_*-26lDnoi4wVk_v&^*ufGn`gez|C9gx z*IZw&NJIbQO>-rS@nt_$$)O8=HS8f)5mcL02|g);8eK$1Hy#v2Z7ybqtEo7;Cal^=*CYd; zQ8kT>t%#EZb*W=?MH@#~#4v})*0iU#rg-v?y+hA1c#MFI3~dZ(4Sq?=m0Ldg&;6JE z>ei#u!GH`ZvF*3N-2T@;{mHL>;U;7KkG*rdtjgj2RvAD2W3R(y7)&yZsbTSdd!Ka~ z*e>m-Q}L7koz?*R++QDN?e=~O`n3N9bhoZ>)TyqH8bZACC&Iy@*Z#zNIw0;M1YObp zE{A54?A0PEHh=&whh|lEBzVOx(pw$B<_XTN4?uDEKjFQJwEa@tJNI}u{b7n*^`!T$ zgQU2({*N~tc+2AQue>*PECCiP*OWO%DY8mSXISnGrx%ySxBSYx%3BhLzxLMf+3;&` zU90kfDrJ0mkfC|6cOEI{^RbjcpF6T#Qe75*cdvIMDKmcK{XL&8zx8It&-}(amfy$z zmc`4W-pXg<@4O56^#9IN=tsZv-o@wm-;@14`@A#x{SW()O)ct;jZ4Bp*iH3I;!pqH zTTJZE-*c|DB(8fJF1sW?@o7cgT=M7F;c9_gpL^Pp|NUw22yYqj3!n4f1^IARQB^(n zBDFawKK+Fi@BZT!r^CgAY>^@p4zfrsh}>@~VLD$3oZFvQaoSz*d<%NdtKj&tkB^~O zN4((5pZCzl_vb({G%@$Z=x68is)W`LdtL<(G@Jv)(@@9rYKVeu2U(CJ3lFkLZMUCC zi>~+|bBtMw2Me4RUht1Lj|bINfFC}GNq5=eYZm+GF6lMd_N-zrm-Y3tSpC`Ienypx z@S#@hU7lk{ugl1@a`9nD`WF-De2?#x@}pVa)+y)?saD*D#-@!8A#Dd^XzROjFM;;eYxGSnL%xiS8W zWhm}%iDw_Dt#&=Ehb6>VRQ6;)Qh;IJ`)g2#y^%#F{>t+TbLl1;# zs`$+@{yQh%YsnTx=9^sRb<6$Zz3uTAm;1e|I01aU=T)McKEvK!e^8rYmu?q+P=GL| zQ(AM;My2WxsX9CZ1nm4G|1?a&b0m^Yxv!5~bvW@v4>ng4UOv)Y<@m=Ck=Jo)llU(m!?Tv9d2J z>hPcM;wOFHrcG zC;D$}rB7_&(yVWOng3IghE6@nU+MXKJ|16vvi~7p z=~!~j6HVO^O^%wPFA`O}-fupNyr86XBiIn-BLCuYF1q^@57>DPHEj4q{K=R5@2tQ6 zE`a#SyW;xO{Kfvq?~0e7=Fj)`#P2%IU*}(USNtER`ET-G5idL4e;?HLSEu`{`Ak3K z4-wsK&hTHUNxkz7|Fz|e(mau+qcrHwi#FoL$Otnoy~2MKrc*f6U(k@KiALfTXZpu> zKYE9Th}ldu(~bFupR+Nei9I2{@l5||q1laR`5*N6T^|?E_7C^ULo3eq&-R0-HV?-W z&i3a5{x84Ee`js@v{(CQ*M=W@wZ9;~{WboPs$|z|ps-nS!)yJ^y>0Q;uk}lO?s={M zWUC&bcYb{6&9C#H@C)0WO6Qg5_`NW;kDcS6;NSQ8`0O|OGveLn`0w&J zS>R0SyzPzt?4aEI6{k@9?Hm2KNQZXLoBY-KK2)fiIWN1~eh zf4koSyWaJ7|J8&RyuJ_%}@W>ED4^^P_+K3ZDnDDf;`k z{hj{2;`YBG+!NjUw|qY3M_-9w{!V|#q`QeVMOp*LNETQeFZdIGU5X6%#drLPfAV+= z>%a4schRHr(DZlt#|I4W^{f3QbMAYX+F;-C60A-b8{U)JQX-iiO^Egkli~XK-qrqb z(^w|gmb}oIcPCr5&*gMp)#{Yyr(-aPzsc0za4s-80pCyDGSLBJlTcxD3 zPjk$1IeL`ia^<+y>WzPLsej0XN0R!Y9S_m=^yuE9jt~3q@DAHY9%|OoHgsFXpOvq>+V5;x5U>5HKP~>@75>LiV4uI+;G_O$T`jZYV+Q;yiMoFP zZgx%l-GQ{+?D)%9`Dc6A3^jkuKhYz{nO9c}p_Wvk+csFCuWYCm`s6jN540G6`+9$F zeBDR*b>y}FS8WWl+!!WYXJfeay76Psp;tDBw{5g)yRY}(Pd9G5-gRTw4gRO;=m&4~ z?-&b#BV6ewgTQe&`F~5keV_4X$DKF(ucV3#ZuT2Al1pw$tC$_15c`)A^+0SR`H#3- zXzL~`)co;e_@Ag5{wLk=Kk0`5$(rHcnht+38~$G;!|zOn|Ces~e>r~mSoqZp|5I-G zgKqeP{;BHwf8OSQ#tnaVy!q4qWn*E0Wv8leFnHN#{2>Q}4;U6qjo01`7X01q{zFu? z{1d^PtucloDT zQxjZMKfBBS2Bn7X#&YJG_)Yit>-c=@9vhj}@rA$gPp=3=TbrZHCs#mDuvNC*JZ>RhMZj_HQ?$Pg)b$bd8LWL}Z=C&@nTS+=jW1r*# zI{DJ6bqYdG)#{6Dh^!|v%dWxReRNW9h{1}oMAV<(fBh*NyY=CrySMmp(DoQ?&A1_k z|Ixnq?0fy+7F<7v&i)(!YhyDE&HA$6QMaE`#}5tsga7^fn3SQ5zUu$T^Y+EB{hI$P zZ{N@vU-uvMs(B>x>>HZ7&Hr1!8rfu#|IfpIlTV4qxBHz`Fx2=>|4&sB-&sTPxBQb7 z`2G(6c8QNyeA|DozE6GIpIbeWbz)>Z|6ly+t&dd2|LvcMU->Wo+2bXu-T(ZDb~VE; z#{qXWo6_|C?`rmKw+1MF>%aP^AC2tOXtED$Xy4_x4gUDP8wT$E972p1=tf&^mD2yK z9an7}`R12wRgAlLBJ^#Dm+bUU*V$5Iq%{|d-!T=$w~|jMAB`rFD8rpU_~xCT`-`9d zg9$|OH+TALsb}SP{OL!!=2(1{ZB%nAk9;w{_|@O>uc!EofAc#QT5(qT{gobHbm;B> z=0D_9cENXD4}Hi`r$&9B{nt-kcK0*){QM{G0PfuHvO(PtzyG`b42_gSDSC*|)c3i) z*ZucZ|M{g|-*)-F@LhlUF_u9xjxr4V{Gr`jueIWN66~{_FV0*X&`TT@rUZiP~jJ{Q4(B*d;>`Kk1(l@a^~|4l{^;;Mc5cONLtZ z`Zsg>z{p2Hf_$_Ua1@seeepM%hNbZv_MzEZHuULzY~tHCkp|lw&{-XMI-mA8c-}Gb z9nbi$K7I)ayGdvUd{+~j4qHzax`t`_YbxT ztybZHTM*gJvC*%_wYxZ67bI~_$pL}DbKOK7x%1}0r2lY(E@ z_sahxCH`}AFsH5;@48`J`tN+Hu{El!Dk>ZwJtdfvw_oS-tD;|cbn&9f$r@BjDH>t3 zk^-qGTW~J;<1c^ZJ0Coi=%6-_?}{hMr;V*5$f{_dimwcR`nP{Rx{8WQq;**Ov(zCU zha3L>p{Ebn4Mfj-V5*j`f_mEc!_J* zw^NC${s4O9`?4HPlRdtUL6-xeN~-Mf>Fcxf{p+%K?@0S_KwY-WaX_i>-ZXvxQr{+* zJYlph`%C#E)_&p8>!$_BGzVX5G9M_D;&7jzA1WReyv<+Eriu-KALV(&r7oOeck(9U ze#wi<=c9(=Z}BR!*u@9SRNyaBrMmbF#{|=kyLIQV)Qu1Fu@kJI6*J!C;9zGG8SVO4 zG94LhNW<%YW`*v)r6)MFQ$2vrL)q=1MMv487X6iBL%ec%Fm347J;CFCvpP|)OKjyS z@#5p~^JG;lb&LRjpLZKw{H7yy%IK|B-GGLD6$j*siJfg0)!e` z2nY&pP>|lFOjN3XpmYTn6%`PXrXXT@iUNv?g(vz{?EF7x?%uFL;QR3X{?X;mnR4dL z%$YN1&NN+cGpOK)P+s!%PNRa?@$N2x0|i&xYw?UY${Kbk;5Q40(^bR}X7l`C*5a29 z6zNPIJ^%%5QCAmmTwN-lT3%O|@U^;D34f>uRUq0f5XwclZU}d)++6Na+dFXuL~T23 z43j$Zndb77>fh~nV#Mx~WaQsY^H!MIv%2s-M%Hrew~+i0Hj}>b_041SEfrl|YR{|q z>v!c{&1&{q!rOrYp8yVTy7xzXbggIw$h()o3Vz(u-OFr1?G1rVW%h*sjpL-vap4HW zG9R%e{&mk%TN?4C|Bc-g&*9}`gZPawYku?RME-#?~iJp)fAjFOTE;TS1yP6 z-pw3mdvU}94(MaJInLw8@o8$WS$^IOqhC11I!&>{Juxb`I#1nj$8Fpwe?#UAwAIXz z1bv;6Dr(NBr4U2tdn{amqSHkOSXhce@ymI6bx_vP%drF5Kh(=N{jWUOr6n&{!h<1H z)l@vqgVS2_&xi+yw${~gxV5g1-&moCv@X23^nf~UN#!Kiw~zZ zJo>aLnhYAui0-^mT+#b`NmYRPHsI14%nRN53d|OI^ngmfPEG2;N1LbKQwv@aDN6Q) zOy2mr8rGB7F?OmIJ^2zSR<(Qa@@V?*y?9*;oZAZt=c=u}_;}-#s`3POxHs#~J;qwq zuQ#uKtJheny}fxW;E{beHZiMHeRw+~Tc!2oWARzom$ytWo`K#=RwLZtV0bk|W+Qs0 zWFrODQa|?PwPQ*GATS^;v8Q03YIF|{fmrGN{qEt}hOt{MxR>Lo?C31)xYz2oH1*I7|hK;+7M5amh=%i ztx6oqr=y)$4(0iTB5b%ukv|;OHOs$aI7#4H>g)*Z>&@rw;X5y%UpCwCfs`kEB(5NV zmEHzoaPHw)0Kg6m>}sg$E&d8IX`tBoHRNVZ?|FPQyb%Fj57gb`qxr@Vd%RS>F}%Ro z?Ehg57Y4qU$MQ~Q!vL;hU;H1quED*|Kcx`tWnOwxjp{Cbr?2}y9-DmW$$c1;jW`*>@9))`51D^0!WVP^9tax|Xj>FR`!yNzenIUmn8o>MK0_+Q3z{uWbt8 zX-%GzYj#=)xP*PcPBVkyqR-UOX?%Z;TT8Tf%j^U-dOEL^_Ea!3AYT&R zLD`S+)?o1QkML;fGBamzAF4NGChuW*UJ1sJ{GJbnw|=%)r7yvqv`c1TCIzwLdCZ6l zPY*%QYVi;q{@vyOWETI)FxIP6bHGdURGYaxEtAGXQ(t(6a~?Qpt<^wOp0zOmN19-r zrpt8Z&V^W5ul}0Lt3+C9a8&0H+OhP!YA}yK1hMwwJYE4}?aVwr2_@(?pPOWZ>AQe8 zK&vlVz(T-6(1?$uYpeOmZL?-lOhWLNZ4!U&4O{re#a{z0p=d@CF1f%y-~MSyYf?8EK{d z+n4co4PwW##Zb`JswTyJ4AEK4PZ+!X4?c!*DDCF$sJ?kz=LhkQ3nqS7^Pk`eYSI%t zCID0^@qGIU{;5%0?Oe|Lk z@O{)pik=2M&%f+x-iQX46VLEGeCluF_3+8xM3DdFCjOO?M0|(w4OgFfB1t{O)uUQR z#^}8Tf?}Tk?yY~n<8=l?NB2)bWHX8Rwz^lcJPXb^Ysqi27$GoMgF6atL-kn;_AqCaTj{PE9&0o`ESN6{$76Ean<3U4qRVb107fy1}f`7;C{8J zkoWdC>?Z1#jA-$CBn!hxMtTMHa%lUP9#_5|BK!XwpQ#$X%$IrA zA&-)=kHqQKJPq%X3xVN5yuvdrs?t@*S7<0!qh8@Tx19ZHNu8cbS3xy;l}DhO{B2+5 z;YP@MOXYS{XRnN_$Y=!+W*wL9oYA-r- zsD-&FFdCUy*}#CL9)FD=<|@QG$Jnf=aQJXBtl3FT`un=asaVH=asI=SqNbAuR)V=hkVkm_@lkS#~-dHT3l>pEPU^mtwKwFK{2T)#v z&D$gxM_u4h)q0C0uYTDDDkfF5Ck!`=I8g<7KS6Tc^0-L?WW#{$7@ln~Gy`gJc)Ag0 zHuwI4HEjpbOz17L)$-{ggcR3pz?sRZlIiZe4Ake?2(SbiC)7K6YzCwD=jkRjQt09` zqO1zoyo_W#l`xu=ZCzw}% zf?4Z+_1Pzw(eGDrXY{Ad8SOdy46m$SILq6+&o2P!w7-d3-f&M-vF9KO=cwDx@x+8_ zxJoX|9GW4#`&eg`OM0>Q$~{MoI>!ea)BNwA<4+r5KN1Gafu=jd7JD;e)bh_DaQ3SM zpJ9O7ucm&^Q&s=-yfWOg&+{UDR*e_Qs^aIoj}_bupS_>+Mfi06f{(VKMD^hpypB5h zFW%*rC6yj~aYNIr4`E1qM*X>-m;c8&Fjr4jyM-uxfmWArvy&^G|Gb1dVwb(H8T}-Ja4iM#0C(8$j*NpxC{sRS8clZ1M93(oK@a`}~Jb256BT*i>!s-t7 z&`>expWkm%PQBREhy*f!pJC!Q115|ohKmDH|0dO}KO{dsJ@H9ai}FPt<@x>y@$`*@ z{lDa+T(?}Hz;i$ToufrAHs@g|9RF!cEeJhM+ zg`I~)|69h@@~~Ck8pHC#A~kyZk5oalAqgK3J`p&$F76?cb)=R@#7tH89q}H2HZER0 z_<%@QytPuCgyrcHQzyoWWW%Ap87Js+X;~=h*8nGC8+AzFDst=;f`#3>B?@v6qnW;m zEJTY*)AXslLQxS(J5LZEwW(0V!o9ap)G$6#-xZ2fe8R_zO7N^RUW~v89kyZ(dTN+% znAX=d)4jvkVKN6^tHbS zgP5{v{R9!|!%JW_AxSAcF30j(x8S0_>??5fr3DDpozF@1Q5G2M^n_Mm-vS0N8-Y=R z;OZT^AsA~2J;qmT7PSzNA<9DF6WCPoKVcBGH2M!Q;MD~>lmc_B(3@3E_Zi4wdaDX! z1zjYI0cNOmGipeN=72yYL+J?I%UG&-c(#e^2cb4Uc<7ouWZ|KwDFO*%4lP7+u#^y4z=WY^pzt%TaQ)qsK#+Nrm7Ak8;}Oh6}HIc%pJxS$smU1t*84 zYF8P!Qs9ctq3t;+t$+u%3&9l*S0Y?7IV=I6P_GG(cE6(F1&uBPf;fcp^V(6o@ z#kwI}lr3J+^57aZx|uFqXN$Y@;G%4C!%@othRkcR5p9VGFr5dq@n7FzM1fWWlJ z1A4UUmW4TS0kz`a$GO?}i)x8j3cnpwqrZo~b-$=Q1VTQDTSSmxr<=t{B+yvzWo@XW z2p$eANQhUYV`8p#di}PNfmsEjN!%L;BPjXf&My-3klmPEywJ5e_6{Vevm;`puVJ01w zqJf&KXog6supRg0(#2R(pQ^2Ic7Y2XGzc~y;oV5dD(ILsZyvK)$3$H^J!SE@H=VHv zohfRTlsFM3Zaq_%cC z=7`5o(dlzVr8cnjd5!dN2tWhJWy9z(fe25uccxtp4v1Y1Scii3GS3AHq_fBrxbs&4 zHP!sNBHdmiJ!FSRd(Cz@yc!3DhWngBS2YF)(Ey*CD@7fA2CdZ4@|B|bRXc$Cd?mQ=po&^0S|LvNRk|pf zSBVLLfILlkSBsW#PhTx2;`7&Pk%QbDt=753cSSRzpz$FqU_)6G&|H?kLuj7eqE26JF{L-RN$@x17d}zL}PO^c3(Xuk~)Ua zIb0Z=p#H%0Lo0aXvP2h#;+ZAAc`{4@xXbK&9z`Vw~Tn}K~oi}46a_BlgG?W_ypR5hO#sdWQpNf1f{ z3z-}p+F}NaV>&JF!#W8ffS7Kr#smVI=rOEHh!o$AEs&a0*bHHX4AfePo|(YdW!oSz zQn^n-`3%fZw1T5`+Mp2()RgEUC??rMsS>NRwlHx*NkaJ58prMex>MFmEJ05{NXu^P z!Rg1~aScGJaV-RVqz~c*q*U?umY}nx)=aYDK=7^L((u{;X&TkhX9T_9^yxFYYgF2V z5p};x-3lYnLz{FTzqm={kl}}zGkEHVO2iOw+h&oZ9^WiF>lH%~ZoTJbS=N5vERy43 zQX?JK^fn($mhs!hX3%0{l`W!bBbvv+$b>l^tl>x)Y3;n2wh;C;+LWR1rPGk!ltHU| zODL?T3j31x$I9=1#Gvers`jSHL;o+a{-UI27gkO_zFv^C0_l%!eY{Xwec(7B-O4CEH0v3SWk0c z%@=ySd)~6IdHwo-g4BxM?YPm`eJ3j!Jbozx@w6r4+wTyLy}fkG;54~sQiH{*`CCNY z6obJ;phdyoHKb`<#TpQ?dK)$?G~OoMhE$ifX>&&IHbHhpgmgAUkY`zyu^oa~hx7^; z!8VDfw~MX__+z`ssbrVvs-}!_-g?G>rWu@AG~85ucWB9WW{YTolwgz2s?QD>XYj(( z7VPm^v_oeF|4zzyR#YJ6z$AUzfO1e19#Dt6Ju9AqV)e(fViZ0jo)eQI4qzzu*6{vF zBXYFLJ;1w1Zk!(Uy2$G3>fizFv6!PSAHZ_eo=4Q8LpZ^ z7wJgI(2lVEYJ|JHUYTj%ZV$1G#iJRxA+toK#|rF%U>Ga3Dj4<*_pS z!ON*n4sv(blh+{sFc=2%PlI6~|2h~3@*jd>Aiq4*Lf-EUAYUIG2+Fqv!$7_(7zXl} zgJB?lJs1Y^BN};j*I#A?)d27o1;+#4nZYpdE)0f&w>TIE-W36&a}V)MSJ~1{acKs% zRi-*|h)3P|$~74u42F^MTfs0gelHkC#-9Yk$oMnmJ;Xh^xIVo)ge@j#bUO(yj0lc~ z@;w#|BbznBFtT|%7)CZbf?;Iyyp@e3C>xAM-t&)?uEuYJVPx}TFpO;e2!@f(v}>}N zrL$3YAK{IoEoqhoo`y8@;FG4-9N~j$tG(+e?_&I{dLQLY0^&JQ-}Q^DThLw6dr8c0 zJ*pQ$&K~7-w)wZCym?9QIgMWQ7O$zM9pi2P|IFuv&ZlG7*}=s|YdjhZqnaKMhEYvV z2E(YPXM$n0#L|BdPMCw&a=C2 z5B3M%-N7*M?hS^4_fRklyeEQT;C**G5uK*GoZw_<-g5#AHgnYHC$L?qn(FyBABNBV zw|O^w5>N7umS;8f=t*9#q9vk>0#Ef!h9>AOp1RN8=R=B{cllKH-btW5uCAQqx0x%Z zs^;(TAL(2F6hCbIud{VN$Il#M4@1a8gjH%vZK<+*Nhr04EI{SeAoaRRJ_VX$DV1$ZOp4Tv9 zL%)6vXSx3K9CkG9S6Mstd}h*4@c^Koc8c5aX|hXSx7%%(9-=nx5_R~N>KW?okwyYm z*&b9zMINIb{~8;IcHza;YN=*(6SQTSyA858nYcAXE7mmp?6sWq?6SEBPfV)w7x_{j z;^RMhkxrk z=;>fIto%?hM|iQW8&o78s_WWP{CDIxC-MW-x4JI%tt{%B-;8=6E#Loh@@?vADLv2z z|0ng5>U(H_dLIG#9vs3fUHN!LFyA77=(Xe%XJLY)>l*4i^Lh%rKeDS0VDkxv1l$_P;r5V@C7l~%^M;FsfmHWN5oFVM;Um@VU)hS9fcSJsshbXNX?-iqtRSc zXcc5k80^;JV=U&I7+n6zR`Y>Th=s5euaix-l1(H_PpH>jSOD%T#eCSns#`C|E;~G~ zWj<{8xH0pg^?WyFJ}UEd`%V#t_7d)!h9wbdzia4+x9&YfsP`Lm9~p+17pMvUmm=sA z+=v0MR|3s|Gp!Q%tnNP-=E7@>02YL|F2c;46@liEkV4)XZ6Y9}s0G?#lSqK;?jR@p zXf|9t2YNN`!^5o72|))VKv)I5ZjQx_;jlpvW2VzY9EZKrU6vpW*PD(=Y>>?75POK` zYU4qLw;4;_fYvSyud96uiAQpEr2Q$L(BaiksjvDdcUtJcB-U$P4T#yC^x&{HmiNei z1l~fyHXNOV%zapJMixk)frFpeEj|K^NLP%pz>5wZ4s)Zc#ceZMgtpKp`@L{mxaW|{ZAZq;9#O;f zT%F`^7{-E(P!tdgOLXBLo}w_kq3z&-9!pnxTg3)0Ug#~Jw^uK#20ZD81H=iTf3PV? z*Mn7qSegq>H*}jh$%^2KqdA{tAE(DQJO;{`;e*ws6J<@UkN0A!w$sCD7%{3d1G9AP zSq^>(>!(`*OMD(#01wDFqzS~O89jDj73EU^g=FCiJGSkpva%z;?M(|#~6VtUBV#yB)UyF*aOvsmnlfbXr6+2 z1y2!6VG{tjh?)s_uu4G9jt?~x23J(CcN!|v-OPuE39HUxfzOUb@A{y9!l2;5NN0`x zmS{#NNB=-fYqYmU8r)0xHyNdSIK4_`dJV*fbY7x6xb-qFWGt}?s4zSoao>NSTSDrh z%Oj%h@(XX=2lFd`lc6`_kid2uVmSG)L%N8UZBKAI?A)onm?i0;;w<4WR_2b5SjLeN+i0IQR&#F7O#Bfb@pu4=Way|N8)ft!j0vuF~e6eG|!%;uf2go$& z(ZjnvApAmIfG$W4C?&K*Vy0ay0)1GssNua(5)Wh$DZ5J|0U*=bM%x3t6se=wX)+A; z^{+goUMMtdx)6l)Y4~7@v+v7KccZFtqyxKZsM^E4Xyp*_WjJ=L`lx-eYzhA6o`~V}Y&kOQ0uIF& z+cM~IxEr{|1n(6ND=7vKHWC{n;Mf(G?={Dh3Xgv`w*Y56=n36CWpaz6MQ`r;(wLG_ z=FWhyv5Sqqgwd~sF&P1nH((cu3JlADv6)Ji;cPt?1ps5}Ne3}xYmdC@rP+(FWioDu zq(;8f`{6DCwV|77h`r0AI@aT&aW?j@aaYk{CbU-iFj(U=RgX%OGh$j4`EWSr+UXIF zQiBFh%!Ul^ed&j)^ae0*OMTXhdw4UP-W@-Mj7Ib0gPMacYnuXba?u=vfq}lGXl(QD zxg63S+7DUL?TdV|iAV2Y=A^xFG)YI{gH#NPalNa4(HRWy@gISWj)RAw%VF5o4UQI; z-tWxLpbgJ`6G001mK>I_7nqG1Y?|rl&0n^#Ei}BZs+lF@0Zov zQw^H*q#!1bWcv3mv7FfKMT}n=zIayGI}O{9;KYk@*rZIZ1h^__7q-pddRy{Kf~&4} z(cz{h+LZ#=0SgZvp2Hf2_ALu%+f$Z14eryHvm7cI1?@BF*p+}=T6{_x15{djIo>t;KXaA$k^xI12<;LaML-u4^XWh>|Z{FGI+{2 z;D-p#z!To|O>e-9>5JL)Ui#wj-$wd+8t@bJjcvg9Qo1q?_-bJ}OK)Rb=A%27R12=~ zxb`3(H?El8vnU9T)SAOv819Z#*Jn+-ei@fAnpf8a&zr<8Stwt61WmLe#-~e+^AXli zpuW3;<7dXwOhJ3s_P(tD>qwL(*K4 zw0gwb9+YP1HE96rG}}onp?czFtVFv5iI$!c)qE|9besoF8| zZWI+OyKYn=Et8;tE_YM%38AWy-lC1~z2Ky+@$d@Q0~+`pvfJvAkdU-`Y-k-CN|evL z{N_txC}Al23rboU9S{qn`jt5VdyQu3;0*dbu!DB$?oo74cr;Ej)5GMj_JfZwzG;&` z4oDCYv}+0{x`ed|fG$z;K|Ms!cYZ@&pj*#N&R!H>SoOWiq5V@cr7 zX%>dZlK0XQ-z9u#i4XLXagpc`ASS}Y!wfnJVS0;j&R4zkf~a}RTdC>jA?=dhx01)J z(JzWgu;YLAqG))_hysTM{Mc@NCmo!NDJCG-Il8s^|w_a)Wo zph&sK>(c93M!cj#57O}yQY^2a;o2e**Y_$JfmH5Nh+ueAcODdp*Wg-tP^85Y5@I2U zbwcC9cIiw069=&?Mty%&bhzcp3aa&H>Z@ZS-#F^;{-%gE`5x1$qMqk*T;lD6?ayNW z1U3VB7*@leAd<<;0U^MfgR^J|hJpZtMqB7491xzG1b`V4qM>V1Vf9{K5+X;n)}S}3 z(F3UM8XLM(Ar(bIe>L@ea~MT%AUB;O2f{c!9S6P$Irdyb>7af|m1rf>4%&1gY zakasg2@ixL1h%HY${(5+Uh1Z5li7x7%-TWJff|n!2tf}`At)mnmVg99DWRcp!aAWC z7v?Rse#^oHdX;~o6LJAhYI}=>8g^V%{Krl3$8n)td~F)_c4g-86spJzR~Kq5gW0w^uzr5F-Lt z*r$i0^3hVX!@>XE2jZd;dl^?dgB{5-f?i3Qz5BAd^r5&bZ01z#N5DMrYaX$u)i60LU%QNP^i?aifIlVbD?_X6HzXqGVKb{ zM;-75M`KQ;-@G{c3AWi?=S{{0f77$#5q&)N^>gC)ntGch1{T_8Njy)3433gKxexU~ zqE053*DD?*&!=LY%jk0 z+=5bBPFXE2Gb|N#N=r}l4{C&2!#xJ#D8~HHy5!Rm^z@CCQ}ABEhmrDbK-q5D*XW?; zx@Cvkmv7pO;fYW{BM6T&S%iTLvnwt&8_ZfpRR}lOb;OHRubHIe(j^D{-EEMqd^6OdegFr5iA_nDh zu$Gm}lYv}p_+TIx4Xe3vaB+;IIA?k zRqXVtb)u}3u@7u85?)mu7Nys=MXBmKohaS1$mwQz>ia}l)%Zn~O_B+QN7YM`<#0P? zwR8x~=9b=l>m4pFlxB8sIF8F1#+`w;AfeA{cp)qu2gC63i6#Q(MYOfg?e^BADk$Ji$ielVs0MZuX7lGeR%9x<;s3^;%|A-XB5R-vJseNkTHzwB2 zP=BljfXQl7McLj}3@;D7cB?ll%9eM20x${SWqgV6U2$#}j&B^k9N+%<-6&2AfC z9>z{}aKpt|UzJ-)b~aY{cT|#LM%2c5x2}?n=woRJ-l*QpL`8q0j4avGm6%{K@7ty>SrsZl;=CPp10puw@7%nu6hGLGbSguNefF2h$Ln+3~9ZZXEdTahcF+&kB#ne* zDnX@I)R%LNuBvhanS%b?x`E8ZgD)fLb4V?1Aj>;1RdN%lYU(LRef9Cb9C0eNp$s)+ zGgW*;xwTP9met62-5JrV)H)=v|{;)xwVWY+%JU?&L zkiwx&)SnGyLfM{(LUh|v3i1Yyo{(2C$4D90#$QWNBV43!|-t(KmrV%?2?+- zNH)fdx4L|1BiFrEIIVcf=xg zcHzWfgGfXj!U#G7L_uHItY*U<0MmG3!yVx!RY@7zwyeQ23N<;0FN*XSft_!=U)fu7QgI6Bp?GkUv|AAISxqfYopZ z6YwP9k_2$C#jh5AcKoN{&JKb%Tmx^s2HpqQE|8B(`x<`Kd2EEQUjrWmj1||C@HgNN zZjzILg9&;EaB!8M2OM0$FRsEq-R2jrdT97-z`-@p0OF-8{A>an2E>gGHv{ZIcm{s- z2T=2o9o_{VL@;%w!TF=_^9;%>%o|vkHz@nYoQX%{WNPX}qFG_w~xu zh(~K$J-a5p1Jrb{+!lAZp{4umLu%q_4Xbu7WY@pt30d4RG=JCtJyJuo{Mtg6{aYkt zHbb_nO^U~smU0MsdR!~nz;g*cy@8(eni|(5QVaT(t)P1>sYB}S%dO-p9QnVeHRRkO z^;K(mTS?Df4yjC%@Q`YByKInd3xrgsrM=nkatKhWk3(wF?XpdT?fo%FYBe?oL#^#~ zM2*amNtuvvo@O51paBV#2Wly&Z(F-rKYSCAbGGW&O=g)hSYIk@2!5zn{kxXYvfJk656hjX_S_-cxw;@x zeMFQhs=drE0h)yP$$~U z*bG%Nt`TQNAv+wYrok+BX zfGY&SNf?cq2f?=iCcL}Vz7Dc+l%4Dac;kO~M|708d2H_|;6>io)|sNtS#e}u!HE34 zeuV{jmKtm`66vC({ApNab^+hbZK}F-0hgR^CsS2&XX!~i4X&f9!{1P&OEpl_JIkav zd)jy${7e!r6TfivZaZ0C{c`(FCtg`nPdn7SHmG-<=R;j&m+C`rbFg28bd#>nMvX6I z9pFY4vAn{etY=I0!CmrE;~O>NZux4`=2n5AafNJmzQp6Mp*8sDlj-DDkeyY`D$Rl3XmYJYc`X!TUMHskEs=pM31VqqJLw(B)T zL)EmWOs!XhC<8(AH2g@k*zg>wsTV{A%ErieDIhSMG4LpYi(wzmM>H8@~hiy@=ly z{MO*N5WffU8-rhO{5s*+62Hdy)y6Lqzf}Are!pTSauL6e@OuZp*W0LuV=fkfMztQ*&Xs1%|k-Y~_cDY#re#7t^fM0L??!xa5{2Jp&iUj@Kfp2rDvo-Kb z!!I1auTC3bH3sDk7(b-nuu+3Y_YAW{68<&*c$bv)WACbe-6Jz9jcUwTQ}Bqnz%cmd z;D9(V4<3p#m^mNHgm@mK(%xrP`n}R)o_p5c@?M!_$SY_GQ|0!P6&&w0(cyFY$xK;w z6=S=Uzn@HNk_AO$>no6ln_LEe9a_baod6a_po5u9o%n}%O?}g!A){GPW5y zMCc1B0W<3(lEMsf>^y@&`~0~h~lm3pQ>CQe^$ z#OQ^j(I2389>0UJ7Y+ls%ng3S5TxGHow4zV7~e~R_G9StJo+)lTEHu&aVU9#Lh}Im zH*Aj5A4jb(br`xB{6epQkJmKH^22#(EDE1)8l_|NVQN6GtYqYM4A*Sat_B6St8hj;W-UART2JUg>WtTJd!!`i8kGB-2k*gVdiUPhU z<&Tnl6wZ9i{1nZB8;Thl2DIXoFm3|W9B$<vlV08P|4yGWdBE$MT?k&O8y2d zmrU3mbsBstM8FDADeeSI#oPm3i2x(S;P=NP|5g<5C*=AsXy#2Q$b&=(DhXj`8k(O^ z0qgal@aCb$jR9sp3!XE}f*Zu)`=R$CMQlAl%pC8+KeY%|+8D-O0wfpo08Lk+YXI;j zG1V>%mp_2*JLkzaLX z>`SnXtR80YU(-~6o~&h_*`QYC$)Uzz6*5@PH6B(=2g^~dUPn)&4ieVaFlU9J5cA=2 z5)2*&+orjRiq-N-7&_6%!@h=3d$43=bqIqNaD+`lPl?>A+6<8ujCgEPFh+J!19w3)bCiJBxxO$qVH#oJ;w)}U8UvCh(AQ2P zdTh0hm^+`@aV!qA?4j?y*0gQiuvDs)N<5_U(BLDrPnewp3&=Rjo`txU$t`5^wlZ3d2}^Zu1FIVDn(q+$LC{J=X_ zgh-}r#-IhkJl3DM$oMLc|GE3+JBInwdNp&htY?1N&Hw6TdCaVIF~Q=mijzTC8zdG_ z)eHEXL;IPnP$FC~u)`-4je-6nKIt@kZ;oY*qE}4q7fS48#pS)!H2qmNswrp z7(kUwUexQ&H_-oilhy(Mdc?GZil`@yZ|W!k&KV+!Prk|#ELPHvS0RAO&^lOqN<>T|Hg1c^7-}tj1?>YL$Ykzx&f#@ z@;)kqYRX(ybpb_JKRhIR$_nPeT}&yHv8&*$I>br_`D>p$m3v=n2jrjBE5>gx#n+Auj{TccA}rZphCj-f|C zi9wA9MAu@->YIo7XcWEGMAuJKjLxtURBLQ|ypUK>Ei?(mHNpSr_d29vXU66eK*SaM zZWweQ;_clMNVNHO#(pP&5*=^B*!qJuI*c7<-Ux);xU3aXYrj%aYk=>AqWNyAwyt0B zAavJY%b$X|7lfZKc=B}24G5qzoU6^);J2{LT?ai-gRwb)bkL2_l?w4;jB9iRX}%!K zviUoB&|-z*OD$FiCEaMW$6|$0(v7YY0&#Gop#LG{xpr3RGzkx*J5b>$AFyo^goAGz z9AlvqT&Y%5{_2ZK@pI6`!@$dGRjc%sfu%<&6XPp9Yx(aSJrDi8C^aO z-6H*S-Q}|&X-u-E^YKNDb;Iad<1C4Xp70WHkFvb7Yf*KTAtgeRh$vP^=gM+&Gdlia z_1#=qIr)C5718Kfva%7ob3FzR#Fh6Lv47pJYR{8Z&4Wp*-#l2XyQ>-VFb=1v&GcEU z-kv8bMff2r)}RbxsZnl-67yvx-(~dS_0PkEhAwGoosktStuq8#C;#sNX0{}fXHbvN zr}E5v8d^6vI&88b-mC%1;J4fhX2TMKZb<%HD`9%=d(#5?%w%jeDwG1g$YQJ++5~QX z;Ypx;2JUK9S96hpXb&y!3&P#r5O1UT-i5o|-G*pz8w`g?M(#%urz4?2ob{Ms_)t11 zHJB4n1H^W9o$*Hx$62)TXHKu6;te_=%+?+GOO=Lafc0Dzh9K;9IxZeD;YbxjB}JENq0_UJ%3<~Lvn zn!51^QO0NxpY}PX18<_sziUgTg7hQ{A!J3bxdR z)FoCOAC<}GOH0+TM`gJ|(|a>E2)!b+iji?Pma)&!4>Q|x^nk}98z4e5>ltDnOKSc$LdFvP}ID%!vt~MjAOvmyF`6Q`5{bW+L>6p9}y#^Ublk*SC!A`de z04C?W8ua9j;MedTAb42^#wMs*i)E}Yr3aMBmoWm`6ZL+mlQQICO^Lp6A@`afL2P-7 zv02ZeF$&SJkRv22FA;460gE+Ivtst*S2C&Z^a!RU``|;9db6k`X3H)Z(l(*s9S!qj z2gqLY2=Wkv&@!vYo7Mv0xde4#&1SkTWbA%4jHiYno)`jzyR{p^r%{nsoTkZG1Xu1Q zC{a{T#vTIqxbwk=W=&w@L!lOvL~|bm7yfquGtr<->|cyodN@+POjMbdX^cDxnq!Bc z3+@MragP`x>vqP-<{p=9nEQS36y1kenq(a2Ah89Id5=+WB|}_N5G|Cfzz~J`;64;R z?*1G42gEgXCE;0u`b5_8H4U*2b(=))%B9@ICq6`7TO|-Y8#ORK1U2wGyjx(Dj7O#L zdnYqCmVowDLqDNlyz)@Y$H}W13>(aR5#)-KxmYy11j`9_9n?lSQU*X;)b9rc zhoYH=fj4$h%wL~U&6ddo-y6+=4X9J&km%oQ89Rp1)H)NO8yC$*^|lJgjQ1Z0u>?0r~p47jy_mIVaN7MV$b%zA^E zN}U3^-47r_{jp4zm%pNMqE!VY$7Y)K(Wg;;m7XA48&lJ*fk59%ULVu6PV@U9wFf&@ zlG?;$j6%Jq+*KA4^&dt=xhll}A0@Y$z6U^;fm(>XpR8H55r;2)n6bCfRU^~M3w6%; z0r1`T&%^5-C|JROHM{16Ah<|IMb04B;csEG*baRya)U6;0(4MbJ%_P3$fqvaF$jQM z;PcU0b=YFGS1=GT=4~Jfp05V=X)El9`!Jg>1-yt7-ereqK#hMw*7Ke3h`kA$ks=2) zckYYzAxIVt7?3`*p9ui7E2EnR0C4?PE1{<$Bs$tT8fqaQ(GF8uRAcmc&{zuiY8B>s z6zxrf1Oedle+>u12n0o;!^KX8Hbn8-!WwD5L}eOU4e}UFSN0cFN-)6mU@AJcg<$|~ z6TQR;b_3~Fkix4E!}cTadBRL2e*--8#bygI1rjBiQTUfHYi(I8GcKSM8c=(e%Q&Ce z4AVtbR3*$SXD2I!ap z5NU4!XpKr}JQt$yFn~wURBMqYg@EUfrbU0ui9vDFbJYOdkOaLi2Ni@)NH&9~RnZE0 zdyRRZc=i#-%J)G@f&peC550U~r!iMmRzI$g2Yn5jV`_7pvC1&O@?mID34vL8hi#3u z?XQ(#f92tmFnUw)Qs5utg}4d_@E{1?d>8sKxVZ9z2q^{F=G@9qcf^j>XiC(1QL|2HswikcJIjHH{Q$I8!GmcrT?e5C2}q;x z&M0)uSqzUl{2_#|85jun`6vPn9I@H+1Ag1#a~Beeo{KGNtNw&=vpkAtmI1Gd4+ldQ zA7!k1GsEoVf=335@(b#{I;rtvpt+E{hrz`CkSISxa#wF;h&I{K-9dBpdWQKVZ~+tk z)U3hS5caUY*lFBq;I{vq zyQ@3a2EmSRT%nH!!`s@S3l^bW?LX(sDbWQ%aJ0i`lyNSygYk8!a~owfU;G7B+eRX0 zL#q2I+4@tBD*PmhNOZK1hyiv)yFQ`<`&yD!dw}Lzzzo4S==RSykJU}9z=Q(AF z8v73(S!EUlB@upJ!?iMqBC(5C28&EUikRkYpi_~FSv*by>>BD)uPzJl$zu3WCo91Y zsb#L}07la(+BwQ1q5UVY#z$P$kcfJMM@D~Ck_;Zpd4=fl73{dE)GwT_%%^k=_1iPp ziKUsaKc!vGD`+O12*75-g>aWJ;YI>Vm=J)?gdf0N!i1Lyu$eF<2>>x6@t}u*01q}K zH+axTOxOiL2@?(l@c*6(|IULC7!l3~nfh|0%#0>RwEw`2uA>pk^R$dJLn2gzr(x0; zs{7M2&sU1y*6^h3^II_rP{ME90|5BV&H%;xuh}j7LQrEyi?uu}dT4NKst(VB#{D-YRnt_pEjPfEWHozJ`%iX5MeF>f&{K`bDK zPeW~#RJvyG3BxgohQJrET2hkwme|W9opm9l?LV=P=eUU5?LV=QM=}?6O4dE#M{%yf zeHzmHISdrykcIm!;XaI%rAhb;BvvI7-?pOtLeX&Jr>qqHU{58!=9IkVpD*BhlF`*yAn3bY=y(RrS!#jM@wFj*9U&s58Uwk`)R(Mf~&Z&kt^&l2dq18FRGsJ~Etc7alCrGR3A$wXvZQG7e zGF|D_WT-j7$5&@rtHcqsO1v%KT3L?3%5q@NQPj&?$&J8DE)r_PTY+ z17ZonSk$k>mg2V8t5B?5J>h*GP z+ov!i2UkT>om#8Gtq5T(ioY5R@9G6|%oV6^?%VYMj4>EHUFFG7FYvx`H?l(UTpg+3 z)S_ti%CTz!t)|k-Fv6`rTmP|Fid~I#B+t;Yji?cs$IeTZhZ?8l2oU9}%$>W5w*v=r1V zma*QbpQztx^8`rffC7Q89YLiJRn51{I9F5$tbT1lu)23UwnXiH!vDZ_`HkUA zs%q(Np|!QGu{s*ZY>t2UTF{q`1Z6SjfFJF7yBfu4_M-_cT{sfjzc{6ysQ=o>HysN zK|#V_614gRV^5R>c>@VD;CsaKUF63iMQ8PbU#7G!LLU-fBYy845D_P#j$^)IlH+e0 zy$+piIEJ90#TY(}IYyMTH-PObX}6pjaR`1Q$rW}F_~WeFuv;GXWwpXu1a)w2gF&}u z;Uk)3KQOfwNiC#c;SbEUCgSE+-8hfNE5anPzYWq1A=l^$nhfiOW24XTjDV6erki$M@YN0pmZD!{TfzS4sZ8e#lfFFhUhD+@H~D;q zeGIUpG^b?W8WdprW2l~}2E2r|u0{U2FUc>BjP%7|S#&3(vJvts>dgLgq*rup0Psti zTKX~uyTo!p_NL1aCa2vD>N_U%`Hm{{HY+X{*5AS^jf-aYD=dx`B$`kAqwD zRkQu*A#GIe{nAr*-(ieYZ4J<5{npxi!6aD)cpUSL~c|^g|`te~u+CS92sAieyA^9k>_5ZKFtp8sJhF zUjxCO`!VRgqe2hJCJlE}^nsnjJ0kj7JG!e7P)IsL?&%yp1n!z}+lX+L0GoPL{rfc; zFYiHJ+^!xwAX6Ilr0762714|A=&p@`HUaei;a___nK%mabfwS#D z$I~v?&qz0saDeu&;9hOxaN!zsb|`?I!+pUH0rur1pac^4oPmN@9ogNj$S{>?)DgQ)NKc4VsF(AyPAkou7f!pR+E-iErnzRcZ?TZjNd&E`h*?<@a>yo?GO;yAs`}VS~~;;mgmKdL&6HJ-5om3rlHV3FeK_Uw;bZT zX+}3D;h%(Dk2v2yr2AU3Kdo==zz}z!s!I`9Dx?$%gV#g(?MPKeiT)N;5^`g7r9%G8 z#w(r1_rJDyX>|V`wxBe=|CZ^%vL!p5M4J&7(@N}c5(6t(Oe?XM=9WWz|0L1>!!$k! z(7&Op0}YF|^GIyxx#bcOw$}&2lnMc)>!-_On9C4AAvv=#oI$4PkmISahtW199dsCD z_Xa!BI|Z1$+ll^3b>EnTQX#&ZQg@ZOYw5lka$~Y@7-9`N?-`Lb2C2TsWMf|^j5hR# z8ek@SqX(9qHEjE|>xo(`v&~M~~X!V~zWlvS`E2aj^f0g0>9)HQUM*qBmg3$$Z zRET3Ln>VJQ-}q5uatDsc)5krb^yTK~j~+`>U z<401Ub7`R?%Wy1R;pm8ezi}idAuP9W^vGeF6tuv=y!?Dkgg?!24CUtD&HkCfF+W;; zTHBH5e?7s``8D&Wx&HW%9A)c7y$ljeHVGp+H6G@h>f-Z`ep%sRj154^3vru79wVE& zE_!ZZo}PB$s8-%!29u&Pb~`Gm@5?x=nXo&Si*zQNk431)ko#`!3LUFX{ zV~vo-$h?s(9wYq&!$ywDFJEU0qg8>z(fvl>H!5#Xlkp9kF+l=X80BPMRY#zeA1w+P<%o|lWjtvFM zp-9R;fWvATmJMh3yn*_Z=D11Y*z16;^hi!t#=#>Cn~Wt7;DH7a*~2xZ3fFqq^w}S8qo->y`ftIkrUWvSN!oM)tNL zd4)~J69LWGCLFd2f7Ve>wT*TrCeBABFb(^-q+s=GPhl4#)Wm3KSrbN*d1oA+`cDC8 z=P`xDMvr2@grIQa#})P)lRIkIK=uhLbl~Vw1Q!;tNg!@a!RUc`e*OlP691H z*__3oFS60&7}jOfJ~xiQC&oD=8XZJ_S9>laYwd_(qXx0FXy&fD_Yr&S)3s2L$JW`c z!>}-8nT8g|Ele#voVki@3M`IK81kq0_Apg4vQ202Wzu3~Z8z#=0%B$$W&vW> K?MA(9^}PUGoD*UI delta 59 zcmdnERc7N>nT8g|Ele#vocW4u3M`IK7;>lg_Apg4vQB63Wzu3~Yd7j;0%B$$W&vW> K?MA(9^}PUGr4wQR diff --git a/wasm_for_tests/vp_always_false.wasm b/wasm_for_tests/vp_always_false.wasm index 003fc115be92dc91fa52a5c2c893fab56d7404d7..2c2f150abc420446bf99a109c092763bcd9416c4 100755 GIT binary patch delta 150806 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 z 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 delta 151416 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±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 J4T+O${x65*8bkm9 diff --git a/wasm_for_tests/vp_always_true.wasm b/wasm_for_tests/vp_always_true.wasm index a18626d71efe90e60a0b8a23403eb002a34fe7e5..635dad5ea6370455e0decece2155c5698f3d2536 100755 GIT binary patch delta 150912 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

wOM+3WHVVAVNhoA&7v(!?>}fe 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

6-9$9oF3{`5tf2f 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 aJFgF8@O{^ONqV?tpS1HIH-tY|^#23p*&YG_ delta 152794 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 E04H9AYybcN diff --git a/wasm_for_tests/vp_eval.wasm b/wasm_for_tests/vp_eval.wasm index 98fcac06a286800604e53d4d91ebc97b9a4fc25e..bfab45916fec91d4b815c264725123e54bd67de1 100755 GIT binary patch delta 166012 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
      )QcI?Si|%k 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 UjR2Q`FP@Kg=)rhL%)0jf09p3{W&i*H delta 168835 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�gBM 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 NZPPm|+O=ug{{o9|6|evR delta 181071 zcmeEv34B$>_5YojwD@0q#xzWX5fbL;Q_`G5Wzd2?s( zEN9M~IdkUBnRBndrr*u~u4)?@W=WQuJE zUS|^yJ#5^lu~SYw>C~$af0Q)@-)3FxZ|oX=^55CD{71Z%XZ@J}gip-P%b)%+3uY~4 z%UECotEoNckRy&f>gZ#Rz4*%Cv+MY2>)GS%Nmh68QuZ4*as#{MJMXji*k9RO>@oIF zwv&CxazA4KVvG3o{1cY*Q@)sIzwvBQiXYBcQXaHOnAMwFx{P`rGYxC~9UJgeiYEji z1fgcDJ0-=i$ntwAPsHTNlj;`zqOaeu!LWu{+m~%HV*OK}i0RS6M%XlJxNn#diw$0T ztZ!9_9hdqrGMOE}c1-jY7TEfWE+dvm<>$@}yr~}7z7so?u}Eq}{&@pi0E6kXV$HFr zuhHs3%o>GwO|!Lh0iM_6Czg}y%%5Amt$hPpAz*l;={K1vtVpwh++wjFmYP;@aUJzT z#o|WTq5`I<;gNc7L|7R4DTVqc&_h1o+O{(FX2D>NveCjrv)r<&(+aQf#9l4@5wfg3 zzvv&F^`=fKJ$o=PR>MPap}TF0W&p!uOL)0ym>f|wVHx57lCO^8NmeA!tmjix+e^o= z0{P(G;(ZoNvGP*3L{_(pegW!#Y*}hj`8BL)?S}FXINO|BTb01?2UP{3=w;S!W3EM! za-Ec_?ibWgrPXt(6PtmdX5hs%@(d&H3!A>wA+d&mkp!O-6$FmyQ=lOPW)`vt4@Z!T zAreXbEOw%39eJ>fAI*lyx}#Zn>ehZ2v9^@IdJ0>zc1HCTCF7PZ1b`(N;##YPp{JHg zC^f<{G)Wz|I#wgcQl3uO{Yy$neOiAyTar4pp|fiHBD)U1g)vnzR6xL4?=DIW9XqjB zBhMISd>i;1k6$B~-urZBYTl=duDxk&0|RW&jJvBKZ?jWxjnz0CplwcFb<_-YQ)<%8 zvhtfaKSm@1?ZI$P=ikBwi7~bg03i*Sy79f&8?`zt!SoQQ_sFN_2`;PGiz$w zx27()CcC0uZ$+t|6Z#W+h1CP}qhtG`zu$?aG~9xSfL`x|{bNr&8`$qSv23);)L~bW zK@$qM_KSUre|qBGy7gWRZXc~bev%q|VRhT@_bK0d(%+`5hB55>7pI0}`o+Eg_0gBL ziBt9n*0wf&#z~9@ohvfIpl6H~S7d_JQbi_clm?nxL?ATspkSTQjRYbjH-U)7r7SAa zfdrJNf4T^bD6-?k_wi zQbHp2ojX?zZ|&$Z;z6)nTCnPQAp$HwF|}$T9g7lJsAX86GH~g{+Qy$pIDfYzHTmwr zsqd}Y#JWwNHbDPufixq4HFv{_=hS|qwX2Wu~J`n&k5}2)T8(O znB9{)?A}@Uz58CX@}3mdieZK^+j@^T11c+N-6X7sB`O`1`qRC&k#*=&Y!Ipx*3GHn z_6rL)s&^^@IaleNZS9lT_SBa4$&+_uLAB@y3s3?}3YI>DH&U0TM-6Kiy`>+##k&MB zK;7jtqF6enSlioEN8Q&@98;^Q-?W!gdofMja^JK*7tBor;e$xQ1#5;yhfaxxOusc0yfZc|b;p{+iwBtg8XlVx4NzE^2wQt6&y5XF?O9WPBCYsp z>CD3F5}ecAYz1epZfd#9e|2miNd?OQ6JSZ zz-{yP2PU(Dsn;H;E<^F4Qx%H4&%;v19mCnu)Rc}@)D^#zXISc^j_;wPa~`}5zi&J^ z9KZPwof$N;MJ)R68=%x0Yu93+u77I5 zugVJ?fsb2?EWt-^lrJ92ibXUMNFCQ%wtt4+8=MUOzB6>`3@n;Drn6%I@{8T_g39Ob z2SHD2LuU!v=Y7BKvR|{lU$@iilcV7{NhD_T01#TZ0Ayy>)^i_%`1Qf;zSJqd9>!Wy zi+(+i-I3b$>zS-Rb@HR%!zA1MXfu8r9{V4r+IJs29s~H)W2YqC`Ne1^>iI>i#A*|k zo{Xu<>)!;!8SwZpNA&K!TMgq`k2h5ATt&SifxTLH^MkuoHzC{&PCfYe9*|PU6Ib%Z zH%fDqzkh1Wh9HZsJ?+WkxL9~kmyD0{Cv;lsl?@l{n{?4{j@vist=|mEofM|oJBDVo z$zqdI@!yU@{i&0G`w-if%Gwym?~si%@%!VAgYo;|#+o7}SreURVeM$P2Ag7bY;x-T zjayh_>WTk47r*hRuEg){Pc6W&`SdRW+qDGQ{d5C+Hx=4684~XcoBE|L-1IHhj;B@; z4L>GtJDb-9@3+Bdd*&3raIt*xbbkSxoci>clbx73Ic^XG#(s=hn=ptm$mZTys`c4+ zwtVf#=Pu-Y!LroPp0D&z3cunD%lO@_cy0Id3t3<}fn%jk-*Pfro_cW0-I^HgN}btV z5BO5uL)ePclidSA5^r{&Uvq?-lh{GMdoM_a$0#n)`%)~Wd4@r6Yj~-3$J$F@46xcG z;@C7m1OUYv;T-&6@K@3{Da940i85(>aYX8l-@Q?Oz}(AHD_*K+52s#w>0JEQZ>=t0 z_k`XUSVfn`u`Gcft6h-K>PTI(^~AIs3@aNfv{fjTdPn`tpNlHaqVeQ zLRg$(xw7K;TdFdo#LG)cKkh^ihg!c|hhQVKZhjQuZ$#{b)cr3HDBX_53S4LPS_F4+ z>$yh|KEUzv?Uy&@thZM(GX&ndKK119zweOuW_r^`q`8!xD0M zLBz_lTBuLp1v9ZZ?r&I)zzPP0n?~#m)C|du#m-oJ(W~7YQ*r!jRro#iwQBrcu6~!l zR;@*F5&^Rz`q<)<675J7az*QvkTFT1k7;2^i?k$@t(TpiW9~>m(73 z8gVNHc!4Am!cGwqaj6xz(q1G`D{iGE%Tj_{DG7Siid!j(g4BvzX`PnpqD~`Sb|bpZ z6F@w)JECUYN?T9|wc=LVWw+v1O2Q+x;?@cgo)DHxt*j08Tq!hSovQs!1y?6ffFw;v z-bVo>0(hO+11P8`O8lf;)K@@|-T|Q}0Fm0YOCSTmjej};2&Dq5A4#f$_K{R4I-_$? z=Lv2%VI>l%jN2-NdM_?ii!Nf??A&f~A{@%@6t5L+ERkc1TCw(;H+OR0-$Uj#3US@4XfEo4h`%?mE zCHz<@Qta<7spQ}9&u>De&6|)Z$J&hm(qyXcgVMDp_x`tFvr?mX)<739bLTCQSzt@q z&1TpP#+IZO?;ez@{qSgHV4v0_!vi0d6=MG$844~DI|odokaqU5S*h(G-l|H5fjl#S zl94@wQulo{zI+zut1&yl%)qqhcvMYPK^b^?>h+HgO*Q`O7Itpx)qmCa+fZ$7>YSY= zsp?(H$hrGM(Y@MHMxfkewSDoOv7?uK+Q8bDz0UL~_0MeRd>LWv)+Kv%6NBU*7#p9O zvnLW6>1n5P2)fDG1#+rjXhL2hn2cP23=zx%q6yg%WP{{bADfI!$pU8W+uISkw<O8=qI#Yg7$}D+!fZf6_ly3$U zkkKH3yl@{NFOc8&v8H{Y8EFq_Z5)fZJClu0sGnP7e^Qb{Bu z7ewqDT^vTDY*yvBJm?#e32g<@kbEWz?0s9FpQEsMeGa=twuGs#G~wlGx$NkhBMg)z zU(dBksVozKZ_7xG-FkCWmBCb(e~7X1at=g`$Y4){okQ|iC1V%K>G^D^n&D+KFUU${ zTRyugauIT7Qq^P#bjVFqg~m4&*o~KFHhz(OzkvNr6?glsXy@03Y(n`(p3V>Qz{1Pr z-%Ht{^0*?lf;G$ci)@IBG(`2q>?#>8Py?a(XB4&hgR*vYNV`cv`RHpRb|!?4TIyFL2Csq zQG?{|)$CU%(eie!k7P$mgh+2)L$TE=i+&eKzeCPoI)=)8)?z0o7Ezz|u3ALpeI`4C zog#OdEFL-qwX{GsmQR?hILBE_S5wCRomQMJ7ddDa3m595L`(JzXX84}fo!pFpEsS4 z*0NInzKO_Qv0q}=X!d6YUiR)7_7Sr>->7FBnJP$fvTmpIk+JMoTqS0w6R()SvN^X5 z**p=9^o~Q=UKGD$61#|MLs;Ee(}>O?@?DEHiAfPI4{Acr8&CI-4{;LpEqDJUYns>@ z&IW46Py)nI!et4yPqlp~{{gkXflnusSU#S8p z{zDyCdw+^|>A2eLQ`~Uw^%w5D=eGBr zP{Oo4dkUM2dS0Bu$`01eL2{#P8O>1xkYx8SUOAQBgyL(aveMzIIK;%hO7CB^bLUj{ z47MNgiNiI7YFk2w5qH0I>w?vL?|<)Yb=V+#4`(IF7CM4eX%#8SmJqm`?%8$YTR(nn z?Y0+nzQ!Y1*$IGwD*>4@w7&Puj&(OK`@|Mgxkf=Pl$nt6n;v|B*#pmP{p-57RB@$y z1`6rTJ{7M<#rpV#_92uZqhk5`5v(5o+=Fa1mRyY`HURr{L_vlM=uJiioik>zj~TnP zbLvs-Xe^eU%T8qva5i5~IfI$m^T0cN7~R;C&P&c0;QujUDsvQ z3Zp?_TTVLhMBM7~CaptK!dmA|>gep9&*lZ$_dCzKl0C(E+Xr&U)$EkO!oOhRH+8mN z&Dt4Wj%;D4^2lXo)GV-eY{ska%4OHEEo!nIISY%;&a?U0^kmy`Eh`X{BTVAmahb^n z?KkOYG}8JDPptFeh3r@%%TjCx&6EpMYGwsVO-Auw>bTPCQM^~jl@gEQW0um)BAp$@ zet?*FUOuVg?!5FZQ}5k*c{t*EnOe8CzL>n}C1!T^{D_SUcV4}WUCA5he2+FOzWLY@ znnmhFGT+Px+eys9z7oH&8;}JGPb5*M0DfaP$dSugdDH3_u|uh`wjzj;zFR~^*s^t+ zZ`z60j&5W+*jnMlm+nx7)+31Zm)9?6{b-W{;=rg=^*B29HOFq~d~!J~5!em#xm($} zkn4u8V0DO{y#i9u64|q{C)YdIdQgRG4zE{EU2X7g?BowweB8iL!1CnlJDV3R158&|S?ypr2ivik}N z2|gPIJ~LY*VcDH*c*znTFTksS8BzElR3-{R5< z`5uL%-S=o54QXe7!qLe4SXq7s5{z(rBt}}b3fXfE_sjRXm_((EHmKTuwSnDF6nM;f zEWqo3!v+^$Lub{PqGKT$Sv!no3yOr;wesJ;VHdDP^6cNT3U;mh;cwYyDmL^9c98t; zMs_BnF@o(OajuWD7M3YWjaR z*&E^3P>G8+pKRaFWAdek*c{Z|xR#Y6IDIV}R;g$k8UVnO$O62CCW2oP_+4w+FTWN7 zZ+nE5y9BNpQRpE8fASIb1`+sOovQo3b*lUI>s0q=tyA5&!w51+UUogoI#KWCkFg;LRz1e<1F?33#$RRh0IKC2xE#^NF0T4af|PGO#m*lR zNq|g9+v&$)A5k7c=!Rj{fzvYv%`&GmMN$_>(wtdv2o>XTf0cx z>}$5{Cuphl8YVy8#2#f2%XQDN(ZR32avO)sB)j>Xvu`R;RUtXu1l&1{gam1Wd= zNtBn#I@6DWHx`;^Xz#*p8o>dTe)f>W<6P*1ZdS&F)~;o8=8mZuq~{iz)i!< z1+mg_$nS4qX3Qy?g_VZ%)19|%VfCy6?M8Vd3q~!LG2S4hG5|OY0g&{5H%1I$>_t{| z);q6vrTd6Jy@9yf$5-8m?h}zi0GtXWNLEca%L8#x%&^~M=mNl1ku!9i*S^TGL0?Ez zqOvUPy!Cgig|QnuE4MNMt1M~0%r>c|G6(Abtw2}Ua)HmnR%+VsH#mK{YSP4YwFfNf*qh5 zYrCrS=iAv~;5Bb;$7&)_p-jHYCdrdu!&u!QzyBJWftSC1jr|C9ch2Zxm$1_|(+W?c z6SbhsbRq@l-F7=-pO#zge??AO2sge3R$piBM4;m9@WL{!g_NJ(clfLj$iLvv?3Vlt zIf58kk$ka>RmunEuyE?CC$eSlpP|l($mkm&{79$u2J26-UGOF==7-o*dOOZvKUc#x zAP+0RI@kS`-H4;yc6s;?_Q_~v&KAbdVwFH|A$!m;tJDCVKv_7a2|ImV{x@n;Uj8;a zte8fd4&bqkV+oZj{O4e9D*nr2S=V2LItRXw9lVz&j06MthX!Gg|yhh1H; zkXbC^S4LgX_Nr{1z3;$uGNa+$@3KlXEX&^mvt1&`zsF8SaMOEWpG)N9@39dG-g}Rg zh!=vnazPm%C}aO%3xMw>|G>ryZ4KDTu3!s0Z{G>ogyz(y582O;R+BymG6oN6@9Cmb z-tmUbLsla0&M(Zj<=%Lk8?omTjOv0ixeHc(&ws>j&=r%&`gK(7*A+kUFBTf7ASR|8 zZMJ^p0)aRne9#-e&y8pZ<=%g>gEiBnP5oDeOa5RNGr=^$XUN8cgU~S8Y9$a@2|CyA z0@{gErhW|Nf(9E?m6-DjE@T?)r@Zke+=vbKGoP^P^rGPMD|ypdyh!HmW?`a=%H3?b zms~n8+0E`^*h?1dVaIu2$V>KMyASz&59>FW)=6%)<0z8|bp_~C3AtdFAxsOX<9sSn zKEFq8?I-VL2j%KAqMq+2i=L{m4l|2$lDli zAdr90_{IHoZM$$H!C)n(+UHhlkc6Ce3@Cvlar%5T75EkBhaKeM&zQSl!ws0~EF336 z6D9DA(z@IL!B^BR;jq5hgyVG>4nSyq(>D2xVhtiG#qK9dx7I6oi{1}e*zTej3aesr zp^vu#qeXr`2;G?I=hXz&Oh5nE=~tM1n9<{hJb?LMsir^H7n{u9e67oFbGUP%jFHjbk{ok%?VT!n+E{f&`r!Z^^BufI~|iRcDejC zmzO|hE^lICC^1N+=nkk|D99TN+3rQMF2+fKIx@z`YhJ(r9eBZ46QH)loX%2p?jYTq z$LC`K{9Yda3mEVj`TQ3d{O7B+d2|6!oTj)TwOQ3{-S;C8U7<^>ym7Fd72Y@|*HUkM zu^VyNP60Rjsp_#DX!hpztmis1Gw{hs9v>=46>{txJ7*N~TpX{ENNm%~7nauqM(MNU zwG2X15CAf8A`q|1?r$=$YwG+%5x-f{``i*}$v|eQ5`Jn1|NE$fPw)KXR&hHEw7dgJ zV33>$nO%e^t(*1&GK%1%C{xi*n?_yo;JSYHvrI zFUXVID)=}O{qn2$1qd#$;$sl3QL)a#eta<1FtM6%00-Dp4g4>W#U@W;!ryH2Z&ArT zaaHpC1V03F;m;GizZMz~iStP^Fn|w4o}mNyG`yTYfX_vJoqrw3PxA34OZk^En>frD`6Rg zPXD@w|B3xV-df8W0P;(ihFSr|t-U%4YpENtxxyL46>;0y6;~%|M=l=DC!b2x z9I~p9LapV_8u+!a*U#+I{1N=>BQm;_=WQH}?_u=96>QPP)o!mau&dmN-NlJ@&ip0V z(+d~y*NAzxrj8H)8oBrjy-sVH%exw_%SQ4TQAq1Z{@$#)YSg&JrbZcWz?8AGJ;jzPRd)sx%RX_+&C={w*5Kpf72H4IqV5EjBxjB| z&Vq9jS-wW9ETdIy&X6aIHj~KCXIsHzR4xS+0d}B&aiD&-6+->0tO3;nLE*PH8*`dT zwdV(U0@MIjp9BuQ=l~`Fkt=~iEd3mUn$mvOf!_?!NexE8Z&gA}RS~MP5ISM`;GcP6 z(yqv^W1r&IL~o(dDCE{K6vyyxWB^VCbRkU3i9)lyUER~y2F|*~1&x?W8 zu!WpQssODOh~iOMzA8chV}}k<9F(MFogqYdP2c`%1A|B`NLxNaLOkdaq(PboB5GjC zKpxNpsLDowQIQaUn>JZKs3d_lt#jZB)da?x?6T#I>%~VETaI)ef@lu6 z=j5vw@q@}?Y=)5nQGDAP2ZBEwop#<=H}fJGMvQ6Z7eZQG(ai5-eBt$S+8ll;ApPka zNH1$-_+ox=!4FKJb+%eZNPTFTu{HA8i+MBqfi$Z`A+mK}%)h5|SITq0gB{))x#&Cm zCIlsy@J4p2JoOSj46*Aj;WLtN7l!B-F8;1|LfEl(U?#(mRZ$iLBTEEm>*g+7_SWqy zN$5nzSaP@a@-i(CdN};1zsbG5yjWgyDmRCKAYkxEyd_9#N~VnN6S$NJ20&v3B!E98 zLgS6FeEw8kouRe)${+?Mo5{;Hgro_wB?dr98ipikrU*JdJAqk2(D^J*w^=k;ED;=U zOdvFR|IA=clrAaz@Xx@VW`B_OVr1LNVmlZuWNlEk(iGe;RheS*TE3Jiop9263WxM4 zkYc2m;$%F)Ei6yKh)OW|2;(L;fgJ{TI1aOkrPuR`c!u2)O+sh}sJ6Httlx$4Y7n`| z5L9x}^*&_(gTIg_orXMD;ZyH~s8Sc7nL8FzcBg;}(stiOp%@ROnAjY*kv+M>c>qhM zgY!T$;oqPhfVmhPO@Uz1J&VOv0bvGafG=UJaEqWmsfJ3JAvIK(?9*{)26>^F#3C0% zHmJpE*>;Bj(P<{HLGyIIM&S&X6I<|KZ}qh>BBm$vIC@2Uu5TlNp6GlXn}xvNAWo(3 z)bqv^8BAfzZII-`)*Vt0rt|iLa)$ znJ_iy^r$**&N-9rjRdU13@$_2`rtBOm;eJFroDgDNp+7MjTg;!*hdjMLP!ASA-cLq zR_Mo%%S{EHA}U0K$;1fP2qPp@*BZXK-^$UKGxzP6t?9QHqxvs-4$01RHbYdOJE`o2 zhz@f9BYld-u{;4eBUmvVeM0oCHzJgP>yh8alPJQS#rp5KZ^Vef;`El$goY3HGL2yI5W-e8WQ3JHuGq^POpca zQ_oB(1Z#XrxgR~rRUJb2xMC+AWYd@%mT%1BQ~%S-F-(}d&fzt3>tbH|zt9#GadqxtzlqK3EvhXAuG}tsxpT(8ICq>8GH|A)~>C@tj_5idV zd9SRsy#v`jB}e{+4=8nZ&wA&C{Q&qNOcIvJi~qt8<4-VIbg$^;YgpP3Mu~j+uUHF} zwZb%c+gm(%u&Qtw4;Mjt*Bdak6UR>oSGR=0!V#nC-qzneantf&?)`rFh3x)X#kTS# zmM_)Mgm<7pTqE<25ykR~cliBmP3PcuvG^d|_#O^h@UEbj&-+iSIkXULA3}b;oDrJB zSr>_7zUgnBiGT2+EcYtRg>`DS;yzdGDmn9?{Hgri7@B%M3$G9mn~%zqKjbyeL6%(f zVIL=1fO^GF-u`6^cRv0hZ{ixYnOyVhWtyE=?BeH$LcP*0r?m`yY@;w&zW<4*lU2K& zPG)k3lXmkF^0J?ZAzvdI;LM_2PW~46_q8EXwliaXDo)h<8`AcF<)sp*(n97v&+PpT z)tO#aRD)HEMP+{X2Sf-pV44U_1UYiXVv%qOVg6!aoBL$qNY$`$v1pY8ZxuISmOgx| zm{v&sU$FDVdYF~qTzQV1lIcTNi?yfUa5#9Y|NZ>`VdQSzn^o znX-%AdJUBi21PL%dYy>@sAx?PzPVJ)l#{rK9pv_qG*4<{?DTM}?qS63;rFMz&^tEp(7YLD)V- z@I#M@mLX3hVr~+oP_Sbe7orA0A0fodTGhVYHfjE#Oob8@jV6M&E+{}PLl@L7M4YXZ z{}AFRFNS+`w+h{Eo$eEHRc+8yE$QV*IR{@rcD1BIrD|6pd!6nEjGPESbi;<2+;Hhm zxCwR_KJ@xpoqUSnl+Tnv6<;rl|pOIMFDf(xKbi0^)n7-8ifpd>5gJSe&QC)5%oAz7iX*`NBB5@67A4~Wx-_&S`w$Bi0_4W}PIxr?` z3lp|SZO!VMW6$Ub>y`jK!cuZNCxP27fs)AmY)0-NDVv1lm!XJ=f@hMSH?2G}z(42- zYyI_y&t-JMuX96<1kCl(;mta??2U-h;(d_uy#20U^uX_qjEc&^dOaX4 z1U*Yn$nA@>^xPN~#R`ov7mX1Q8gU)jvm60YZUtW>8qaXi2t8xO;erX$!mkv~u?oUE zok+k!^?p!Yp(h6}h(k);H;1O~EMPYzlR2Uev!WwM3@LM&B)FsIiLkg-)_yy4L~YSZ zMUm4;3#O(=o~q#BT=6Q1J|`yTAy^O-m+qGlj1?^f@^BomM2^W5Ly+;DJVB@ZSLF3k zG0ne_?95Y;?LdBljCdXKZG>uahcskE^F?hk4Oy9zL69{;$1WiM7HF34SF0VxFw+!{ zh)%&U5R47eAqX~`bxmgLy~7NpX9ba~!ywpRYsrV?nemv!kcCv=k@^BNOF=(5A>m8< z1HtT27HNUU7*8c_aR$=0!Q4!Aq{RO(h-+Dp+Hn6+o@KFI!XseVi&+A z<2Rc0w2l6dPWkL6BJQ+Z$>IS5tsSS36s}^*!yrvz6jJA*z`dHq)a3wqMFRd6S|TCz zSf89< zb%@lF9U=7|9ah7gz}!lLnJaWqcbwKs-KUuIM6W_94H9mSJ)#ug^k|u=jX0Z&F!sgp zHR%6KgawG^o!tcpm39}3(6PPn5;_fZrXy?+x8C4Hz+NzeN5*rgd_z2+Ch!Zr1(?vL zr6z4RQq-hP!%V#I^T7O^g86fT>^FzIFw;Ww`Cx{4XY~-w1HCY}Dn=v!t5ghx9vw^t zm!<8M-vT%3i>nChQx7kpl^*H@A8na@L_Q!v~McLMG~Ubt5y#XeG4r^L=(hRb(pa{~lHXeC)(vCVdAR)~`LO6D>v z;$t8=a!U!(7Cvf>a7R(G%zd8~%iazVlx<}kUI*UdzA`^$u-;V%IoR_vy5d)Z)hHkr zRH$9vtrenvxTc+uz1s)%rKyGb4cQZOJ;WP1CNfXTPb$Pf$Pe*K2;ghvai*w}->npR z{ctk})+bo^E#EZUf6-ewMu#9!Om2}suM~rj|CvfL8vzd9%jGduB0M}mT{XbpX}?07 z7B`MXiFPb*96ObOY^@R_SU}!hB`Wh28!@I5gTeC3u=R?YqOuSpwEr8x**}+ATNMHl zK8PFfpuDM{C`>xthbk3Q2$KmyH339*!deE>GWi7<+YI9sy+Q-0j?@a2IwETbmMXde zjGajYGCXU!;0dETV5JAbzG4}mPRT9A_}!`vK5V)Q zFS91A#KJ_j6+mJE6)R1I({)rP=-ThRcpN<`<7BfK?w&ul)Anv=B3`pdtN{XqH znnZ58lA(#1s-(oi2^_s03*)AWc&Ti8o0s)L&lpmSmL z1R*Pcgi7_4gQp5S<&TH2H-?`1kWi+cB6uprQ^9zn1VOgNkx;Cjvhh@8CMhu=kA+AK zk2eY^P|e~hI-aQ6JUl^rO2z{b)hx^#@I=kx5Zr_%VH5#yf&|>@#S=A4r*_5Tjcf$4 zaYjOxdZK1=X%cDFYA}gM96<#rP|f<)6E*9@Q^|M(jL?j!W}$<{6E#chwNz8Ju;QAy zuyWQ4^NY^;q-WCO1nr9!PnQO-C3Bq)PBZI&o|I$;0?uS5S+lnKz|{E6S#0S;bv=un z$%Go*X~#U%F3sC8)qK{2xGv!^ZZ+Z3j5~=Ln8~>XofVTsqRq)sZ*$mYiGlP> zhu(p|e+D{|iY3s|sE0|Z?tMlfyA0twwr?>IfvvVw$kFPG12g{VYUxN1qmMfNMVAgL zF0D#sqh=<=&{CL9O^st0O)E^sig$iO)J^~c_q?Djv%@a68bz<^mNAX`M&@9+*9bew zxPW5}tfZx|<^bcQmws?z`DsEd#0lOt{Y8w-`BMYLnG8n~y#vMNkw~Hn)CAZ3WJKF@UjXkivBWDD~1;Q4wMuz`_rOL zUKUg}=fI72gba?&JZNTN*x0!U_9k@2>!X9j#4sFP_{mzUB=(X#WC)ZOH_D5Kh(!-Nt5uk@wyFonvN&!MDtiYA%PY{Y=PIy<3(LfQ@T^--dD$O;Dy0q|cH0UDgUue<3b?(qWOQEQVl zM~kw_3mL#4OykF}k#llxcXH-i{BZ1TicB&${~b9)b+WvxvdGIvLx@`=9~~`DVcjx+ zj5r9fL&k_h5M19N`petLK!LnaJ~~E>Lel$V#1Z;UgS@m}&^fd>sk~vIq!W66iDy(fQ1S`txq1SQ@E(+FCMb#bG1_yUeZh|I#A0yyb4i(2> z$`3vax_0Din<5$zY?`7lzFWsePZf>(6k9MA$bLxPHx*dIFicflJ#3n|Ot;lf{$ZMk z_a~LSn#no(90gX{``PDKO&6D=(9P4ucz}zJPz(qyma`5=57x+s4#x(-MPS(x;;LeG z&ZL<0K}wel<~#(Ofz?Nd>wt_=GsGy;UxIV04~md&I0^a8YQf<|XL1HSBBH`YM~W#3 zo;wm_hmId5D&=KIsZA1|4`RQSj~yi@h}D6t)Pka-@)(R*)#j>DZKxn)V9}$km5{TK z6lGOTd!*37WYcG$O0e}Mg7VHIMTNZLXpvK-^ZB%tptfMxt;-chi(`@ji!M4SJAc>} zhqSg7?AuXzgE=|cZoPM-1Uih=yAbT+{B-;YZbW9lzJ#wL4s=hk*nH?hkpftGBmId+ zGmA_>X+7X!N-?u@MABeBxb0~)>DUjmW;U5_Wn7xbwy+_>KWvXrm8jVORz2HA$% z2K*#1Xp{a#&}0df^%&JHSiZx)AI*^kstKbo5?mmpfhjjzN&8X-;HQNT0Kl?ZT{Pji zp8=fWZUsO?dt~s8%?spU+~`n^&Q1u`K-dZ%9yO3fy*tpQ3cDOc7zf`WEWg!&B{e7#?O!CoK$toE{C(8=bzOFPN?vZNI*HV!}qg z#>lES7`FWwF+?I5GG1Geq{(Z_>C*T^f57i0tf`0;3a zjof=YE#njv$)BB|*w~XNh~i>8&A^h{90p#|sx9xxVJC_cEP4kh$t;&h2UZ7As(|Kj zuLW9Yx{ZN!X2SmTGI~X_HMbh)(y`*?xe2;2yx~MKWSpwTB=ddT>p^AkXh&qQ^m?os zw3w05> zND={^hzWejh!$XBjc&H+(*=0K{w*qByA(Hc3*^U_qN)OU>0CY`BdC;{=JM)v(tvq< z8qhUo9-mn0468b!@M(oS&f~DnKo2+0zD zf;joRSo|K|k5-^ryWhog`}=s4W5|Y+#3&y#cvuk>02q3*xD%FJGVc^oILJ0>ML9)G zWJ9lIz=Yqc_qhKQXkiAOg8M9XK{@jjF}@hm-vM$@@@70N;`3H^+^OPtz_IF7uwWPh zoGOZQXgrAm)Q6YgapWW{kZWYW)4;|Ki;Fz@>M0Nv6{(fW*G|HM!{o&$Ddveh6FqN6 z%ll3f14y#rv`b)+Y_=hx=0>hHm-y-qu^XDx>V6A}yUKD{+ng_y15OtUAZy-py7&%) zqBF!5(QPDU4!2r=Od^Rqc051%gr2=!>JExhp>1;_rUm1DG;B7<&Qg_vhSJvTe$u=W zw-hnu>X`C@7eSkYwqs|@e~-saQ8?Y2z^g)eB>UkrByzzdUMjycfe$WL%Ad=L?_tK& z@GGe(ZnOMy0nGk^I2u{vjiZ%Yym7Shb8j52{K6YY zD-Wnv2I&UK3D(14jOO2MqV-jeli}I#PiMzt0w6bd;{fDlZybQ!ssK3`c4KaT$uZP3-fGd`7rk*b^9OGn z&HTw5M>B7G<7npn1&Tb*g}CmvgGJg};mwD3R(a!SXSFwub{_V|(aw5r9PMn-?Z_#O zd_unF;5C>K;NT{LLiu77E;5JZ6ODX4Sor<>qw?S+5fR;>y zrg*js8qQ_hu_58;H!Yc@_N+IKvH6`hj_XzbAzO>oT94p~C(ARg^;GuG>kqn%yeINE9P){Ayp zy>Ya2y=teQoHCWual?aCIXPAT<5WHm3;t2l_(cdhr}2{zM5ptkbmCC?qv^bwZYG0B zTI^%WD{&TWbz>Q?F_h;O60)tW^4aN-OrDTCr^7qS%X0ML{6ho>9l(V(U8s8NQYIs?rLWSBgI7e@*c%-4uGma9T}&J4I+ zStwg(@F^#g?4j+pwh@!zUs5@fd!byzLBi*7LhF)E>G2nXt!N zBkwp#>4nqTezf5?%z76oGq?lWspWR=HLqy*TxN3 ze=mDxiNC^k#nb1AD5;NLK35#)d;DeApj~3l+#*6{`tGLl>x8(|DQDfsih_269CrGXuvOY@R3nS(U^89LdDNE^dRi##Wk~VWtw$s%cM6n*( z_pd-$)R1d{>|C}gr6mhqtH&EdD41Z>B7k16#>^SRYqVOp)bhpKb=?y}B7F=_r6M#Hg!*IdnA;x8ZV-hyx~Nlta&wqa8{fXz;0_ zJ_ny}3g((PP0=?6p%29wQfB{EpFvX8X9U#ejSmn3={|eA47zi3P={NC zpddwb7*C8ugQ&4d6f`UVK2p^sqEhUrmC^y3(?m=wjO`aAePd7)aSgvbkt_xO1HD`c zeCX|fcFrRfQZEe}xkeKovcWAS5UD*a6GXe^j*v)-nJ+yb@quCGq%(oe`0X({(2!6= zeGZ8pizZxi#5`hV0$Kt+`Oqhj6==yUh1FXkG2Uo}E(ASFz$F61!jY4t9j%&RIq z)J|XnFc7$_tc=H0?e%8T?wM0Pc#QQvVbiUjj2qH*|2Ja$Ry#*=kkQSm=3_P74XCH4 zIo=N}mSc(O!6$W!oFzstD?UZUM>)$K>Ciq863VgmD-{VW)7 zL!&vro*9VXyD5lVcK;zv9kDEy3$CD7;ogN=}6=}B1dp$2+U72 zaPrqTIi0zQi#dLEF-P~UPm-m+>FEcT1Nthw#p89DjyOP9lTZN;&z<9qr~QiPcn&vw znyDz;hBQl|eOO;CW#msYCO! znFrEbEV8@Nu!hP3^=Sfi7m}?_(7L&x+K`fR6_9Si4O17=Zods_ntRb+sZS~ogQU}B zj`RAy=o|tqwHwdJ1Z~T8U3@62RuZ5+QQ?~eN@=Z52WDW!r0Giyr1qHr#WLj)U^rN| zC=X5#uqx}pPR7(|r!$3MU_zNnJ()`FJV8id9)W|_&%Q|Ui%_DUu8j%LEpV#T#hZO& z8YBwv$vlrBGhIrh`#Y*PyxDCmcW8P{sFA!{Sp zBn*C)&m<}iec1?OL12P0k{)aM;y?qr-7t$GO&};}ND32SUV|vr85SY~ecP-5cmvkL zSpNkqNoe;07eMKG`gI^j;l`AFrsH{~59Gvi>5@F)UKpS?FTaVC6opKL>0B`MObFDq> zaL8ErcpfT=(~oI|=Fg*tYLK*g=$8ODnQN8KpGOV0;l=^Iu7X_=alXq`o=Pi6XNGSf z7&TeN$PDUSYG*FTDLpd#bmlTEqBEBw^W?c!;r!%0`rh4gJ9i1rZjd{ma~E6LI(Lzk zk6N(-USa1eBsdBjc=H{2^AbS^-fW2Kc4ips%*R=b4R5XkZw@l&&P^(SVQs(4&P}FN zWJaJth&TX;ky`;gF9GX^b~`idmngFhZ>S@L4p@^RCfng(e#5ak(G1+ zhSR4GJ2wz8ALl_fz__=M&S%y0hqI8lckf;{4H|C$Tr+#F8JcT`=bFK}W^^vSsh&1( z3T<_*7lX}K`DM-4lSrE}msHBux-7^sn&orS7_3KQ*0w;>wnR`KO3C(}cp}c*oX4*8 z`g!Ja386v9tdXy@ZwyAJvn4j2snX}a5A<4 z{Ki^GW~#LQQTOptjRd~1V_VQ7f)5nw$Vx=;MMxc4jtIU8sUj4#VP#R6rI5VCW}CP} z7HgsUv8V1)-GN^le90PouZsqo*ChE;Os$O+2`W@v` zdW0PNFv`72&(NG0YBR6{F>2{u3O8k=cTSJG5W&|mHQehE!6$ok{N8#MuMn<-q0mvDJvbpdZ7LYs{+pS<%i--&K4n$m_dk}G9-iAnp2j*@Y=G_!_<7J5%^FoWP za@CzYPXV0VAK(%jU`31xuwes6HL&6`5?Dg;9aJ?Ui2{0#sDVmgr7_G3)ulukJ=>j1 zz=%Xa(;g;@Q&jXdew?Z#I)-}O)XeN^>}&^e%}7@ zV;x1w3hFXkE7{WvdOrIJAMvoCqBfaPKQ!&RkRPD6nftf)|8zTjjD7{|#4uwu=Je=m z-09KR*wdr0@ux>$V{pIG$C!c1VmRE1Ec?cwVnU?=%aU-#u3lxw;+-p{axPC@AZ!Uj(tYI=W~yK&(|>eeYW-=82vum z>2p+KU*nuat61;7qtcNvD(#55b8;mj?wnkXh<8r5;Tq=W zsQ)kKPajfS>}%CS0gKSlM?F$o8zQdMc4#YNuGH3oh%2@2+DB^ZrJ6bd&G8azXgpis zylKB3@P55f+He%>jWmD7Juq6&CgXu@Z5i3O)?T^uZvWD1dkrXlA$DrzJrL(n2BSBK zrxn6b@gPo0Rjn4}NedYCXole~9-lBI4eNgTL50mt-f`*jj>|gluylBbr5zEkFugJg zPZ{=j1k^ExM@f9Z0a+RSsspkz`oA(D0Mw=*b(#WpioIrqK7y{!H~FfvKtXa0psYPY!hNx&Z$`!B2oL)%vy&?#I)-}O&u-? zc*dkp3g|$|uSx-Zw)P*OfN$FQa$AgV@b(SfXlwQj9ehIv-_XIA-=cprf4-SN2b@2B zNLM5w;y^qtA(FiJg^wq{p}KFV?toPHza?cKfVyER`JbTfzIIz*QK5!e1pQSmEXMTK z7{-H$46w~9E!fs320D@6iHOxWF&Nk;hT0JddiFK3t<5yM{0#L+wpsfnyJ78uEvnBP zYFjh{df0mg%o;b|in!k#=*HU+PX^5aZo+aTWSbRE+%XybFj4~b8T4HhUQUCumM&zO`ZdHiR5q!8DlC(M7`gP_mpov)euoHD%1;D3=1== z3sk7|s7l{z7uZMzl2P?$fO-SNVqs?K5(89vmP+4lm)J}tveb)#>IKY?g&Ecb2C8&1 zPuZT&HEWc0`dq+Hoe9swZ7s8euI^?NdZ7a=A)hEgW%8|JaO|ioomGUqKDzmEe@Gdu z(i<9w-Yk@-t4@8?=N9^$)g_(!fYUDHyBLD*;CEq253c|%{qPW(YgUj&y*Xg6nKjoO zhz{A-_2ieh1g>3y`i=ldfXy|BSYql_T+iVa*~BX+nq*dQU%cejR(vnjXYJm*SAC+{ zz||MSkIdZx`QTH$2rj2|xXBJT+F_R+uD8Q=cKC2WMxVw-ybkgVHVii9%C;ZM5oh{B zHR8-r=tZ1IXhoby=tS&C3e^0EvIE^xcJRasY%Q5)1+E=Du>#i)KG}ofO;>6TEJaZgSQxqgg&SW5)cQZ|#g}RUC*1&^ zpt&eO@apPLIWD)LzJ~$6>Q43CW^4DSs+Pb!I5AQcQI2&g2i+tA1*=Bp;kpa@kA~^i-m=NkOknCf zaDgPc+w*#Buw`?eZ>67oYZ@t=_k&u4P;`*b#z> zgzgr4gtZoqDd@_YeMPX)N~kM>K$XBUb6gh5%WPm~*Q^E!$nFstt&-TJc6X z@YVnz=7NWwp}7WJSp^BVTusXsh+-am5-R7S7+|1}+}bK0xtMM|>FYtbdWiAY&)x6P z-Pu+`F~SxKaghsC9bnK!Bix!p8lJ&padn4eB-{+bFW8}bqaHUX;WwV(fj|q)DwoLU zmHOZl+S&h7D!f!%X_p7M7>6&whVOU2e@r(DmBmX_)>ZAS;=L_(Tfs+Utw;Kpzr^BC!xu zM2R$nR65ciwo#$vwOA8~-kbuhhy#&M+#K9s{1X|?=y;=-Le-%0fqJBBj8Ev1$UroK zBhY{1S}=dQAxvb_6lwLQw_y5$%rJGBN>4fkc2NP$lii{zkWr#nzhEDUCXw-C2XTy6 zKYEL>2Ofb~Y$l#?4H@SZ0I1#H)JwJR-8=cpL~a@gdbiSf2RZV}L|)UV)+-fi=&~~; z$h^$l%bnc&WbQ)dl6^C`9U${MWRCBfxi#r;+JZ$x1DS@y%mqkI1y_6X1Huksez;E# zXI)J?PqBc7e48mwMKYY}#! z>I&1R(v~YuRbd8HtP3$n1*&+unjJ{hUI7X7bQdsydtQEBLh)*RCP}xT_88>Nl5)~5 zI50i5l%(eAf*G8LT7LDCZeF37T@BsDp)V6;t9NuW18-~)=|%vmu?p2YvT%i0Pp3h| z=p%!=9L~P+jv7?$Ax54>501^GW7HOs!%QTomtZmq7<`O?Kn4HtKtneY2^y3H_VAH6 zT|{vsEJ}$1F5f08Y#_>G`AQVJsU(gKK`O3y;*)?7nUad9s#}mq#ywDcYtbV~wP3}< zO+YkdaWsh$fFHy&(UDr!744*v(m@bN_rXm0^mwfqb}8SCqq?iSyp zH2H_p#Y$AM0?#}kid2)NFrAAe!;H$!0w>pibS{z^uS)b;7yRo}iTx?P1!ILSogT0F z0-gC1eMzRl{OX-Ka9?PWwCVW@2bbtpHb#^Zk~X zz*p#857<>{tX5r>D3dFH&kKu-uS%2?bu7Ae5!Ih<7UQp6y(=xaDp950p%dz@-z>mi zm3o`ZyDCwf@zw_~^?7D-nmW@&T}_lmtvEGtvkY;fFb@S@iLMa7s?iuklM1sISdWug z*1fnvZEt=I5{vGDprX;3*Ps$4GHAT(_>G9uLI=FkdmCp}4aSd1kbx%1xwA@}Ke*S| z>kRGve9o0s+WQ6U!*>(Nhlm658tw(y)F_-ILQsN#5G~-S8{_-SG7x3D;n5ZjEy&pc z$uh3bBilEE(n(>rNyBv`Zcks995#UjmEIolh%baT4Z;5(s0vX zne(*x(`9>+=I+RMAmVPqdq7a`E}XO+?qzWz6!1MoLOnQBZO3yH{CRZ~5W7HTYBi!? zUo)6JEfjEeLCXl-mC*3OHwY~?yI#b&^&GYiq-IR& znbVDEjU#Bn?M)y)NC6&lN=&7FT0K8=J&BC8tr_CN4L>{kU*N{J2Ez|mJ?ZVw z4#d*yIle6F*+OkYERg!c?22=pE92Z&n|4t}wEe=K)N$y8XWD^rYqM~7scIL-t&Qmv z^qj93v=d8DQ%s)%#Tg^usfshkN14Ss1=B={k=S+SsT4W;k34HeIV8&ToOVS3aA#E> zWkRhWCTB7Bu+}T%W$BiOBfoBEtj%ZRgH0P2hx208bV_oVlc&ndd(*sn&{c^+#H&HK z1O@TvL1`$j1Rdwy8^=~WtiD1_U!A6L0~*~uEPb4srY#WZjwC)Ur>5=lq$d%cI6;G(8Bc_ z_6T4so{aGGhOL02ET^y{a11kj$CIAn14@vYCOvoIc{;M=Yjf_Lg{*QG0&VwEIs2l zA*Md|rTGP7_H2P{O$|(M5bLP^7H}{YQ;#I)iZNKEXrAb~nh+K7K^*!uQnD#eLRh5W zYUwLD6N1}LYn$tb$zC*FPfM2aV4dMiNG+hw`k8NG84bCKKtz`|-kAAE*eF7-4Pjgq58auc6VuZZDfRx@alQw?09+0`UL#dbC7$*o2$=w6pr z%6}1QHvkN8#NXBXI7cH-Wnb7MRqj4`lI%=gov%=o;m$3?8I=J>P0pyYW|M0p?Mo|5 zsVSiIq0cmAk>ZDdG_!1nirgY4kaAw8{7<<$pbz%b0l|aX0dzpeXeCe=$Xbz=R|y13 z+nzH-UgSefO=dkc(t^|eof=0f7l%sWZcvG}`n$+|xs}?N4&bQK8NmJMK&hcnHvp z*{8?zr~@4eE7(!GQ~42TM2Z-X=ElwFVYYIHbfeN}jE(_2WCi2Q`g^kabF4Z6QWMJ5xsJ&4ElfM4)Hu!O)5qgDPOjZb$I^TCSw2+- z0RTtRbsCgbc)*;GhIXr3Aoox);4I%-2=PM6K5oill>+$(EFRvvDbpQD%5AD^oroEf zZ{4P1X6qpoGjk^yKf_lw%~1_T2ZaYW80{36HyA4^#OE?0gXLqJ$lDNFB;8;JYY2oJ)y9;fkWoYx1Lb|Vo|V{gM4eF zO2NY6?NK{#FxFE!oZdV}A=aO@6c$b}9;A>KcM5~|o7u|Obpub%K^$i{-$pQuTu0`c zgBpa1U?k0vd~>)x*y@8zFQT-yRka;yhR<_+bx9q!DG?!kPUMIP+Hq;dF;OmjB&r3H z4urtwPg5I1>q&AbODm_Ihwz*et#dXNX%T_AugeaU++#wQ!f4uO zIGEIu09;`^qMVx4N+MKGjwnZqb6YOvJZ~i5sV1g6KOVv^o@+4M9iOmu_(TdPx9!+l z;H$#QF)Z~FiX&`H9Ay%Ci7H^{C5BDzUNHyaAc7+LS}jv5Bp(@8;2X2_>D7KXdndk$ zkFAnVVfb~$dU6>t&wff!!tBAR7ksmt@E%Or)po*tr;F5~Fb&fIy~`$1D#N{OAKqni zF+j?>tm=pD2G{m23#1WFVl+Co6WmgJ$9I6iad@@%pNzGY$PwBiH~!1HGY77}FQFkTz$6Vd}JF8;l|3?VLPU4{C-BP{N>L6;K?X z$JUI%Al8{t3aE|O zdKS- zaeIH3@BQYd>wWE4>wez*mgzb8KYQOQc)vR9eN8V{y4KmiN42}scmLJ1yD!Yjfv*#P zQ+G}J{a|_may$WjY$96niC}J6xza=cxNIU=<7pt*(@#W!uZ2M1kqf|=?F{h85UjV2Xa-BaGlas9{JwbJpLQ}^noZsAtK)l`EKx^y^-;Qd7P*V z_RT;(ycjln8}hO1_Pbfghs1bllIjx*1&?mQ*Q(_ylcI|vG>28v&r1Eb^m(&A$Lklgt`#=Uz&%%p?gSZYk#JtHic zLL#=IyN+Vm9>vqi=vHNR`&OA&BvV=#(6=}lG%9T zzXbbMsvXuo$$3>S01DHNtzI(v(>a_pO^(fJ1I$wU_FMM$ZeSm$>X<|*eoc- zvGp1<;BS1BmDL5Kz@zQDYjlV{cO=+{S7{VojFn@_eYGWy?j{WIXh3PExTep#^w~Al z68WFE+tbxcAdmc2HJolfrdAllxZR6NBnM| zJVTiA4b{cfR;!Mik?9t=u;Cnq-KDY6c~;XcSy|43rzjK5kt5<;)|`Y}Yu;d+4%erW zGynm!PIO!}NP)G!M=ci(0#FYND^i>8Xa{{HfSb;>88;#cE+Ne#{wCj^5oRW{GLCsc znad;Lg7hjJ7qSRAszmhgFF@tt;2i%Nr7yWU{Y!ge1k$+#g|sG^HtLASL0#$#89-~= zai!zr_=@lOrYpf=ayWH8%h`DnTNPTy!Hwb|A<+{bZXHi={Ba=;yyrh3;?nir}8m5KHyn z8-lRqHxQg2j)Sm7aG!aBrogq0r#s`x;k4-gh?)dmL-DQ zYnomMOPd2LE01a6k_L4*8qW$09dAj6x?8SKpNP4$IZPi5UR#aFNqnk!Wg5Lf8a)5* z83i$JavghaykT_WU0=HY-@_ZLotI?1CLcDWgzzKsj~`$+U`s0iENVqmBdgBYay0`0 zFU{r<$!sAYyOCwsr8v0oY#24|iug%iLvK6wNWxy~dp*y!OU%x@^xDR^NGm#6^N*WN zDBVEd%|wm;AG56^A5HD%-c^m$KmXn`t=PurioDWqM}+02_xzyndZwQTkRvxZcMxv! z?dU4xf}XFFXiM+^Vc~p~pBnxAqdSm~E0An()AJ$8Sjr0lR`G=`HH@OB660zD0#9q{ zyW;fTy2JrE9;Od|pV|nZas?<35pNUD47aA=jV_{ZF<_xXucbQ+-!P`xW?dNBg*#r? zL8wIfzMZ}snoeD>-JtQb{=@x%ETI`$=LUlXR^c zfJ)qOk;R*n5NN zn!%-mcZvB3+X`t}=1->RN*ZlC+jf2Aycq52Y-kPHN|(5Df|_N#PesyQTGNd<+l;DS z)(R5>N6gC=Nj3StI>BI$>XX9^%$EO0!^#>>$Kgn~I&tr)xv@RJdn~(;dp`l+l2GM0 zB;1ST%Hl~$SpO7Ga_;#4Ha^`Nce#Jr$fPCRdD80`2;=caBXv(k{tLCUhd#+{L^rYC z@ooc{M6$HXaFmKqxxG!_+&k+V-tC*c(oqCAZp*Qc_GKT{KX7ZbytYjEb(kzY|1~lu zgh*fx)TQi-?mbZz;)RAqf#OoucJ|}F5zL`D^T&PqQiWCW{s@k|QN+j#;1V6f``BYh zU^`ed#Kcq!gY5CiMGGk`C`3yo7cHUh`+n-RFAhW?!xMKPRW3x*6b5BmWl|;$uk)R3 z6UT?a8^k9DO@7x4YEDFOsm&yehfEl2355cn}YLGi-^C)0$39{==Wnxkw^-C@PtJg92dXo>a$BWZW+jQ|vcyM&652+;Pa zoxY0!bn9|7mLPm+1y^!|NXR=|ul9kF(&+Qu6#%eByF0RbE#KoKBbguBbW~|;3k-JJ zO{@l5ryGF2V+o8qbAch@lJ1idkN9AvdrBjlxXq7@PDeN!HG-^Wx?av)&rwRq(c=2X z8{)-Ve{Cz5c9Ecu&R{yGS1I1t9rf0~dqaF>XWkS7mBobmYi^8}`{o%oZt7p{cHH`h z`t#rrRX4pzaVI&1ye|CH`d4p{zZ1UWzWqDn z7D4Ju?~0S!{n4DT*8D$g;b1UcZG|sDSg1u(k4Whu?cquXV0NM3%3;R=lyl z?wE5?sbb0z(6b^qSB5>-g;di0f!!o5ruVmvEeE8Y{o_k{e~ z$4Cs-0idpW>Amq{SgGBwTVMCy_+-yfX4dzv7e{^dx4bt#DcaRh|L}X`-vsyC-WR`w z>%$$lhu<5@1R~CkwUx^D`kUSt4^rU0?~702aX*ifeJC77VM*W#^=u-&v3Ufyb+M#mjiyu`5n^d}>!b#N%uB_P+PW$!fd0T#G%G_uFy^Uc|8q z%lWi&G|ZYoLG|rK*RjB}y?)vIu_CtD-@xNc`+g|eoE1gE_C?#S(-T&l{!aAq@Q!expL^67PR4!pXMHF~RRQo< z#-XQS~ae^1Iq<7 zsw2urP}vy`An++CqUZf3^_>?){b6_gqZdTWquXw;|KkPG{JwHR3+NjLbrK~8Ni1c( zcww~Y1OYK3j0DyOC2Q@l{-WJrTTlH>yW>k#hg;p6)W5wuZV$`%{cv~u?Qq`XVHeQF za|nBaw_xd394*Bi z-Wk8x&86LRNE%O&?xqZ?M6n!7>Jnr27K>f^h(P_P=^={S%555|T&Y}|<^|p1j z)x`+%zhDKJMh4eMB9{&8qi3J`z3)y1>6&zc2ukT$@ZUgg`!JCPLT8x~K&~07|H=C3 ztdl@IS~IdL#nA`}AljkAFNps`B{X)1yU-Frx3q zPc;vL%|!a3`miWHdXzq(+s%G|d!a3pQaACuDU(vs;vm|r|6S1J;6%G@sp4_M4?P_k zr${wJ_stIk!$I&%#(M!_ACTyG-Kx?CKIZ(=kU*4DIPbQB}kWE+$Pbcmcjh zNnMXAG(C8EL4H+QSI6WS8IY15*SlUAbwAbCV~tW>rC+&%9IrPVU5|tgqz`0jF2&5% z9+@pc_||$1Fd1>ghDncF&+!&+$6Zw_teoRoSrccj!M*hWhltf^6Ti#!IJ$5fXJ07g zenZEDU~+jn!yvG(G#X9q_G^O?Ct#@`1mUZ+LStGzhw}0*?@~Wa&bb(ZP=V1QV#1ct zKQ3-=vtThU23;F1=Qn^4ZSvC+=4ps08AOokaTbqbpAdpjiNvS2p+p3?t&J2+%GCU1 z+XDfq^<$MXMC>E*z=^D0)kaTM8xPg?dDZrupQpOATn%tNU>G4mz&JlOK(}A;HsP(w z1ttdade`+)&niPL3G&PYnz_&2Guc=$5tH@o=EuJq51g9mNf}jVu^Adz`kw7*PI+j? zj|;_m*LT96Hc!g+?_3lu0G;TD9K|znHAdh!hp;LpyE%k4esbV2WFe2A;i@5{EK=Tb z`>sX5w|LrZ$@lQ%IdozD_KTxxji6>&%1xdk=P>t%3{!!;^nV;;*v{c`k?z{z=1-`&mSj9!QB_3cNScPVhhS%7s;GQ#yw+`ggi_t%8xR~7_*Dn;ZE4a;Ry8T&| zHu#bSp5fiC-+xDZa&0hkq~mf4LPL!as4=_ld4yPj?6&6xwg8fc9bsvUX@++AtN<6qwTFzgb79}|Xk=Mgv z|Hc3&%0i>I6Tp(?)Uo=c-b3{jiS+U696QM#KYP);3}74lm<1C;a+1Pc|AlgM8f3C1 zj0quxFiBXTIQ=F$m{GQqYX;4-arJur?=J_v8i;O_ghlfoUU-1BBF;GDnneLxg9cXt zNSuW6W)L%EB)FMvqHr8*r322CmTkRAdwPkk7}PqMZ?dqJ&wwH?MLD>!nvlghLvfBbwS&%TQIclsQ>dHVZzR> z_uNICZ1eAP?DzLZ^-Ct>=Z0Ude{?e5Rz!DVWl+fTP<`D;<7Gp)M>1DI#j04Aj-U49 zC(Bt@Ib&gO`)K^Z6K0rrLGj(?-uk;93X}R(9}he0ulnP7j~dWQnJd%4f{(?ESKW>m zl2w`VxYp6Qn^tS}YDxyGZ;C8rJ6SS-rJP;&vG}a;_WGZGEdExbz7qA_y(eBw{#W+I zXGe!7>jQVkujBRByW@ZCJv51skY`&YCs~YPa%gw``j5xMDtgz)<4g7Y$;aa#`?5If ztgN(BU$(s0mwo2m_=YoP4Rn4;_%YLy+bre}1PyEe#ZoZ(^?!Kx`#!brM_>M(;#5ny zo_r)6sPFvC`1jT3@aOY3aZg&C2$QVM&0p|sUj2o5oku%2$IR;D#~1Y1zdRM5SYNm( zF4bTEVBA)}=)t(P{u82ZQ5RozkGB%>L1HC}&E!_%Blnn<_&@iUl{o)T;#1aPC9+;e zQQ}<%`OHd;rmaMNYpI%>Tux096{uMM_dkhG4G+{$_+-2!{G0lQPlEUd>M!^tw%39B zTR#~O%|F1@J>_5hz$fGRZMa3o(w6$;pNtPI46ON9-QGPM2H+hGW(=Js+MNCb=R*C^ zz3~P?Y~H7Gh~=}SzzRQ0Cx1E~USPA$<_S4EMVq<%a~I5_vZ#K|r{n(yMz6dtK5esT zl)+%R`k`l*t4#owtA0&cdC}DR0)&|J;%7*v?ZfxQZfjP{=B!L+(?*0{WHzlFG)SXeZMByu9zkRM<}V{83^ z4;G!UOTV&v>-^-OsR9WqbX;&)`hl zUjHX@c@#ezkMP*^S+lWU{aJYH_WIjCYi@#1`nSL5QS`8rpWtWp@NfhE1P~ zzYL0WPQ`uwAd^jQ8}9yU8`#GQHF6o;_spsIZX5cyABcba3>$if?(*QMw|RZ&wpO2%M-SGO2RvAR^MEF|zVm>eiIy+rbDJ|L$(zR9 zhV@VEXKq*jT|T$SYzAyXXBJ}r=HJE7>Teow=tWcU-oI(RCG?zl_e0?ccZ_^&PJLui z+$EM#sz39$;*R>a_wvukN5al^W+jIDSO5FBJmsG^k(>XX|8i6PLqCZI>Q{*e9lj`P zssEcCww9W6Fdkfr**U>h#ZEj3osLC@M`NDBGb0W{>P(Lk4NqitJccrLNBG^|n(Jh9 zoZlWNvE8{MINDl$nU~w0L(#F;9nurvwx&(usFd3K=Gz+PYC&r6 z|Gxc!V5#5lS4h9tc*(T*b{%2Wo}M7Rvz?$-*+BN1>%DVTV6NBc=cbc5F;!%)N$)f! z>iLyh+{;iYw19uDd!?~{p%WtWnbDq*XY|Zyl4mwrLar-^cxC%atF8Po4$fq}E{)DE zqiPYVjpjvUc4HS2Y0KH&l*86*%1rMxB5gSwaibu2oJO52o~R7Fej7RLxh98=8I7D{ ztciA}_va_O0e^Mu7)ITM=7|XPd)dCk@+krJR`f61a{aSYyQ|4Rn18JD!@&b>8^gyb zuX^_L?P1a@f~mG-TocBDY`>xB!)?iL>UpRwxl;4YB5BA{f33*@fq4LLn5F331UKpV zHo;9>^9oP4YnWjCINq+|6jVRIO?FMzj;WQkLPM_v8z47VkkVFVx8!zKA>kx8ruv!}q`@hcGurRs@VR_m1AGbI?G zxR#>^RNvZYUrj^-K$9DI9%~&-Zj1qr5GOe~4U!Un^Z4uHub00ve``jAB;YxpzeW5F z@W=6q$wKn0JlRi@B>Xx4mh!iR{D|kN{H^3~Eq|wx7xK620$x_|cM5-}^S6w@Gx=c) z&$IYDhrjdrJD0x;`Fl3My^z0)NWYfnZ}ImAD1K)LVQ2LR9t!(vw#T5#0eCGKd<`oO zpohPv$tAAfX(soTz9F04Cr$3jVi;`2ce1u$#7Fu0tCR5ppNH4s9!j zKud%dbZFC+G>j$e2uce6wm(ITr<&y+tfk;*z`KJjnP2H+kY z+Va<-lddun?~qd8k?w2Cz`*LzA&oTbhd|{zq;Wl?A-R|2kR?&!*2VqG+uerA!*jAN z!K^hhPW0U0maNtD@wTLo)%T(3NL#W<8IQHGOP%Loorl5`npvqQ^zKGG{P0d@8z68{ zL~l0GKZSPmzw21R(IRpmb)@gaqUBYav>Bdk>YL#(w-roE+@#q6vApB5<~;=9R`;(7 zx4NGew|qO(sHHtvT5c2L7>yG#kLs$?e%oMeQw^#l*E6Pf0DO|?lYEy?o=ft*K6xQY zze7EFAutD95*ubvE$O2r_@q7SK~53oD4v7c1+d*zb4x^FLDFxomkBYf^qYZO;+F6* z9yH`x(CJ&sb5)L}=raf0b-2^vWqQJfCV2`oIhR5+;F0(~5J0mccL&ip%FT5wCf zfhVfHuIV_J-VJfaWYT4`YI8L(g9-HgIwophOS#VtqyzXCIbq1NcwXs} zICjTsZQ2KSR)R#ya)1V!G}AJ#87&WpmT}%qwzFxiMZuvQ=*MP(HlE&Y_J(X?2!eNMiz`a;5TPg(yk=IXFmF^_3VoCCA40D>)-VlfPXCG*RR;!> zsv8iAX{I2d%Jr-q&#uxN;_Y`QTR>)jSiOrv2;J-N_6_J*#M2apEmp#jU21||x$!}U zjZkcL{b#q-5D09ED4+p~ZB~1?luu0AijYq7@qpML+1GIdqK+mT+&ak7X}xL7g*?-t zD-*KQd%t<$#I3~WCw=gSe)>!g)<*r1T0cc>Hy4x2%~+4bJ+(p3-IkhAd54$8krrmu z#TM{=z{!l_!8SfysgVMqE)1j!$a$moZ8A3l=-CAes?jj^v?izPxwn<^6lu|&F3e}z z3v_|gOP53BE*LG`vVFU&mAsn=6|A7x8clJld}{@c19hi)NLl5C(ZSLR4updceFK6I zU4tT*fTYzW^086FWNQ%}L|*+xHsmox`e8g9F!|BoH;An|%F8Gx)&!&Mds~$r(JRvs zSSd@5Dp-}eG}*yuWd}2AH7bIJV~C1k@HW)4LAab0VsYYvNCGZ{^8t@pDfgI_NM;^0 zjm+F0)sh@$TQZ1Jz#~rqpFOgTIUcX}o5PHDCR?ioW~I!x#*$>afMu&(s6+VNmin6> zjpx@^$zhggLx_!t(K0p-l~fV*?MNSw$I@dM_nOp>^ayW0DbaE;wy)eOJEfD~M^TIq zvxi3UigrPUwOV!0sz38<@$y;^9ifrmxhsvYcS}L{tJ5p+I+uh*gn4>zYlXwS=^7a2 zr9D{I19Egmq0Cz`GK)UCJ=&5K1ol}uObtXQ4{oU5m}G$sj(4_2FOK6l3|I@B^~rH7 z>8Bxfz(;H|2;EvWcjIeZU}=Q%0hDvfj4H&5fNM`9E5N5G8%moT42P1DJI#r#PNMH^4tfLH*7 zrwD?;@Z3~_|AYS_dW1)w|4EYbV(ib>?FTZhApTb{*!78}=spN3W8!=$^2FrphF}x` z;LuX_mQx^`_`6usPef2jv`nsaBP?wGKSSp?a2a<`pKzHUqZ-q#eXN20I6wZ zPsz$Qx002Vie)M;`UOxqg^}X_;)G&>(`XB9l}CTU5tM&fo;AGdvxba+>qzB~774^AhfHTpb8taW#}f zwr_ep*xqti7AT^IGK=N0hx`f}WkHrSPWn@?Fw^Urj=A!NM%BAayxp7G8(i%I?^yzn zxqiUxiz#nknBTipU4%wHZC~sMUT%>E?i<<(b<@wtzVP#slq6Idu>LSJS6dO>-&Q?M zJ~3g4&eat9O%V1mzz9b~VqWGSgJQ(J8>ilMq({k0$U=~MUzlkIRYz9i?3)freZ;Xg zi#AG$`sR~WXq>6jk$wdwbp=*VG`7MYK+%!WlfIc+hthNcIoC6j{JerSA$}cQ;EgfKZItCDN>-1PxH9m*AGGDI-18ALPa(CK>U=t6N zJ!zjE!{Nc!jlmgA>zQM2Mg8^PjC*^Qiw_z*MblAgXw0pu|JS$Txi$Ix={FtQA7#oW z)6=AET93~(EcF;nG=C9=--yrf+3=bPK}EnD5mief7<~rh8tWeYd{Sg=HsRl=|0sa$ zbgE&oaMS`jGD0XqD3TVEGkKCOBL0dhq#0mW>k<>~nQh;olwZwatYu!`ewmE@o>CwQ z+3oh$L@8?MNtA+a4m`~#xJo`jBba7`9O{;;1gP@KqW@^=d2@@7iNh_L1G0Br6SJLcIB9*Yo(JqpJ;n~(Rls|qSo*Fgom zrItf$d5)h(4u@{%SMLvdHxOMJ)bOMPqb77KL0325C2obdM34de39=knUAgJo;kFuQ zxD9NBlvVDibyLpXE;gTK(O@-H8Z7Q#3yg6JJ*_}cJF`JtYl1QI!1O@Tm)tet^jB?@ z0i7Ohx1jkBpr28nWJaag3n{!X;o{)}OTcpwAo+ngw9+mzTEuUj!t8}p?rTo4F$&|b z1%kESEOdvoZ|m3?%3T2Ap`%KYPX8|yc&xqZJhM66p3FD>%MFL04!MM@dZjH4u^N{Y z?T3O}DW$kCF{7#AoD5Y=OvDZgrX07GP?k}OFiP56mpY7SnWpFPu8qZs?M=bNl6XgR zFS_|uI3F&_@_?jIblsQ^O&33RW*S50NRGwS+Dz^{$%98s)4Q70Z8WStNDemBtE@qJ zU&T=903s0NTM_($RwA61;Ly|fa;R~oB6QFDun7>)2Xr&b`o@9Gz!kB|(&%KXhoy7F zHG!;@7Il_F$hurhQi(P*p4P3jR@94s#k&!Oh=XD}XI#1tMca}JBei5JJ0nqnih#hR z|FSLR#cmmK(A2Ic4ndwYr`CFKpVY2J2I^OhUs`Loa{_#IH9uD6acQQm!xR`{CXm!Q z!NHuX>&QZ$XIW^qO2M3QTV4b|Q#;f+IPMDPl+ThMBuUI2;&3WCer&nUu5&YCp9H2A zqo6Lc&6TU&p!y-~xYG78(R;G^gshh9$if*#B{o8D{%&;L`Sh99yTOe#-Z}8Qy4kJE z-!&2V&EfGiRqMJ28L%IIQOzRFgq~dGQ8JKKF2ssJ!rAmeEFkm-5Ut>n4S}OWP?epv zub-q5Naq$&neboiU*s?FFz%spYb4^7B~J*|F74X-Ra-#T_i$v3!43PZI9}}$_}wMVF#SiyQ8=dQ z&_Gu=x=~R#7C(JA>W}^)?mJ#5N?9iaBz0nOqZ3)qtWJ1!;|#Y^<1tB0&{Z{c8yfFB zcpr6}v-gsrsK+5F!84yvb~vF*Y)8hF8y4z8t}>%sPR25z+-m=e zsL{`N54Ee6g0&*i%<96B4#zRRqc$`oYXX;!=WNqWNK!YoVN5S?!x)b-H7Xc#^Jg%g zr>gL&>uc^%pCJU3RioQ88PSj?GhrI-2WA0Aq$x3pY3h#j}ywvJo>YwN`ECGi%c@6x9MWN3esbWl=7Jn)QS^6&^ZG zt+S~uX=>qvn%W{$TalWo0jo|;ZNk(hjj06%@;UMqCyki}8?v7)v=B88sAW?NO3nIg zCjRAham+H zI^53SGx>y>C4H$>@BUx(4V3x}lYJk}&^A+1WWpI6?abohbI`FpC*&}$^UE9bJwI1- z62+H{gmG9XkiC;bQ&?3Jlf&Z(W1U8}qP899EYa19DJOI{u}e2A#oqnH(y=OLreEs$ApK#1RB#YI;LFqu(t9+?IgbFOU2t=sCN(#niPGv%gcsa|# z>T2W&)HeJqr!n=iQkZv(jyZxGYN4ijq1$v$4b<|mZA}B*&s-7Tp_x6*!GcrzK+!Sn z74M-s7{gLK(ud5e^H^+NCi>Qqe${gRgPh!>1n3@Oi|Aj-&%<)emxXoXs+E*BLN7EOgkQBTk}Z@C&2pwy*Xiq;1p{x?T3L(R=r(eo zp%llRbF}(f@{7ip|5~%FsPz^euvMg5x{tH$hIu~THO4J$m2}U*STf3U=ZS2cxdtCy zCH)aUZRPpnxmd_4xeYT6m&I-(se^YYjTDa zT-sD{DJp;;>S6kSv0FDyaFz53S(lKNK?AWWddb* z9xNx9>3OJ}oTumEa&m#5N6N{idLAt&FV^!|Ie8AxT0GI2T&|2Aoykk|+*eLsr{`2T zdAXkZ%gO8Y+}W92rRT2BbQP%~2R zw~WmAUn%|AZhQoTJwEdcjlX==}LWPOG{6U3%NH045C~4T9F}c%dN94 zScn#A5MvjWIm`zNWRo#5r<~17Bo|DrXG^(+hDw~zr~ZXwOmHm1GUcd9_cp&zHeRx2 zS(Fxdb=m_nL|=A1wWo(i!1n%>3nhHr(tdl#(uW$K^Nxi0Qu8})eWCgNGmV$&wj@s% z_$bb-Dc%%rNH|bU<6?~{=kJ@1Rkawe;bZ`g83C@EU;L;xsri(OLBliB-F}AGOSZ4h zco0xnPfvOGEXdwv>}S)dchp?L3x9#l68@=moXKd|0=we!i`D6){uTIR6gR;iQAB|5 z21B01QgJ-TAJSz)zQ4P`jEkkZp=DH3F6efbG~RY~j4|0cUcqrvZVV@17J%>}{odS~jDrT~Hbb(!&owQH5-+l$Wjr^B z>(RMjk084)_-~S#Y6CZ^plKk1%5Zd8$<3!q3rv=)LqHYg_I%)KF5rw~koAfhc`${H zi+IZ$ac9z`hxsU_2?KGx=#a!gCs$U*-l`=uMps!A-D_&onusaAfKm4ls97EIjH-aH zhq+yXr;1%s&sB17b8KCM4PbwB%4iy-ccQl1@litD9wa4eTnrkTN15Ib9O&hlu*D8` zBsp@wo+E6r(-Y*qS5NrkUOkO}6J0|(gA5F;au=9qppl~`0?mkV!sraPaJ7M6raI8+ zi<~lSVhLOzGECIEx2%aW8?TZc1k+!@N1|mj^C~IQx%w(W&$2+(iX?dT)r~CXGxH0x zrZ~dSSRqGINY(Ghd9vugHZl!$VxE27#6pfCATS)JbF4?=A9K^hyqx(EHTidiHfh-~ zMN2e?8>CO-oy7Ke8m}Mj#5`NLMYz?_nMW#r1$YQN?c??Vh~2(o?x^Yj8$9N)WVNMi zJOu;*Ktyk%9US})zKRpm?eBcRd==s&EMQCntw)A&4lXTUxExRt@Gb*U%~XjTM!;o6 zz6K^2API$7W(kUTMrOArmE>NbjXW$(yo!5StlJh+j&Ca&!BK(r!;~rld;~ec^fM~t zh=fZGJ#Mvd`~_*E6UyaJ9%wz*NWzt+y; zMJUAkkWuo!@Gp{aS|;M*L5yCUbBuI9?-w^|9#gzu;-1_1{nNZZ*Ikj3jjx{7{Czqv zq%s`V9%l#Oz1hp2vW~#1xaV1EESK~sa50fEEf5mrAQf_%P)QG)sC`AF$wRz9&pkhX z*NAp$f*?_ytgA`tyk|=#q6e=&_YK*N!Q51qbZs2{Uku>%-kGy|s({ z=fWGWRVboCJX>jHiIYBMnWryVc zC~3(2cNLm#BOXwGBkgfR1R27DU3iVPHf8+9FFJGy=co_QWyY29X3G~vv1SHk=nMnL z#$zbnRb@L{)KRukS@#NKqXkl69iBZ-di8oVecdNB6U&HyWoF(UQU*UFzTH;*k@Ts$ zfz-HZfrOWH#VGx8%!RsQdKDop+ zXMZD7yCNt|X}&}b#JTPgcS$-I2jUv8E%gpWW9;3+nTs74TIyu2ZntJ_bS|bFM3QVH zWI*&Gk0Hm$cBkLxGy%AI3d>8L>$+>{uJ$pE#%_f@CNJWNX_8QvOq1jap1bieZdN|; z&*OQB=Sz9+BLa|0-=a#7VQ-VZMd>NZzl!H!HWa;@=OI?D`0cm#6IH*F=Z9gpZ<4$6 zt>NXo?keI;#{Zq{2we)dNp20jUvgB|t#p+9e~{S}`Yt=R1L(}y%G+yHg{9zn>yte# z3kJKik~hco4&$d}V>adE%p&Qn|7%anTyIKsfaF*MlZU5*246r}?B+ewqvg*}cQwE7 zY`kPfsaF6~j&o?j7T)B#pk4f`ZLU}TQs0kO>&HgoFhCEXgf6fzP+a}jF#vjgyaBL|jCTscZey;vWD6yl9rkOZpRlZL zn0Ks11_;r?NOqKcT1Rhg_i1clc0!XDn&{usSmlpUJze*TU{|{takxt?l$Fr8b{6N5 zHpj$V+%jo|7XM=}XoTJAPOS1x#w_u!FOxXyPIr*EHOpHjGV4w!WW4(<#paQN9(`Ct zK>$6tO87au(xIdRB5F9;VxVu= zlg7i+bT`KxXrCelpn#-Ts)N@Yx`el^j-6j#itf-$gVkly9fpts3yE|XWZ`U~ZGm3M zCb5LF*+Sj*t>5YEA;P#cz^mn;;f^$Gxf_jCQH zSG1gn1h5;q=YcrdU z%~Aw|+vq4%s-;!{M&QcZiD4vSe>0F9T7fE!4J*T{=4wMj(c)^C-y_kLnjoQs z!VP^@U2YQ&&W77*YqPiW3|?}d6?4SG@B7<%a%A}~J-y@eSi#SdO&NMf<)h5XP_(Nn zc`eUcw7X0AF%*5Us|a~=2{=n+IJAW0pV#xX7?KvtDV)`cnBYP2Hf?5aRo$K70Tn{x zl|Qz+cXz_Dtx#umJ+b}-@cY4ZW{LYDCaUO6*4GT;Vy9L|r&~`QMaIQ;;vs+sZx}>> zd@afX3I4%oCc!^jbUVgt{8!29SY`@_h}m?n>5PMLWvJ+fHS`wMewH`rGTwI2^?$EXdFlv(m7XG=@m^C_{{-xG!8me@nzRo^^{;^>=+ON>0LFC$7TwP||-t6KoQbPSag)IjJS%MMr?ICh#$yl8Q$0CagsD9@J## zKR?Pqy4@SGto4K!h*uo~Y`%fV3?Wnx9{`d-z&=tGY7!w)G(JF(!z$OSYmhV`!4AB~ zJP~-*X%D+z*Hu+X54(Z~R8``gFBpSlSJF$XTwlwK&je(_07;G9+o+!jn;B0Qf*Sy` zVt|CB^c!pqkN{L=D+b7g^%uLAbv1|sw*jNHeegwUq;p7_ND#o1FN*8X7e0hbSVsg} zeKlbu1;ZB|0gGAm^xKu&>~N&6eBKNCdS+*P=g?aWvWz1_uuG2>h&jQ@mxu1fk>90WxsYGKLL|L2M2|!TYc?Q2_)09cKc9 z)bBRz2+!0DEOa5kpvHFAS$Xbm2R1blceYo%w98zXlkJ>L(M1n1-RW(YCR#@tIZBud z#Lst^^cR9F!Si0x49Ui(t``F1aJ!^Y;%jXQKoKM>3 zCr{cg#wPUKucvr5Pod|O-Vt^8a}fQjaUn%!vAkMp!K?Tu#}8y%R~pq2(NMq{?u~iA zi8?G_kL8_Xm5&*6aeRvGUVQ_^)a2du>p=~k?=@6CcH7- zn8sWmW^-F(whMOMSU%MST|?$y7?vjbwlJS*RVM~Z5ZXIJNO)be*{v5xSkH{DPKH6u zg?xc<04G+_YW2!w4Ldmo-9mo~4+V^2v;9y=ds`@Pn)YkpBQb_fIK67`f)!UyWN3p& zPg-+CKAfX}*w4Yv9|Ek4yxD#Zgw?Q&#bIcZfQ5xwA2T7aP}0W8C0SQ=?+5`M{R+;7 z7S`dWsJV6L;#e{B6Den$nt!D!7Le17agD1mo?bdkMaA^aM{y!z+x#=0JdWNkEiby~ z^Zhc{P(qBK5w_AL4Z7mE{0_dAYm`!U8X6^PGa6j3Oqy#X*CG)%nZH521fZa?AyyD4 z6$$2w`51ErNdw5#9y;7*Qs#L2k^;RT zi@Ry1B41I%91sJrm5Ld=U0r5_n9(YL8o#YScX7+9wYPfXTL=qx0fBAR;rBFNzs6&v z;thda(A1mE3LtJQUw|;+4IyKaW#GXf*3Jsi0rh7W%-YvLPa*!UT2Rp{{J9rB$YyN7KnOAaP9421QK8!$vMa+d@GzFTZB+wA5ap{WHEo|;9rKzxW!&=q>vgxqvpY=#<^X|>`u=Zp8<_#_aZU0g?5EnUk>)!ppt z3r6qx&U-)c#fQJS@85aRJ<;9udzJt~r8JEy@{xyr@8&&E-2LruI7h9Rj zexW_Jf0Z9L;nvhVg+W7%ko|km{yjth(R4}ux~mI`*6BIaZqmE6^d#xYEWMZX-cCSS zsa#L}hl(jvYexfYNG&&HDP9<7bqcn+4Tud{Yb)$^dQxecHfVl_{7AwzV=XXLsh{?Q#1l3@sUhi<*GN5vyU9w zVa1*bj~1&8muReF^~HJ~E>@qT=b>Wt^1Puc4P8Fn&`aENZmeECqalSsnc!;Wp5#yj64kY$B_%utH?zz*gZsMiU-d0|k8uF`Q){x&?XONo)+Hv89p9$|y1}a%j!ut$V zGMPjU)1caKIY*ju4qDF9JZBv+MZ>GHWp|FV1weMzgC{TWI7F~J+|`>}hqUj6ks_{h zNqvQMVLZ--bdL{(GSNL5=X%bZ3sD(OgODAAr6LUk10RK6VOCwj3i+#u_dr3M^1;Lbag40^84)X(bBF2Js7~m9YAH71%!`h#(0d5Ml_Lq6jGNdT}lY z!!3#cLxS6Hp~p1gT**mU6m;xPJ%`rfFye{D@j*S&3e6HRKOe_vl9$=0atsnikhwX} zF1Iic1o56c-dsW%dwx2K0C&IHSETmDZ&Im>FeKlANl z3|6J&{>(ObO}jtkgw;6k+?xASW^a0g&2+Z-BtmA#$5>;7rB_jFaQZ_ngb(CSPgT!^ z=ivj{@T4v-JYQzl?C%{~W^Y4#atG<}(74{Ws3 zmudD*jn(pC1x}*O!UxjNex0t2q(^zk2w_}za@)Lxi+87cNM>|#@7Hw5lF%i+|3eRu z6ej6M&)+C`KP4)yL4NfV`jZ@F&A~|sHue7(kAT-PcuyIev_=iB@xe)J8bNexyvpC5 z?q_~K7Fu-DX1OdiGZrABgQt=1#bn6Bg%lSdSALgUh!I3$p{&s=ZirrV>|upTRO(+F zX<64<$)X;5-7r9|FIw61oLa?4DfE^@eIj#hNQPuD&d+RtQs}X8W=i1b7DKE>H@L6HK4wn%spBu&v zFV#;ck#=ddEg?Vs>K*^nVoUhzHB{qCumK%Kx=>|iEa49m%&Cbx&Pk-K_WITEid$H( z>}#2S%5soM_)A~`{k=HBb#Ym?xa*c#)FMG~-Sr1owe+#(!Z7ne7TiTB8n9W>_246Akktov_)ZTrJ|)$3;Vx%QiTFTE3FKYFyl`*R^xcbHoK?!{iBVS>7}|> znqsZAX{k;D2UsG6CuLP@CGNP3YPDZ*Sy0QyPhJ+xgIP!AD<1V^H|oi8G$%*M5ATK# zVttmPVhM_MqqQuEmHEhK!8qu}I7vXA3m`kKD{CJ4-Jcia*4Q_iV@2rUZ^A%ZBVSOu zcwE!DCfk;%lYG`7)hUt@V3FV0^@SG(pcB_u4r<>)mJ0h zFI)ew$ux9qRln%W*O6$oxuZiV!+WXu>#&_3M^@J&8HW3J^7*rfT+Vq z49a%8vIvm39LTJT#9B+|mJU`+@e9m=5Z*c49L$JO0IKX=nCi-r!*zE?cr}WA=gvon z`Qw@Bck3_J@7e=__iknEgpP|1Jzd9J6;WGCAD%m=yA3rN!ZX8t&?XA z#^@g#{No(|D5Y#d%ae!lyiIL@FGpsq{T?ufv9O+G&QypQR^BAI#FbN$(f_<&!hT z59&Mrf}E8%8GEO)BQ$H=NDJ|kCxB0^h_q2^N4GRKKi*6$us&7kUF8~n0I?~s$3ISydL)#HmJOYH&w4;(#XQmCtLmR&qt8;H!gc>oY7ehPk6SCPi6&2AF^%V*6O!fj6Ne}&T5gxuInU5xsJC}2&X3l#%TIZ>@Ks9%1RQ&eV)MvY`UBn2J3xJ=l+m}yb#ds@aJZ{eiGn##DMwj+UjHz)aCNI~ok%?FtVopqnO-PLmvZZvX zaMLCxk18&uJCWn*^oIvI0bq1`4sYgl({$k<;4(>#d3l66%KIoV@V=x{`c2-|LRW*I z2|c**w{}E=y)+yU`urG4scXG6?paVQfkIP;uxrdK&&r;{ixiry@S^D(7SJ6M^3yNg z@)aMNycNV`CJL>k@Vsy>RDN&pB@PA72+fEj!(yXIM9 z>fYLc@YtiBZ3Q9>Vnc9Dbnzpid`l@aki)-_{v(c#VIR8tAW2)UDx_Z`x!wl~A0UYy zp_;LJu-7b!<3sbnBxu@F$)3Ot;ebmN(r@e6VW!1b@m*dwWr$fY*NQE@7t(L=gSE&+ zGGv=C>1`~IaNd^IR@r|bRFKB*t+F0jWhDs*C{C5nFo(LHb5$M(Svou(Y2XwR^BrIK#PMnzz z$d*3Y#T{lgzydgo;Ne=#$%=h;i^L+cX1dTyyE1DAtKA>6qCSZ{*h=Jgp|B8b){I)E zGyXvK73#+#&Yx@;G4w-?&;}>fSR*SfnA$g@$~jL)2OmGVb_G+4_{oMfzyLojn>|!g7p7U-KE4e)!@27FkDRd^8$7Y}M1bM$SRYp(Bl)DRMXjg`PBb zVJA%;qW|i`1nK=*`Y7QM`wARVt2?eZ^H#2cRbZ!o3KsqZcmZWM$7XOy&dF{I6kVE| z|F$Z-yTngOhm^=#<^6V4on7mr`&aCqAKk&i3Gn_{T^Pr9T4F9&H4I@gif#!L*K}$w zzuOMfGkF$JTMKU0UEGt#sqJp5Fyl1N^UV*~HN@bMxN6Ot-e*#?|AupS?Hj7U+jgCv zDGG5co@=}7HoF}L7NMD-`BV98I@-SIwx|n+X^lhhb@=aDlzTSUM%bzN{;mKIqZ&Yx zXQxyW+_+TGP=~o}%+hZ1&g3^{w2`-yJl!+EoHp_%$kUA`%xd#=9#T{b2Z3lh_mkd{ zrT3A3BPX;&j=?=}jjL27y_b)JU~OH@=?8o?)p)UgR}G|cHT$YDA^UCxd! zLS@#KH!yR}j!(@rhgZXL*BLukv zG=oNqhk5I5yx~1`J^7pJ*vkPf7xR&>Rhy=W&ExLO=2E*TwO;r?VuHXlaD&ngei-6& zhpcFZ?-Xf;E z)`@0Q9v^>)D|#KW*w7&{O5taSoF$@JDj=9#*Mcsp;pTB2QO(U`jBHcYYW~OH+L8om zq>>D|J%dYmd>Sle(>TlNAN}V~AH3=8>O7Qv&gb)PLyq%GA8GWO7gUO`H@`FH|7g5p z@TNUu>316$Oft?$E{&S+889Q<&Y4+yooH+Lms5`PA#;L~=Eh-@?R8LJDP50CSzG1#aG8wLP0we~xSk6wyWO(s^L=?flc2b{3l2X}R%5tT~VG|db}L)xg(p6UXx2K~y&l43s3 z@6#|EBK+w(gxfs+@4=AbX$wU2Xz5D)@AJ~X`uO*wt*MKzOZsV~XcP^5&v7~CpQLqB5!^fAQ3T||Y>}i8WaeFUr<#^;HWcGn?!&1xqJ)E)Rs=Yc&&E9o zhgcfpiD$csLAqCcshQHvJyhn2ly4Os9pS}qW?TVxjUV7^_v&Fz;_S7>7+Ngj3s&`) z%04P1f?WG>aEataSyV1`QRmB!&53W0j~z zV5qt^;ZOyrn^^?Vp%ft9QdAV_%@?NgVnNI`16_(f1b+Ba3R1i!07tN9*K)JE`59|BEU(RU3Dp1m_Y;>^SL8|op(=71c3iI zL|~UlqB_y9;}HRo1KCtalQK|n(CUbNFqZWH!bHGnyuUCJaCt*U1T>wI)hr@l71*1_ z5J7CWekJS|5*2W7j7f~)CdBU(;uBxvIlh!%|gI{6$2mvEivFHZd&*i{0-(MQ{uZuTRQNpApy@vh1{mtXF4`RY^t}wRG0EQw? zNw`vcpDi0r*f00kG~YMue@ec;i@p8g`|rH}o!)_V9JWuH4Eui$wqNpWA8qd!!1!l0 z*!~EYR)X;y&);DC6|wz3WBYx8=C~M-GMB+$81MauYa=c{;DfQGZ#KripqcGIubJ(? z(2!NnITclP6_w z^Bua9zt6`6%PCOA66k9$f~9Y9pk2$}gex@GAi0-JvXs8nOi5HH(f3-aoU0;134b*O zl&c)=Com9DHa;(72y+nsPeY76pNX&Vr;XD-!R0`o@oeF;&q%wCmB*Gd9F(F+GBX92 z{hpEPwhAudE|o^e!>?r@G2M6Yy$u-?B~eHq7?cfJs*^?>$r;1ZVwb~%8l!GQ{2VvX zqshd@K79J^-;BEL_@gGMsZU%}!~_qWWXDaPTg>jHkPKMpKAxm-;jsAY)9XnR%46A@ zswovcjHBC*g0H*}Mg}YETMPI%c4&~Mb+FpqV;^T&|s?ljW4kP`wWY7kBV0H$vQ$QU9_bp;kybg z>Qi{r1-!w#&(&85fj*rl%mfiXp>lG~^eI>=|5E+lN55a1u20bX&5xW98v$X%ZW=Vo zYTr=n`1f1e%`ba1O8|=M8`(ae+G7e-$tY%CMz`TNp{F9#u6w^hSktqmIa6JnqU-s z*XuJEI=jyL#PUjv!q#Brj9$+=EAE&_Q@2md5XlXV_$I-B84lAFhqvs_oQ$aZKi zT0syWTl4)6Z6&E90dcD`ULbN+ zh}}koDhaejQdjuNyv)CenF!|a6JeW`$bPzjS9jLh=!I5fQmpb^c5ZV(AnjZxq)>I2 zF#(8JvaS%CD!Ou>dSIX|c~Bxa0409O7#asw8iC#GqPrW4RV(X3DWh1&!WW?g25!FV z?cR}KKxVYhH<7M_P4HD1ix>#-r5V_P;H$fYfG^e(9b&2t;sy@jtfKP_zCD6(pgw!} z0yDw4Xg`{80b~$;d@+sC^=wx+Lw%w69Mel(@F4m&PbgrY90A`&ERXRNm=5bXO>AdY z-fHV{vxh+)wOOM8LMdCjXO6S!74&7S`fTWgC*k-GGhTxNy1z>!Yj#zcug3Ze5{FONtjhP@|0Sa%Se-F z)eYoICgx%i{Phx9qF&M%)JaGZEE1upFipE6rj6$ZxokCQ2gIazbA_5Ks>gorMJA$l z9qCOWk#L5pMWHIl#f1%8d=|ivT;GBl38^&{!=i2fS-c&(7Wl zdDpVd=ImW}o9yGgxU`n><^{9`!_!8XWVzkiMCghRYhh^?$~0*nC@f}`mdc;aGChwA z-Euw7bqi!RG*c6G6#X?2A}b>>pi^|F%E%L?i-JMm@^k%n{}*vdsQ(+xxOSPvQ_s!)F15k7)ndJPw z$eo{URyVxoJTUa;DhJ46xpT1xbvBTwA~;9?uy=h!ws(C)WA8fmYjSn7n6JDU zH4LR`sn~8(DP!|OP_UbGJ%A>+8ogzd1I?GakpDN5aYOZ4?Bk2v@*8fb zhHu$68axlq%Nf?=kc`(MOsRR63sGv|+l$>iM$PGxWwrU_eeTPO$5r+SEz?Db8HbTk zht8jC`-`RL2V_2)h`l<@j2o1~9Lo&jVtn5KZ`EW(ZBE-FyMLLMjib zS2r~ubYfaHg>bbF4$#6ZbUh(>zsM!;6f;*eR)5Z_FL>@3ZAoW%vboz7m>Yrl=FD%zh(G2pUmvvq|5MEW z4q&v?zIKZXx4Y%raoR}P*()C(2!UaaT5M`0l8?rqa_a|$=o?;Ck6CK*uO3g z%~s=xeJZ3sr1NR1vNK$7>Uc)KT8Ved&9D4k22{)eMwGe2h?e!sEvP5~Mx|eFS)>g7=ofOBGv>CH_UL(2G(Ka0gmz#_}( ze>G*mCd=u!nlfOO<@8^hGJsV%{c0n_T$&?V+X7*h^Aj$RAs+HpLsOp10TZoSmSrY; z#|h*0Yd2(Kou}b7I6V3D*)@zb->f{;&^ceU89 zL#5MDPDQO+O6QfD!6Xu3Aw6V$9;%>YD0s(rk^j!DYayZW&ZM_9GmUrV+}4xx@=Uqd zXybQwgp=Xj7c^M*fX2O}byEB&`7)`TSkS`sc;p3Yj7OlsSQB@hClSc^G7G6&oF)y- zYgC4akO1D3VH^+|k>>$yU5LIh~hAv;whOMz$Bu z_;k(mr-(0ow9eE>l%x(kxQLyFZiF2yH8XqmISEDowr}6h z`w#3hv(~Ixv(~eo^{nT%p0&GVW?Cu5i+Bdx!6%9X;=;?AXDqS|10%o)-q;_dIvYKO zfq{T)OgQ>EbD)n#tvZ{WRQrU0p<$!63}fz7UD3a;FD|)2K34ejY8a&BJIq(XCGkRT z84(tVeetSBkcC9XQB_Ss05kRIi0F-16sylMw*-AWc~u0!nom~zy8JHU=DRAKxh!sf z^|a^*R}|;hOm1pHZYl)K7;PQ{q=*AeHmKj1i|Arb`Ib!vuS{Fh+*0CJIiy+g-9qAW zQ2vs`x)<*m;ov&Uxi^!u#d7W^hX}RqwGUXOW5YvlQC}$mq z2O4@P{4SiMRI{aicRQkxcwlewv6sk&U3Vl^1!b628= zBQ*y-0hgdUe~czw38^Br3^f6lBdcv=Vbg1>GIjStlEM0*1N(Xh6C7`enP4YNN%+@4 zdN{YHV-|Pg{(9zwx5^UtlWjWdnSuB$6w&4O%FMQ4rY+fQ)fNZWA8@P7AGgS90A-xKnA^<_9O8!8n|F#x)=+TJRWcdPSd6yC-PWt4Y;Xr_a5bRc-u< z%cE|BK)2NibT8AJw437~eJ^x?bV{I&hMLUg@RSzgTHS>U@=mvFU?tOiJoa&sS3b`I zhAVb@!T+Vmt^AOfT3unyl0)3>?96z_%!8hY_gAg!q>oM{D7bdoH>~z0HWAu4to9{o zXuS5X#c6#|dp*LWeI0_3mN6@UGgpT|q;)KQLu);0Kom0%f{-X>nx+LtMUv;Vzz9u} zrUgce;~3pbX=wvE(#BPmmLtCmML=L$c(6okr{Xukr_Cm6I3@u zLBvKZ%w}EBW~+r!9bDav>I?-708mOu$TlLhG$umu=prnlXgYqpVt#h9*9A1B-O&)Q z($`2eaDfrkm_A0`F@YFhAtST5TH_#Gk&To@IMQITOxwe6eDoW6Q3iGs7S>nM;)^o0 zhuDv8VD4U?;yPJ<<8fN4~|r3LL|Uu5ed>q)T%}*@U*g^3RBL~bFvyq%z<5za|?H@@$%cn5QAcsIcLUKzY2+wgAI z^1PwlLh#SH?VTWA1SyqHxwH+g(udqg1SGew`Ko{2?q|t7N+ephF zX$yhr7wY-Iy2|1@HZD%Ev9g?p+ieG`{90mi&xZe!$UR%h*!vl$w6kntNXaeDH7lqG z>#B=_=ZO)wPlU3+PAF}IzvA*F&r>xVM&T6MA*M2@r)lcYHhNBw zH2%wGgY5Egfq<3g2`yAZ7@y}LGumw%1lIba=7Q$vme#?>)X^M&o;sSh2lGS&BN)xnu&cvAS$lXAuq z^0n(l#ajssmphIFgLNOmF)!8@@wbRbGwmUTshXW;vgnJZB;5&XoA^e(cOAy#Vl{4s zP>D4@;JDv+Ho02AW*=Fan}9Kv>v#-~`~(h53-V9+j0V?zK4Kx)$9)N7qlNLNiWHyR zO0@D6M#sk_GYiPq9EFjjo2ve}H5qI^+l{obYLtytJZ0~rboy4W`BXDB{yKWX5W+ad zW6R_He*E~!^l>46YyvAqp7N{n7=Bbq2VI$Ypj2E&-`Z``0DkR=Zo3@v0nLJj1DK}J zyVr66YMQf)oHGqm?fu-=me{>eb+h1k0xNM0SM9~w65k(a zIWB*v?m3(BVO=>ZbGNQ#_Sox+q`gU3hHR%!gT{bSoo);CR@}BqaQ@mDF`g@L5-~uD zxbg!N_l@87&gkkl6u+5!PqgZ~;!#{)e_e6(?DrrFXtNP685j>Z56bMP&?`8~Bm@>qu7gBV#x%J4CqmXUINB@_HIEFYULX-j6Y zEXgKmn61eJlZLUu?$o5k-f4Ss$Q5tK*vK|?pb+lb$l9e{qx6Rf4W#ihy5IPzxP!aD zi6--j$0*im#oD7Uy|EZvfXuVl`)ck)4<(ge-I71fJKo)H;`T^)JHah#F%=l+HgLBG znWd9C6gz0rzs5XWH|g99!q5Q&C4evNPRHoPVuH5l(+X#J^}tvfVs zwrNfq5w?L+5D%Sx~c2f&f!(ETKFBnA$#jaK?_8!X-QG>X3 zi?soA4n<>`=Ig5PID>5l80bsf_6}i!* z=fS7pVHAAt|$IJ zK3V(h5E>(A)_t%igHjIV@`pnyLF^AhDI2&KB=}*p?+-<(8HQ2?7@%=TT6D$6V%2pl zrfV{W;{coz6^N#r-n;%Wp=ow31@87SZqMSjM&YkjEpCFTz-5n)I z3cDL!=bS(|9aO;^ERXZT%uS>}gbP32<-v)aVRwr2fwJF6DITqR8#Hg~cs-Jim->6y zVSS>Z7z@jxNB^m~m?l2NeGhwS+v>zU|0m*$WQNja>Yd1(v!U}XXzif$QamMm1e>>D z;MT3Yb<;yzqj&z(=a13Qw?*OGi#_MHh1+@Zp}oI;^l#&+K|GQh@XD{g^?kqi%~v+R z{j0W2w~3uv`OBX@b?_r`Fd>!OLf$OK+%Iq9m=rt{^7qeA5X(px4R-z7 z)Y{)9^}X4~j9i|@_hBEi@F(`f%G*Eq6BxM!{)%|I^1iSA_+7t!^p5?%h+%~aZt`G6 zxpz2-@@O*r33M?D{^3rtKKtd5-nBOl@uU$z=ame`gr6OZgT+aMv4ac^#tlAK4aPfk zv!fWj=N-^uxqXq`Eu(G__M}lw4#2n80lbr}$p9vb^JD<)q{S)NzKy)e(5|7Qo(%3SWK9P5 zUh<~#2J++CvjlHA|6M28L>&$1h$yA;BwEQy0{n~nj z%-(QcK^iW`4ZVGD!l1%1Fmx;{HlD1HSS*aiY+LN%S7H1DJ66Tp@Ni#lto(Wvg(Mr8 zP)#JIH?c!YQc%70sq4z}9^6EblEaiP)Jt2vt|5RwQ?FVf|00%d)Q&PdjQc3J5R5@X z>8NnVQe+C)ka#(;7P#g6{=F>UHOVE>-9q$R{EOYf6rNT!n(G|dpRFQzQXh&eoDI>xcKuc_Js z19Wajw}yjhEeBb~RG`z8&>@h#sj}a1GR_rfEoLrMam1gXunHo-DV~hoBf#lg9J@z? zQ*0T#M}#ZvkMEJ;3j6FHvVjz*s4!MYtL>inUJEpv(OW_Vr(3Aj8Lmk5cWBunew4Nt zc8U0@DH@+c4)?A);CDNuL(PSsKnDB-jp1_{@b9pU4EPDgLx~Ldw^>F8{97#}1AYSK z@Ja^!vH)8s9-6+RR?2{1$Sv?&N8!i-M9376!T%X_4+swQaxt@4;NL3WSD`q4-V)y{ zoX@8CUNOri;`{B~vv0!6D-_T{K*zha!d4OpR`y^E_xs~}2gnTgcN!&d;1_}<;NO{$ zg2mp1Z&c*>Sc78CCH=G&B@0>0$U@dKvXHfm3}oTzYz=}Q2%`xOWJ^6Z2Z!2#N{gz9 zMGVt-)?gSDpuWQwP`5!T4X8fmpZIau5k0HxkScz_#xNk>> ziK#C{cm3-x<8@-vLR2(v^Z)IYh|VypfUsG0ISAM?q{1t4SeV9tmtP!hwFx+mnGfHVg z2UU&-5AtJ!XGo{gw$vTIWKru^f&SY9ridF-x`;ZIY&!k-z@nA~MguIe(@97wj#!C`p|81=3*KQmK0ztb2W zXi{J=IXmEerM9fM_hD zeT&A`CB8$o&KkF|p%aJg>*i-y?9RqwHF)ep3Xu0VlsjzWb~O|`Y~vnjC?=5XZ!(b7 z!bKnwBko{wr(j~zZ78v*Z?Zh3gPo0Z+sa@iGCbFI%gFFtl85B$kiH^$NX`yvMoj{d z+#Qmfc=r*pNx{qscyMFhHLb*Cq6 zc~kL4968=@d??m4zj%83SfC=o}e4kPP?A=y*u02$zkAdo^N zlpw0e3<-!7@Rf{7fJeVlFCoBZTt8U;Eh7VX!5#0B)K`x{w^qLce5wa9dIk;30RCC) z0iF@?G2CnawSY%xf=trY2E~d18Y@E=+(=Up3zZu*D}rc)WYEgLfYwRC*YYaM1YZA0B06XTVaDM~U5If$BD}G`sX7C>Qtuq={RE!kDDM|dE026z z&~}XXvnE9{-pJ`#dD+@`xe6sp!)_D%-Yg&s@~2j2;49x|d=7zNic<6jeF`rz*TPF^ z=Nti0$0Ufl5Cc-9vPGqjYH$Xv%s?o%m22Um(AmUj zmJX<6rWlt^zQ#pk$zG}&2bl{_K}l+Lw@+8&^)3eXC@=Ek@w(M_Su5V~h)m1FRv zq{C&+kllE4US=ZiW(;f}xtqwb!$dn$K93XAbi2&Pn)S^x|F(yij!D(F#K}=hZi-VC zOHITn?8p=yk5kx^NgZr*)j-in9dIe#?&mhPE1TSnp;x|*_~F^eON`pL;J()ZLfkRjSSFOK1wyYr~wTO z?XED}HaI@ydUlzC$HNdSyWjXy-8tFXia;#QA(wtgroFg?^Ij{AM#dP`%v?!)$q6Yc}e18JLCSm zBk#7&b3fLSO{vwYLop^|wlTpMB17fmPHMHDOB`he6i3*kTAMA|s^xY6%vEoUiA4Jd zs}h^XeAAQtUZ6DQ>W>6Vx8k!ch>osiHRx@aAPMvgG*z&hS&J3iP)QsB9e9gx8~~kO z?7i7^`x7w;c0<$0R3e zJsg&6=#UT)J>Hf(AKmv<^z&Oj>7Wu_{a4s~!8{%{stoB1d6VbUHu5G*2onoc;} zO_@%6$&05G3XIHj+EdF{G6Z@~=HWg{XM7o{DELnD)4i=C~gUMej z<-#y$(VLTjG%r9~H&2-X;BTsS{r!l|WZ=lVViIts&>FEv(keE%+hpk8qj&t$xqBRr zCS|>2M2iw4HI*jq#8l8e`9n37tJU5_jhuc99=Y1qh!tUAMjv?PYS$Fp*h+5S6zsq& zqdG7d1aQaI;S@un-`!Jesx^|-3AuzaW5Nj^v{~teIX7>@0BaaFsMrY@{+bw+HY;(c zW>b)xpt^N}{%!5mj=_@dA~ZoOje5XTO7o#eS4 z!(xwVRf-@%h+!o=36)2W4df|>B)r~?~F;QTo9myKA}bC{||cdVjI9SXX2nf|heCc(HPnuG@;0K-Yc6%0gYA zD6(skdiEFb7$$w7=ys4iRn*Rr1^I(Tb|Q0qy2!5GR!#G>0YrA=G6Gv60BaRka1j>*2!S_{?6UrOFx#mSUGpwy-Q$ zR={Q~w?$O@^1QoU;NIFO(h@sE8PO#wrO=N{vWFp5l-qD(!dy1daD-Mc8kRP2xK*1X z(&)r79SvxHo{*()=a9YuvkSeDZp0Z?9y@k`QT|O5tcwKHmS{f2E>%0CSl+vY?a-XSrWO)9*)Wek@TU3$+5FEG{xC%iqDJ-s%xnvA`eo!zN3RQv|VfWPYG?1 z*B$`|3KlgEu_H}E5+S*=L=_>8s~i#cKm}-<1s!I%aS|qZqPK}y!4uZOi_WWrNmd-N0SFvW|ow1w9;~oPN8*vqJ<^U{*0XaR& z6c;bJZ6PAwL)0sYogz3xIed*_LZ6||Q%>C_s(nMB3-vK1rYf zkd*{a&A?ja9gG*C(w40AoEElD{Yoiy&V<&5yA zt*TQtcI|U=y<|L3^uDG?cv*j)>#_MgeuXhR%KN4-!g5UR5g&>U^@V;UJ8=0bDd*Fq z@l`B!=R`ru8qU&j9up?;IKc{a6{q#p&{auWLFGrUT;R^rviUfFWfKHL;Xp(%+Nx~M zqaoURIEq%mcM)Bf$MH)xi49{_yxNdW{KH_bj-Vh24M#wEoSalT$@96ioLKXUI!I|n z-cHD?Pv2m!qRtUEh`$5Jz%OPuIC67SPb*U=7&2d$c34)nOQ7qXi=;7)=8OR|Mr} zH})F(nsiNvCgIw&{7hr74^25l+^Ct(i-Tyg7X18kv4f8 z#*qRXp_3LsxCUpE-PRC!($5L{Qp|vSZsO#*m}fNViQ{BH4HBOhevx!RU2Y9_3l084)e|!9JxF>e4e-gx(mu8|Z)erg zD9Eo?)E&kX?Q{0@*O#GRrLmlf(nHuU)?`FPJ5qpXu^U)r+F`xg+1;3dH7fhcFceZzBk(KILks<-FlLGc*5S^ufPDj5lZfZ2>`mt9Dt0&yCIQn2 zb0HEg4u>L~Opu=1LX5#)p$GF?@&SyrUkP;G>(ik&eK!b%0}DmpOYGV;eg-gX&za7NgzzERY`Ld17mwO`mJ(@2F6wrl5ZCCt6XUKuvhj$K7!s*YM4(uQ&k=NRG#djc@%oC4Kf7?vy3A>+Nl zVn#m!&#%UUS0(R9)2-ngQwYZ3;PrZmD0HsCJ5_1|##Hq|@O01*VI^tAAi6a_H9I>u8 z^)p8{6p2#}l`Ly05vLkT9N$nPPBoM`*_EipK#P+NMNS>d_9jj>lwb;Gizqpdfl!%w z4)jJAsv>I)w`?v@2}`OBN9!TvNG{QAYGK|A#pkmoGJi*zzlw$1LA;sU-~NzSp3Zz; z%*3<=`{~npD=by9HP=X8+7`C17UHhC8q8hH#KVZ1Z_`Nx9bv2JV1@5ih!DoJ)g92k zek&!JO}HQC&K@p*C#RV(Jy)_fwszC!G)8@#Z*%Hy%>a`ztaqNS383Fe^qL8>np zqDF!{>mdaHY?qCxglWG}@_>DIta^g#P$4ZdZR<4S>4VA@T)7tZDDj-`5|e68N3&KI zKA@>Ssfr4xauC*JjRKd#j*eAMNWo647X~M+5rByJM9*lD-e)slNJ%20#GjFhk6Y-@JS~S~)mgzjf}!fW z*pJ;q8w4H@#)b`-glh55;(>S8H9%-~FuKn8>m{@dG&8PQSB>>+5^_g@JzJ&rivCweS6Ao6U!`g+bQG8sjGjvZcu?`VoQR_n%`HurS8HZi5EI0R zL}NgpLP;HP0O78;J;a^q4j%lFZlx;FLsKJ2QFr5hm#4) zu)2f-Ud+(qr0xL9G1FJV$f=EeQ095YuySgh;`ta3)vjF!l9X@Gqw=v?LZm*U0qsXR zGO&9hCIgz@JOZtz^M;#vGth%+2DTU4+85*B4ISwMNnlk4ID4dAi+5fMzvKZ$9@bds zHQmF9n&R&C*{7-q^m(x?3cxk>Q(PFDl994uO3+RD7;b(xc4E~!F+{;dz9i+ zk%_%5y}8N*)|)=4?3Q%ps0uBp^eIfhS>yAbr`0GTDsQJruxpC4RW1 z%uBRL!^X=6(Wc&Drs-ddA)!iZ4pvmQ8Y{#-5mh*>^4DFzt`tBI3hWFWv0Qx|Cv{&b>`v0HXTtpaU0rk>I6 z)lzMmR7(({)r=w}N-JwtNnG)iDq;3aOJeWA1J)~nHB2h$4dEEY=;_M@+@e1&ycOiM z#bzk%A-bxPIwcj75rP;aP(|XL!b8*)WYqtdNA)6tb zpdDXLMXn4vdPg0<^>B~1@^o}rxMr*TOH_3HdL4J9AdAd-`B-$8s*dU zKYX|b*p}Fv@F)*A(MYEL?j~NaCA$>vaY4sel6UW zJOGmEhnce?dL@RC9yvUQumKy*V;xtbsjTiZ!O7NnPfS7)6AHL#UKusk!p&>ZD!>MR zRwogn0yVAdc6uL+geX+{`cO(Y7>n!|TLbB{Rk}U?kSuE=O4Ovugk%EBwP_-aGKM-> z0!nmL5G1#h+JZ!l?Wd^*`4X46Bsj-C&4GK%lUs^xwt|mPDFS=_JxiLJHz68MznfAh zr2f$ig+jz%qN%hqFF|C9mK>uW#N;KF(Yh>=(#6yvJc;X$RXLODTUf7eVOk$AAqm!% zI14k?5kwA|UhIOwT>ARangijGBkt);Ero586$gxq<5&$AL`AS=PC%p9*_6|*twpRG ze9r`LogZw5fVfsr27+#r-&Lr&2)E_x736EI&>aq89`fiT zC-dP?5q=j5+o2$TQMZKo^1httcDU#6hddGQoq4J=@F}&2$ZGcX9{eTrU--}sc#P`h z!n#nr4~x620WzT%3hwo=cq()+1o=$=QQkm;M##<+mm*dd@O{g;PGsfFrob&6x_VgD zdgVGQ4s^D9)L7LL*IWuWe!QJNU6aVz zl{RF2FDA)+7Zi>O8U>V8OQJKS3Bg{q>!7l`|JiFsP&4PJ@#L=!X8 zYXk6=j|ClO=&X9dDo(E);w>TxmR9;$X%10wzp4 z-s6rT6;~fuJf%vQuzDphVeQdT-z@gm<`~muUjnzZw$QcAXwfI;rW~+gZIaT+@HW`kwg(rrQ@7n?pTbnpL>&;DqTx>P@LHrQYbzY3| zTnBSiVR7?iaBEeBZlf2P(ST_S_Qms@)loxxeN$N8a1FiS5yOl@(F~3l7;U&y!`8|o z16yMNGatd#K55GLbD%oaB`rOCL$!!y>Y%Tgl+}3nX2ZBDX8iBf?gH($r3VHJOVcwq z^f4eRzPaJh5=dKYv4?SF>?o7i(PHp8-+>Y*_nx8dTqv&x^{Q~*afN_87LGsVLMY1f zxQucbAs1-HDlXOIz}BBbEB?sb>q68ZXqk?O854ZKD5xz zR-TLIRNxENEJrUtH&~^!V&*C&cQ2PSdjZvKGirMPY5npg=Hyj zL#}a_;u@(Z)xHH@&vH+dgDvId-cRgoD)&V(c7`8W1w-uN@W@7S0TUpw)<+Yb5uzV4 zE25U~IBauk*u|}kixzIh=9u|6)FiE=k@FxgfOB8g!GTyVZkpE}97GKdZ4snzu~!E) zlj#9PpSu#;bH3WXsa0<5OvThIOip3tqSsbSLZa{Z`A!Roo}{<^v@yN;374h;v16I} zm33lz@+-N3>uwq4+nxuH+!;>5n7%QILELGcc-P^DZ4yf7g8Ys`(1VSNf|u+-Y0!d4 zdyt0940^ zH&Nlo<|)cV(PM>K7qth28uWGLo3Qc#S1svgpOSA$k5+l7=G17*0zeV853zm94x8~D z$arctD*EwYp)we7-C6L1p6Kd5#lD*LJ?Xj3RA40m6PdgQh7<_yHR~zUvJiBOLFm@9 z4JdaMd^6II=d`SL%3~P49aR^S+21M8V)%s4a8o94CqCf-sx#b@$&?cbt<;X+m~?cS zkTFEwwoINZl)dC_&*W_-j~0bkALA9LQ|%kamt-5`tos9yA>z?=hPP3+OJn-;)WA>c z$m}Bz^Jcw*rMV{&H#f%>>=PZ!2ODHK%E#+!hq#Mw-W!*km^K?LaB3p$G*6+y^ck}S z#vl$c(`nNzF?Iua9wv?|owi{>r=V)ktqzTB$5DbQi*k# za!YCcNjb=>y`#`aSYpA1+PygpYayfQyuHNCaNycoZp?Ul;obF{8y@mTJqvza3V)R* z>fT+78`It3-9;+n-KBc%yftEKzC$D^cJ7+#1s8+Z>w}AFf!yH6&?FR3Wm-HRq+A!x zf1ohC_WU%Ep9s(MwKM?@zUW>dBOix`PH0L+F1|hGf6oQoIvueCbY<>YA7AdYi&#*!`jCJ6|s@=pM0I%l-qkWJE2A z1|BKSt&J$WiWla|>licfe1zNlxx*pG2QL^*x-z1!3?^N%3T&R=pQ{YE>4EE#*eGUw zsY-di&N)lz_j2OWU|11-1YLVltx?X6VWu2})RmJjwJS$4B`iv-YrZ>*N@q;Ft|gCB z4zX1Jge@{OXH{GV?$doHDWnaA;-NbWMGtDt5MhTLaon;UcN8kwX;6}O(p9KB&|B6kgqf~$*09-eg^~?KXa#CC zxQO=|5awl>Duqwkc&mhJMU|lPBH$wk={Sg%YKFw6@acwvPz6_)io_-Mq$Omz44;Y4ueq>4AMV?Lel$gmo&e;l{X!wM-QY@~6g6-JVbC&-CBnPF#SgJ_SJcT9awX zg9w9iE29qyAmk7dKF-7(gmoQ6g4Ba<^?y+HbcdD1eRojdJ6ZLZVPn-1lfLQs4%c&4 z!;?+vu>sgke-yH> zj-(%D*P8n%xkTJBddHUuMl-2$eNS(e{!Ex@-2y#}$rs=`V!wry71&WQAyJ0Igfhx^ zF?d^rX?r-59KGRD&htviF_b4mj!`EVYG=qXC#dqT>-xakSYdW`2CTyee9K9KK3CQbieYPm3qTMTD**<^OD8Ogq;v5Stgmqr#!8<>=7o_x&2 zHn7&Fc?e;~a^OLd=Ft{oC4hgLw@(HK-gP8CU3&NAaL_uSM#4+%M3mWEpwL?=+{KkO zI9-8p5jIwWm6)Ni3Z#{+a|c1J89+wpl+0zC0ZSln)fojutvX|H>KIczX``0)2XmYi zK@-#*?F*X#SOT*y;&#~6QRa4oM7>TeK6ajZ+MT^vZ_eWR*oofxJpUHYQyxOqj~7nz zF5vm|bxJ*eTX$nyLKF1TR5ip#~z^XmiuZnOHJ zUBuq#m<|!ZKZ=7QZ13S66yXG52b?(4opK@F=A62+AnM;qJLHkNQSdCPopMMWFXUr~ z)NXk2(5qE?G9Ibl$Oqlj`VCfi%C}41(q83g=p0N1xGgDbpQ__PrpI-K&)-{sXo09` zjlt`}y7Dgp+-S;?9PqIsF)5z*9kULC#li>HF=USyJ`3Sv2;rkA7{cA6E_}4FuaF(y z!--4YYRI%=sXF0VZ6^*(;D7{! zs(Kz0=Bx@00ALN`#omI%iXL7Sh_7V7iSs0zEv|cx(?JJPd1=*>I|aM+U!&3sY&6(G zk$91@b)!3&9k!2EmNGt^HdPtIfvm!K;8a!}sPPhq$hjJmzc?85;=kbB$fjdd6`^g% z1ny)msjS=AR0oHpv+O6^_y#Nv@sZFLpP)yT@fG=xns;t62$LZRweQ20pEuzul!Y8y~%Jp8tvnB*j-y1s(ZGMlIi^R(hSr@8RDtMzg*=oTg{3v*X<-=*9( zaIf1OpD4{hwNiiMKy}B%)7>yo-EN@NTn1{8fr^%Yuh{uwqGMbwEO2UjTxam(L75+P zUn2oZ4t#6{;k%3-90^GhSQ^B|R+e!MmZ@|brLhSp6SLDy0=VDz2x~firL${mCy&(?r8Y?#X;(nxx?5@ zD`()-REMdU1@Zw#E@#>iy`9lT-!IN0#;~o8gsK^1ywnNMv=R0*HG3TVB?iavhs{%A zgTH4bN_x^IMM(@XOsyICaiDMm{8U#p`r!|YgTr-Tbs4bqsKVYbpmJzn*{1-OzR(D) z-WXUl1C|^i1uT)(Is0cNzGFHQbZt4QJ;qGuBPmt8LP< zf*}%%GwOibb0$W1fXN}$+)*@(Me?P%@cxL?xTp?hr*TcA5e@7sb{ujpi>qQO3;w?~ zm)rl~xx7|X7h5KXFLD0=Oll*j|7TJ|6#uhHZSGzHuqUMZ8Q;Ful^vT<;!*pg}Q%9&W^PX<>2>!id&z0&z-YsmC#8xI9`)+)@wa zInJ=V1{H>b8I&AtB$sVWtE~m*1WZ#_(~#EHasuWNFG3sIag`ZxPQdaVodH*>*Whxe zTOs%dnlIXg5Ad&9iH2~#g@_L&9>6Sby`=B}u2raDn0s7+ThPwKgy;xha{(?@*pcs^ zu^!p!?dq@kz`HstO@5023HDoUxAqSQ)2loktIDI1*R&+Cu(3`MN?0Di`cyD19!DO) znBU-~U2dR0VWAXfYRHI-zm}SFR^^0d5Jp@c=Gqp;SdcYf=r8 zhiQj-0OJlehEh=Ng|cE67?Rfj10gor?zNXi%@1gIz#p%Q@3}x@4XVy3yE;prEkOTl zE&;4eAw$f>7b=)}Zbz+%3#pbFl?49P z5jw&k%*5>%g(5DLXLU4zZoEE*XSHJskHS7pQrf6%-D5%5aAifzJYoW4gzL;Bo>(>G9%JWK z4hS1V`ZrhXd6U?gMMRi{m0S!k#IR6RY&Sya5i2>**ceS|=Qc|pkOlBX>c+2u<=b(T zQms;hWH$qA2OEduTjr7u;dZ<~<|5<$8Jlw$dM;;zu?8Js?mWjL=~IBT&LXuKi>Wqp zR4T1xzf;b-LxLS;QZWffrCEo?6xT$IUlkYIw3tP%AodxbLjyraoP_tdS{2bkiq?5g z>vGHK)*7)>CIK1msr{zVCM$lORoMdga^lk39Cx&cTX7&Y6`jIk*+9gfGp-Vvpe>2& zZHJC)j(IHPbC{_W;!zjra%N=(a}7+`OS}&lEfS5xos%#8GRM3w(`eTWc-kb^$h|H$ zLer%om)lf4n^T z*0tp>{w!PaIO__cwM3L`xXRW+iG8JDWDU!jL{i1>GuL`~)6asKC4Tm-WLnJF?gaDN zNd1DItAd$lX%&S0DQKLAX9>z>cej{1v1CnkMNIUt5~%>F#{Lz%!ybQVqPK$S!n-le z>j@S$(7aaB!2e>Jchnz&<}G(LZy}wIC&2$$nx{7Y9yCwIMe`Q^chWpuX8vHBr*|FY zbTscM(L5Gq(Y&MnNHlNZ|Bq=N&ObIbe*n$Xt8Qo#ng_RY2%6Up<%07P&jJ5n1h1z~ z@Y*L4ymqnf(#?%Pg@2bj(|EoS@qz7?HWw^Xx>cDw;L0I+%4R|30NJMo2@x&6^U8qF5$4DZC z+AthcU}+s^Uk;?mb$g6D@vKF;Iy>~rPv?T#9C|UEOiwFz zDq{IDSH*r^iNVn>U9V=6xP$R{2NCH(E$&0XZ267wL54+Jhp>3f7K4s%I@Sse&`Zb7e*dAgsOzB3tEg}O4J_2IZLX7 zMA1Iz)^prA)lS<((KBtztI^hj#Tlyls(R`o=meY&`)7VFwgk8kq4FiHA8M8ibIE#Am&);MJ;!kfkZKAT&qgUA7(_7Y*wI98FfMWS551VBdle0iNe}d zI^9|$wpA7ewOSFCOHuhhibGC8tG(yb>HFL7Qr>0YXgsA;j_5T}NNVaSVMTCx!^fvh{c?v+=|j|I$kbytRMY((=FA)MmFHUugz zNv{uFbuf>c+mj^YA&B9W+7ql!oUW9B@!IcX}{A9tbDFsWS9VZdmK%Fx}a26cCM(WE`g3I9P~~>G9@U!+pjfI^j3P zInTEbBckbZjUt+K6tQNH?^s9aNLE6F?i>EAWQzYSX3cqCJRD#Y0TC(ZkX;%zhEGD+ zu;`a_1JzJK$_6wD5D0)E!~w31vDR)a^RuH*{0E00E3r&&YQ0R0WeWIih~B-Fb=jP$ zx>>R1qyZi~bsBpmdDNo4lKBudlZHx<`L;F~8qMyoGRSb#k?Ti-9(F$3LSNEeNfvw= z^I5if!WyeQN;K)PY%3qOOj=$Y!aYb1ylj<(W>L8n9}-W16oz_%547DBp;}!`4Cw4QGqojMx59Kj9VWB68m=+rD946 z1!K*GAxUcacFwh(D^9%HOqjfvLrKrA$A7}H^Qhe{VWd#?t4K}NSq z-S#|%abjfa+w*9Ei;s`*8Q5$4(+Q_*8`4>8Viq!1^%+M=SBV>>?`Z!oHpz9>WtIMv z^~Bm=Uj4~d2*>SGAGc%A~`+bMuHBxRhbGQ9ozC#dsMR; z8#@&A;2vP?K-@U5t+4>u)T0S>Ba|~95c{m>;LLz9*{yZVx)kL=mjs#WTkmRBB2zV> z&lIE)V#O$>y}`*`vk43>F~J>niHDbqpVsuIQq1JO&0el@zh==bPPZ*73ivVBhW7%PVWgo=2D z@YyugIM%`BFMyQ?2wV^P*dc8DTxYO?y&m!sQ$GTy%~M^<3RM2=UCNI0 zL@5px?yx{74jb~Wucm3;=UmGAQkSy6*rlvu9y^Is*&}LtQ{q&%huvz8Ze}Uy2jcLejRwJpuV;lDxRT&U&QlCOv%BSV;{FR-MEt^oW_T;h zSB&z@jnE_ICca{@C~}dU~SOy}2*%h)^sTMBB^;s1DdC_R`Q-EckTm=0(P zdhy(nxXKT?AA_M-4~sd*j#Uh_R3yOxlVMLoNqksDWX;Ss7<=zZ6zT{DaZ!VkP*qL) zhpaXXl83KN^6li>;8A5#6sJRl)#*|Pm4oRrMGl4-N%Q*hYvAyt)fvE&jNcqAcB#@& zgZo`fB#!H<%AQ;SA*p0jJi<%2mvu|1e4eGIWSq_VQ9 znj?k9dLC6Q;}(OpOa@GdW#SRxh#3Lgj@&bS4DJE;)2&&KBb9Q;#=>#P>ILP8U>51L z4AX)?pq0J?$%4RaQZVRS!7{7@am*^PNCs=NSxrEib}g&+*|BObWsQ55v9rev*7QN; z3a(s7Y_JA9laN)a2w5;#Etu_&*K}@4pgXqfx~Z7iiSatN7vo%* z*oQ%vIU^!(I3Ui@6$eDM03#OYBI|2qF`w#;mX!VJHECW2g*Y?=79z#OGHuGhBzY4h zJnxwRB3r%$M3ZDq-UQ(jxqm=UY+rv1JKMzxC*r21>h6Mwn>FBUjsfN`IAAIhS2s`- z<6FUbVu0y{yy^S}Ra(k`fF{QlLf2f$q?(C`GZT5w#+s2G4d#PE%vMrTwY)K?dupC)b4O&v2rzl%=l zFkJ~6B8WmfDjZ><0azhWtk9@PeTFepnWzQ`j~4y1-Je-wcbVQuwJ!Ggk<;y~g8sgHP!{lV4elO-;;2&K4@x=7)Sg3wzf zTdXk+G+&2pf;gO4;cT-yYLm1Jr_A#~XPX`5W#+BC*Si(`EhhT7HOWNFLV_y_thu6 zIfdX!+%{HO63_MFc&=-vw{c)%>}pY&VTdNrVtge$o56@&&bN5v5QCvjlu=SNW)U!m z5s*gJ5m4pTBvZyV%zk(XDN%)hErH&32q->5D7hq}E&QiG3N518!{GDexoyx|;7! z`>N6+%?h*kOyi(okYcA!2yCbs2en3opgs=6ZX6n@aN{_zZN~_KeCwtV0s~XSIK*xn zHO2uY@}zNqFJvwUcpp_ehB?MCaX(bFraB>zJEBH7Aq?H(@ARtpYwe>NMD=I&%o4W_ z-xDm9ols-nCBGKRqF4#~oQ-mU3xhfbPIZwfGb)%9`GP`fHJB*HVWsg7sYWbhYKs(W zD9L&meo2Mc7THCZti%=x$1{t8#z&4Og+<%@hkT&@#FGB$&!7yE#9Kv}hEZg9xp9XU z%h+N(-JIw9ARqh5P2FOaNR?L?A*5!BM7FbCakFHJgj&6ssD|1!FO3c|p4_QFSTb(7 zGrXM}^yNCAf?XG7vs&WKRKb7J{6IUy@`;2<5jI0*1|^t?Q55rv23QyAu4%hTJnRi& z`9QsHn@)P%HiXVF5+sQbG3vzsJ`xO^cf5tWz=WuLZA2S16J`%%sP`qpyRM*(9FufL z^+5}o{OCWvRaj|iVf(7|N2wA7z6y#eeKL1|hZ2cGd4;6!A;|g)2_>#WOLI4K@DQch z_sLd%t#J8Nhs>j%M29T>Fr&=^i2hn-Of8BMS?{muQ20@JRrJdzk;7L}XX;8<85*vV zF-?6O2Zru~aX`=3gZdcdD{ph&F$InH9C3_4o4we32r450XneaR0J$*!9(N;in+_epdEH?Jmpqn(vT(U({j%XHaZHedAbfT+>d`r59WNL4XKI2ZlBFE<0 zur?4XA(5FKg537A_sVt}8Q8k%CW>Y>UNTKW0b)fnt10~gSSl5?o1z&qvPp17w@Hu` zR&B%PmTjII)+9(`9*;QUVp*NjXL$ z+#*&*>qH;GwXw17mSWJHMvB66{6bo^bH*&$wXTW+PBR7`$W50{#iMcBSq7*_+q|Rz zsL3d-*=9S3(16I#+bjVnyQs@71WCo6A$4G%*DORMV-<@O_N4vmiTgK9p7oDCTRlnl zda~Ucaoww_f2Jvq`_~RCCExYjUHxNVCTg5ub? zV$!22-kHy7rKX$M{cC3Uw?dE#m!~WyowF+s@+Bizlk3Wxur$`$lrIztIgeqkzm0~8 zw;Qrh4U#2t#Nkv0PHo_NW7CtUrCuij5>jc#5(b$TIH}=-6Ii{a)_F2_}o#JQxKdxQv2*7^s_ZiBT}42k9Qj znJsQDCNZTrCG86~xI>_jj3Cbvi3|smWuR^YvCnrK62t=V5Z$rqnHWJjoDt+?3A|G!p6I-n%gc35Tx zfKHa(B$h(Bl~SM!0W#98on(oNPfv4#9+9PEkemiXTtHacPM)?xJK@DR13DlJl`Jw3 z(jK!z@-nybxh41hdhVUvN@yZi$DYGtI@+PYB~JTI2f4Mtx%S0zQprg`eE%R}1*fNt zK0wL{zZKn2svdD-AE|m^31TL@*f&X&WmVgQ^WVzW+O_aWK3yPQpcb%+`D3BuEV?^zL@Rr|UL> zadZ5b&=v+(;wG^9NVcswgcydW^6p&ue)R6;CuCideN9#d1ww{`zx*gx&& zi!ej+M0z-9OFR6Hae3k+hBcWv$=L;pw~4rqRDD`A?ETd?x5mX0Gofl}_MTUMuWSBOoew zss*Rxvb$9`WZbT+oFa6^X$wj+plB4M31uLq4+gd*I zv7p5w16$BPIl34}0cS4sz(O8cFwD+yV^ey&mF8hjmcB)toatEzGitVVn}g;K&9W;` z9Dpj4M2q>WSxLQ46!@4z%k3+aO(2lPfse}oadc?cXqW#J-$&5G>O5!9JkT=1*r|c$aOU9>jG_b%Y1*ZX2-YcOuoapZ#a4M5CQ#Q zL@}H>#swvfaki5f7u7q3aj|u7kUrz%SS*ARarktN6Ln)cXO1_<^WcbJI1F`X z&(7e-%7})HT|87ais^7s##a|OqXKG)p3oU~wfr}_mWXtOnFDb}H^O~2P%4)8TBiDz zAX0VFc=Ih`l@f?8mGFizWmqq!Mk_MatOM2;=K0nwR9fy-;cdbjAD3C2vqd>+zVpiKu6EiuE zWU(ghl3`6Y0FyC43YkRH)J~J2>+tS;mhheo?wSLB9HWxfL9Cw<-dZdzSncG-q17=l zm^N~Te9&DFT&rM_61l9^hDqBI*2x2tTJO!rJNkN}BNq5|4}CM{CitDuh8Vw7Zx*X; z8)^VK%2FHBiDWjXdnRs>1&pdD0oK6$oDr2*U2n^OK$;Vv*|>7QkzdiN=Ro)lyc1%4 zqewBwuBQzTzzcR{(ClOYCUxbH(-Q}lY)ANvA~8$Kfyi<*o(~JQi=;2ONYuiIT3nP+ z3v3QjB_VOF=_q3VD-&Tdd?nknREBPmBhr`T=$ZdXPdffE6j@Roh7E+<|I$6MAB?ljlc*6tQCoCA^hEHtWp8TTy|8+-+?UFp}6ye%B7T%5%q z7#>TZOd{=5Y`9@YByNoKVWQ*;s}~8m4*E2WKvOtXg8dbxucauBFpH6PcaelJn=d(y zPqui~@ab}41tD9u&RY#_8B|X&eRqQCQFNF)j2i*sw6-WCoIKmxHwje;ExI90H%fyWWLckpt zy!eAc;E@Yy(fr<44{HZhD?#mU~(rKR`NO9lh|@_eDSaQ$8>)D!V+Jw-BF<(+S5Ud;)3o_No&eQ<1h3_y6>e1CnAglG$7pb{^;W`^pBo><1OmW zk*+&*lN%k@emrf=alb&_D!j8I9AA-&@UEzGfj>X@Z_(-t{Kc~- z*Y)rA9oo$R&T!QYMjyYx4`}>XF7StGJg@ge|8aren!oGTsP!fOWw{m6)i3e?JiqbA z=&LXBd;C)>=$xa4D|0U>~0!X`bf|L?^BF$8vW@ zcdzwt@lQUf?EP7E(q;adz-}qU2@4qS6p;u^x<3lv!h>J z=C{54-dx#xB}H!I*T?UPg=Oy&t{=^LUP~tZWzyZ5^bbj^>ZJTRdCzMleW*{J9G!Bj zKh3@uUYd8`dpBkEy%!znzIR9by(Inj@%NJSx8v`5(LcSye?|VhLiDn`{r+g(EB$$0 zlY4j3`}|eQF1zZQD=ylw^i>yKbM4wC*IavFq3pea?|qTqe11v#o7|tk@3^)y!M>+o z?w@+d>Y|Tc?w3!$u2}XiqwqX_KEEW5ZOWUGNr&7E7|HWmImpy?=M%&@lYYd;O;9!dLlSa}C;jL6|noFG&lybCdJ~ zn_lIwYC2R^tD_@c3#}@5m%WQAP1C#%euwO6q^~aBaQPK$m!^H)$cvZrf(O!Std{7$ zr|bbsZwZO^XwPf?H7yIs3dmX&&3T=F+Vid?IY{#DTs0Nm%e9^BN4OTazMS9T%Iv0$ zYCkdXya&%MbLV+aMmt{TpPO6!Kn&|x3`=^a= zI4VvUe#Z3&7s@!hL^F_kK7(di3r7NG*AG8_(3HY1{Xpf63DmZ^rH6{OC0|`^V%T z8FeK2p_~01bMK1Ixy7H}lA!vX(UrIO3#LqE25Rk;%xRna3v1^uDtlwJ1OEpboFsh~ zX;IrGeKz+RoFsh?_ZrM3EdsMVlU~dH(V6sR+#j1sYl&casHGLC5!nx1LHd}?3vZm1 zeiP~J2X7^Pe5U+ulhRvAYw(i>e~|l5zMp1nB_rE_J4k0=_)F49@k=VWi~FUS^xc!v z+a{$SBAxBf|4q7;@23_1oiZ}%zvuplO!^%w7z~c#e5RD_@~i|_xRI;W0#b@*YVQ-;$_jjdfB+>)$j2y?WitwRC*_+FOI(d z9{&@4mmlYNhKG1j*lg+OuFd}Qr(izQ!B{2jM)JIiHf&gX#j7?18?Fj2z5F$oU%EE9 z_%DLjuf67~DW9g5tD?WZ)j!356mDv5)Owr$3a0rrxB15f<42Xfmr$Gdge6?3yllks zx3~F2{+y%5Kn_LzhjRZAeJ1j6U}m4O#XlvT{pS#o_IWoyzON;fjN1jvm zUdHtTzAiLK($h%`(W51=^ylP{Kh~&^5YLlru74+==s;gCu!fK?grIHq6VIpNI4Sz_ z`~5}vZO2BxeZRl3wD;Juv18Hd_xp2l#pufS`zQ6Cy1eYIpzL$_oz749Vf6gl{Z&(j zP^?w-v)ldhxjT936%@RXW(u2=X5Yd69Aw3xvlLx_^zSvuFNk)2(7&^L{_$mR6}4>V zCpgbPK6>qk{Bw?b7x}Z4A77VqU*e}O3*RRX{nAxy*I$0o>!Q&Q_^VqE@RDBeqc?rP zUz#RQR&u!S?C=HW1sA{i^7WUly(TGnQS_q^__GI-1g4H{rS^&F_PjF=klA)uRU6MyFWXcu@xD;7j{=1@sygM zx79zdFA;^l0yc>XW!_%<-owZaVi~9RC2aKPz|MJ%Z@%@z{&|bHo?Q0MCI4=oSGXqW zza}kg%cd*Q!uR<{912^`?_TvM4pHvooz?c<1I>5%L;2h{qUxP~R7uv*t4=M8U-hnp z72n7`Q1aGpc%`=~dhAaBJ^9&Tbk#@v&ka5i#*ePu;2ntX>z$sK)RtUlM=S2~XXTGy z8NKW-|C6}~qwc%?`TeVnr@ZRb8-lAY3ogFu)mL76t#{;U(G7R|FRGn&TG=~?Z;P)H zGmxaePI@4deuT96pyc^CNYBZn2Z7V6ne-{7Rc})MY|<|xebKcDuNyAE>dN3U#F4ep z%eVP6rX__wO(FjG&Wdi{=ATkdvfodZvK?*M@*KyRyz6fN_-Iq)kF;HR(Q7V$#YGz= z7)EFPl|MJX?DXi`zw(d%lkwBbw%GlcmxZolYyTp+ojls^CC`4s{jyA23)pE&N8kS| z|CE8^8E%}W;3Jgw_-M;V{gGqK6uE>qHu4jROVT%RFEmfmB2WUcrK6vI)PHI2{^*Q* z{NtjdJ_`E3`W_$V^T7x1xW^wZq$B(O=QD6WL=lmY!_a%OR%kN|Sw(xrgzc=uECBK#YTKWBQRoQ!t-HbASG{3w+W7s;nPqPuzi;sSU;IAF?{0pZqqlw1zq{6P zcG>&)v&!C+{Jzca%lsbXcMrc0@w<)R+xWeK-_`ss<@XYPXY&jB9m#JdzcRnytf620 ze!%Zr{JzHTANW1U?<4%)%kL(BZ{T+=zqM=7VP3$^bNL;|?+AWR0-#x3d--+o%dd&P z^4I=LX0(^M=lAR8viB=~KjrrWevk3{Vsys+{_NUM9?!KcxpeKtuYSeLF2C}!tIlt8 z#F)Rir@tYo;9>siANxn`->C=+`N!b4^1otw=dT3q3Rj-wd4HnRExBCbhx4J0P=Wjx zb2%@6GbM|kVtL>BNwRj4^EhNqh;RRD%|GKk&->7OsQ!B@^2Mfz#X9+yf4HT2M_QT} zm$Y>@Yg#A&{0|mdnl&$zf5qpwv^0G>Q=<2{?&fEh<*mQsa`^LV9Jys^;Tyd?8D zHz(KL@_kXU_+RddoM>x{h)43Tcx&@O^S*4xZOx~(oRrNtSnT$iJFIi=t>SIX=d~C~ zjBDwBx-h-qwXBYQ@;Cmxj^8n>@_)_mE3J1nM?~|a2f-Xe>*&5 zem(FjF8Yw?{msWbuQ__z1O8BL0o?A#KgU{nPfM=wcW@YAxSzzP4vOY)1)O=t#4G;b zT`18Wpesk^@;8xN9AXWdri^1LsQT$Z{(wGmi9Rx8q38YVv+xG5W7s|?%qU&wdEfpF zIe+S2xEm=kzZCBhH>{ih3N}3PZqK`yN?Jb+0(kl5z@Tvd<(~J@Zu0I|o|peuVavbk z$sUGb`Ntt5<)TWzORfDdcZHwO#ebpxXBk_~ucl!C1wMUxnCc4M@AbTuWc8fXsw{nGm-3H46~KH2T)wp_ z=f1iBf;cD4=L(-+%k0qOx8`%T#?pn$j|WrfT;F|7)>{M9KhhUq=>8Rd2F{WZx>TlC;Z4f%lKTN>T(^QUlh4^jcO79T0*4w0xO zkB(gDzFzzg5c>D$c-|)%qT+Y>{L|B1TZ%U@LjMFd4C$SBH|Gi;zrpi9Kr4&S19yA= z3?5jCTq#$0eLoDXiv0^;eRK=#mYxK>lYQdlXVQPK@J4X_r7Cc0Ywqv~FaJr+q#2A$ z@$;`oo4^~rhW`0ixA5R7RWkIdE;Fh5k27AkaC=d(nvi zTUp;x)^$`>7mBIFZ1vHMmHM;6Sf1q|mg|F*F|4?kcmh#Cze|NFF<)TbR-^zT8 z*Zi{#f$=|2kux(H#o5i37EQL~UvWWmNAqv8CFVDew7ejbQ7aminxB1Xe)DL{P$olE zik6ROvivU;k8FN_CZq4|`GqYvXEQ$8)Wu5;g!&7`?#YC@_ADv&E9ugI1)&z+cn${t zDW!%`XF3Qm?>0E+cX28FoxGh)s^-MTV$cTST8@Q1FlJM;vl*(@vZPW4> zFQwjd8B(kCL*Km{hK*vO;`BABPOXgdJAJdv^G8z7NOGC}`vl(j5TPL?h3rO;>NNa37Eh8_I zTl_oLH{G;dn9IMTM8?fzd<`(SVLQs-!$=fQy8}ZKJWAV7$yvjwbuEUOS;CWp~%1_c#{VUzqGNbfb9tKK$vZZg@86;S2Sdi(NbaGzv zJsGeyU6LPa{!j*N{y*oY|39sL34ByV@_+X`XOhfhGMP*!2e}{@;RwhP4!J}Dxi2|2 z2}w9K7n6j5iW6iNL_iRU## z?9bi(zmE=8)!o(A)z#Hky%+uNFoJTN+x56`!UoBs*~19@R=c(}Od!5B&AuiKk9dyb zguIA)-O@jQzP&br2*D@vOMArS;rP}e&`m=ah3`nx{b6`yfIHn0gDeKn|4rQCK6_O& zA-a^S&h23Y*J7JEz6)QG&`Kq{eP5V_Afy=u6VSD0%dFLHw|8+*fvnc*c16q8Z8?g? zMlCa~mOqD^EeS8XGWpg4jM4QX??YB$tbtEXWvm(piM+#FICyJC%&{U4E^3Y-zo*@B z#?~D{FSX~MMVQg#L*l{L)B@@2j^e}D)CAXPFus@4kH#csGPXfzud6v)Og7->MVHsr z_Rhl)Nxv}2m6yTTX(p;(SNk~W{7~2VAlH>3`ov4GtNoq%M3Z@ns}QuoBH|6T6TX-g zd@Q$f?Y&~e8*2CKd)#d{QIChXFlY&S8jT~NlLx@$3a#5xC9Sh_%{yf*4>gW{jeiXD}gzG!vysH7H z5gcSvAcnrF4ow_IBrv%T<*EUPn5+=n-c%&*W#!6-7YQ~nqu(=c0?qFp+mij*jMclDR z-NuVV&%Npse6BdXS1nCi0qyZFs@o>zF}4|qYma1iHDGPBQ_R?>e$erEoP5(6yPxX( zK(+0J&-XzW{3A8qwH-))lYhUO$lWpX+QAf%;^+|@a~t3yvFMoI`pPe3JJC*ryN9I5MxR zcS8nhBzWu?*DAn+0Y?~%2xgn#7L@{zg75M^4rB$8*m23;+tARRfIXwUF+(8P8NhLi zQnC8)f?R3PbFAUvNPXH&WTr=a{kA%BlIuEDPCl6=F>0tLBvgY@)~sP0V5^41fSYSL zW8@+qN{{zESlYz8gX&_QCbAEyZMB$nsI)*#IHY!W$IL-;k&5yqi80TCzF2HHq%I3= z1}UVDy+AB=oFF);j&p#+)!~9Mg@o-#mK9V-HDF8F4S<`4J#6H%gbnFKY&oo67hrmr z5cxnXAqEp16ru=lxDa!xkfpKHKrA69V%D^T*bBH>hyoaObDv;{O+drQoZnHe$=yH} zuWE6&3~1+hLM&@O1|($7=j_6EL~S1kWFZH7oS)^fQ){t%gkACHF_dyI$6YibF9YfH zkh#d>t2J!D24Y@*3@N=;9{Vy5S3jomk89jFeg>9OROKR@%wsQHhm&P=Ep*XInTrSFG>~)eSLFLl_90l9qnb`kQUDa@~q0x)Q zgSlnjq@1!89k&?bf(sCqi zvy!ffq3i0iN7d^zR~_IJV#;6CLfwGRMTlL0QO7!6ktlgV$+CS2-RFpmch#}d4-bj@ zch#=aXXC|_@2Y*BBxu$;-r03Jo2HfX@2V*Y`JiRztKI?W7}*4m^|~%#loyH4e^sA# z%q7z7?3fCaSkd(TU)2S?-5yk>e2q;6&6t@tL(_wx3FYCgLCQ&xrGe-pWm2lxcub8~ zOW=Fl*{kQoOGE%YS9l)=7Wory%EO`t^5$-S=((!0`hO|0bfIYCmHF(rNp<;w0- z#=b?N%qrgO%$2X>(2F~;=qFa0UAXO@&TwE3G46e}r{*I0ZDRHNY6rX+f%M+oY(RlH z{Jz>ZcWGHr^b%Af&z^uY57>KVEH>$%O-AezA>$#_a#8Si_1a-=p~ipWw1l?$yNh4| z1Y4(SSi6{yHNR|{20Nr2Z>d(2v0lx)i@1oBe^)1JkE|swqVET4a%M;9k#;V83axaW zLK$e>d@PnxD@4NwYU+qlXbaz9kN2L+gM|X|E=}-`hv!~Qa65MldF9Q39a+wZV$iL} z(b=4bc2Zh!9y-?a^#|&B-scQxe6u~pTi6~-!wxdJ59WKoX#{^6?fn>x3J8AGWlT_` z09zB(OwsTW477ogA2X91!;-gAa)LPgkvc4SFX;SHd!nrzYnBs0+BR^zZ9R~4(IVj_ z&cLgWtF~Mhx{hzLr?}c7B?m|@?ZR#MKpC zNw&ddPMv3ttA4k`QiP?^Dp7kvy(6gs{+z#RcN;P_0tv~qP54f#9%G7aZWefaU+PZkd!`S_XTlsug;enu}iML@85<+b_3HLMoAa-Mhwr=Xc z*qy-sK!=4y2vj5Da6ig?N>NE+r>@uEW12z)ow`<~nWhjyhprb%!HjsRr2isi`w+8r zh6oGqG8;$rz-$}3qSadg%*KJ?uahtmCJ=_RURi-sqR`7mk^?jUYg>XT8BVkNWIqmT zrOlX!q(M4VcX+@>``QY&!4`L^hPO6@Y_X3P+AnB~(?88budXg#bB zt-~o3u1UxMJY!5LQeQw6xamced*(4#Po)z;=|Q<{d#I` zV~oe>oou-IJ78nJu0|Ig6Z22wm~VIwOb?X%ik7)Y-h$OB7WbU6ur_b>jljSh0DiWo{5Tze1)>jHqUP1x+$0FRqya~!Ta3hl|82c+B{{Zst zV#Gi14W@hz2mT02jFg}jFJQH@?FEqBTnUFMa7cO4q!S#lkXzjF5W$43_6V>rVRP{( zzwqZ^-E(MaTOL%iy@d3j(Bk+bPF2khV&_? za2K)%z9Jo?AZ08#>}!A_5%Q&j%ij4&!EBatA9gio3t`DH-;^tWOuG|NY|wK`JiJ+c zcZ5|?ndM;60vQZVzd#I#^${S?qKSbPn1T3OV_!t_sJPUK^fPvJH;@BB;?o$5htg9r zF(A7?%GkJIMN*}N){U9V*bYpCDQ&TgkOPZwDMRU0-CwRj1UZb_Xk&PT15yw4IQ}yq z!i&RPj@3zTsX8^L>@{AK6#{Plw*@I<_w)^4p;AOJA za%C61`ZWZ5TEI;D3?-$H!Ax1U2~i#X{aCY&vFv7DI%6}4k|2tj)P(l8b%H;99a92b zm>x?-SjV$KaA7L9>y4591ds`6-@U^aoAZQ7|4NMwB*8y_yaOu&>-Mw|I&>1jygvHW zj{5Vd9Zx)rLHjg1uNKzuyIa+b*n`CG#Q&jN)e*PjRC*U}r^$L6s2#?LyQa0;Gp3=*fyBD1RAJ= zsmkY3?SQSwUmn0HzV2qmW)n7)RP+PdDd*0_RVI=8;6j;6FG61BNHNq4SsgyEET4^Q zOAHo&sSKt4x( z3)pP1Tmw)400c>LVqsQ~MeJqJe$pTeq^Dyr1TdzPj&k{{JnY)xN|SI+FVBJ+JEIv% z)8K2m6=L~Exg^dd0_2|_Mx4?&aO->efg4yS$DzoA zV3snHKj%vPtr#aThve5~@Gn@QHeC_kyrNZ)YO7@+IA8 zCj={-3}LcH1Z%qyh$9KriEqA9Q(ZrygWQJ@*EPYrvK=N5k#a_zo+EX`kcT$2){yAE zh}*{Yh@l|ThgeIR_FsC3*m6c~l`zPQsSq8JG`1CT8V@|0y51%}KBIPQdj?vK?81Gn zZkNH}G2tZHc?NQMiDf?FGd$jYfCr0S->Ur+i->enoUwzQOK|Xrb%mSui3ut6J;}{P zpYOHp%f?oPV4b(}X21qch_}C0<29EAn29gGRZ|E0p!CSjJk$GmCh9Pdu3k4Js3y3y zvr7fs2-yB5-Q_YHMepvUG)w5yv10glYO2EpubUKb8oSyYG4DIJ7`JYxM@kUl1-3!REw_CIP)z*ryT zfKAc@)qn>RJllke2(Cb{nC|@;Oi%g}HOe=^G&r#68!3>3UOAFiEM)8*jQZ$wA{iF) z#%dhcJO|QIYyrX%^M*n$?Sh$_CXVPuG<@ZQQy3ev9q1zpm;CUVa{Hb**C9$5jHPgd z$;;s|jigl=GvP=uyyX#+^Eud@`XtV=ci}Ri1@a<{YV4D!-$)8#2GU~QRM(HkQiNW| zh`CoY=FPnX3k{1YBY@_U;doPH3rIcD#*tI;($3>Sgk%0#@>mdAk_*=wM4-e_oJ~MZ zE5IZUo^I@8p}-6On`7poj3p{WFe4A!vGu%rnqkb zCqgKt6kYeXCxE<#3OB)itDgii5^J*9X_#*I0J#!M=(QBn*FGS(qi-KXnIuBCqs)LJ z9NR(SgzcSxT~dS=9WAea6cgTek)rlTHA^=}!s#fn@kiCuaT(gMWIwL1rl4`*2$N8& z5s!&~ph&um&aD!k{HX2@6!gP@hvUmd{8A_)DHjn*=BbVqzm$vkB{^yymSUI|bMHX~ zrTsDOL;<-4vTqrS;g5lkdka!pAXYR~E*8DYQyb8|=!e|TxNIh1;-r*NoD|j5942K5 z6)vGU1IG?u2W9Kn-JqqxHG0oFoc2PtwjDT+9a9RW5|TpcBhlvA6Ik>Z>9-<%V@WVQ z5TFb+|9d(v57M@QG8ToEiK|R$^L{|O)Edo`oUmWz{poO3Z!y-s50@s{LCAo0o`d4s z(^jw=D^h|daO}u25&UQa(t|65I%2&IncH{e(gWZHPI&0o+7vCEA};$${iox3jO6yC z3tT*#vBRRn&uWqLG?At_jhjA<>aFjniI|$0^iu@7oA}UU@%jEf)QW`s=FkW$X<$Hn z^|M;SePYykwXY)|Q&N6JvX^Fw!D8)sbpWmykDpinR8g>1Z0%fKnqe9e%f@}fKwXi zhvTIVsR?PylyTzb3u85SKIAM)7V9fbDG}>^2;X1lR_`CPzeipF+}3Akpu1u&o1p z02$fj(UV|2wyH1koOksbQkuo4KS z;kFp$ID_m4l7zO~d?sSQ5DDjCJ^Cj+OWzgNDE$=oMjQ+yXy>43JgztKlLjWrb8=57 zNn<@A|3FgjypG-#rPM zHB7OHIBbyH7^XNEh-Hc^09&TWHWL!EL?D(W9s?Y*#506gmS{@=Vp(DuA!LbUqXmQn zO>q?9kSWdta#2$Z@00(|5;0zm{b zm$LPskYwsD`wwM|{&OW>tp5W4Z3hPXuUojIdO*(9DK^D=BK-C~IX^<(IgmkF6%p13 zv_C?zCAF{#8m}$d5TV=bMjQHFvrqz7(acWH z)_A#z{-r#>;r&5hTrOZOqU<$!pCI1*P%<=}4H15UhdlXyx>$etZWNXmq>2#q7~;c5vMFCBp4#7;=YX)BtYI0k1U z1jxT`5GlIWN=m<1T&`GL4$xlQ@Z|=&iyDlX0-+f&5nx>gWq8%EFYK%))tK<3)(w zi_CW%bOb&GzPiDD%|KtkmA~AAApWiJuitRx^ws9u68c9dYn))ddxI&A(sQMHv~@(8YY=<6FBfT0SX$|Pj8ZzAbo%-Ki$UIH&0;##p*$! zV;=({k!kTDe_hMi&tT}p>n`$~HMk1g4+MdsLGC-!7`qFbMQ1k*T-@}bC(Kt820x6W zO>|;3>C}89VIVQ|p!pln!}duKr~ zS+6hH@h$_CMu=TD%@eTRPq2Sv)2+2UGBZ2HU5^6;>#MuDS% z8R?!y;;tTyF#ywu8mObvUy&$xx<5!7s^fhb1Fnl^Uiljw6^*b`&clNop%mjiA6mM>xKX?bgJsFq zeE4?1orhXsjg;MRuY14(iT0;Lehj$iXxHNGF~e|-_5`8B?OIY`C;F8*dtS(13bxkc zc@Zm(aQx+@?89NqJg>&(%y40wi^@DN#pQg0w8aFkiD|pD1G<^uQE}O)VFuRY8J&~u z37g0~qm#1(r!lUr$1~cS{Y`HR1B0=i9M%u9cf_pBllysRtla@8Ac8h$E0A+Qe6e=- z%Yd!N_dQQ=cZV@skM9(3=dN#Op(wGCcXM8E62$Zf%^jGBmiW+G&yKj9GiXUZ!NHac zCio&PDfmrGe)vBc;^>Es6Y)Yret^6UfP)R`3w;6mk6R*&BQ&oV7OB|-33=vLGNQ9_ ziPxU|X+QkP5B9=6GP=DLPIf^15M3@0X~5mYLEPqM)0j3q<6)SSTr>~w>%(QH)kbmY zTMSP5>z+8Z=pu(prt3)>Iv|!UAycP;8 z{^h9X=+fePUm$&0!dPRDh@7G#EDr0#I1EE8%9}Ze|B2SxxlG|U9A<1yD5-ytngQy5 zliJ|Y5(DSqE^0~RS3{8_ufe*3kWtiW`w2RTA7vui*8m5tz*))HU5)t%O5-?Ak_ez# z(s(S1jnpMvn*nNL3Uc1bWAw>DwgFKp5RYZ%$FE3;(W;$$iJoAOycRy_M2ZkG+TK9U zKm;(*d}7?4U>0FfH}u1mIn*i9B#9y{>ZYaUVXX8d>BsCov5b}z?O=fG~!TaN=GT1{xj>Xx4nUsPgiYWi(D3!%FwKXK5 z7rG1sl;|X0e&_*2*g)G-GMDII`Q2fVnkKUpE(=VNqX_QC%N;jooI z@GlA=bl?u$5mS{n^A^<;P2N-h^Q3ATxO{vgRwo2Ea(VwcEHDUOg5%ugJWPHPgYy$= z(@8GTzq0Q-me2l4lz$+0e<}`dsMuGW5-d8FymO%!%H+gdT(Y>7HB;7MAZw0xE5kfbF_gQknCle8plS_~{;pE#MMd9{~DBfjLQ zSd^soPMHhV+VG)Kr{J7709G4~dmnk;Km+Gq&KZi*vpfd#bBo=_D;((OQqT(QaQ3J`;&2YFhxffp`W; zrFJ?w-5jiL4dA_D)g8#iOQZ)bUY!CbQ%+6>)jbtn-9vW!Yv6M_SlzRL@m+#o<30dZ z0E`+JI0R&(l?2OegVC;CqPpVIhzkhzMJfi0^=OaU?LUIgTw;pWeGZsj-!OGaH<^2b z)yaTQTPdh*ZTbz^P3=Rm^51up{Z6nsDvqXTJu{|Wg*^l*{UZ6EABss8b3>{YKShkk zi%%r}Me?P$!o9hvEn7zTh*<9|CP@Sha=|5zpf*Y-PhmtpBf!Okjzo&W6?5x3o?xXpqG zGW0X*KJ35=p_HCWFh9bn87YU7ad1FE+D6ho%=(X5g^v1hmSz?DPt<*B5n7}K{-t!y z!u?k6=9Ei|eaRGaviU2I?ocX*W@_<)sgWiL8ekG5tQB@x^q7=+m@-CSCTgbanSjtV zlMu`^WFj=%f^r8anC6VfZF|(=d-jkO}(9NwUk=cG;0RC*%?GnPdueN%4qd5fYH0@^!`)gxU!_xa_KfVM z_Dz7;tym`)ktgD`gO=gZ9awYvBA$>2nhTj?$H!Y)VnS#nm2kJ>%`BRF4As^s-dB>W z4+G%?yJe&!h0T=2x0AJGQ7}PE6ltThc4GZlO%-RyXkCPVl-5mLO$q(RYKo{DtGUJI zQCfl+HcImd-)L<@V0uL@eaV+IR#9Byuc{#g%jj9PW&YyYDnFrE^Wh87brnIlym%fy z@kIzug^J6|t4at4gOaL>imFONu!HlL)zp<6xopI`n#h>WL;117s`giv#Ff<;RRXP> zRaskT3LzY0wAS3#)M|@Q#kBQ{bkku!n(@p z;*uN6jL#B7{!l#--d|i_IH$~z5*TXn&#J7MRbteOCe#ok+|so1TFoBO^ui3yFE#bLUW?V58mqNovglZ=-P-hC zt(FndbX7p>s|jVXR@T(%cCFGSZriL4Z$eN~f>TVrO>>C1ZqTBeRz9TdvkUiZEurbr zty*_o)PJY-YbtNjTD2F$Ueywt4t%2B7a`);YL|&uZ$trpMjNd+y>?a`6)(Ds)7v!N z9ApDqnT+;7EG55Ue7>r>Zdzq=MOn>vuxE2X zlWQpgc+;$k>hji|=ZpFRJ-c<0Wf}Om8l#U+;Ddo>(^(!e8kWZ%SH-RZJ+c3fpj6b= z7FO5#8GZYsq^f#eVP#b%eU!7jxVjo0*}JZw51Wd#3Vi0S3SXdm82rW>ea!C0SDbq2 zog8m~%^1T#+0TlY+(XZnZc~J-N^dQm?4f4{=m^(eTWA;=HlK*j_0OoQD66ckG1@_2 zxCV$Y{-E)&=h5Y6le%@A&!)owuPG~GkD;1j#%N)$0yKvN>xp7!-Y)YQeORmBkI_~L z6Jqqemh!U7;=;Px=>=>X*|urB>_e0{3w7!=pV8N0ic3q4rqXw@>iuTh3v248vF%`K zm@L}?Xu7|ug3-q+D$C~9_Rc~reOSHJG@_U8=5321C`JaOaD|!0m8Iong~q@MwtP1v zt*)z?$?jG}W3}GCKYf+~W4Um8Re32}3dHmUtP$nSFN5QYWtC-qMjxjr_WO(H86v)d zK?Fa8crtNUZ@o<#ef^?-R_)Bfl41}>!uqP>pO@=73VjtvtmvVq_?|^` zt*nLC_gC51iWt>LPnWt%qJN=&x!Bf6ACMOTCPRY0i#3Ea-5E-w@9-F^He`yHnp*YM zXYdsIXiiyWNmXf?q4h#&oJ|22w38(_v+gIR#_M*zPju?9r={VC6$5Q-&_k6n!eiv{Q;VHZ7j~5xW-&hS?g+3U{`-7-~woN_S?*?Lc0M zSt}vBi-1jw;yQh@XspnqeH12S@FFKh=d-30Q^blI-6x{rbeH(7LT{Hsp*@%KTlYCc zr%L@sNp^@QD)saMM=&d38m^dC!g^r&RZ&*Kyx47oK=FuD?*URGN&vk;DiZGlWdrf^Ejkk;(+W`gBR z6lKQ%z<=UZOXxR9gSvQukU6JCWDm_O9m7SvEYt;%1^I)SZOM^~5(;y8pa zMsF*%jS_)sJznY(W%wu=aWrCAtezphsMg&Xzo4Eg%F4@GqbU^LslZz&WHwZ7ANIIQ zq|DX}5|$&GoX>}$hIGY{L>!E$&eM|>x?MATk@T=jY@Mz9l0Pzf5u?JGi{?Q}TFziK z!+vs!e}JWQw@bA0>vcRuZ1n315j(+xeEde2c*Cz}N#ml(N3@f19W6$C_1LHq%0O!h zmg^8bYxKm+Uxe_qCSd#EKx?Y%{79>T635gJt3rRA3CY?8lMY4U1-lR?e%2vY*65>s zh?WZ(2pa?`t7;fU@raGjXtBakt2?{D2{gY4raPC0?o3Q>9aph8Kvg2nh@S*fvIZ>-5g@6;38TOw|2i zN1Yy-N?~*+6S{TBstyKQW_8rMNby;nJ}-4u$O;PJ-sryGZ~|s;Cczfw=;^8JA?BR##QNln#rbp-H!F~y{=nFngGsZHDG>67*U2S7f@ AlK=n! From 5946a35ef449645174acd4189175c3345fe0b963 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Tue, 12 Sep 2023 14:46:00 +0200 Subject: [PATCH 088/114] Combining Signature and MultiSignature sections to deduplicate hardware wallet code. --- .../lib/node/ledger/shell/finalize_block.rs | 14 +- apps/src/lib/node/ledger/shell/mod.rs | 31 ++- .../lib/node/ledger/shell/prepare_proposal.rs | 41 ++- .../lib/node/ledger/shell/process_proposal.rs | 59 +++-- benches/host_env.rs | 6 +- benches/lib.rs | 11 +- benches/process_wrapper.rs | 3 +- core/src/proto/mod.rs | 5 +- core/src/proto/types.rs | 248 ++++++------------ core/src/types/transaction/mod.rs | 14 +- core/src/types/transaction/protocol.rs | 8 +- core/src/types/transaction/wrapper.rs | 11 +- shared/src/ledger/ibc/vp/mod.rs | 23 +- shared/src/ledger/native_vp/multitoken.rs | 5 +- shared/src/vm/host_env.rs | 15 +- tests/src/vm_host_env/mod.rs | 14 +- tests/src/vm_host_env/vp.rs | 2 + vm_env/src/lib.rs | 2 + vp_prelude/src/lib.rs | 3 + wasm/checksums.json | 42 +-- wasm/wasm_source/src/vp_implicit.rs | 12 +- wasm/wasm_source/src/vp_testnet_faucet.rs | 12 +- wasm/wasm_source/src/vp_user.rs | 18 +- wasm/wasm_source/src/vp_validator.rs | 18 +- wasm_for_tests/tx_memory_limit.wasm | Bin 458918 -> 457618 bytes wasm_for_tests/tx_mint_tokens.wasm | Bin 595637 -> 595637 bytes wasm_for_tests/tx_no_op.wasm | Bin 378213 -> 377025 bytes wasm_for_tests/tx_proposal_code.wasm | Bin 537785 -> 536614 bytes wasm_for_tests/tx_read_storage_key.wasm | Bin 464053 -> 462718 bytes wasm_for_tests/tx_write.wasm | Bin 467479 -> 466296 bytes wasm_for_tests/vp_always_false.wasm | Bin 435152 -> 433960 bytes wasm_for_tests/vp_always_true.wasm | Bin 435152 -> 433960 bytes wasm_for_tests/vp_eval.wasm | Bin 507688 -> 506797 bytes wasm_for_tests/vp_memory_limit.wasm | Bin 484515 -> 483236 bytes wasm_for_tests/vp_read_storage_key.wasm | Bin 491789 -> 490522 bytes 35 files changed, 305 insertions(+), 312 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 57ed9269e0d..2266343be12 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -1099,7 +1099,7 @@ mod test_finalize_block { validator_consensus_key_handle, validator_rewards_products_handle, validator_slashes_handle, validator_state_handle, write_pos_params, }; - use namada::proto::{Code, Data, Section, Signature}; + use namada::proto::{Code, Data, Signature, Section}; use namada::types::dec::POS_DECIMAL_PRECISION; use namada::types::ethereum_events::{EthAddress, Uint as ethUint}; use namada::types::hash::Hash; @@ -1156,7 +1156,8 @@ mod test_finalize_block { )); wrapper_tx.add_section(Section::Signature(Signature::new( wrapper_tx.sechashes(), - keypair, + [(0, keypair.clone())].into_iter().collect(), + None ))); let tx = wrapper_tx.to_bytes(); ( @@ -2489,7 +2490,8 @@ mod test_finalize_block { )); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let wrapper_hash_key = replay_protection::get_replay_protection_key( @@ -2562,7 +2564,8 @@ mod test_finalize_block { )); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair.clone())].into_iter().collect(), + None, ))); let processed_tx = ProcessedTx { @@ -2646,7 +2649,8 @@ mod test_finalize_block { )); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let fee_amount = wrapper.header().wrapper().unwrap().get_tx_fee().unwrap(); diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 46a985b8fcf..933d1a9bfca 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -2159,7 +2159,7 @@ mod test_utils { #[cfg(all(test, not(feature = "abcipp")))] mod abciplus_mempool_tests { use namada::proto::{ - Data, Section, SignableEthMessage, Signature, Signed, Tx, + Data, Signature, Section, SignableEthMessage, Signed, Tx, }; use namada::types::ethereum_events::EthereumEvent; use namada::types::key::RefTo; @@ -2299,7 +2299,8 @@ mod abciplus_mempool_tests { tx.set_data(Data::new(ext.try_to_vec().expect("Test falied"))); tx.add_section(Section::Signature(Signature::new( tx.sechashes(), - &protocol_key, + [(0, protocol_key)].into_iter().collect(), + None, ))); tx } @@ -2312,7 +2313,7 @@ mod abciplus_mempool_tests { #[cfg(test)] mod test_mempool_validate { use namada::proof_of_stake::Epoch; - use namada::proto::{Code, Data, Section, Signature, Tx}; + use namada::proto::{Code, Data, Signature, Section, Tx}; use namada::types::transaction::{Fee, WrapperTx}; use super::*; @@ -2384,7 +2385,8 @@ mod test_mempool_validate { .set_data(Data::new("transaction data".as_bytes().to_owned())); invalid_wrapper.add_section(Section::Signature(Signature::new( invalid_wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); // we mount a malleability attack to try and remove the fee @@ -2452,7 +2454,8 @@ mod test_mempool_validate { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); // Write wrapper hash to storage @@ -2611,7 +2614,8 @@ mod test_mempool_validate { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let result = shell.mempool_validate( @@ -2645,7 +2649,8 @@ mod test_mempool_validate { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let result = shell.mempool_validate( @@ -2679,7 +2684,8 @@ mod test_mempool_validate { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let result = shell.mempool_validate( @@ -2713,7 +2719,8 @@ mod test_mempool_validate { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let result = shell.mempool_validate( @@ -2746,7 +2753,8 @@ mod test_mempool_validate { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let result = shell.mempool_validate( @@ -2779,7 +2787,8 @@ mod test_mempool_validate { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let result = shell.mempool_validate( diff --git a/apps/src/lib/node/ledger/shell/prepare_proposal.rs b/apps/src/lib/node/ledger/shell/prepare_proposal.rs index e8633940b9a..612d19b6fbf 100644 --- a/apps/src/lib/node/ledger/shell/prepare_proposal.rs +++ b/apps/src/lib/node/ledger/shell/prepare_proposal.rs @@ -522,7 +522,7 @@ mod test_prepare_proposal { }; #[cfg(feature = "abcipp")] use namada::proto::SignableEthMessage; - use namada::proto::{Code, Data, Header, Section, Signature, Signed}; + use namada::proto::{Code, Data, Header, Signature, Section, Signed}; use namada::types::address::{self, Address}; use namada::types::ethereum_events::EthereumEvent; #[cfg(feature = "abcipp")] @@ -1135,7 +1135,8 @@ mod test_prepare_proposal { )); tx.add_section(Section::Signature(Signature::new( tx.sechashes(), - &keypair, + [(0, keypair.clone())].into_iter().collect(), + None, ))); let gas = Gas::from( @@ -1208,7 +1209,8 @@ mod test_prepare_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); // Write wrapper hash to storage @@ -1262,7 +1264,8 @@ mod test_prepare_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let req = RequestPrepareProposal { @@ -1304,7 +1307,8 @@ mod test_prepare_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let inner_unsigned_hash = wrapper.clone().update_header(TxType::Raw).header_hash(); @@ -1362,7 +1366,8 @@ mod test_prepare_proposal { let mut new_wrapper = wrapper.clone(); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); new_wrapper.update_header(TxType::Wrapper(Box::new(WrapperTx::new( @@ -1379,7 +1384,8 @@ mod test_prepare_proposal { )))); new_wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair_2, + [(0, keypair_2)].into_iter().collect(), + None, ))); let req = RequestPrepareProposal { @@ -1421,7 +1427,8 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Signature(Signature::new( wrapper_tx.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let time = DateTimeUtc::now(); @@ -1471,7 +1478,8 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Signature(Signature::new( wrapper_tx.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let req = RequestPrepareProposal { @@ -1512,7 +1520,8 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Signature(Signature::new( wrapper_tx.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let req = RequestPrepareProposal { @@ -1552,7 +1561,8 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Signature(Signature::new( wrapper_tx.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let req = RequestPrepareProposal { @@ -1591,7 +1601,8 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Signature(Signature::new( wrapper_tx.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let req = RequestPrepareProposal { @@ -1629,7 +1640,8 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Signature(Signature::new( wrapper_tx.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let req = RequestPrepareProposal { @@ -1667,7 +1679,8 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Signature(Signature::new( wrapper_tx.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); let req = RequestPrepareProposal { diff --git a/apps/src/lib/node/ledger/shell/process_proposal.rs b/apps/src/lib/node/ledger/shell/process_proposal.rs index dca2d4fe4ed..e9d93b8ce0b 100644 --- a/apps/src/lib/node/ledger/shell/process_proposal.rs +++ b/apps/src/lib/node/ledger/shell/process_proposal.rs @@ -1002,7 +1002,7 @@ mod test_process_proposal { use assert_matches::assert_matches; use namada::ledger::storage_api::StorageWrite; use namada::proto::{ - Code, Data, Section, SignableEthMessage, Signature, Signed, + Code, Data, Signature, Section, SignableEthMessage, Signed, }; use namada::types::ethereum_events::EthereumEvent; use namada::types::hash::Hash; @@ -1660,7 +1660,8 @@ mod test_process_proposal { outer_tx.set_data(Data::new("transaction data".as_bytes().to_owned())); outer_tx.add_section(Section::Signature(Signature::new( outer_tx.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let mut new_tx = outer_tx.clone(); if let TxType::Wrapper(wrapper) = &mut new_tx.header.tx_type { @@ -1733,7 +1734,8 @@ mod test_process_proposal { outer_tx.set_data(Data::new("transaction data".as_bytes().to_owned())); outer_tx.add_section(Section::Signature(Signature::new( outer_tx.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let response = { @@ -1799,7 +1801,8 @@ mod test_process_proposal { outer_tx.set_data(Data::new("transaction data".as_bytes().to_owned())); outer_tx.add_section(Section::Signature(Signature::new( outer_tx.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let response = { @@ -2164,7 +2167,8 @@ mod test_process_proposal { wrapper.set_code(Code::new("wasm_code".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); // Write wrapper hash to storage @@ -2241,7 +2245,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); // Run validation @@ -2300,7 +2305,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let inner_unsigned_hash = wrapper.clone().update_header(TxType::Raw).header_hash(); @@ -2365,7 +2371,8 @@ mod test_process_proposal { let mut new_wrapper = wrapper.clone(); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let inner_unsigned_hash = wrapper.clone().update_header(TxType::Raw).header_hash(); @@ -2384,7 +2391,8 @@ mod test_process_proposal { )))); new_wrapper.add_section(Section::Signature(Signature::new( new_wrapper.sechashes(), - &keypair_2, + [(0, keypair_2)].into_iter().collect(), + None, ))); // Run validation @@ -2437,7 +2445,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let protocol_key = shell.mode.get_protocol_key().expect("Test failed"); @@ -2506,7 +2515,8 @@ mod test_process_proposal { })); decrypted.add_section(Section::Signature(Signature::new( decrypted.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let gas_limit = Gas::from(wrapper.header.wrapper().unwrap().gas_limit) .checked_sub(Gas::from(wrapper.to_bytes().len() as u64)) @@ -2567,7 +2577,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); // Run validation @@ -2617,7 +2628,8 @@ mod test_process_proposal { })); decrypted.add_section(Section::Signature(Signature::new( decrypted.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let gas_limit = Gas::from(wrapper.header.wrapper().unwrap().gas_limit) .checked_sub(Gas::from(wrapper.to_bytes().len() as u64)) @@ -2674,7 +2686,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); // Run validation @@ -2717,7 +2730,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); // Run validation @@ -2759,7 +2773,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); // Run validation @@ -2801,7 +2816,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); // Run validation @@ -2843,7 +2859,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); // Run validation @@ -2885,7 +2902,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &crate::wallet::defaults::albert_keypair(), + [(0, crate::wallet::defaults::albert_keypair())].into_iter().collect(), + None, ))); // Run validation @@ -2930,7 +2948,8 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Signature(Signature::new( wrapper.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); let wrapper = wrapper.to_bytes(); for height in [1u64, 2] { diff --git a/benches/host_env.rs b/benches/host_env.rs index a55b97a2470..da51d079893 100644 --- a/benches/host_env.rs +++ b/benches/host_env.rs @@ -3,7 +3,7 @@ use criterion::{criterion_group, criterion_main, Criterion}; use namada::core::types::account::AccountPublicKeysMap; use namada::core::types::address; use namada::core::types::token::{Amount, Transfer}; -use namada::proto::{Data, MultiSignature, Section}; +use namada::proto::{Data, Signature, Section}; use namada_apps::wallet::defaults; use std::collections::HashSet; @@ -25,7 +25,7 @@ fn tx_section_signature_validation(c: &mut Criterion) { defaults::albert_keypair().to_public() ]); - let multisig = MultiSignature::new( + let multisig = Signature::new( vec![section_hash], pkim.index_secret_keys(vec![defaults::albert_keypair()]), None, @@ -34,7 +34,7 @@ fn tx_section_signature_validation(c: &mut Criterion) { c.bench_function("tx_section_signature_validation", |b| { b.iter(|| { multisig - .verify_signature(&mut HashSet::new(), &pkim) + .verify_signature(&mut HashSet::new(), &pkim, &None) .unwrap() }) }); diff --git a/benches/lib.rs b/benches/lib.rs index 11042c84b3a..c04e1f3b585 100644 --- a/benches/lib.rs +++ b/benches/lib.rs @@ -73,7 +73,7 @@ use namada::ledger::queries::{ }; use namada::ledger::wallet::Wallet; use namada::proof_of_stake; -use namada::proto::{Code, Data, Section, Signature, Tx}; +use namada::proto::{Code, Data, Signature, Section, Tx}; use namada::tendermint::Hash; use namada::tendermint_rpc::{self}; use namada::types::address::InternalAddress; @@ -435,7 +435,8 @@ pub fn generate_tx( if let Some(signer) = signer { tx.add_section(Section::Signature(Signature::new( tx.sechashes(), - signer, + [(0, signer.clone())].into_iter().collect(), + None, ))); } @@ -481,7 +482,11 @@ pub fn generate_foreign_key_tx(signer: &SecretKey) -> Tx { .try_to_vec() .unwrap(), )); - tx.add_section(Section::Signature(Signature::new(tx.sechashes(), signer))); + tx.add_section(Section::Signature(Signature::new( + tx.sechashes(), + [(0, signer.clone())].into_iter().collect(), + None, + ))); tx } diff --git a/benches/process_wrapper.rs b/benches/process_wrapper.rs index 72b26e0cb18..55bbf02777b 100644 --- a/benches/process_wrapper.rs +++ b/benches/process_wrapper.rs @@ -49,7 +49,8 @@ fn process_tx(c: &mut Criterion) { ))); tx.add_section(namada::proto::Section::Signature(Signature::new( tx.sechashes(), - &defaults::albert_keypair(), + [(0, defaults::albert_keypair())].into_iter().collect(), + None, ))); let wrapper = tx.to_bytes(); diff --git a/core/src/proto/mod.rs b/core/src/proto/mod.rs index 497c6064778..e2dd2f667e8 100644 --- a/core/src/proto/mod.rs +++ b/core/src/proto/mod.rs @@ -4,9 +4,8 @@ pub mod generated; mod types; pub use types::{ - Code, Commitment, Data, Dkg, Error, Header, MaspBuilder, MultiSignature, - Section, Signable, SignableEthMessage, Signature, SignatureIndex, Signed, - Signer, Tx, TxError, + Code, Commitment, Data, Dkg, Error, Header, MaspBuilder, Signature, Section, + Signable, SignableEthMessage, SignatureIndex, Signed, Signer, Tx, TxError, }; #[cfg(test)] diff --git a/core/src/proto/types.rs b/core/src/proto/types.rs index 0c59fd1e0a4..5ad9f98e659 100644 --- a/core/src/proto/types.rs +++ b/core/src/proto/types.rs @@ -468,7 +468,7 @@ pub enum Signer { Serialize, Deserialize, )] -pub struct MultiSignature { +pub struct Signature { /// The hash of the section being signed pub targets: Vec, /// The public keys against which the signatures should be verified @@ -477,7 +477,7 @@ pub struct MultiSignature { pub signatures: BTreeMap, } -impl MultiSignature { +impl Signature { /// Sign the given section hash with the given key and return a section pub fn new( targets: Vec, @@ -493,30 +493,20 @@ impl MultiSignature { // vector instead of a map assert!( secret_keys.keys().cloned().eq(0..(secret_keys.len() as u8)), - "seecret keys must be enumerateed when signer address is absent" + "secret keys must be enumerateed when signer address is absent" ); Signer::PubKeys(secret_keys.values().map(RefTo::ref_to).collect()) }; // Commit to the given targets - let target = Self { - targets: targets.clone(), - signer: Signer::PubKeys(vec![]), - signatures: BTreeMap::new(), - } - .get_hash(); - + let partial = Self { targets, signer, signatures: BTreeMap::new() }; + let target = partial.get_raw_hash(); // Turn the map of secret keys into a map of signatures over the // commitment made above let signatures = secret_keys.iter().map(|(index, secret_key)| { (*index, common::SigScheme::sign(secret_key, target)) }).collect(); - - Self { - targets, - signer, - signatures, - } + Self { signatures, ..partial } } pub fn total_signatures(&self) -> u8 { @@ -551,11 +541,16 @@ impl MultiSignature { /// Verify that the signature contained in this section is valid pub fn verify_signature( &self, - verified_pks: &mut HashSet, + verified_pks: &mut HashSet, public_keys_index_map: &AccountPublicKeysMap, - ) -> std::result::Result<(), VerifySigError> { + signer: &Option

      , + ) -> std::result::Result { + // Records whether there are any successful verifications + let mut verifications = 0; match &self.signer { - Signer::Address(_) => { + // Verify the signatures against the given public keys if the + // account addresses match + Signer::Address(addr) if Some(addr) == signer.as_ref() => { for (idx, sig) in &self.signatures { if let Some(pk) = public_keys_index_map.get_public_key_from_index(*idx) { common::SigScheme::verify_signature( @@ -563,89 +558,31 @@ impl MultiSignature { &self.get_raw_hash(), sig, )?; - verified_pks.insert(pk); + verified_pks.insert(*idx); + verifications += 1; } } }, + // If the account addresses do not match, then there is no efficient + // way to map signatures to the given public keys + Signer::Address(_) => {}, + // Verify the signatures against the subset of this section's public + // keys that are also in the given map Signer::PubKeys(pks) => { for (idx, pk) in pks.iter().enumerate() { - if public_keys_index_map.get_index_from_public_key(pk).is_some() { + if let Some(map_idx) = public_keys_index_map.get_index_from_public_key(pk) { common::SigScheme::verify_signature( pk, &self.get_raw_hash(), &self.signatures[&(idx as u8)], )?; - verified_pks.insert(pk.clone()); + verified_pks.insert(map_idx); + verifications += 1; } } }, } - Ok(()) - } -} - -/// A section representing the signature over another section -#[derive( - Clone, - Debug, - BorshSerialize, - BorshDeserialize, - BorshSchema, - Serialize, - Deserialize, -)] -pub struct Signature { - /// The hash of the section being signed - targets: Vec, - /// The signature over the above hashes - pub signature: Option, -} - -impl Signature { - pub fn new( - targets: Vec, - sec_key: &common::SecretKey, - ) -> Self { - let mut sec = Self { - targets, - signature: None, - }; - sec.signature = Some(common::SigScheme::sign(sec_key, sec.get_hash())); - sec - } - - /// Hash this signature section - pub fn hash<'a>(&self, hasher: &'a mut Sha256) -> &'a mut Sha256 { - hasher.update( - self.try_to_vec() - .expect("unable to serialize signature section"), - ); - hasher - } - - /// Get the hash of this section - pub fn get_hash(&self) -> crate::types::hash::Hash { - crate::types::hash::Hash( - self.hash(&mut Sha256::new()).finalize_reset().into(), - ) - } - - /// Verify that the signature contained in this section is valid - pub fn verify_signature( - &self, - public_key: &common::PublicKey, - ) -> std::result::Result<(), VerifySigError> { - let signature = - self.signature.as_ref().ok_or(VerifySigError::MissingData)?; - common::SigScheme::verify_signature( - public_key, - &Self { - signature: None, - ..self.clone() - } - .get_hash(), - signature, - ) + Ok(verifications) } } @@ -949,8 +886,6 @@ pub enum Section { ExtraData(Code), /// Transaction code. Sending to hardware wallets optional Code(Code), - /// A transaction signature. Often produced by hardware wallets - SectionSignature(MultiSignature), /// A transaction header/protocol signature Signature(Signature), /// Ciphertext obtained by encrypting arbitrary transaction sections @@ -982,7 +917,6 @@ impl Section { Self::ExtraData(extra) => extra.hash(hasher), Self::Code(code) => code.hash(hasher), Self::Signature(signature) => signature.hash(hasher), - Self::SectionSignature(signatures) => signatures.hash(hasher), Self::Ciphertext(ct) => ct.hash(hasher), Self::MaspBuilder(mb) => mb.hash(hasher), Self::MaspTx(tx) => { @@ -1054,15 +988,6 @@ impl Section { } } - /// Extract the section signature from this section if possible - pub fn section_signature(&self) -> Option { - if let Self::SectionSignature(data) = self { - Some(data.clone()) - } else { - None - } - } - /// Extract the ciphertext from this section if possible pub fn ciphertext(&self) -> Option { if let Self::Ciphertext(data) = self { @@ -1395,64 +1320,59 @@ impl Tx { /// Verify that the section with the given hash has been signed by the given /// public key - pub fn verify_section_signatures( + pub fn verify_signatures( &self, hashes: &[crate::types::hash::Hash], public_keys_index_map: AccountPublicKeysMap, + signer: &Option
      , threshold: u8, max_signatures: Option, - gas_meter: &mut VpGasMeter, - ) -> std::result::Result<(), Error> { + mut gas_meter: Option<&mut VpGasMeter>, + ) -> std::result::Result, Error> { let max_signatures = max_signatures.unwrap_or(u8::MAX); + // Records the public key indices used in successful signatures let mut verified_pks = HashSet::new(); + // Records the sections instrumental in verifying signatures + let mut witnesses = Vec::new(); for section in &self.sections { - if let Section::SectionSignature(signatures) = section { - if !hashes.iter().all(|x| { + if let Section::Signature(signatures) = section { + // Check that the hashes being checked are a subset of those in + // this section. Also ensure that all the sections the signature + // signs over are present. + if hashes.iter().all(|x| { signatures.targets.contains(x) || section.get_hash() == *x - }) { - return Err(Error::InvalidSectionSignature( - "missing target hash.".to_string(), - )); - } - - for target in &signatures.targets { - if self.get_section(target).is_none() { + }) && signatures.targets.iter().all(|x| self.get_section(x).is_some()) { + if signatures.total_signatures() > max_signatures { return Err(Error::InvalidSectionSignature( - "Missing target section.".to_string(), + "too many signatures.".to_string(), )); } - } - - if signatures.total_signatures() > max_signatures { - return Err(Error::InvalidSectionSignature( - "too many signatures.".to_string(), - )); - } - if signatures.total_signatures() < threshold { - return Err(Error::InvalidSectionSignature( - "too few signatures.".to_string(), - )); + // Finally verify that the signature itself is valid + let prev_verifieds = verified_pks.len(); + let amt_verifieds = signatures + .verify_signature(&mut verified_pks, &public_keys_index_map, signer) + .map_err(|_| Error::InvalidSectionSignature("found invalid signature.".to_string())); + // Compute the cost of the signature verifications + if let Some(x) = gas_meter.as_mut() { + let amt_verified = usize::from(amt_verifieds.is_err()) + + verified_pks.len() - prev_verifieds; + x.consume(VERIFY_TX_SIG_GAS_COST * amt_verified as u64) + .map_err(|_| Error::OutOfGas)?; + } + // Record the section witnessing these signatures + if amt_verifieds? > 0 { + witnesses.push(signatures); + } + // Short-circuit these checks if the threshold is exceeded + if verified_pks.len() >= threshold.into() { + return Ok(witnesses); + } } - - // Finally verify that the signature itself is valid - signatures - .verify_signature(&mut verified_pks, &public_keys_index_map) - .map_err(|_| Error::InvalidWrapperSignature)?; - gas_meter - .consume(VERIFY_TX_SIG_GAS_COST * (signatures.signatures.len() as u64)) - .map_err(|_| Error::OutOfGas)?; - } } - if verified_pks.len() >= threshold.into() { - Ok(()) - } else { - Err(Error::InvalidSectionSignature( - "invalid signatures.".to_string(), - )) - } + Err(Error::InvalidSectionSignature("signature threshold not met.".to_string())) } /// Verify that the sections with the given hashes have been signed together @@ -1463,31 +1383,14 @@ impl Tx { public_key: &common::PublicKey, hashes: &[crate::types::hash::Hash], ) -> Result<&Signature> { - for section in &self.sections { - if let Section::Signature(signature) = section { - // Check that the hashes being - // checked are a subset of those in this section - if hashes.iter().all(|x| { - signature.targets.contains(x) || section.get_hash() == *x - }) { - // Ensure that all the sections the signature signs over are - // present - for target in &signature.targets { - if self.get_section(target).is_none() { - return Err(Error::InvalidSectionSignature( - "Target section is missing.".to_string(), - )); - } - } - // Finally verify that the signature itself is valid - return signature - .verify_signature(public_key) - .map(|_| signature) - .map_err(|_| Error::InvalidWrapperSignature); - } - } - } - Err(Error::InvalidWrapperSignature) + self.verify_signatures( + hashes, + AccountPublicKeysMap::from_iter([public_key.clone()].into_iter()), + &None, + 1, + None, + None, + ).map(|x| *x.first().unwrap()).map_err(|_| Error::InvalidWrapperSignature) } /// Validate any and all ciphertexts stored in this transaction @@ -1514,7 +1417,7 @@ impl Tx { ) -> Vec { let targets = self.inner_section_targets(); let mut signatures = Vec::new(); - let section = MultiSignature::new( + let section = Signature::new( targets, public_keys_index_map.index_secret_keys(secret_keys.to_vec()), signer, @@ -1790,7 +1693,8 @@ impl Tx { self.protocol_filter(); self.add_section(Section::Signature(Signature::new( self.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); self } @@ -1804,7 +1708,7 @@ impl Tx { ) -> &mut Self { self.protocol_filter(); let hashes = self.inner_section_targets(); - self.add_section(Section::SectionSignature(MultiSignature::new( + self.add_section(Section::Signature(Signature::new( hashes, account_public_keys_map.index_secret_keys(keypairs), signer, @@ -1818,7 +1722,7 @@ impl Tx { signatures: Vec, ) -> &mut Self { self.protocol_filter(); - let mut pk_section = MultiSignature { + let mut pk_section = Signature { targets: self.inner_section_targets(), signatures: BTreeMap::new(), signer: Signer::PubKeys(vec![]), @@ -1828,7 +1732,7 @@ impl Tx { for signature in signatures { if let Some((addr, idx)) = &signature.index { // Add the signature under the given multisig address - let section = sections.entry(addr.clone()).or_insert_with(|| MultiSignature { + let section = sections.entry(addr.clone()).or_insert_with(|| Signature { targets: self.inner_section_targets(), signatures: BTreeMap::new(), signer: Signer::Address(addr.clone()), @@ -1841,7 +1745,7 @@ impl Tx { } } for section in std::iter::once(pk_section).chain(sections.into_values()) { - self.add_section(Section::SectionSignature(section)); + self.add_section(Section::Signature(section)); } self } diff --git a/core/src/types/transaction/mod.rs b/core/src/types/transaction/mod.rs index 6b00e4dfcc7..ce50e289889 100644 --- a/core/src/types/transaction/mod.rs +++ b/core/src/types/transaction/mod.rs @@ -168,7 +168,7 @@ impl TxType { #[cfg(test)] mod test_process_tx { use super::*; - use crate::proto::{Code, Data, Section, Signature, Tx, TxError}; + use crate::proto::{Code, Data, Signature, Section, Tx, TxError}; use crate::types::address::nam; use crate::types::key::*; use crate::types::storage::Epoch; @@ -235,7 +235,8 @@ mod test_process_tx { .clone(); tx.add_section(Section::Signature(Signature::new( vec![*tx.code_sechash(), *tx.data_sechash()], - &gen_keypair(), + [(0, gen_keypair())].into_iter().collect(), + None, ))); tx.validate_tx().expect("Test failed"); @@ -271,7 +272,8 @@ mod test_process_tx { tx.set_data(Data::new("transaction data".as_bytes().to_owned())); tx.add_section(Section::Signature(Signature::new( tx.sechashes(), - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); tx.validate_tx().expect("Test failed"); @@ -344,7 +346,7 @@ fn test_process_tx_decrypted_unsigned() { /// signature #[test] fn test_process_tx_decrypted_signed() { - use crate::proto::{Code, Data, Section, Signature, Tx}; + use crate::proto::{Code, Data, Signature, Section, Tx}; use crate::types::key::*; fn gen_keypair() -> common::SecretKey { @@ -365,8 +367,8 @@ fn test_process_tx_decrypted_signed() { let ed_sig = ed25519::Signature::try_from_slice([0u8; 64].as_ref()).unwrap(); let mut sig_sec = - Signature::new(vec![decrypted.header_hash()], &gen_keypair()); - sig_sec.signature = Some(common::Signature::try_from_sig(&ed_sig).unwrap()); + Signature::new(vec![decrypted.header_hash()], [(0, gen_keypair())].into_iter().collect(), None); + sig_sec.signatures.insert(0, common::Signature::try_from_sig(&ed_sig).unwrap()); decrypted.add_section(Section::Signature(sig_sec)); // create the tx with signed decrypted data let code_sec = decrypted diff --git a/core/src/types/transaction/protocol.rs b/core/src/types/transaction/protocol.rs index aa9abe8cec8..32e1eee65aa 100644 --- a/core/src/types/transaction/protocol.rs +++ b/core/src/types/transaction/protocol.rs @@ -32,7 +32,7 @@ mod protocol_txs { use serde_json; use super::*; - use crate::proto::{Code, Data, Section, Signature, Tx, TxError}; + use crate::proto::{Code, Data, Signature, Section, Tx, TxError}; use crate::types::chain::ChainId; use crate::types::key::*; use crate::types::transaction::{Digest, EllipticCurve, Sha256, TxType}; @@ -201,7 +201,8 @@ mod protocol_txs { outer_tx.set_data(Data::new(tx_data)); outer_tx.add_section(Section::Signature(Signature::new( outer_tx.sechashes(), - signing_key, + [(0, signing_key.clone())].into_iter().collect(), + None, ))); outer_tx } @@ -339,7 +340,8 @@ mod protocol_txs { *outer_tx.code_sechash(), *outer_tx.data_sechash(), ], - signing_key, + [(0, signing_key.clone())].into_iter().collect(), + None, ))); outer_tx } diff --git a/core/src/types/transaction/wrapper.rs b/core/src/types/transaction/wrapper.rs index bda7142220a..c7584b89555 100644 --- a/core/src/types/transaction/wrapper.rs +++ b/core/src/types/transaction/wrapper.rs @@ -414,7 +414,7 @@ pub mod wrapper_tx { #[cfg(test)] mod test_wrapper_tx { use super::*; - use crate::proto::{Code, Data, Section, Signature, Tx, TxError}; + use crate::proto::{Code, Data, Signature, Section, Tx, TxError}; use crate::types::address::nam; use crate::types::transaction::{Hash, TxType}; @@ -452,7 +452,8 @@ pub mod wrapper_tx { encrypted_tx.encrypt(&Default::default()); wrapper.add_section(Section::Signature(Signature::new( vec![wrapper.header_hash(), wrapper.sections[0].get_hash()], - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); assert!(encrypted_tx.validate_ciphertext()); let privkey = ::G2Affine::prime_subgroup_generator(); @@ -489,7 +490,8 @@ pub mod wrapper_tx { wrapper.encrypt(&Default::default()); wrapper.add_section(Section::Signature(Signature::new( vec![wrapper.header_hash(), wrapper.sections[0].get_hash()], - &keypair, + [(0, keypair)].into_iter().collect(), + None, ))); assert!(wrapper.validate_ciphertext()); let privkey = ::G2Affine::prime_subgroup_generator(); @@ -523,7 +525,8 @@ pub mod wrapper_tx { tx.set_data(Data::new("transaction data".as_bytes().to_owned())); tx.add_section(Section::Signature(Signature::new( tx.sechashes(), - &keypair, + [(0, keypair.clone())].into_iter().collect(), + None, ))); // we now try to alter the inner tx maliciously diff --git a/shared/src/ledger/ibc/vp/mod.rs b/shared/src/ledger/ibc/vp/mod.rs index 4e02cb229a5..91cc65e0b60 100644 --- a/shared/src/ledger/ibc/vp/mod.rs +++ b/shared/src/ledger/ibc/vp/mod.rs @@ -385,7 +385,7 @@ mod tests { use crate::ledger::parameters::EpochDuration; use crate::ledger::{ibc, pos}; use crate::proof_of_stake::parameters::PosParams; - use crate::proto::{Code, Data, Section, Signature, Tx}; + use crate::proto::{Code, Data, Signature, Section, Tx}; use crate::tendermint::time::Time as TmTime; use crate::tendermint_proto::Protobuf as TmProtobuf; use crate::types::key::testing::keypair_1; @@ -725,7 +725,8 @@ mod tests { outer_tx.set_data(Data::new(tx_data)); outer_tx.add_section(Section::Signature(Signature::new( vec![*outer_tx.code_sechash(), *outer_tx.data_sechash()], - &keypair_1(), + [(0, keypair_1())].into_iter().collect(), + None, ))); let ctx = Ctx::new( &ADDRESS, @@ -1037,7 +1038,8 @@ mod tests { outer_tx.set_data(Data::new(tx_data)); outer_tx.add_section(Section::Signature(Signature::new( vec![*outer_tx.code_sechash(), *outer_tx.data_sechash()], - &keypair_1(), + [(0, keypair_1())].into_iter().collect(), + None, ))); let gas_meter = VpGasMeter::new_from_tx_meter( &TxGasMeter::new_from_sub_limit(TX_GAS_LIMIT.into()), @@ -1370,7 +1372,8 @@ mod tests { outer_tx.set_data(Data::new(tx_data)); outer_tx.add_section(Section::Signature(Signature::new( vec![*outer_tx.code_sechash(), *outer_tx.data_sechash()], - &keypair_1(), + [(0, keypair_1())].into_iter().collect(), + None, ))); let gas_meter = VpGasMeter::new_from_tx_meter( &TxGasMeter::new_from_sub_limit(TX_GAS_LIMIT.into()), @@ -1457,7 +1460,8 @@ mod tests { outer_tx.set_data(Data::new(tx_data)); outer_tx.add_section(Section::Signature(Signature::new( vec![*outer_tx.code_sechash(), *outer_tx.data_sechash()], - &keypair_1(), + [(0, keypair_1())].into_iter().collect(), + None, ))); let gas_meter = VpGasMeter::new_from_tx_meter( &TxGasMeter::new_from_sub_limit(TX_GAS_LIMIT.into()), @@ -1581,7 +1585,8 @@ mod tests { outer_tx.set_data(Data::new(tx_data)); outer_tx.add_section(Section::Signature(Signature::new( vec![*outer_tx.code_sechash(), *outer_tx.data_sechash()], - &keypair_1(), + [(0, keypair_1())].into_iter().collect(), + None, ))); let gas_meter = VpGasMeter::new_from_tx_meter( &TxGasMeter::new_from_sub_limit(TX_GAS_LIMIT.into()), @@ -1704,7 +1709,8 @@ mod tests { outer_tx.set_data(Data::new(tx_data)); outer_tx.add_section(Section::Signature(Signature::new( vec![*outer_tx.code_sechash(), *outer_tx.data_sechash()], - &keypair_1(), + [(0, keypair_1())].into_iter().collect(), + None, ))); let gas_meter = VpGasMeter::new_from_tx_meter( &TxGasMeter::new_from_sub_limit(TX_GAS_LIMIT.into()), @@ -1812,7 +1818,8 @@ mod tests { outer_tx.set_data(Data::new(tx_data)); outer_tx.add_section(Section::Signature(Signature::new( vec![*outer_tx.code_sechash(), *outer_tx.data_sechash()], - &keypair_1(), + [(0, keypair_1())].into_iter().collect(), + None, ))); let gas_meter = VpGasMeter::new_from_tx_meter( &TxGasMeter::new_from_sub_limit(TX_GAS_LIMIT.into()), diff --git a/shared/src/ledger/native_vp/multitoken.rs b/shared/src/ledger/native_vp/multitoken.rs index 0d42e86eaa7..1ce44865ee8 100644 --- a/shared/src/ledger/native_vp/multitoken.rs +++ b/shared/src/ledger/native_vp/multitoken.rs @@ -150,7 +150,7 @@ mod tests { }; use crate::ledger::gas::VpGasMeter; use crate::ledger::ibc::storage::ibc_token; - use crate::proto::{Code, Data, Section, Signature, Tx}; + use crate::proto::{Code, Data, Signature, Section, Tx}; use crate::types::address::{Address, InternalAddress}; use crate::types::key::testing::keypair_1; use crate::types::storage::TxIndex; @@ -171,7 +171,8 @@ mod tests { tx.set_data(Data::new(tx_data)); tx.add_section(Section::Signature(Signature::new( tx.sechashes(), - &keypair_1(), + [(0, keypair_1())].into_iter().collect(), + None, ))); tx } diff --git a/shared/src/vm/host_env.rs b/shared/src/vm/host_env.rs index 179472a8906..04ab244783c 100644 --- a/shared/src/vm/host_env.rs +++ b/shared/src/vm/host_env.rs @@ -1796,6 +1796,8 @@ pub fn vp_verify_tx_section_signature( hash_list_len: u64, public_keys_map_ptr: u64, public_keys_map_len: u64, + signer_ptr: u64, + signer_len: u64, threshold: u8, max_signatures_ptr: u64, max_signatures_len: u64, @@ -1828,6 +1830,14 @@ where ) .map_err(vp_host_fns::RuntimeError::EncodingError)?; + let (signer, gas) = env + .memory + .read_bytes(signer_ptr, signer_len as _) + .map_err(|e| vp_host_fns::RuntimeError::MemoryError(Box::new(e)))?; + vp_host_fns::add_gas(gas_meter, gas)?; + let signer = Address::try_from_slice(&signer) + .map_err(vp_host_fns::RuntimeError::EncodingError)?; + let (max_signatures, gas) = env .memory .read_bytes(max_signatures_ptr, max_signatures_len as _) @@ -1839,12 +1849,13 @@ where let tx = unsafe { env.ctx.tx.get() }; Ok(HostEnvResult::from( - tx.verify_section_signatures( + tx.verify_signatures( &hashes, public_keys_map, + &Some(signer), threshold, max_signatures, - gas_meter, + Some(gas_meter), ) .is_ok(), ) diff --git a/tests/src/vm_host_env/mod.rs b/tests/src/vm_host_env/mod.rs index c8c105400e8..63c7c8030dd 100644 --- a/tests/src/vm_host_env/mod.rs +++ b/tests/src/vm_host_env/mod.rs @@ -474,16 +474,17 @@ mod tests { assert_eq!(signed_tx_data.data().as_ref(), Some(data)); assert!( signed_tx_data - .verify_section_signatures( + .verify_signatures( &[ *signed_tx_data.data_sechash(), *signed_tx_data.code_sechash(), ], pks_map, + &None, 1, None, - &mut VpGasMeter::new_from_tx_meter( - &TxGasMeter::new_from_sub_limit(u64::MAX.into()) + Some(&mut VpGasMeter::new_from_tx_meter( + &TxGasMeter::new_from_sub_limit(u64::MAX.into())) ) ) .is_ok() @@ -492,7 +493,7 @@ mod tests { let other_keypair = key::testing::keypair_2(); assert!( signed_tx_data - .verify_section_signatures( + .verify_signatures( &[ *signed_tx_data.data_sechash(), *signed_tx_data.code_sechash(), @@ -500,10 +501,11 @@ mod tests { AccountPublicKeysMap::from_iter([ other_keypair.ref_to() ]), + &None, 1, None, - &mut VpGasMeter::new_from_tx_meter( - &TxGasMeter::new_from_sub_limit(u64::MAX.into()) + Some(&mut VpGasMeter::new_from_tx_meter( + &TxGasMeter::new_from_sub_limit(u64::MAX.into())) ) ) .is_err() diff --git a/tests/src/vm_host_env/vp.rs b/tests/src/vm_host_env/vp.rs index 7324fbd90ec..4bdb1893fdd 100644 --- a/tests/src/vm_host_env/vp.rs +++ b/tests/src/vm_host_env/vp.rs @@ -379,6 +379,8 @@ mod native_vp_host_env { hash_list_len: u64, public_keys_map_ptr: u64, public_keys_map_len: u64, + signer_ptr: u64, + signer_len: u64, threshold: u8, max_signatures_ptr: u64, max_signatures_len: u64,) diff --git a/vm_env/src/lib.rs b/vm_env/src/lib.rs index 099460258b8..33e2a9c0d8e 100644 --- a/vm_env/src/lib.rs +++ b/vm_env/src/lib.rs @@ -202,6 +202,8 @@ pub mod vp { hash_list_len: u64, public_keys_map_ptr: u64, public_keys_map_len: u64, + signer_ptr: u64, + signer_len: u64, threshold: u8, max_signatures_ptr: u64, max_signatures_len: u64, diff --git a/vp_prelude/src/lib.rs b/vp_prelude/src/lib.rs index 32e29df46b7..95239644a63 100644 --- a/vp_prelude/src/lib.rs +++ b/vp_prelude/src/lib.rs @@ -94,6 +94,7 @@ pub fn verify_signatures(ctx: &Ctx, tx: &Tx, owner: &Address) -> VpResult { let max_signatures = max_signatures_per_transaction.try_to_vec().unwrap(); let public_keys_map = public_keys_index_map.try_to_vec().unwrap(); let targets = targets.try_to_vec().unwrap(); + let signer = owner.try_to_vec().unwrap(); let valid = unsafe { namada_vp_verify_tx_section_signature( @@ -101,6 +102,8 @@ pub fn verify_signatures(ctx: &Ctx, tx: &Tx, owner: &Address) -> VpResult { targets.len() as _, public_keys_map.as_ptr() as _, public_keys_map.len() as _, + signer.as_ptr() as _, + signer.len() as _, threshold, max_signatures.as_ptr() as _, max_signatures.len() as _, diff --git a/wasm/checksums.json b/wasm/checksums.json index 45f369185d8..b7132abb0ae 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,23 +1,23 @@ { - "tx_bond.wasm": "tx_bond.340c5b40130afe30234e833ca56cc27e7d7682c9eeb6f6bec0aa9c1cc8ab8ba9.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.9b546039f0d3186063564479d39908e7152c763e8eb403b8ffe1f1062f9d2581.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.5e921f84f0ac90e498f013aee50f2bdab2989b642a8b1136d5350e3f81d8d5de.wasm", - "tx_ibc.wasm": "tx_ibc.198eee5e3e7bbb1d40770359910608d6f64ccc31ff155883a4fde9f0a43ee870.wasm", - "tx_init_account.wasm": "tx_init_account.fd06524b88d3198414e205371a3d502cfd490593afb7204cde77aa4461ab4298.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.5d0b84ae5937a0debb30bc5d0725e405c6df9e83f35177a031a6f403cd69ad0e.wasm", - "tx_init_validator.wasm": "tx_init_validator.51c3e74cb99da446127a5b86261ee3688abef81a97aeeb69ab7bfad419982e81.wasm", - "tx_resign_steward.wasm": "tx_resign_steward.ddfa5cdf5450fb27fff7f9332c09d326ffc49ace1c6f86107b5bf5ff486ea18d.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.3e0d19dd85d558bf193716696eea3bd51f923e13e750a9f47d3f69187bb1d3cf.wasm", - "tx_transfer.wasm": "tx_transfer.de1a50dd240b47f8cb8c8908ca2a1d5a7bdf5666f6ab89755ec766b86d511c3b.wasm", - "tx_unbond.wasm": "tx_unbond.1b280628bfa88bd5da7086f72d5c8dd110a41bfdf265aef9bd24f55aebc457ba.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.459c700dc2104fd1352f612d2b5ef7e921fc25fcd1d5a6ef23d66d8362656803.wasm", - "tx_update_account.wasm": "tx_update_account.552882be607d5c85b62d83198346751a318aba48a85a411c550e29f158dd5ab8.wasm", - "tx_update_steward_commission.wasm": "tx_update_steward_commission.a30918eb4a73169bc6649c0872e2a5c48347ff2f2c2c77cf245c271b9617c679.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.fb1060580449efeb7ee4bb2f94dd821d04dc1c6bc113505129455f5961c19def.wasm", - "tx_withdraw.wasm": "tx_withdraw.6b62ccb81c2ec4ca6f753b847f231afe1280a710413bdb29c40022f76c8a4c31.wasm", - "vp_implicit.wasm": "vp_implicit.0b24ed30523cf07e313eb909a543fdaa781ece0edb0a730afa1096b0b3f2f84e.wasm", - "vp_masp.wasm": "vp_masp.9fce62466516b80d0d4b9f70818e2043c199d3ccde8e15388ebb8ef84d2211ca.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.e04deff5842fe2168e077fc880352eb04ff53036e9e1025b9040456d02cf85fd.wasm", - "vp_user.wasm": "vp_user.242e0ad72e300d8315b8e9df667025c16216d16726c3e7f0467f036f85ba5bda.wasm", - "vp_validator.wasm": "vp_validator.0acfc199bfcd51fb07f4b5ad2f101f8c2cdf4d907b5c7732f96e66d50ff184e1.wasm" + "tx_bond.wasm": "tx_bond.102e22cb5a0ec5553dca143d22a4eab17cda1c0b9de3283230b83b670b91bc44.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.8cdd2265b05eb85d1ff2cdaf50bc2c498c62a2cff34f92e7d8297e5852e3428f.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.3060ae1355ae7dad24aec4f2d4b54cdc5c2cf44b79f7f6efa6d2e0f66a355c53.wasm", + "tx_ibc.wasm": "tx_ibc.eea1d22dd89b6bd6cf237952215bc70486cfbf3b634c51d44b3ab506b1893d8e.wasm", + "tx_init_account.wasm": "tx_init_account.5184046f50afee28504f9d8023791b5db290efbc1583775044198a914e28f004.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.2352844060c60bc29799979b488fcc95ce7c6e4a25a44c191e3faff3b7b8d960.wasm", + "tx_init_validator.wasm": "tx_init_validator.ea42e20512d82fabe35428c91a3e7ba3f77dcd4f3e9f8314e644c7de3744c447.wasm", + "tx_resign_steward.wasm": "tx_resign_steward.bba7f4edf654fccd477f8d497f2c737dd5e97b61cfe554d0a03ae58348480643.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.23c402cf757f4b52492f264fb283e784211bc07d2d5baf76efd5f6cf72e07868.wasm", + "tx_transfer.wasm": "tx_transfer.17062ada7d2cab8e503b78634719b02073b98576a40b7d88e398cebb33ddab07.wasm", + "tx_unbond.wasm": "tx_unbond.b894c49f58dfc72d4e3c8a02d9080974bc1e6394b9799c8a73e85e0dadbd7727.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.e05a10cf29367a694ffa6ca0789e14334af510d4e0e45a76fc370acd08ca5a4b.wasm", + "tx_update_account.wasm": "tx_update_account.8be9e524f77dc5b00baf1fbb1b03b9439562ccafa6731f339cf239a1b51740c5.wasm", + "tx_update_steward_commission.wasm": "tx_update_steward_commission.4d5c431925313a645d943b49c3950632253ea0230a89b1c6f0129c119c2c8372.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.090171ef4b3b49e7faf90514f0b135140ad685b8bf46324e7d8b54b7b940f8a3.wasm", + "tx_withdraw.wasm": "tx_withdraw.26dd2af1b5da91325959ec6ca2008578384f3b471093a3ed7ccd3fab1183be04.wasm", + "vp_implicit.wasm": "vp_implicit.790a8d2c202dbd904f1ed06627e10423b668b5ac497adffc84b73d82e3937dad.wasm", + "vp_masp.wasm": "vp_masp.e4a7bccb32c3df0ab755f88b94cd4bcfb463f159d7d8166c7627faacc0c53b21.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.db976009a8b78a95f29bcb07f92086da13906bf3608365f93f7094392d128282.wasm", + "vp_user.wasm": "vp_user.d9bd82798ff01ebb63715da9ada05d9c63854331a5296971760242b9634cdd12.wasm", + "vp_validator.wasm": "vp_validator.5d6c04cb3cd4ad799cd0a6571aa64bbef67d73f2a41f93a8aba53a4befa580f1.wasm" } \ No newline at end of file diff --git a/wasm/wasm_source/src/vp_implicit.rs b/wasm/wasm_source/src/vp_implicit.rs index 09a3d32ba7d..215dccf421d 100644 --- a/wasm/wasm_source/src/vp_implicit.rs +++ b/wasm/wasm_source/src/vp_implicit.rs @@ -187,7 +187,7 @@ fn validate_tx( mod tests { // Use this as `#[test]` annotation to enable logging use namada::ledger::pos::{GenesisValidator, PosParams}; - use namada::proto::{Code, Data, MultiSignature}; + use namada::proto::{Code, Data, Signature}; use namada::types::dec::Dec; use namada::types::storage::Epoch; use namada::types::transaction::TxType; @@ -535,7 +535,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![secret_key]), None, @@ -671,7 +671,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![secret_key]), None, @@ -839,7 +839,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![secret_key]), None, @@ -932,7 +932,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![secret_key]), None, @@ -987,7 +987,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![secret_key]), None, diff --git a/wasm/wasm_source/src/vp_testnet_faucet.rs b/wasm/wasm_source/src/vp_testnet_faucet.rs index 53b039c81d3..7298c0b1260 100644 --- a/wasm/wasm_source/src/vp_testnet_faucet.rs +++ b/wasm/wasm_source/src/vp_testnet_faucet.rs @@ -108,7 +108,7 @@ fn validate_tx( #[cfg(test)] mod tests { use address::testing::arb_non_internal_address; - use namada::proto::{Code, Data, MultiSignature, Signature}; + use namada::proto::{Code, Data, Signature}; use namada::types::transaction::TxType; use namada_test_utils::TestWasms; // Use this as `#[test]` annotation to enable logging @@ -266,7 +266,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -399,7 +399,11 @@ mod tests { let mut tx_data = Tx::from_type(TxType::Raw); tx_data.set_data(Data::new(solution_bytes)); tx_data.set_code(Code::new(vec![])); - tx_data.add_section(Section::Signature(Signature::new(vec![*tx_data.data_sechash(), *tx_data.code_sechash()], &target_key))); + tx_data.add_section(Section::Signature(Signature::new( + vec![*tx_data.data_sechash(), *tx_data.code_sechash()], + [(0, target_key)].into_iter().collect(), + None, + ))); let keys_changed: BTreeSet = vp_env.all_touched_storage_keys(); let verifiers: BTreeSet
      = BTreeSet::default(); @@ -449,7 +453,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, diff --git a/wasm/wasm_source/src/vp_user.rs b/wasm/wasm_source/src/vp_user.rs index 6e5bd024a37..a334576b530 100644 --- a/wasm/wasm_source/src/vp_user.rs +++ b/wasm/wasm_source/src/vp_user.rs @@ -185,7 +185,7 @@ fn validate_tx( mod tests { use address::testing::arb_non_internal_address; use namada::ledger::pos::{GenesisValidator, PosParams}; - use namada::proto::{Code, Data, MultiSignature}; + use namada::proto::{Code, Data, Signature}; use namada::types::dec::Dec; use namada::types::storage::Epoch; use namada::types::transaction::TxType; @@ -392,7 +392,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -561,7 +561,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![secret_key]), None, @@ -723,7 +723,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -810,7 +810,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -865,7 +865,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -921,7 +921,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -977,7 +977,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -1033,7 +1033,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, diff --git a/wasm/wasm_source/src/vp_validator.rs b/wasm/wasm_source/src/vp_validator.rs index 6325f1de240..f929a8a0d1e 100644 --- a/wasm/wasm_source/src/vp_validator.rs +++ b/wasm/wasm_source/src/vp_validator.rs @@ -192,7 +192,7 @@ fn validate_tx( mod tests { use address::testing::arb_non_internal_address; use namada::ledger::pos::{GenesisValidator, PosParams}; - use namada::proto::{Code, Data, MultiSignature}; + use namada::proto::{Code, Data, Signature}; use namada::types::dec::Dec; use namada::types::storage::Epoch; use namada::types::transaction::TxType; @@ -399,7 +399,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -579,7 +579,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![secret_key]), None, @@ -741,7 +741,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -827,7 +827,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -882,7 +882,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -938,7 +938,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -994,7 +994,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_data(Data::new(vec![])); tx.set_code(Code::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, @@ -1050,7 +1050,7 @@ mod tests { let mut tx = vp_env.tx.clone(); tx.set_code(Code::new(vec![])); tx.set_data(Data::new(vec![])); - tx.add_section(Section::SectionSignature(MultiSignature::new( + tx.add_section(Section::Signature(Signature::new( vec![*tx.data_sechash(), *tx.code_sechash()], pks_map.index_secret_keys(vec![keypair]), None, diff --git a/wasm_for_tests/tx_memory_limit.wasm b/wasm_for_tests/tx_memory_limit.wasm index 8e8165038dc020c1de9dff9a6f9937ee4ddbdb0e..9c21c93c57878b3a1d06759ff736af471a8a5f2d 100755 GIT binary patch delta 98708 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 I^2Ja6|6Wv5asU7T delta 99455 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
      n13kJ{hU<|?7nI0S?80>Q3_(w=N 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

      SLk>#*En4iG2-t4bm{Evl&iQm~TcjrTT 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 YR*){>Z!Ul3v)?_n1%|Pu{Pi#YANH}4lK=n! diff --git a/wasm_for_tests/tx_mint_tokens.wasm b/wasm_for_tests/tx_mint_tokens.wasm index adb1e921ecec81e6bbab0ec20660d4ba42ecfb80..217ba3975c3e1bf61fde0e4b1c0f9185b7d1b94a 100755 GIT binary patch delta 6955 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 DdtbdO delta 7438 zcmbuEO>ARV703HX;`iduXUDPQ#7R!xIO#+MDbu2=h%aSmQN^Ma5<(gzzPdo@At6;k z%%Twnp@3!wi}F;&f)&hkW}rYzX_*Q%ZKnvaK+M2`O?M!KRKbP~8-C~9_v{zX*s+5& zww&vC?>*;t&iS8vJuhAFy>z|z^%uQ={&=@?7;Q^o_rAxYxkIUleSRbo9oma}@__6e z9!AAODJIR!-qvDK9ymIG_EJ+`R>k_hVsDFHsnNmu=am8zTrQ~~8JZV)Vkfu!!Wa%(kvYD0S z4_Cake#Lgc?1n7bBa2c#jLO0|%QN1Tb@imlmSMW3FI(*9OOK7jm%wcDr6@J^E#hx= z=`gB^Z%guy(IF31ZH1!DNsAS#60Lwjs#3Qns%jk{nO#i2_Pn$uH6)?5Y*HvqoV4dF$q%l2 zYo8h*sgFU@l2t|0!uM>WwnVm(vS%1lSOOYpzypIFlB9mkYwi|PUzTKpIf41Yldxe< zRn2h(i^&t$yp=^_&=wpBlYhVJwUcjM^B!wvOVs6lTY^Xwlee#BIG7I(7nkLnl}oIn zf!oaCc=);}eT{ER+BU5f z$(cm9rI7yfvty97egf)t%5rm}pb4L;&yRjS3DTxPBKEUGvh+KiNiL5;K1;c+nuj1i zvD|njg>>r|Uh^@ExGMA~)SEsKO4-z;ti8;}(Qn2(%D*NZYI!JPni~O9HWk%5x`c`t zi9DeC)fXpG)u7d#W)DRSvz*ZLVJKpVZ6)nejJN4Fbf@D~RdIbmYfhy4vCP9I1oOXUML~|=tzJx8xT^*`2s#GSt43aTMUg_Exrf#Y&^qGQjKEQ>MV z9oH2*Ntw0m*s?S|*C?I*QLmY+Zg=Jg^f-_Y0;i1hlyi6P<4czN)L#|^#TIHo&K?Bn z?syR9q|R!AYQl6ua79mB7zE*OucSe6rzUD39|SE_Jw2Tw2o%g{5L~Y%V@87T)bv5n zUf>#6t`epQLh|=lz1=6vvTC7URkK`(j&syp9l11^MpY!t<$?D8!)VRgZ}Qn+ zyQ6AD)@(lSBo;|DI8Zyu)SE_%{C!*~hJxW!6Lym!QLtlKrL_yUW_pO-)Nr^{eKmQ9 z-MnfN-0-AY)sy5RPxf@P~kQnw~uEx#ivz5JWkyl3XmEQ%cLuUzE9awcYx-obw7 zVpNW~8!nu^uNO%y<>b>hy>>T~mYgI5CTX_ek<`jHcH9!L-UXKaxX3R8S8uo;*HrH%+ko@rtZk^@iA8&ZORV_BR zi?5jFO|SVLvyws9tE%_-R+SZ2V*%TvE<5J*DqAFzctFf1v1MMXJ(kPuSgy6 zL@{H}FAzEQ%W$cjO~K4dgC#1WU;syg9_D>b)QlRHF+2N~ z8eir-HO%`kO%Z~kW>RSQQNV53lbB=K!zE+CVC;RZsmbgw{ccM3JEQF9O-X!IXiD~~ z4F&S^H0&)u@5$boQA2k7U_74rmS$+qxV&#UEj!L$Rkfgkaa#5bGG3E%`y}=kem^C9 zqBxrODk3htQ{{cnoI<-!k@xs9Ht%&^4qB&TPxl$k`wcU5{r_RFV$7{!BKt?kiI&zz z2v-gevSJlY|7$y;Cof_e33^lFVm=~EuA${x!u;LgQJwLHFSPpTofNQ7DO12mx+`Go z5_zR+<|Lqz%5N$GS%+>j|Ddmj0$TK_RAD<`Seu~8#)eE?t7(4EUM=)2BKGB+ouPI7 zf{MVb<&t)ZhHM!tvSET!^(|sN<06*EOW=`3OjAdNGZ!(M99R2{N+=wsXbVI%9nV@i zlSa!+^V&z%v-tIA51_C_L7QK`4zJjHODa0W?J%${jwrBNiWqatAej zFEG-Kw^V%fSL}SN(au%SOrIFP{%D^c_TYvcJbaZ>4Iq$VRm!z_&D0D%?Tde$7s*t! zh~_soq$;DKrdCP%t_C?rsz>*TX*Qn4l>8ozsUBzssyt&&_Nh4jE5hj$HlHG<$PI^| zyN?h2mSZKLXVqN)%0lNr^~cAQ3>%H9YG6T6suN>6DWtBwr1?+qH2-E==uKvG#M3R diff --git a/wasm_for_tests/tx_no_op.wasm b/wasm_for_tests/tx_no_op.wasm index 85b647c477f17ce8c3940a951c5da48d99950a72..9762fc4a558ebc6e73fd7deafeabc7e1e64d2ce7 100755 GIT binary patch delta 77596 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%0D0lD^Du=IPoQw zdYtIemmvXxVJC!y07g>R<&MlI4KK0#7jA&ByCJGg(QqO&A>^M;Kq4CEKa(ez1cW*0 z0&&Keq0kKb*z~2^-o(kC+8WYvSr5Oo1epxBO#7Ng--8Zbvq^nx)UDuV<{WI&9gH74 z5n)WHFvjDHTe3TaGbus{_u+$JO;$pOC;@HK5^__*x)f<>TT%9FYZd)bLA5Xyfo!X_ zE?YpVZb_L+z-W9hg#GnC`cmu1W4KKVBGqh>>T_}Lq#-q5VfhvEqc&!p`wA+oK6P6t z<2o&Iz1Wa^h4~L(;UVuUJe2tgW4B4@Jn>gH!!%S(a*Wv)9?!|4Tj3=|qtLK!v|EG7 zu@*2>T7SlkqeM1F1mPcXW$-uqJsh!CM9+B3Tk30WykRtWG2B(LDG&mjkYLjK?@4CS z@(u4~(PdzTWHGnmwS;xT732FQ#iRm!zXbRcb^9f{r`Ut`f#`>?)Iq9=hN#lsa+a&W+)-2B38< zT@Hd^nEKAIX9sm=%k{Q=o`bueH4pB%;r6jC=TChY0k;#yksF(-do7obC)*14TCf9XryNKRjJ?`n zLvfenGbnYn0mY7TSegp)Cm3y9ss53J7~)`hucNyr(|JLsH#;T|*ln40y8wctZmep; z_>fau>1rXVu{)Ege2={b=p5?&1#P*8b|Y?uGrmrI_`150AdT`*>W~UoP%W zvJUS8pVZ--i|M5a6V0==Nk+T6$`QStkHO+Ig^jE*?4+%anTAielQx6|9Ys+c1nq)> z=!|O;sj$S}R{A6wv}1(C9bc8A)!LwzM0H$x$Ade%(vv&7($jAJXpje;Th+pk zroP@OTm7iSF&TS1lnQn{EIicR5-->ofPvcjl;U@|1;7g6Mp)fkpDTeSmExbe@Df%9 zwp5BA%@x3!O7Zt|1+b@5{JmTO%OW?cWCeC~vYs&k{gZfu06RpYLo+BhNte%(PR-=> z=2vCL>rTxmWVpHrv>j8dnl@E3kV=8T`Puc-zPh2K-htxm^sEGbO?9u*CCg}?V$zVr+Qrfww?ga86dYgCn!#V+1ETCwq;hMi?o7Or~RZ zpdtnx7uXQ=v`L5B9w(fy;x`xD-LY5>qBr4ALS#dx5cLQG2LEMwX1!gifb>0c-VUs? zJW~$4Yv!5pcFjv#p9z)0ydtg z({W7|YLndQxUDnL?8=s3Zq0tl%BA0|HKih(K%?*kg~ockEM!*Y^|(^r`bW;e(?`4+ ztV6XT>|iz+b8?d!nJm zU^=@ojObMWOqjV5E;%;T`J_w>N3f9-thlx^u~o>eRvJ?nb8{vCyS2)djB|8tE0uRR zU{SV`hx~2T`V~Ib{Qr2az-lIr&dNu`)Lpz_`gtne*P+W<7|Msu)cIGZhs?8l63&K4|PTD7py=V$J*IZ8x|{SkN@Uh?_;X9-NIyXI%9zftd(NS#3aisGJS~`z6whEwRPVvZ&6_zeo1qdwJe9tPNAe`CnSp}9ZSOs+b zoV|zt*g=BsOY%RU%j|tR@hzTqcKusm7vt$=82Fv@u8ZlCqXLA6!Aglowzd2$%^kzT zG+ryRX0dwQM;B;!p+Vt;jAdzWGsP`L*%k2QZkIEsXIJ@fh(E<1sAc;xSP--aw97h}Fo7=su;ynlqMD z^DL)^1^%S*6k{S38wWZ;wvEPAI0u9Oh@Hg;;3_(8pGL(ht^xKdG(>c4W@_UH6^`lQcJ(Sl;%Aux8sO4E=MH(7qdf$qj+)ZsICB2|8z-l)nQ>- zYY*<_4(Ymi>Cv!>bh5t5aM4(1igby`x`}^!QmjJ;H>|^#QH`(;8P-v3SjTabVcj~9 zb?c(7*dt_17sZBkXFIHm9{~QHTE1$AXskauOzU%)rm5^e`$JNym&R!BwM+}SL8LO0 zfqJ{cGmfF63d>K$EkAZnRf+%hk$(#==t1!sAMDtU*AIB6%pDXPn&AZxtOzg%nkB@3 zKwoEgR)d)so^@*9p&bK@yvMWU;2Gyc!n3ycFe^qc>D&s3TQe*v$B~~pc3W*7DZcpZ zVDa4Hy{LSOd>83n@>;_1qd-dLJ$DG#IzUGBrEk}*=LCdp@vwxW;NDX8Po$3^SnLt3Jaf#{a9Beh4xsAT{NNKSv*4sgIC3Kax| z^BTA8|N9-1cSf+Uj;PNec^@xZki1Aao?pUG$8aJ1T2ucOPn%K%eRo}Z9nC626-N~X z_&;~JatbOT>nkWa>?(CF5hkDBYbA)JS;=>;1d%i=dC*D_Nwbn4S_vX)Rx)oTh@^gv z=W8b;h;oOmv0{YuFBnU%h?=qUT z=4LG#luP>(LpFoFOj0s6V`kvYEw8be>zH}Z6p>fZW2w?4u1{_#{pE zsl`RAc(a~2VE>}@lnuozru1+uo^eV!(i>NbzE8J9;^=MP_}}mO`KR~%`2X0#RBYV#d`=&WS~Et!e&b&}^0Tkq z{PwTASJH}&KKi4_4}Zw}jKl17C^Y)9`FkJ##KU*qai(i^f}+p<<3~Sy(0h`r8s{UD zOZ3Rz#Ko5=s$`nY=;+=*d*XfnanDb8{(ypU3KCVgmj?#2IrzFB&}q#oJ&1Y%)qu_n zP~l!%+~WSpJnkTNAEptG-zis<#ea}ibVh^b=y7C4bcNMxn>G2KfWO%Ho0UQ;F;k0G zVlimx-fqYn+=acEy2$Z8KuNLbixiCCK!wCbNhS&N8!IqT*wr`;I80}hHZpGo8FwW< zgB4`#7cG|9OsIZx;S!b+s3nQ`O)DI#&AyFweOZvm@Bw?igJ9NdA^yy~L`@I$U*Ini z-~4UrRRdLH6KDrGRG-!aG1GiNjenyM2h{-e^f=3-uxirIFJLvlyyN$ME9*EvezNf; z@u8m8=R;lxDb#`Z}JJ9w-`MZ%jne=WtHhfvqh`iCw8FgghZ@ z0cXh@z3HQ$n!UM6$s%r}r>Rv#}BJPEh4Ed&% z3@zp;8GF1|O6H{3QSx_rV1hOW_v>MT1)Eb$i{2xphFoGP7M^OLY`Tu!7DtZ$=48sH zt2Au)h4MuWK>Dtx{RsYTqzax=6`aVo)RAn92l7oJI%#hvZQT~+1*}6HX|f3@#u&#S zNM##SLn;cgohd?-)yNT~XjX3FMpME=k*pMgz5q@tnl*Q+lte|d=1=7d{6XbBF26o@vW%_}nh-#AuaT(}GQ*H(nI#3lLzvD=rr~3=FE~+Hq zUTkMocd}SpqZB(2!c>U%v6LXi{v%R4UaXy=^l+i}ET!{>+Bq<#0j<2ujuhc~l8$Bp zDZFFvU*{LKj1=zw(9eI^{#&GlB~OD6L?_AObYRLYql4lWJKFc)T}TV_;?YQKtRo(^Uree zg+`ypmiKLbtf+)t?i-u{*x^GZPEQ3YIw>&ws7hS(=K~e4Kz9~Y6+AbiGh8$1 zFP~*k3bRs(3or(JM8$;nn=pVP&4dA@1)Jq06=Sk#-g#d-&4R*{V#CcX)zapUXl;+L zCT7Vhe?T75%~ig*Wi`vZPLSDI>25caPn-|oc*}w>RgY(Djb~pL-kU5b!V6$^Tv`Fw zlZhjlSO#2~&`*S{Chrf^5|)=^|bVvQ>-a#tJh0EN#_2UsTED z$WlCS1(_U4&_-M0=1g0MyM=WKeML!rpXpe>`;ze90(**=hR5jC+$<|Okw!VDLvp`H zmf~qE$o1IbJ>+|=kPpRtkM~+Zv&ZqI734a++X}J{AH%w3AKax_?R0aO&fDM`)w>$6 z_W0m_*60jOVDo}j)dlT%V1DQ?F@hpB z%VY~j&q|HrdxmQ;VC0`^%)dNbQ}|3{`Q?^8%O$V8oOm3$T?m~=TyeV)<7Oa>738pI z!6u|+cI>%L2)F_xv6E{j;m~U<$mW9O+@@j{=#2!8(iP!{3nw-{c15_34u0o~a7}BM zrh#Wmm!_;B*QNbdkVELbR***zE6AgV6&%r}T_|bkQt}Gx(waXAhZ5ny?*wHX#vVg( zwl-VmF6_a$-RO(uKnUE}`?_#Vqvy)-)rH~4A72^P)}%}Vl^FLfdYUxp%}^&r_`kmr z9)mAaN|CyKvV|h&tRP2`5Cb)GAU|jYIglT)f*iPzS;b zw>!ea!&pab8lr4F%P|H$Mg$W59SyWMp8tp8GOXy!Mn<_8DanEKkQ@h(rWQBi!1Z1B z_L|`-?XSR8>r##tJ-vay5V05gn5Q}N+`#kmDu$sxO@)oIYna!UzslzI%dfI|bsXR3 z6?Y(s!g9g~Tg6e*d97Zhc}-{acZ0MRO%dL)i}e`S9Ne;7mW1Th#%nL#X2~gI;a9I{ zmmZE&SZ0=E7b$baat#!y|8WJO1ol_&MaNE<&%St;01RTD)9^$`554KEPa9Wem*TlF zi&50qc=>j;WPOeC?P2YrKAnkku*0?xJaCK|2N(Z^KJBgz*IeV8lm(3o=1msg*Lal1 zm-oe!EPH6HvsT5J`x`^A36F)To%0&wy4zjyUYC5vCEs&N$7`+1$u4=JORjUt9+!ND zWWZ}<96g(~df&GjZ+?AvQ{z3agJ~Vtxb^CAW#dJ!4}1CUt6mR(*O_#4t%dLDP&z9R zGnJ=XRv>07Kewzv%v4@(S;3?gv!2F)1LV>i}MD@M1twaD;1^`dgVKgDx;*3eNDIAW)_ zW1x=v11f=H-ucH&(6zQG25;2qj&nO%JaUdc?R*BCJ~_$sor6GImZMJ<+X9>w=o`K6 zlZAMnG+^dOWmU`O%u`LB70i$7l6I%8dlMU&HOg0y;I&W*N!QmiD7z) z1-^NDqMj&`^^-CW`@v21^f!jl(LM~yfVv`Pi$V^DOK6eCHE%Rg37=y}M$K`bV^>D*aJy>-Za{9{<@7kmqwUZdXIvW|2Vc7M zT4Q#}wUVz|w(ep4HfC=*-L!+hF#ZDBN_>NvZ7>P#+FBvyTGRr1%*N8y1);h|f*T5^ z%G(b!&Z&v!O4~*odp^CZ(bSl72IMrR&-nC%hyCG)?%Nps?+1T+|K}}EuBq4?w_Rsy zRL-1^P?>U0xKL%vY1I)bQ*5kLRS|M}PGyQ&bgRmAKLvV!gY=lvm|m}k{iVdIOl2TJ zeg-M1MNi3+MM1`^Tu6DD|9Os06ILVRRVZ$(Amdeh%?dJJg|5>I99g_n>OHTg+@-6> zAn&etrv#6vgwA>-*i!Fg8qT-=&9P(PldQa$Xn5@_&gAFnr5N5^5$T|*c4^%9W+1F{ z2%R-rI~Vp0(n78s!`fV1I{#j*EuBX>70&Hm=U!Qk8UT+W#VPwGpi6zS|KG!|1$69V zq^}A{$6Hjqi367%sL8Mn@)0h8I?SO4@U}KPO<~X@U`4%+kk%dqGw3(Q{qr=>sKfPp z`G>#WJ?`i6D)+dT$IIR0B#)?pRCl*dwl8weyC^=7{^iJLrnqf%_n!M_A8$PT?oXNx z6o(L$-FD{Q{XIZ4FNz=-KVr6Q*9WziczU%;5h*~B3m=mQjTh^9?@8`yWD5YA(yRWiH!wj6fb zJv4A2XOb@TuQO$)V8E7vlS{b3Lf~LW<$=?<^SZEu(}LfC&4|gpZ`WOui!r(TKlrFW z77|LO0L*bCJAzI88LZfl>KFm@G&c2;W2m`rp|+`)TSpy7HN_K0e^c*V zh!`LN#Y-0AMvN+_-nEd^YHwIwh#oBnFdXAh% z*qDU7_3VXLJ$4!gozSDxca7_@%SthQNUy7!*CTW^K?uk>7h%wFMW$FFkF8`N+}^N0 zV7R1nO7)8W9Wn{~2C50?*+R?-q!Vo)Ksei4qLTraGT{_;J;f~yU%T-ZhJU~catvR) z@!Y`_1Z)L4hCdY&nK~1MfSYId`x){`Fv~@S#=DRSTX|PH@cm&^lMePfHoS*xLETBQ zjntMiJ`AixuQAl@`P;uhs|m-&eCm71lLn?0NSP5KZ<_5QrpLGIrqR27yA^KH#zZZM z=iSkDs`F)uS+qYp)BX%B@}uO*esy#DEBZYhA~BLqu`O5120~uDJk5kUtd_Gb2i5Z9 z<&e7KblDt}wP9d{<`<^Lfyyptg^DF5SX`#~fB@l6NSaZ09dsmypfRQ*7BcZ+gP1EL z;BEaB%5Jv1ft^(eRyQ*YV+J#IS(ME4yw^P!Zwgr`&^{{;V=YoTtHU|cIUUX+iWSER zoGDwIoneizg+s-OP%#a83ceg-++g8y<9qm=!lXV(7CmT)$Xc*mkBN2mCfXLAGUTkh zRAblv)Z4Ni5mTsuRzLZ!|p#7?%$e@W0LcoVZ# z+UK<6f|;80;&02*3Sv}NB}{ZUUVUqKbhh5Di_UHuuAQKg8WD6SY0#qeaknpa?wDw2 zhQtI0c7{{L!PGrKOSSh4qGRDC16j04VnwPjA1rbi8V=%eM}seoJ9ZE<+eHut#R%M8 z+yYBd{1-Nu?miVZf!fWrUQ1Hss33nojhQUWJe+xl!fqPekh?xE_w*!D?@Mer$w10FiKVke;in=K3Y1;2~n+N%v#h$iEtB_!dFTx{wQO;uIYimNJj+qGz^dIS~Ve>O-Q8P8iwa68Bd@m5?dPro-U;ER6EM*ZoU_tX2G0K zF3hzl%t0~2QU{3ZGK9eq9Et3xPDDmfSZj%EItE0Qsw|_>uBP=PTttB$bmQI^^(8q?WNBpI27o<_rlc%iPj?u>dHFW<-A!HDYz3WmHOaMZS>7!-J& z;#kAu7!go=wM$|ll?7_%_>}r0VSDO%j39oG1xI5cE!S4a@!VeVRX)(WfMB1gK>AOg zV(ossCGLJaMyE!6gx-{JkrA})m_KQ}N}o?MtJZ7y7uEl&{Y2>?!1 z48P7@7Xz}%?CsaX*v22c!zlK3?+OQrqhjcY`eCfT$sr`4BaWUAZpTUz)YeAk!FP8T z3yfQ0w9NQ_(OS38*!}Tg{8^49@wqj*44ZptR_0(x)=6B^}7q20^ywT8xFp=e8Bw3WFI5 ztI0)4cr>gTzAgHaj zj$u8CM~@Q?v@uezY>QH;uR0^R+|66GYDuvWbW46=Mj_R+F93ZtuFnT(i__nKK1gg- zn9sAsY8_v&wBuGnDDZ4)M@+9nTU^oOi$v3_(~L>?@;!-1nni5wuns83&ukX`h$7+l z85F(D`40G7h9r$3wFW&3pC0we(*za4GlHfwo$~p!Efy z<>{sve?fuJ0k(7qsQvph85%``e4?{FTibdqi>!hfJ^B79QP>!_bJ32zH}e*OYRDgj zS(`_Zkzf>cZWw=F*7BZ#m_UxKAgzS)lKt(tB9ysS02>c3+}IJ1qHp)!Wi) z2g&rM8Ex_gM&&&W@KiXX`g_^`({y=T^-5B9w$X{zE3eVr(1oi_2#{!5%-SH+Y@JN{ zecM8UlNoIJwBNaFs_2#1b8zvHeO!{KU?y175&s3>cGfEFD%a*zOPhcrZS%+`4HmHc zFSF}Y9EW=}k^8=npq~_H^i0`(N?F_0l^7{=AMoG_h~OSZ8P8wVB@)(_Afpwmd6yvf z@%Re`*sF;rY2GCtgPlIK3@gYHsNUG|u5f7*2*Y8>w$bCq=EP)zr)5&4u?$FK=tRbu zpyC_joZ`)21RAh-3`LLC(-PA`8m4)94*L&KOe8TkL2@BENI@ls{Wu-NBJd?@?(KoE zS~Y$^SNFE*v*TSc+yOQaUbq4mGS)Cz?&GGr7_^@R*a%WjAKHrMngPt9ZJLXP5JxYv z`0B#g#5sjyiD@&0+9|3D!$lDO3#Ouo0c8$}<(uP_b)JCoI1G$@Q!VtN3z|}Tqxy1> z^4$K#=@R&2?OBE?PiJ{K9M#Pm}`@q219XX6d3NfZJ5C;0)*457blSE$+pUz%OG65Y4we zL8fF^5Ag=SGVn;Pk~s{MsS;1YGV@|Tk!vpA4fHbhkm#n#Iq@G0t`Pr=zr}_ow9S~+ z{WefXd@Fqln?vsXUm@&SycXMm3<^5WUC%0j84RG7XjMxlgSB>iSycO z8OAK@G_OV7`vbD{Q;;tFnt5sea?(K;nVj?hjZl!u7N%UF;3($biyJxNU@LEqX?_b5 z0Ws2gr$@*7UYstBK9>J1rXlOy=~@?$<-e=~#6V>BH19qkTo&_*f28Owr2o|PMwFQj z7-@XWF}3JKaXmml1s7t%-$B3%?LGe*GDD!MkCbel4{#z6m zK*q{ME+Zj%iRZc_+_&|^Iw#z3c15_KQi9ViPH_#|xLhLRZxFWu$d2%BZIA#OyHJ!F zF+a-2hH)1fCzwF43~NfpYca&Kdh?WNO6Xcvc9=5x7SVZ?InMj4tjtE z(*lb<2Aq$HN~zAtrg=XDp6~Qq1va&Jch%)A%+qvNZGE_f{a9~Iu#1xm|E;}VBOoJz zL~0x#vPa`Klx^hP2{gAgZkXr?DoFo& zw@?C+aHb2rfu9fu_TIRg;7km0pz)^nayT&%GX;QyxfzJt0CWK8Vh7_qRAEtZoPIksJKd1?p>-| zDd49(+ad2>>-pgGdNh4Zc92M~;`%yZHH!*MVYLU%?!szm<>Wd(xRqXx)d#Ad)9JIl zqbGx|cS17j=74pRD(a>ygC{MDKbXt?f5IPGwF!ryKbr=J-AVjKip8SADWR!w%A=G( zQ^7Wr9u8{MmHeoCQU2Lr1+CoV*r?O8CmVHh(8+I^YMP_&Wts}x+^Cy_wrlHKMhz}; zFd&S=5W=G>f{CI|m@~M0@85te1T)wzHMQ9a)*L0FyQ{5=PGKPE5=ISQ7uJ+{G*Bw9Lm>A@` zauITM9}_1Pxegcz#H%!GNqwE8SMg$T`&N2g2gp(&42WKdBH+mN__1i<+@888*N*6T zmTOP0mFRef5snTZSLBE%A=d;t8ZcmpH4wR@S6`_>!E)z~*69_z4qtdCaf zv`a7{N{vE@U^{92%sRVT9E1q3kdtE|^spE9r26naIF5Cu4_TY8^)C-yrjo1Ylgn|jg zSPj<9vx7ByVESQGYIHYNA2d_a)p4jRO?p`;S!xInonQn?o7OD_i>UQNF5rN>!I#+# z$E;<-09nf%#b&RH3t#!md4-@0Ua6C;Mb;FM^i2`1EMc6~N0tRbq2inro@Rd9rzP^OTm=yWIq7-dZQ9XcGiNF+oUcs|g26M?Q<|{W#dc`ay zBGK%fddUmxWmd?hir#6_VwQUSEXh7a_k%e2@;~^PlEFZe_i}@R=g)?IPA27!bb|Pq zP}-ZMyweMS92M;|q0cWAPUJy4YUxuZV`&iVW2d{AquRMT!uO25>jJw?lFQ>I&9D^` z=Mh5GQ(AK(O#*x27!!Kq-6F{1(P6zva=o9w^$yB#E{$SF=1_I|jjRWc5w}A0nPIOj z9j}Zz?A)^#=s<-+yb9&+lV^@4Fu5o%e-7p4&-G3DGmHjJi@^47z=<+!pqwZygNsz? z?Pb9olVGgzdbyZKF`uR=%vL!Sg)z>9)KXcPDIRk&ickthmlI6bIC;4Qyzg5Q7J@<` z=B@p1(QBn*?TCBRjJC^zd3{xxI85}3T`B-yX$;XUR4qrRQhoJG^~ttDyzy=OR@3%m zp^)3VO2=ToW}np6+(GH%+I;)3hSNw?!r0wg;g{#;ecTw$x4Z;6VicLfy zxtSew7YFl%?ZHwmu5RV9*aC{NqgnBh+E#0}t9Dtm1Gzyr~v?*l;jclpr(tP-JLjvI}0ZztKB%@=LrT8C~-dr~RBTT=CjZ%=Tab zO?`6$RsM?e@otXCu~ASs_=qFW@weX4%^?e4<5us#gdPf`LlZh|jS5k;lQ63QxXASY z&LrT3b9gG9t6-B$u>vAYph(E9f|Q?0QnMf#LD2ruA7LVZ{0Y%1iUO}|z`a=l6Kmm2 z1se&9L{m*4bAbEh06So;q{-5z%W(_Dx*WvN^YIA}F;tQ*5CdRckXxpWYrN-);!z1! z92&SC5gV9>FzI0b>PHgfM#7;pHckSA!#iDQjg@a3$x?;bT?Uf!`DJ!RX-kqbT94_-f);$ubPa+_I{n!Tm8#AmtxBja~TLsWI9xz*hE1GRCo3n?nZ5K zx7l*d?(}}3jP(imgWM4%w8uQ-GUYMXSZ`dgEOJ2QfceH~30&tCJ!_uR30!~-1Fef7 zz>%F?q>pk$&Kj{{=5lKBDfU=G=C9~-NSA^6Q|sei;K=fYA(MXM<1`xv!VI;BV(CT| zA8Nn06*3lN0J}H|_wJn`;9&N15(!pYLnMS^T1CP-5|LcCu{cP=vNJ$J=P%kwJnUr( z^L{Z2g2+WA=WQ&WM{@K=0BW_kBIGJiW0T08+a zgkcCTB|&R@ISJM#ldAeEI;OTD!447#vXicKvjjO3B%{j>Fr)0>5D1z~cy$9oNhHlK zOYHPa8cCnfZ2p!TAOWUwu|q+36YUZnl5 zouHZ|W&=xyRn*bdrA!FxHA7*H*$Ax>4dfD;UyW#gFoGN%yga_mFPBFz)RNvEU4e?Yv<0X>TM;!zP$OH+pCHCr zA?_J7g|g(z1i3EcYzzN({ zNmN&VW^q+55Qql2?nUwaFDY$d2j%8oonV8{c5dOnSZZf&O}XB4w0K?p=#O9-)^XX2 zCFMdfEVZ?lnTuk4w+T%|JlR5KX07D_uyxgZ)EIDFIJc(^0E%K?!p0FnqVeoc6^~Cw z(!l~z#*q%zTEM=rczdBX(yekEv=(~`J2bD_C{+wHR#}TIClwtEN9kXvmNFJ*%5_T7 zDP1kJfc*S?b;l;NwVJ#+6bRjoYsi1biCd_&?Mwvc2{Y})vxBv|@w`tJmn$BVEZ=C6 zC(uk2=eoyYnZ6PON?&DGciM^|GfH%zo^?uQ0WPeiYocghj=4R?S5QNo5-BJ5-!}P$ zV~cLsQH+1lQg6KIJJYOy$mbhUXYa{3r0^r&DBS`yT0NWN2do-{BD6#LC2qNK6}W=X z!dH=_MjDEfG8lICt&%Z{ENs<}8JLKE<-qF(#1D!)I1Uj2vcB6Vv#vMaPuOVu?{7+n z#{E{lfuZ6S|I)cr(|B{-_c#x0_i-2Hrse%Ub(T)t31O67=hN|*d59lCF);!Kjj&^VQ{1azI_$VQdj;?SNWr)*gGkRNwl<{+zr-tNW&9}EAyaBt%c`@)gJ zHya<=7ami%yK(0}{EhDV$#gIj;DQrGf!3!_llSXW5Z~7LIduv%jpJ?&_ZGg^_@B3i zA1ZvVvHj!W$kMwRA?v*Ts9JqaJk$8-$HR&C_dZ5(d*kYlheJnHdH)?(e$G2_^w-iX1|4n##M>zMUwmaVZ*|4j>u&Z(7KZgHY*mcJ%zZM=9 z7Qeaqj<4PH+ACH_v}Z-3+89tlrq?0zJCX(RekxT*1z z17YvVSMPY`HS4Zxc`mylYh07YZJ{GPmzGb5u<@{se<$&V_KMuzV*Eas{ z$Ke|a_up~KS^S742XT1H3PlR`T@rlypSN|_>dK%&Y delta 78134 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ɖacI~35Xu!+r;8crW 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 Qf3ASk_UzBo9ybylN!|eq5M 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�X&y0k|2a>JX2hR?jXw^2$(JRda zt3oKa=Z>|1mfzH;5l!lQUpNd@`{SEZdK(Y9R=>WUrsL0vo1 zp@%EkMGNkHlJs-c?+Je{3C0RYfeex)Kk~78Ma5hTdZ=NHaf!Z2rp39DS$el3)X&ctl%D73F zj(9*9k`xc7_^s!bs?()dT|L3)UJYLGw65Bzi>r1|(4|*{2t1vEUnQ3<)zU;#dcB;; zT+ut;d(}5o0`H1e0e3O^*f$@}?=Dxln{2usJjq>R5BE`AGkrMdWZbf~!lCe(;Eczg zskv)mZ`vxvIMW2xXct;AP$JnvGLx3iz?bln#@q6ROz5el|lDQnH)Y`ajhRHyOV z4JYd~e!Gye#GkA_G+r4DvS(<#gkgI&cW{Wjq~WXrbXdZ0c&5wdLfy^mnw|3}`!z$pLZ4=+Uo(_GGeiBFp-i>K6!mM0 z(hBrIQ7zdsJ?PgArSIv1f(6oNA5B2tn;GG(@5NdTBd#~Hmf!Q7HG-*?=UTm$wV7H) zhlhq%fJ}gvVewa|yKa=?btB6IuPwofkD#~%BBdUY8fBv(Rx0-acB>$)H*hymFnl)| z0>Eeq588nSpJw9n`GS`z3|hOjt%}%IrK*;nd_JgFjFyPTh?W?QIm^=+!h|-cX()n7 z4Y3^2eqGn2jMTL)keoJm3B$^W2*r1nUda1%0tJGOimHg5$=-%*cMfcts5U`WpdcNd zg5+Xv2N5TQ0cMKRJWB4w&z|miP=li+c`i(>g^gV2l^C1r9M6MXXGksItoH)| zA;8z;h6H@F0UPkaXX4}lv7v%K^ETpFtl8lf0pAY2ay$IfAU9KkdYozYM}+8wep&Qw z$uPJh1*Il|r8H=PGB%0mNr{#{1D4XGrO$3K+-=I@2gO;Tb6K5DYD4)o(%2bGDzmZv z5lJqOiRTPL_T=hnx00Z3JnF7ofkZjISmS{jhaP}>l?Uqe5};b#22UwB2%?q(^=hFB z0O=`c3`Es6Pm2f5-WG_>@(@hH2Hx?Xt&Y7^vd2JASFSmLz_P>^VtG{m_*_@w6!j&g^ zn2v~Ser&oP%lojABY6Oo=STAhPjqiaTd4ZZ%I%POdnW*Vzq7Omr`77U(LGl3`*iqFAnNL3G)o6R6Ug&S{;Fcp?1Q`3c zJ=@>j&h2KqeYQK7Oa-`m$qY<5@yEbKAL!!yW?QjBltKrg{?K=jUhbe81-DVCTBD*L4hb`C}%nebFcx;w)7{Mx^ zg232O?PIrp=+BSb@y>sHC~RIa%Z%Oo#eaFvkKgy$555!j@CWkU<70n(_=jKpWXMv$ z?s>ZV9-L)cA(rD~-~ILz$3J+tPgkIgHQK$g4arjnIld(^H?n8fi zI3zJp8K5mjsoTSh5A5YuCHPgfj?Ml4|Mv$!fB1)c|CIt%#`p`KllwGYFj`Hp9R&KP`1g8dIDihq*Zxw7w*#*;N1;h0MkdGRf z=*|eOAmc!-Y*kbvV?oS6$V^GbVDPv!CUh)Mr*6Uctm|Yx$sqq%+Ob-_?@N026de=n z_SmemC)P|I(;|?!Knns)SdKYOq*69l*6Qx7Xi8OOE{b2O>ueO;PimOnCseR6im%rd zll-f6os8mF>v}vNzed+%c@9(NI8f0sR!4riy2H0@DLULX_unS}@FeK))ervo-!gPa zv7yx`?Eq{I9fqGSI!s@7PjQgN`z661K?tZHX{Ng0un~nIJ;oRf-?K!+m?EYKae_i)z<&M}HGz}UWy@Qzqt)$#D1~_L&|mW$zzD@!-fSSEkclB+O;-J$p@Pubg9QMq`-9% zhG^7JG>rPYi$)E^3Zjm{JdS0|!_S~GkK=F<;|m_so_v6CU{3@7w~bK91sT+2FTpWp zhtQ2WiW!DHFJR0~x`IJ3(-n-`tt%Kdsw)_Gx~{W0Nb3qp4kHD>RX8j}6%ijyeuQ$< z^rVBye{gHQBZJAma%&3C!GzNcYv?hp^4BQd?Qg%xt(}rKn0%Vsn|$dfxqY6$)uD%` z-W*KOhrZMoq9YymcO&C&!rwt4uJ?B+YG38=*a^Ja-ysjare?S9T2#DAz6nLW@tZ*?Dp~WmJL3R|3h^QY+|dRf{aHs z>Bu(5D&B{8GL|H1JA{KeCK8B?l1~8+fQ`CMam=-@Mgm=-&Y=Xy_l>U4ByUUovY24c(K} z+Q34a+<@ny`FV8oUi|E3rh!GYM$b{uE{uw(LyPH}6>I>Y zpEUrDaT8t^X&TKP#409wjM_x}j^i2@{-StVsRuElGCcjMzbLM1FEqSd`IkjmEI3a5ub&J^j1KGS}`-S5+-szWqy!f8J`j?IZ_4?Aj*6Dlyy8fk)xA3LW|EKt} zTK!8Xm9j5MByE5 zASGl^K?o16Fns>#UlmU)^nlDq{)()*;I5GfaF=N9W^EK$-T4+<(*ONKIW0%e7LTQ2 zD2+?173!JZ|JU^;HE{j%Uq9KBYHy!Ht6$PKmejKt_MK(LjY!finHIuRra((?`x};Y zwTtSc-mLxJEa6GLnfucMk$SWDrv)PQX7Eo7MC#4rpB9MJo5?>d5UDqte<)amzkzP| z!T*WrAmZ4-I)%F93r6n0@PJ)D^vU9vwiE@I=)*g;*wA~<%1P$Yi~Hq=OtAdq>R>yF z`difep1&<_BJamn|F($x(DaZ0mi&k9)2kmWuI6&ygGCNqn||$s#TZe3mJAdq{53F*vg#nG1125~NJ75J%hTGjpv^8Aq=M9ff z7p2p96466fs6_h%o^TIgh(|@RL6~M6|JCgihDwghbuRRG0B-uztd)dFeY@qn+XTO zpQYYoY*nCwb z6GWSx#wmDU1l{A?8X#6IueK zr|CcYY;p4nUTfkvs1qAB9WFwQB9d(SN1rX8Ru`}{HgeP}Ace&);lNzb%7ue-8z1n>c(PwiOBwO3JX$y$Tllc)u28HJUI}pffs!bV? zrh`r1Y_k*=&oP%U9%t-vAQ`cj`@&OfPgCIu)dw{v!xQQco{pE)jQO|$`ixb#P;5(bl7&0jzetE8ld*xN>! zwv{9WwU4iiutjE#Tl0Wnr%o?VG80Cpjv5)8zU$-rrc<3Qi6x>0DHw`T~o=?cuXVUI&UtRUkm^uh`l!#8hg2uEHK?p8^OYyl-?2M#72^ggu(ug>LwP+@;pP zqiob|JrGhO@kEkA91W^tOWScYLM+VG5}h&vc^POfMN)#S^D?notFkiSwn=z zre*nm>Za#I(;XW~xH6iXY=RO#&8bw}(ywYRmrNz}S;m+g*G2?MXV0dlN;EQIJOUPh zl4t@0cxzK4BM5^Y&E3*eB^Y}uOu<29_{ng;!2KKi%qS-Rwf^=1x3BcKbKJhj-_CM- zjlZ4Yc8|Z^mnS-bvosrV>tHlKHgnfkk32E`@9+LI3!DT7DZBUnTOXL8|He4UMFBgO)z_3SJ$WxW1Fs3fV z#`^Rqk0$3}arcR{^E4@sh~OXWdtkOs1gHPYmo1mk$!SufZB?`=B~mBSqy_XDJxkh7 z*ojxWJc<44fBmkv5(CPVwl9K%Rk_5$*jad9m6w9U^qzkpB8b)IWpOEeh4ojXr9iM~ znehQ&o@sol3CI}BC3%l1i6d!;IsKZLJgZxu0AohCKIUzoZWZRIeEPcgdYwt#%0-;> z*npmp^!Au;!OST#=pMD?lpZATN)HT*btVS{0;qw^YABC-#a|CIqG(c*04UU(YVzU_ zjTA6~Pzj$4#kAOWHKHS^ouc~g0T{A^2HGUmRaD1c zo5`xNps#tkO-N@m48DJ zYS^%%0m7ZehAvUjr)^gDVCY|1V?1ln>8w=>TZn8{$d0cXQ}Hp&!EAmq=19ai($vih z+=m>>(WBhY;5TH}xl?pK5HSX>^RmhnNP`r4zoJK?c)gwvNBGp?YBQXBUjd)@7UE3! z+?@rV@$(ymkr7QmDsR=jqu}Gd_7&o1==t^ndkC&m1#p^gOcr9Y?{VZ>6q6B^L)s#L zOwJQ_OwMq0EW&A&^2eiiOxL3ku_s(-3$fGnu0p(l?_)wN#8;_+i67DRzCyfOR~F>O zy53*FgOGgI2*oS1sUpZKJsGh8s$@ak1+c>51L@tB)K6udrh~dwzG3D?x5__Fs~SP> z8!g*&y*4dO32|#NHXW>MaIn8m(9&ydcv#G=J`6}pi=hv&? zi(}qf?e0>&yTDyq_r*I$C2g*D4iZ`L;yO=7+s&^$l#qJb`+|`gRe7LW-DcHc)95z4 zG=V7TLsi(AKeX!BD()G_$d;SP!R`}M1B*JT!VHO!qbX&NDb&(LrkNkwT1`38KLBj> z7VTe&#?k(F5MMz{_DW(B)D-_~2iz!nSC~CG{pB;#B(iEZB#}M(-ydN8kSe`bsYT3k z{hL&K%FP#ZWcVc&0iN(R#>A2R*DqcoMs2=u#accE+E4}k?x46jU{#!yt0u*QrfI$g3!8dbCp=3hJPqmXP= zB2TZ0%fV@J&PD)5vt+&juusuS-&Kk)H8h?p`HXA(OYt@8`+-vYTdFY6fn~bhU-Dj# z3nh6s4&&M$x2fLYQoK%G^tlJ=LBqHC?#}!nycc;-R}qrV$&n-gVX8n)?Tm1HYY|?D!2}|2`su0br z05#S+l4DzBp^hQ*zcKtV_)%@rsy7t3EALHJN$_Bpua_4<)gd-EaY5YXmCK*+k5Nb$ z0^HdZ?Gl3M?+GYm^8*T<8_P%nu|KeP9;xNfw zPWJc3drCX0k)Hq`8c0+#XFS5qtC4X-1_V&w1Y;;%T==Z zcQ6&ABydu<7B_xf!E19=W$xoR+EvhWDc-%g@;#i98m6Za!(}gzlly~s0jL$-r6|u( zl{n7eLISyz_0kEE%M!j}&LPS@nPzmgEK&`pxOAaaxE>F z%b?byNI%it$<;o*4z7 zl;lK|yXZb~Y9gG()0$6mHUaw0ED^)wRe~az-5TIJQC%U6D)2N@%oaw}WVRHqGxUUo z2{`pR8uiPBWA-|zOUyA1r$8n+zTxLxx9(Mj3uqOZcLQakSUC}_&CoIEXe(94i9Iew zyIvSjJZU&e3Hr~GzP}9Ao&dBR4M3|l>p=U{Gm6V=r--5ngMALhEa25AVvL4!If-QK z?xOt}4rjRhY{S>@5$hws5l{|s1t1lnem>B765hXT@wk)(NSlmb{HVQU4Fgl7Ck%|x z;}b|z6iAbfZ$frVu_t4T&k$RLM*HcSBzIARWVPc$W#j! zs#RU@hHA3Iq-Dpbw#q;^D>_cm7)9*J(pr;j;>r}EolA?RDEc*ub_Bi;7@cpab}YZd zkkzZxMZYcr()~@f>WGKexu$qED=~ubJAp(tk|;vcxslEJ50v5@TI7^b`kP+^zF!m)wLHp5Dt>i8dBu6`V=|B4D|8*ezlTRkw9kxF?dSr$;JX=hH| z3`h>f9^zJjjSwXriq%Z|2+m;pWjT~0e7JpJjS+-(Aw`otoJ!(_tlAmlZY+B^*T-^u z=?g24`?YLG02SVkG^E~1DpG2M15KcPn17qvT6IOzeg$kOAFoZw*Awkx8gv$iD!G`g zaub5^EEZv@kt(+r+%*n9FpQI2&__uwznpF*96Ewp`}dk-!}m>2>H? z?Cpr24(1?+S~iwItExK*qhc3Irj>lkE75zBjw{No$|Nt6*goNUE-tU;1Aqyu%ucAs zwxxWDpQ%x75nL#Yfg+?F^~WfzZ#=YHSTnYH9t(TW^E!Vm$ z8jjjj(LAkSMyS>*6|sRuPBf}jeTnpPqPn*7cPPgEJHDfMdHN+lvzxVCYS*g{fEEht zeBne`Iyn%HfCc&S0Em6RC^*%a&!+`X8hYf`YO-53w#dfjr-jjKER0QaVmI&}Cf|mZ zmYsBHwSXrlAKMD%?3W+g(;1qQfW!49O?c=?;my)%iOTA2*!dJwXk_(ABn$ifVlIA$ z$A)JB8z|V=!>^79Ayy*^=apdDjGbXqRNY_z6{i?Cl8}f}pycW(=NeHCJ0`}IoAlM>3idP|kl$c~^yU-3B2Wc+&b*NtY^&+d!Tiz@DXDgm@%uNr#H+ z5yb1jwK@{CcTKqNi_0!Uye=FN0^)5z)UvhjwzUWG);hlTB#7tM+Fal;2I-bDn6H!_ zGX-e5_4>p!^yV2r78IF=x>D*)N1~gA*Ii6ZR1lpKRe*L&8e}Lt^Td)u`Hl48a(V@8 zs8j{`s|HDc8VGG-ha8)tjovY+6==nTHyZ!}yJ^51QJ1(idqvj=J=4&>Lm-)T zTQd|xx{v~xbG|Q<bjzYyI84)5REURk}{HJR=%q4Cwild-CP!vgKK!36vBzqRW6*XazQ5 zEz1ferq_*nkgbml zE3`nKr~+947}3=%P)+G)3NqTYYK2y?LL+jT(D>D+7O0g4BD=kM{fjyMYzTn_@w}GrKu$48QZJAOU(cCtBCqk&^WnRJ;B}gVbCqLq4N==(x9K$%Y}>VikvIms zOKz zKg*g+dt&Pm^sixHWXj0~W~X8@DK)!kcbPJFvscEF6$1@zgSuAsnN$~W8~v3+QpWhg z2)geW#beO2y)(S4ZbpLTebobr>>^SlOH=NZ>Hcs=RC1>MHf`>GLHmtX9BsI1E=@a* zCKGKrI;o&NN9%j(SP>9JN!rjpaF_PtHi@=Rr;jxf1?L+ZVVFyrT-xPdy2k~23>Yrz zW9>;hc`FlXN^fLFKZl?eJE7EuRK?t-X%9+f&{q~Erd{W|j&a_p2GXV^id9Ab4|5?I zz&b9FZpY=f&LUl5t?I6k5>jI>>^Y0Hd{t!vyNXM!Otl!fbY?}>k(TumE+q8yYpNW{ zuLMGNh>KvB2wH)vooZ1aAXNpBt*VX&qzc-Sv;^aB0sopRw%$T*Qa2?2xl32_#LVf+ zX^8tm9Zyx+3J&W^e!)j|eFo-N zT@hp+(-lj@QC%4;eb~n>^w;=c=I>=M2hip5Qc1(&~^3p zXs@oMW|-8K^Ky^t1IT+%=<2Xv>52;wQ=uF)9b7=J3YW`p5vp-LMP5TyX=7(q_f{%H zEvgPwY~g~Hq?NvKhVyX=+!&FgZufqsD)twxIhKv^U?3N%0c-v3Up zNE;knCtI~8UwGFeg-qFBq9u-bP)blG!lsVU%$#*SIN4c-&64*xEd|G1m;h|}@H=^^MadD+(`F-^3jN}^ssCTFog3FHVZB${|F`9(mMCauj}c;H zO8V6@cy+2z_gI<5@d}<-ik@ZdYc=l6$1B@aj+Gf% z0!Bt*i{Jrk0OD#^SzNN2e5^VvBfL;8JyANuCW@`YzY-E)$WO(b6MuDa8);E(v{k zIGv!yo#`wTb48ZRPA6#d;~q1in4;nIc6nG@wMXUo*Rt`f^6HmNqLVm@4!N zI+_*cZ`A?CUZxS(6o7&@lAnYZzS^Yu7cHuAC~HUS@UWh09;Ve$mT8D!wE8ESl`zxy zh)BrvQ;#)PIGR>SQw`BLB%72*k~f+$m*_Ni#z>M1k3fDvd=o7Q7KTN=Hw?=>uGcYw{gB*`Bn5+Nk*V?#A z9z{E_5=FpD%y4?qOE*`lncgJ6-qV4V3Z#!$@?q#z(e~erdESp%jqqk)nx@N$2wwvK zY#sbE*ry;h;Zy4-DzNdV{3J_y!Y3bG^vOf1>rr#^2$g#oT*LC#dNn#6;{7M}Flls+ z&mL3hqTwU~f&f)U?uT@&7@#6@FYx=oa>f9l(lW}*Py`3^z+(nkko1+jc(YscNy$*Paeog6Ohv~5bXX4&ms3%F?l$92)+b-2fb;+v0)s*=Pt6$&-R#R&JPV+=KNxE z|Btj6gQ$DI9zV1&GR6X1|3$}w<5Un{n2y!%1(kd7wbbBO<8qnJWs5_|-Ie-QwjlN< zkJFW8>c@y8ulU(aS^Ao)P{5Pr&m z;5pag+NNLG)ihFDCbA!yFNkCl{SV#ebO+Dcmb>M~+H?+LK4PI;lCL4_EJHQJ52gEQ zamzO6@;mc~BT6gdXHv8ba=SH`(;gqmX_qUe>;d=)9F9&#+D=%-EO8_+FC`nPvCD36|+~StU zE8*1`Ew;dyF=K3zyxGhJ#@g%WfT8!I6{X#5c21m<+M+p0T4?$t^CA}ci?q6^(UUcp zw9?f=d(yUnD_$_|T=E=-5pPM?R9(;3w0HXJ-A!kXKgC=zH|bo-F)*8}EFQ(m=)I{8SDnMRlg<0s{(Of>cfa9|eEY{qB z=v}($MhIg$dC?WJqVqc9HDpEQiidygrQ~eU={p@a-PpvX=O%LYAIsgKss&Y52HP8N zY){sb9U)R4mlsJ4JZVEH34KEV6VSP|u`9FI5H}|$AIu>iD+;j){hlNm1s3b?E4nWv zR?g9#Lvay+2^H7!BdxH0R-XP=Z&O^m;~z!QE&&_%zU!0R?ct7#wkM#+oxH7-*!pzE z7l-+aBvm3txL#%H=z3kX8DmTAsJ~T*pS5Une3@^AR`v7@F3y@9lMm58+!psZj7|z; ztT_-Ox%mdn0yr2q$IC@!3jAXivD`svnr}$7C0WjKk;Fav=uF^CUbB?yA46=TzBmR> zu*)${W2h+Va`6Onm7ic0VAS$6Nw#9_)Sl#Gd04C@lF}S2PWo~>?r&Q5yil?D6pb`J z#k2F%!-;4RdR@loWD=~Sx zmD5ejn%2~oCx;K# zi-fs2vF*MQF!fW(Ph87r?kaxemg{(*X19DdZF9lhzXLmCTZ_>4GL=ly;!SMdTFJ-#VfRksEDYPf`Xko9{IYQ5U#TCyZ4^tbV9i z)tn!ZsU~NGj7W3JM#U?b@xoDz1|{f*nHmhELtyP9jw1S4vFeoSN_Epr#FdToj;XRK z)5r{u44Tklh|^dnlRO3ojR%`d(x8{r zuwlbnO$OMoaL<^qVUsY+B#fQn#}x15$H}rZ2bJ5$LJfI|h<3_UMXFBJpR?lzFAsQx znBe8{x&~_QJe#^airFn-BIqA{#x&@D$Jj6$xVx1s+lcruLM4nGp!q?VP13w7kXJ*b z6AEam%j->&ZtR>oLz;q28Vcb`#hA`2S5+6~Ne@!rGFucr(;#kL6aSYJ$P=MR*Ldw@ zu9w+NUMn~xUZYCazQ&ZYrV@4la!V zU4dh|O}=3WoiYkE*h^`K%ax{*UWSX~nGlvcUb10K%FH`8UKDS}%VcWGjF&7+%6M_w zftJMnZV$x%ruFp9D|gD7nXWa#;cQJ1*GjO_;l6HhcssA$k$!jT6_+zmFLro1LA%go zNWcILjLVWapf^_FT45+63A)Z`$n4N_0yoE50S`M_E%e{sT^o%dnq&}UyI$F-@+3*b z1sG1m+=erhG)9&P@b@tk!pISKGBPo#UKVV&z-jYJa>sRqv~X=!v#vW^mG_M~yMMOH zMP!b69I_H+!meV@-gLaQoI8^2n6$u-=_k%soyT{DGWY;g9kMpg$GPiZKkR-nH^!#j zeC2XU5}!QZzgU<#q(p>c#p|5o=?KwwPkd^;s~d&kXX(mH)wKs6Q}V&$39cX@BFD)d zU@ccLW8BbtVe2f&o~7qis_ucfez;Oq2BLa>rMfgFl$gVwO#U0vXvZ0DgisCqm~P`& zchTcSw_A?K&GWj#wHYQNAL7Pb=~(kVF(n;UD;fE+O?KL~xLjd^Oc9Y*8=pc}QIuT0 zrg%V!Wl=W~14#tR!y$8r9+N(%AMC8EQAWjRF`5!ej@d_UW1vyX2=$937+=m+g-!N>uE&e zWilKFe>~>){izxtF&gOFnAl0~ge4+b0UJuuJ;iYpRt7ml_fSC`d~NL7&RW=vi1^Q^ z9)B~d8B#2EN^fQ!A@qqovhuh88I;(t6EqS3yRP+wS|CS!W{FJ@@L4 zbQXJIIXEFlG@@b|3Y0_IB7K8WXtaxBy(*!Kx`}Gxif*9?cX<)@gB!C|dj3n?z;BlHNYuix7ztY}=K_{AXf6sjt+7TyE}Gdv^WwVB~b#<;Bhfo8$$9Ff2=*K!dDHgc@uW~8{#XgoVZ>e(Ktk4Td`@^l0m2W`1lIxJ1=*bF13 z=Vhow<#VYH`x=YTQ5@rzI^@JF8e61GsTgm}bQe#SS(RZmM(z7u?B*s8x@ zr8?(r{$LXWBMha3o?oSU1RgT+DPKJPpuBuhB-4ZG^yVlGE`x}}clsHJUc;h=rbBz7 zVL8iSdugMym$N7X&{KI%r^Eyj#>gvby+Mm!PaBWpA$NK^fBqQTY9jHwvqcB99}nup zFZjm!HPxu}=JN^kokp)qRr>l27)@Vrh;Hg+)u$zSUx{0zN8?0yNvE!L2S%G-y z&uNfR3ORRqkYOI8zda-j8Dks99COt0s7g7Nw3uzh?zWA7 z7DOWb$6GDU!Ydj>eIhl?na zo6e}Zj8#91?$^HPJ`K(@bW?h&^g^&WPiKaUlH(1|&wTJiIqq8iSC#qyKbHR$LO=5S*Ff$_8!w$bW=sWE9~VsKINa##8L5=8`_Xr<5HiQaYo%*EI0mMq8`Eog-^Tn7x%A-R=8or=_uaq~lyBPbqNO>$$sIS!S&?fsN=6N7U_qtRMQ{s3xrOx+BTp70ZfhuXv47UygQOYL;0m zWRnseF2)L`C)3K*MM?;rldg=bdl>o{Eh9%^v#;9hO_RDJZSo+^GC z18(T4E(omEkM@M!okp$Uy!=w^2qaj@`Hir;-ogNx+4u+K7Q>KpzdttM#r{#4o|l#` zbJPB>a62zn1cfQ#Wq)iq2}ADfJbf=T4^ zkW98{fETDIXjjGTpCCaw(e6*zWRaaAtT&7HLzjr9LFLT+HinYyBQd(lQ?PhJ<)Vq^ z1YBdE`PEyM1y8=GQ+-tbT)IY>Ml!0O?V|<-_wUi4_fbXV5vTQ_C_QF%7UodeS*<=?Li^E zW#m&-f3H?`@AIoSmbv@?u7S<^slMv`v)E}PyB0(QqjOM3RDar6RTs$0Cx~*OR}f+G%2z?5AATnzY*SV>q?p$6^a$W~XEq z(<&4pvx})C1hZG1^b>?;M30c+Gz5be)RmO<3U8K&{IV8})Nqr2%x8Y0t4innO|m>` zz0jW9NRH$d_xAV!M{XbEqxHD4Ts(Px<46`Ta#}F$7xYsVlg$Ezu|vc+6+Jy+R9L%W zeL-PAC|O1ufoa%Fz;q!^$y!|22)|&w)<`cWKQ1Ofm?@PP@1@`Gr@Bn%H8uSbjUq^6 zaiPS`8j?7~WnyMKVsFYsH$|DXc^d-Mzt{HEHAk|E~eubsG`2?kf-AA))N0v)w%;1fRb?Mm$>5& zOE1!ii0a-wFJ2^5Ue=7<6;YZOG^7P6%joQq!Q{82`qvl0@himLB0Kr)wQTtHbawWk zI9akxQES%SxuubXKqC|>7stMsFFW4K2wl!a0Hoz!_>v{9cP(GFana(SoKTQ&_O*|( zGclvRL{$w=zH90uWrOZ7ZbeGR6%4SrK-tsSHV-!&%^o>{~iz_3t#1;`>5dN7= zcTu=hi4_@K0fyqkW(b(L;mi<7^C8{z5HL*P-d2fTc%iDfD9lj|p=vW!VTkxtI`Bx( z%lyj1SC1=)*-_z9o56BvhLqd_JW5KBwM$9j0%}Ya8^>0y@dcluq)Go`NsfGYsTQ-H zxeWX8X!P&x7`gbL+x^0s?({Yhn(Nyoq8ARpuh0Bt3D;eaV@r!@EjjU8SB;r4fI|*B zaqdPL;;doshf{9G%h@Wwck`cYC2=19D-hp2;~^r3nAH-~pR|14&Do3Wb~dn&#@ve& z%ZnF1Dzg=4OCg-9bb^9WPRzy>g+%?y>+%t;u;))~swERW-t9aakhuuOjDFb=z1*z1l9gOH`lI=wu zWi7;$F;!^)2z*Y7*yMiZ|Zz11Gskj6M$>aaXoRU>Kt_Gpy;e} z_RGugDy#u{K6zX}GhEfA^2Jojba4Sy5p&RAl_ma?smk4cn5sPJhpEZ;{V+9oBm>Ld zpA0IwQQ+l2r%uQ9dp~Y)?eoLnI^c)Fb;J*Y>*EY8OD-8)a+|LhuKs5I#J~g1i7-Ps zYyAnp^(#LNu8n>eT+iw7Fm+*Iw;nu9jSl4N`-ZUx;RN=WJuyq1h>KV$mixf$$My5W z)HQ(@bmee$8IOkH>g+Sk)xg7g!*JET$V^qPN0)8L%+&MX;<$5k!7$b5{}bE21{($= zI1Dz#L`C)qREk8`}z3YeRy${lG%6w4a6fVBf?}*>P zkLyuC46euhFt~p1hr#u0KMbz_&cNd9&onCsRENik=h3yi4L>>VhrxBy4}+^UQx>_w zb*~==*SB@&ud4sz(xf-Os^$ec=~0)ddLHX8Q&;oIy&O_8k-hZN%hh>>zSW6rvvi@i zUalGgYxH@e)h9f9T%n$cw4pkRRJR|~$F5K%_~avFR9OYr;;{^&%$l4mzQFcnGto$> z?jb#7j4Ccm2#3ycsW8DW*I5;J+FJF(G3xw+s39`+40fh)Q@Q@-7}Ylr((jE?=X5v1 z#7=V!PTLr+aS}rcH-b-29DY;eOecNSSQU3E*Oo$AdBLDfQ|`CMs=)}e7sj%98PW&G zs?oWJ_ah_EcTOJA7mrhMUe=9Mb{jS9H4Cx!LR5d)7UWuhceR8ExQ*ur+ zU>4SpT=87HP;b0abt;v^6ea>uhQfvHN69u*=ff*eQ7M4qIabo*MKI2Kmbhy}a$=#% zDi9%_zR!atqX272_ynAdhg>0Uvr_9Ue}|YZ&fxr|(X zN7qn4*%O80%QsLBr0=>;jgPrI-D*VLl#^;f=j3Plqw65O4m#(0HPx+iPoNdos|UMe z%JJ2VBbr{#ENZ4NyFqmi@BExvzoWl?1AOzBdfg4G%jmUBerq`#BBfJmg89inVZaKp z_{phi=XomRWXB~cFR$8?j+13QvG4-U7foVYzE5pX&hg~F1VVTsDH=T00j?h2tL7Rjr?X_jC)FX;Ct za9I50VjZ2RE-T+Ib%J`_>QXaVRg;Q2TXge8)sx|RWTNU6SgL4Glao~$iJza0HhG^uFj>tClGS*aTlK24 z>a+WUin=b^XyrZ55hsh2FK(#j*_F`Evh=uZ*)cu8K~?6SXW3REu_by%gBn^O8RRcO zfDBB+PBZ7WoYU0&V^Xru!I~b#>`T8YX>Mua)wcAjhsjn;l5LhA*r?tJwCbWc>Vd#? zy?TxsJi1-k*7O$Jx}MZ~2ptF>d>5sZ`rtnTcLeq~rn^3OuIhJM`+Df6x#~O4#4OvI zPU;nePJ~rA+EyLUpHfP$58e)ZmJdDvEVWprhtE^ZjvaD~d5|b6=Em7>F+WTf-3Tn>s|X(4pWkQuV29rkA3TQN<(BhnePn?eJ=K@5B`YX{#>87gL7%KA4?^056Q3ZS*ZF)SI2Ct9=aGRT(^)qsKO@0fDOZ_cW_NWhJ-e+ty6VlHMyPc(BCDOxTvce)%oxzruml z`m);*vvK|G?U3p^Jtn1Y8CKQFwq}sZg4U(a&S6Ye5(j8qGQX*5{wAy%2-IgfeA0y2BNzX{SMC@p6~Mn0m%xMsV;#M-EW!dUwCPSZD>a3Kn3B_ z_1{>g)+su^&%LTkVNTK(UTKXb$TMgCw0qSP=i6(qwasv5F=n*F(%WBCrFzhB)!>vz zGtJkz)$@|BAgR>H4`1wqpW*!=AG`y&*a!a=SbEFL-vxrjr<;L$0S~jRR3@S~5yES| z47UOc6?pKSz}3Kp9q^RC;e`! z;=O;P9sCxs5Q_Ky0B}J&_-g+cf84Hs0%*mL0Db#3cpR|5!mZwW{qkltxVj2llxTu< zgdY~tfos7)`aY*((C@J4RH|~t1lur%QS)w|I;Vbmyt#hXys0fWHO+wOZJnUsc@EFn z{s}s=MRo0)KhZYKrFD|a4E?41e-8%JS4jI6J#~vJcjoX@I#oJm5x*f*D-yYU{w>YwyA{B&J6^acyaTG{2*Rt z@qjqpkmk;<`n%7oI}?5c-AUrL*_k=Be%=g<(Sx?C^3oxbU1sRLo;#ztdFreg)vUVfP5RNZ+k%v<+14nSkTBu+nT`37a44s&?9y3i{|a<7kzJYX|?&&!D4__O$-g`(9G1 zz-T>b8v?}Z_$m6fZR(4ZJR+-}hc{BK1<40vd_%BbW=^&zIr0cJS@MeuUozzR;I`MLYOmVBr^Dg?_;A z4#M%gh*d=REAT^Le}*3cvs)^Yel@>kn7sUtwS#}s4&DUpZ_w|6Bf{~#0-loyAH0R% zGVb2{=lSg)lGlL!6?z@`TwnVA{1%q%<$t#wd=U6*e}eak@b^G}*ntqCSHOj7Ddxc! z1BZDp#3p}$me7T*Uw%dD;Gr3M<_>jx?)I7Pq+PK7$PTz$;rC{_O7SMr3)y{77rv&R z&ff9rCM)lQK_ZQxEIfo-Kb3diAV?KA=zCsQjfE@gZNpXmLX@zwl{$MTo~TmYypwsg zUKjsf-4pfZ)dS3a>aIDY2rQXRX^o>4z*c1yf>yswvHrKF%34_(k;?|l8^H&l<(`~|itdk03hj1yiv*QnNS?okg!r|?=7&C%33q6fXLdg|qS zRhQI18gx_Ec?-`l<`m}d$S)(p1>}{EZ%>3@C$7ZOyWUilot`9(uw`MzLR0d)ug=}8 zx=lHleznN|ir;gaXEo2iscD*!p>$~uAw*c*4i@EE;%b}RYAoURQi4Yddfi@io7fwV zl3*mywFH@xk2dK`_Nglh@|#_|rKkJUsrBJY^bKpmky893%p;<&Ao_VRM=h^|Q z_Nn*~pgp9B^Ze#bwh>(G_}!V{@4PRiLjBo3ro>lt;w?1|H_IJwspdj&gvFecn(xrL z3}^0m$}b13)(`wab=CL0tvdDh^_V9;So9YfB?lw~D&dhj~nj_qK1 zFJmF&AYrDS(T2b4@J;KNwW;C3;2SsV?eC}+36B9Zf6dh~=ivjmi{G@zn$a@bdPv{# zC-t2`H(k14J=@{n*VAvBTdd<>*YECEt63_z?*Q6SPyOlvE+MJX(Rc9~R_XKKMX##T z_3x_w>S2_iGQH+KoDq9p#~G3Tp2{EP&7bRoE=TZ>!IyE7Ubmfri|Fe27?*GAQSYg1 zjgyM1yL>}XjtLyqpGkr$oj9m&scyO56+-_(A`ufF`~<%*Ak^M!Sts-}2T?ggde1=y zGoEsF#eO<^NG&aF1{99{IiZr!tRFq3Vuk+BUPg44e(sQZAa~*-+sOC9deZx9U?;D; zjXR^Ue%^GGa?Sguum1Qx{Wwrpe}LnqW&OAh)U2S|w^X{W?*}TTcN}3&!qR^^qWY+j ztq`&sJ>)~87wGyA)m5COc;-X+b^aZ;u~fI}BOf9Qh5!ncZ`IvD5_26;Y?`fr$J*_;bQ4!nX-a2nz^xgsTW&B@7_+AygAe2ptFk!Y4~?Yd_&N!e+wH z2tOof!UKe5gl`ZQ5UwYTCOCvXgl>e=C3ez^^5gTxw)Fv_jj)RFI$n33yaR*7mKc-jeQ4I{O}OHz9;2Y$8hl$&Ktgii#VED<*&h5I3O1CIL}`jTR~@ zE~7Xi;6!ay)X1QNiVChcqT;9H;DVx~j^oDvo~qlOPQdvb@%x_t`TvK9+*@_4>YO@t z>eM->PE|jAU*XTU6>h0w?iIYAJA{agU=N(g983rYWBAJqJRA;#8_X~S^B@mz_<&DB zxLs5z4@Dg);K7G{!$4UFi}dGR+pWFrX~P>fto8JC_i(tTUoicWSyyl)Y4VhrGpAiK zdCuj=KO+siC_I-L7W0m&PNWc;Y?#_gHY89#Juq%+EtTs+uGbWP!|SzPTlutMb+T60KWzk@k#lkerMXbpV%0&z_s?!WD3UKL|0tY|y-bs_36ax+1KBB! zGPsYic9A)4&t>fz-)ws#^QHo@pZSD0;EuFwcV1ZlSnLPF)^Vo8Dyz2EEX4aZ{0XE1 z6NlBUy2S84>hwhR?8%7yx!w3;>VFwWZ+*PdbOIq^`Km4IsKo*cBRxuIbc-c;(D3R( z5M|s)qr)%~Du;+AKrTMV0$q2Pwr2|?-<1yX#HvOHwZF1C@of8gwy<$*Sr_nhWI?Br zoD4;QpwP53MK$o?fn||LJFQ~<<(Lb3Kjw}s?L3fW%duO;=PX0swprw|WwOm7o+Dq{ zjJZ%pqqHLOW%(l1_~Tz0YBX-?;&!m5k*z%jvt^Ax_gIkAGY>@QVAU}Iuo{-2M!p&b z8VGJRY(&O#PUE68_T5hzku4+6V9O%jkpoy^WcbL@_$x-slY(xm38!s;mKaJM31! zO7gO>TsVj4MkY*Y&#sPqIWsT+Y7TUFqZgves9L&Z*^6}xzg>4+l@Yi)vUy4#3OzSv zDE_9Mo7YVjHI7mgZK(P?zyD^}pFa8c+kY6UfiupX=2DgFA`7QvqLug0&Bfo1v#8z7 z^RCq&yG8D(%|OQH**O}UfQHbrvBuBNTh7C1O;`=Q+Txh+v>Xx&g#>xK@sY$$TWMZp5q|NR(4bfxO&=)VqcuKW1iSM?a|xhR*Y zDu@;6b4#j5#MH^UdehOX&!3vBzpuByx2nHo>L2v?L*R>}fS-A>U4OUzy;c3YF8%~V ze_eHMo6jV*wu}%S7RwFj=VMFBW6aLF1a`d6)@2>83WB^j8x84qrxp3 zWg0$kHVq%x92vwN@eCUA1a{%p7GwYc`md|dFrj#JmDo_DVO@fTjM}i7gjy{~ zh3M9=nqMc>o`s^nX?}fJyXKeY*R!);{*UI@{@G1}1tWJ{c2;gNXjNGg%7fqx;&s1K z9m+TJ0>Mbu<;yVyw_jd^zuqfm`KcfnCzN9578fxlhnl|&X?)gNzNNl{d-8i^p$F-{)XCAulzUG zW51!^FX5kf5V7L1X_5OX2j{G|Qf&XkC=oSdO zl>Z1js?p^?s*#B6e-2OA{@?1|Z>7qy)%(A(cQjJwe>={xQohE?9buM17abQcYXj;v z(EOUKU#;+Li{WeJhQ@_3+HxKm29@EQhc>4>q2S_G)(Q%BGMXDa}g1@zo z*QS=?tFTrJYo!FBvdEW@&mHP9yb~Dsuq6w)M`|mYdVGO}Cig_QSTJ|Hf9^Ru5cOG+y%L65;PM*zW=U zonajWx?aD1cy_7jEaQQ}eiuD6Ltg9fz}i5!$mH$$WXE5%J&(1I+_1e(UiXBGEgFfu zxV=!fVh;8@sFjjAxR@L1xxTqd~?;5%6&#w|z&e+$kji>FnocRF{hKr48 zy$JYRvE+%*Q_>kr)<55#1tMFXFQB3?QbIns zfvHsb3sjQFN}l!tl?=b2zO7S<9WQh*xrTd>!ysTp$Y3_g4YIgHhPCB}r;TcrYc(|H z?Yfn*K8?{A3yBq8duekKF#&640+nhI)TSl*3rOohQo z+)*jdd5dL6?tCMsM0qL%*_`0iWjvpra51>x;_*2MKNd)hyz|D@0CxVH-I%BGhBr@U zS;~PxbWegxUv0HFMNOb8^3&dz*@=-C-#Qn6yZv<@{yy;6h4|a`?agd?<9lz9VQ?&T zd8ahftDG!E84%53!U^MjT;{Ff-P{joTqC!?b6WO~%faeo4m+yJH(r1u?B&p38_Z;ZmMAQk$c}Sa$4Ru9ooV5-uufL8`OC52cNUF(TbPg zT-tRnJP156x^e2?idcuyOE20G?DF%Gxh z?VsON31Nf2GV3*T10D5x({;CeR+_c{34jAnpAB|_Ppz^##L1^-8i7fGVnUb%CPgm) zqD_uzvf3a6i6Ms!%Nz>tAHJE5o4&Z2gLj92RfNA6ebokkm#M$^e$_@B`DDQ+!_c#B zLjmF{!%z7Flm`MPGPxuI+BAfXj|?(EQ(_sgiOeKq_+l9_tyD(5O|mx$NW4*??g}Hr z8>_O#h7xZS_NIaoZe9A7L6ca(+>pwnZ<cpX9HQH zjko_GU0IN|#GI*KtBz*OuD{@WnH+uLU<)1kl z?3xmC_Tr9+^+T~V1v_6h2zGz^V3f51Zqoo|cNfczUf^Kw2zH)4(ZkBvQaR1TZuXrA zsgYc5dQEp=nY<;yN@brUHU@Z%t+u`R9>)w0vpti;snU7aW1ndp=-vfx@U8N<&34oi!nh_fY@wK*njKk9NvhB6)$Yy*!x2^5rJK z-Ed1>C#SHA+zS$L?UjIQ^uZLC&)9`>SE`L=nZ_~@fQ$73XkPFrgJN@Jxu5lJjabi? zh_!Et*oD4QjaWk(+A2>`ZGn8}$eU7_FK~PU8t7F!c_@Wha&J0_c9EQ&p+;|A2D@3V z3dFD|l~Xg>7@3;JdSlc+&$LIaZA-Wp$$~6)i%d9LO<6`-be1%?N0nod+6?&!eZv||iygHXv zwZ^bhOAL!!VtBEyNMpFAkj<0VT#Bwl?47wS-{uyt&@{HcSDQI^JNa7Q*@7PePC0yCG&uRDTUu5EuL zx4=P4LMFz~nJtlC~uaXJuaiQ|mUtY7Z*1RO&NI7XlDO!S%|-z{h5pn$In zTPyo_j&a->^1jZ@7i^nQ1LK;}5`h`MbdA9HuIN#7<JFeUbtRxT_F!kobg=5$++VHlv)TE zwQRxfwH7)|xAmD?wM>|aUs@!}62G)a^h*3fiEzB_-SF)Wn~S3R4r^bm zC>DH&wJo0FAk9Wf5jE;Knu(?05_eiF=@Y5qFrIY+`WB&y+NB%IJeai+#zZ$`IFjbK(4h=54V-$OYtIXu)%=)n` znWIKzJc-^x(M>0@i>V}Dk?>jG+S)uKDrf3)rT`iJg;nLt`{lG14DOWn7-mpANxsZlAOa@$0P-BcR|LII^873*6p9|&i>O`UJnfp`Yjb} z0geDbg+H=-r!&}URDa?OmfJ;DhcbP%+DBH6iZj`BFw*3UXKM^O8Ftv6tNO#Mw=CRv z_<@5Tt36M7_-vMgVmXso5%m-sf4~rCN!2~yt@``&cN_Qa(dEWYVtIX40Wu?~K>fkz z4s2a@!w+G&cKD3^q|~tgXp3KG8EKv+o(3El-)k?q{ZC=dxLavGW=0Ha^O4c&M^=; z5R9%m7fTomMmwL+LQYmJ$6m~a;BljRMBllXJE3#8?0&S$ZF zhWu1_!UuRbWrrE8N#l7ju%2)UGm|fc^m2e(1IwZdE@1;$^5rJHl`2C%GZWM@Wm7FX zo|(~aYuQ_j6-Rf^W~bpP%PwUr@MydgibS#e$E9H0;^+l)*=T`h;}vWJNA_9sAP|b9 z_s(NCV7CV|c|VxJVb$+~JS&clTEOn*td0D-jtyhM=zxXnGJ^2%BDRvTkgQt5CZG+u zgq_KPa?n!NQ5G#_rO3kj1Y~tw#>UG}ma-7CZd=CsNdGb{>UMtP)hu{qKK4ba=q-3u z)U#!HY_DfmIfHO(nX+m*JHM|98+uX0wRP(cKd^nTFKysra#jQABUi8qDQ3*AY-SVXA6UWO?^bN)!cv84+Q6%RK79Ca z8`Q%hu@;-Ta8g6qw1O(1yoTkrQJ!mIZ9u7PD%Be5H`lNkfO`H)b_RO$)Jpc;@M0)E z=^E4_*o+;-R0XMn_)eu}YJBNKouI#$H)qtVj5?-s%YoOisuc1D1>$s&tFB}3h0)(~gL+h9RHEw$c zaI-L5VE@A#{9K1%NW;;kIHRP2jb>LyXEm_fh%?i!XYKj*U(1T?*;#C`l-D!t-OFHv z&BgXS+-L!i4F10&d3S`3#}xWD!iJ-Iy)=^$Z(f=cQgYr}_LbWVdMyJWF1?AhcbK#A zwm$y$Lj3JpyoKp&kf4Q!Q2%4ohp_b0C-^lG%@%T4A3gf`>sJj&HZ;xIN}5s`uB+Rh zN49Q4#GCM-iN~An{Qk<8O@tHMP~ZPe8xFLw@`>ku{zWvP5k3Ghr^+O>6XJSw2^+OD zU^OjzYvFtg59@Sn-$D-Bz?wHM{NkV6m*+$Vz+Bu9xr&ueI}oCQMIj-yYIuq5AIMjdTxdO)UM{-_`du2k5(8 zw~-Z-y9*P-zzzbMM2w=NI_i=W-9z4h%0%ZD*7(8ce@O=1)T|ydR{Keo6dXlyKt%G;_lPw32 zn$&~0=Sg;uql-^H&CbDancG=+q)yt-Iv_P~J1fHA-MpQ(!Qjcq{)~`imwar;QOEA^ z4rpSF<+^8}7cQ2MJj2Qh)p)_Z2~eRV)1!Jr9an>P_!$=c&4c#YUs!&8&{V_LMldA} zTER~C0S(&W=Twi*d0zGC`sY=Twmq+U^w;NgkG_8aQPwW`?JhlLOMR(wbp?lF^CD|N z6R*C=I#Ek6vioSdKlK_rO|q9+Y4&nP`&Pp00}b3dV9-uiQecG~@G?8U=o;Ek_VnVF z2}Q8@Sxgmq@@4iHYHQhUwv;WG{yl6gTPe@p!>)2%gYaV+*n{P2;9i!D+|IACvw_`; zSJ<@f_Lkz7mu#M1Pdpv8cHlug4m9eq;nqM&>=fPW3m`VOKvun~#^k+M72^h8V-MK< zSdhK+$S!ySS5p^GkgH#Z=vgKoeVr9RcYpnLw#!DjqkQoVET~I0-u3dzH`zSLvX*$) z6W&AR>b)>ST=KrXY;NcO1bI2~Ep|%B)R3S(XDHS7CMTX)uU!bxHW~K8IBoA^oeiYQ z=ikEQUnTGRE9+n61|>M`1n4Xm>b)>isR+n~GQi)4=08}T@-|xwo%Zv$*{SXn3!(&# zjNHdcSgM@4k6p*s$;12D*0gyhFE@5FZ0OsonB4geYYVb`_73ZbLcw?0neqCI--R#$ z^H{u%e5noh%GcgyCR;7PLH_X65TiYBX605}hY(}m)iC-Qlnzu|2axVy7`;^*`j1PLBP61wn<{4_H;H8Z8%iFkQ#5Bg6q?M=3)iP6Tkt%~d?_-mfq@lX1L&sV}bR zj~_y>V@sm*K4OBQZ*_lXJJmXq0&z^jpDaJDUdy654RHcZ>{~v@#9l0a{FwFEsgZKY zCoIba84kaX#6gLy=tG}?`_S61PuWX$YaTOAwdPl?$xWYO0xpa8JjkX|qj!9+8s%TG zL6CSuzkpB|Xi&a)5cA=YLm14(^36kRBtEwN5@rcYjo$wiJk}G4o_@<~-A&6RB{I;l zhwMb`AVb|pdYW46Xie>A?ZQJXO%3>9nby8odW*yIfE{Ol&F-N^q~4Q-d7LB1G_qt_ z`3>ugE=~W2<>%iFAw$|0=&Ig4(Bt;&x_5ko!y-4!YrloxIyL&tw=A0vuqWVFtoRD- ze}{&R)=Gs|H1}U@6&)#&_kGXoGbLU+wZOgTE}XhF%n4^o_>pHyubyAguakKP#_o~DKE8l3z0Jo* z690eV=e>h!dXhIcx5e~C%ATI`k5#-_o|D4Uy-kg)JV6hntKpUV3wb-aKEOTlk10GO zank-Jh2P0oL{-gZDzGWyefDqpgPW z9d;!cSV_U)R=t~;U_%U@$20k8s*s$;2Pbq(o}R^v(B5TPd|kI?AiuQ}(K0yTf|d0{ zJJtqr96S_98Mald(G# zjxl+zOfh*z?7brX{yltZ!-M=BRw(}%1TypFCqdr3T;saMSsfBk%Ps}b2H*`YRPTtv zu=8O|1g?@}LOch(yfDOz^GJwt3X$1Lfqkfjzi210THYGs6?!#gpzkrSre<5!MJ(ER z^7OWR8oK*zTmCmp+>Iq_;(lDhr)zj*_Z~C6?rTJT5~h~bP7U<-cKkGe%r8absj^=w zNa&L5O8L*(dL4#O0Zd^p!&s5!!Vg#vJ(=MH`o*=DhO9UmEaPy5tdmV0co2{O>cCG= zOvp3{|IfXB04`SE!C zs8Z2$yOD5Al`FdQr}Kz+u;^EtS!ODk3mLW%v`n7ggNM=7hdua3)YPb+s;NKqQ(!izF}F8jUsTr{JetaqL=P|{C#%6{J0+p_h_&`Kg5o0 zjh16h;CI5eQRd0{06 zFjd}Hsfs>V$;VBkVf0vSMx#u=TH=+q@;gkVW_&icL?un3a#EFAGgnk8RIs*<2NV8S z#k>5TbNPGKIK*?F+;}1{1JPeUk$*m6j-m{=7?c8D$rI);Dg4*|t;w*`u_y&`I+S=O zW*I2O8N!hiXXrNZm6^;SL%vkW^P}Ad^Gle$z}&4?*A2p6ULP8QX|PG=59Ramn0$`N zk`D}pLa<4`Ih5~#JR5zXl4lML3)C0O-;4LhBc&HdRE~Av(gyv7c4a|l=UP?@?|o01fK{#m^y+N zL!2!e!AJWa`5L`G-rDgEw9f(Z{Smwn1%4jE2NiBo?G;i?WEqDGQJE|7EtyWVG-)KC zje&b*B$iE={MSfc)>a)$_Els1(QUDskef73GZ~7b2d08=8Yt?LgGTXC4-`}zUwVTQ zXH#JrS`osdt@RM$foa+@E!U3Xr=GlaAY^WCjfO62mtUVy-jRYO1aWPJa^V=Bf2Lxg6x8`*NlQ!epNVN$nuin9 zSj(0zO(+kAU{zwe9ZozW4(=r0=3JlGDp&mkf_}i+p4bkQpXU?Pfb&XX8gTxam1Lj{iaiZtu>iRHkZ8xqrivn4SNI9n6bfYX$i2ApRUoMO3bBCi2^{9_`g_`br^ z`7HS3SDnr;){ktNdIk&@+=XxkAFZ=G%jeGEZAvr~)iKy8B$2DJomBr*lTl_Ey~u?C z)fDG|d}m^beNOf|6Kz~8=bp*G!DHH4{Q10(!A8o6VHL(Scqp)}PsQ@l^qm}gHqR-@ z@w+X99GKiffzG->nJ%#KY@XdIC&aMGsPzVANl3BT-k@4518V(I9HJND?Pv2r6>7PI znMyHPK+m*xEy5b7La43!6$r5Igx1JGy!SgSfuH>gA90NZEsL^p63=I8^2|v*IN|84 zUoKWZ!J*5bja*s*4IpRG3dr!F6%dL6I*Ap~h^>IRH0uP?=gQra_+U(+?8&@1ClJKC zO1FHd{=tDoUBg;8axxF4s!mkal%SbZU>2P>nP0#qKbH^soh_C0xZ0IjVUTqE@l)A! zF0cF@HD)p`H5i8Wo53vH$MR(4JUC}u^1bu;%GiOC{Rc55&gkXm!zPO5t^Anszh@$6&LbRq}N@@tMGXGBAy}3FM_JINshXRcgJJFMX@ivo5|MfNCq~TK)>D#t<_XX zj_0G1P4(xRsXPFUZrxN~@=Il+pHAiHv;N!23k4k$x^NYgEECu~v=R~x8W-|B*0$z^ z+uG5ba9O)n%4@3mS%Edz;7S-UHoP!Su+I1LpVho01q_2dvHv{P>RV%Zh7*J8?_g2n zV*WmDj0L|s!K9ABQaQecU&y|XZmr?>G1uMHX1=^=IwtZadGBjz-H2Y?9Mv@apXO#Kvf<)wj=P@Jo}l@W2s7*>5Hf%4;rx^}9*laS30I$8j@x zCE}ar%;e=dGgm$~Q)%VtwJ?wS$WgVBD(&UmT7D*G%`3IAssi%+T3!GFl|2hZu%kE& z_qZfJ3gw5hV2;GIDrdvw-6ZR0^ZvGq?IHaYCyav7)YWnbw#S0Fe>N{2iFv2It|UC5 z6|V!^S?#QipMd)YAZ`1OcfvSOTJw@G@VzIh^uc=lIo{VD!WW2>oyUdbp$A1?(gGG% z{}#wg=I~Ht+!TkrX%0_i56SK?iHxub?=M+NTOnQ%O67oLiTxuSw;>zeFq2ooPg@u0 zEj*SH6eKROB%uo-$H+v3GVq^rbQl$y=YwsA32bu&Xh#WBt40}N>aZ61tLQW*aqTdF zG9D!E9E1I-#11G9tpc`^Pm6F5N%XB`n$hhlo+`8c-cSaLj4(a-1_RW$tymaN!J5*6 zdYPg+c&N?dP`Y|E$NTY#7K>awGI~LI;bx#0;tsf(0y3a+OdUiB#VLc>q4aTNlbI>< z<4gHP=^H+4f`BC)0yz1}eSWWOSS<3pDS=1Idt4HcrKdVTy~7&(K$UrQl~_X57SMWb zo6AR}B({c@zMacU&rrgih5~)u%4pUKT-~II)oiq)m$YbQ#iVOXU^tc9Y7z4SCYOJ{ zjISvJXP~`c62g0MHIxgBfeWXPKuN&Cx*I4lUFC)&DCC!qfR$XBgdr!G#ic1u9OIc+ zh0v|Tsi%TV3`F6RZQ9jv29v3#JLsmtaF|KzY%ErvAogWR-$G0ur`<(?D%jgaP%jNY zk_GoP7{hJl&Vh;PnKR22vlM??jv$U3fGeHlhGCVHBZR6Fn_7GHKwxq!{s9{iHxV0!!q|S95p-Y-(W9B*0GpfU&~Px?H&tvjNB3l=*F^c5 zn)xnI=>I%Ddf*e{Ac$jCYo4xkIrJZ_JsCyFnEQIUh7PZkhgK8BhS_T!+*GIm@eNr?Adm=Q zZx$QXHKA1NFsntgm`6T%**sMPmsKIUowE6=P2LVuQqy)Cm=#N4)S0cI&wKM}= z!WD!Mqaod%p!P_&Au2i`8sHYB_Rw#AGXylocwq+$dlBkI=feTrOA8V?5gEN^h8&=_ zl}tJ$CM@Dw(Fy7{ni6xYwJVxbWU9&x4_rosKp_wPG0<_MgC=1x%S;Y3HE3=GM=~=D zs*Z`J3)rdcZ-!2WU zXahSJ@Uie#6A<*F2A&izWS~l$zlU znBm-Fr~v7_M$K?RTth;ZSOr+nw$L#}=SKFI~Vfwm|hr0i`10X55p3BU}SO&ZVRg*-+Tl11S7odyOrS z>@_RCPQynEF$kuuV=a8_Qt&viaMgH~lm$1f zg*c9J);e2k0aLYZuM68Ov=(rkmd6yJ56uB}9fexoV++D}GzG9AD6s`rBwtv4j4BSy zVWf#g55&t6QSg6jybw_b|2M=kz)R<-BC$Fcdy?QDEKX#Btfxr<9UD7H(4C z6oY<2&~DAA`veF^K-bb*i+)fe>lEOSUl$l&fDeB8=n@_br%>3Lnw=DIR&H!T=W9vN zFuXyi&)TY@LKH_*Zam1qc2GIc{zEwXWBD%)Atb0KNSuFo;3yg((^X?Nh#8Qr`1JCM z%ccd>Fb)l38oa_ZCSD6HkOaQ=O{=!TH24T60`m*gUmf%-fa8c-IOhO)kBIR!w2hNM zhea(7&4Ddk|@?~+{%Nc zv5L*Z2WWiYB_{~zMP!WXS;#%O799ZBDuG2KIM{SHXDQyJBcp5x#5my65aWFoCUEjb zT7OU0Sf`sFT7=V2p55G>hY$>7O~YfMTC(PaGOOysN3orpYUY@k_lAV^_*b1UH%u{% zgoJev0UU1Y!EZd5VEFMMf1d+Jasl}5AfJh4gPt>J;j^~=(=*cVhS4vq>myh`%dzf3 z*usoQ4kQ^aH5H>B@{Oy(1mxOb*2`a`28x(Tm~&XS)u3V&oz@q8ED1Gq9YCi8WSdJ7 z_9`%Kabm9yzG9r(A*m^>MGYDh4cQ#nY*t`6a{pdFl8D5um3jiu>l*#)#%mZn4sTQt zrnj{OhcWP)jn_i;mV>tv^#%hS7Z}l3ToY;aRBsgA)L*?7;BAL)rx35Z^lK4bU(>I2 zbL2k#+J?qyJqwz|#|^AKdWwvx!5}?m21E2%%Ytp`b1v~@xv>GvA`9zzUbu~p=~;qs zqhkH~Bj$3Ee*GG+h5Gd~ycX!!5Am9>U-#iPPrtr~*IfO&3$Ho)^&zyItzS3dHB-Ot zz^j|IE*`eF;T?7|-c4tPu@_Ut#Fp|-^ucV~TkNECsJB>8&tPw{mY%Suo9K!Ar#H~k z>@9ZFGrhNHqI&RjY-O4`=P8BLIJw|n5;4S6NtT~%AY0izftIBHLkh@S6cfnMp=?DS zDD~ny&@`FwO)6m6Y4yW_J2iQney6Nm&NC(geYjD$MR(8O`cht9#R9#F+WYxnczn3^ z8CQ~039=8l-m2cog79z%$ef@POTFJ-4Nz;B(la3C<-X;-BbEZ>t%FmC>_KvHlkSSN zLTW8(5?0e5HBB5=L*Wc`5k1u=B`R*f#ZL-byl-sP2-2#N4QRwkW+fQ_D7Ph{&O`lM zReH#-v_(M%N$pBo6Dns1g}3F$tyGf=Q^{={;<+EqS|mVXn(*p<2PPzVs|>>zN-7AY#n&0U4fSI* zgK4pKhUwn#M7yfSE)JeK9Kjki8p}>n0dnm%X}HDaXe3=E{vqv^_*c?Djif);b4Y(J z`I5s4N&r}Zc-%qN1cf#O85CW`fxy|JxD9-O zZ4w|8rYLbr7#9AS$u%1TeRw7PGjSx5ZgwW0S6!WBe$_(ta`^;w6@JnHNXW=F2Tw(y zJ>__aG)}8-!yAvf$rp|+pIYqDClaY@B15uLa3fRNH?*%a|2uy$XpoF~hJhr9V9*Zb zM52kE0KovSes8o6+(}HpDd{jXOo|wyz18`b@pgKOco0NPr7%@dM|l+S2KZ1(phhv} zcf~dnnH8`P62r=YtLo*X56_65Wv8QVE{I@>c-OvN7`?~!jo{ppGw8= zb~A8V>Y65Uiyy*6xy9?Re%i1gC}`xZCiq>gb<41g06)0QUIqWWB~Mz#&x)PbV^wm; zDt=}xX;uZPa|HhvPUlT%;QfBb{V0l((`V5qsc zvsrdu!?R`H^?X$O{c6UKQ%f+GK=8Gu1ERjMBk>u&A}AcOj{C3Y1LX_XLu`L0_g>Hc z#&<83Pepjocnt9O5#CPsh*XUhph|R)DF2vy6s#3C;f?^4Cl9RQQ#CA_YsU=hn#D0# z)Le@$Wy}3H@O?ytCvW7(#fk9Ujj=5^*1ATPJW=v`jUCw)$BbQfM7(K&Q*&|bqJ!7+ zHG(f@a?2z9G*8G6h1wHXBrDeO*C@C4e%{+*<{;<6$N2zRe=9=hk=^|+-piSx^3Pe% zhs$ZV@#P5CM41!h#@n&Yb@cZ>5Fcm?RbJ602FRIrAV5QvZux%Born!lMTg6e?u@lQ zKt6C+b9ub?b(kr-#o_Y)yPJ!B@`vVP|I6<{iRh*1vf+=-C|z=YGfMv-zJo0G*bkR4 zKFn{zpkMR|e*j~g6~(z7l^P(cw(^yym{|Ns2GudLjuh@@um??{Zk^12s}-tfp>&7uMq)2k_dd^GPx zK9jSB(G@Qv&J+Xn!ESyY9z*x=v)Q8PANFwE<<}&=Z}9$cDLLj1UJA*j)dwxP1jT$@ z{RZ!-1tgTdV;7MBdP50FfFYey2}lAH?f53IWVnc|W-qvOvOM!GUKlw&_gp`R~+$I?+!U8!N?+1{VYvKX}m1=O&sS3pCpmuXBTaoK9 z{dSxCkrHMuA|I%JgS$G6kMJX@WRsg3fa6?&KZF!1gBsL&{3;I}Aats4yXiN2NKsVv z>XN7=Jh|%I7NqdSuD4%(0}<4>2J9!mH5P-1)cM$ewJRQ?&4zfz^Y)K51=Q?{ zbv}LX%ZG-Bh-8Y1i(nKsxK<{VZ>Fem?Ie~y`gp8HWK&om+GiPm|l zvnkL6DL=(53Y;x3ew#lp&JJeCnz#9mF8QF{p&d~5=yQJH?4S!*#ZU%*34&-?58&!n zOEUvE0?4v=_}%G~;2z4Xf+k;X>=x?Y1NrVd`~Ys3_{+QeX58BggMiec1pT!oOCI=4 zE`1MiA!fAkJ^l`3lcTHO=Q|y=>Yw=$uZZ*Wx{nk;D^Fg+N=#Z-mi+i5L<9X%UfYr9 zXx@f3aO}MOZ{mOQ<=X3bo!IX3;m|{FH1u~qCw^EkTOA9e1A?UG5hnVFjfyf$r(^vd-7A^UMxQ%5VqOQPg z<~OSLymQm@&qp75`B^#YZd|jvO1^Wq=%1f}PAbqLX9-L!SYTec_B=6#y&}IqPt3sM z;`7B7#~=C%rc4)W{Xftug5*~*ryb3Mm>zAd#_kqYCkW{Ns=yZ6Vd&E4nzzGrs^Q0CKzF_9|SrGqH-#4+ZYU)ytkU z3PLz)QML zTyuh60UDOU6G~p3&}-`l$Sil#hLRY$1`f@WcO& zaVW%k*+GSX%jAiodlt=x+qACu&KcArB>k)4X&OIph-dJ`D>uX4|B+H=Gpp z;JPNFw5A>+?P$jcdu|Ej^Q)3^>cwI&3AUo1#!Zo0QLhbsNI>e}lCM?cN03i7jvWGw zqiX!<FS_6zRF2nkylC~mcOFxtzJ=} z_WZ!*#Jg%^5Mc)RVLr{`SwW{>08-$t#CZh}m$q@h_^6Rmj!hkKKEZOrA&-4!wbKuO zqjMU08Lj;YNl3#~NWnb}`&mt3K5fgZwGh870mmfGh;VFB$q%jum9i;lRb{BbL=Lu^ zXfRXsG=NVNZq5|^3HjqWSeH`ZISqN^IS5Hlf$R@C?VK2N3csWH0^B==t!p~1NMQ^b zI%N}dm7$;`M?rU>7YN{S*^S}q1-cT+QyotO0owA7rvcst@OBzRNFYEQ1?c6rO!yTj zxZ(sLz-FxP1QpRJ`j7~LG-Ex6v)qX>fJCUnE#YoVOf^d2E}xlFX0TocoUu5T2tt(^ z4oFn`fM6MnwsHq2$~Oorn#Yhw>*7?L7ic=7uV^ENeCzNE<37hVEs3SrGjFJFQ(~*vC?M|XwD*lAr@iHJ>DhL;!UW7*jrg>2u51Mc^=RKhq z9!W7gC^rZ^&R02V^pK_SNQ&c;M57m*a7lzh40=)vEAE-Dsq9*Q(z;X#n-E*xt7?&=+-a^&ErnFwtu{O5&G{hf}0}Dky z$F*7~6p8|ltFiUdubyF_&u$YTYsBxt6zu%@u*lHBcuMG;fI*TVL{b+q5o&+YVX3`b z4{ny!`_LY2%G*KIF#ND*j2*08Jg}{msRTQsQ7D82S=i$0roWhYgi#`3dT3xh80f$w zw2*m-L1R-4=(s^Uj^&I#bfZWTr-iWF0?ZG@6^t%`7^8q^VHIRPwiAwtb zl7bTI>ez7Ds1PF*q>39-0;!|}yBtnhX`J$!bWwn4ntRj5#IPGP7~zI=TV@;`BjiIp zH0TH-R)t>rAjk%V`l!u4I`k4pD-gwpGTuL^hMbB*;Mf@|<_(@8U`2ES`ZXr~`Y-?@ zkOXrX^B?$u99X*PbeKLit+BzfO`?bv3?fpwF${#T#SxGp5h>;%Zr^kTsSk)NBdG=o zxapCM6-7(%bUaP`q19H;%JkS`i`=kUZB>rqW@Oo`ZL&QL9W+goo2RLRrYXXsW7AYE z#0b=nrPYjuf}Dv}Q0d7rM4F`{5J}aO4M9wS_++z{j(|c$O<<*TWcD^Fc2?=lBojhz zGihkTQkn{K8^dXurP9KH#3-^&oTNsi>eZBnldc*>I4KUS<2QuB?-c9E%ad*UVTeCj z%^bH+#SOZpFH01rypb^NhUh8e_CabwO_r;(MbJh1mtC_1MV})oPMdx(%V}$M7^aiQ z9v8zNAtA5J5;#6ZOyMp)uG2nrVF5AfCzd&C>V&})3c*w#?wjCHDOdx z&5$xH1U_iV&2|vXb98p566-iovx*$B85K={27sNLy->U798)pQR zkPJGMRs~h7iEd!h$_>;)9CQQJP%44OA5SQy#(Ij;yr7jFWkFlY52k>RX%(4vs8Wk?oMeMsTV zz~#X}I|B;Y@_mudxFpmZ*oNh~05|(B<{>0M& zm))fl_|_%OxcrTM&vRVX|VC zPy^=I+=P%pL`g!M^((bMRwYBee^PG;u+*qKl

      +t`yWLV;v=wX`<;BB2Hvsl2R5EEskFlF?uM- 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 G?fpN@0#o$> delta 116631 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 diff --git a/wasm_for_tests/tx_write.wasm b/wasm_for_tests/tx_write.wasm index 048f3a46dbec13661b8b9437916ecb5437f262df..73939497a32d2ed21912ae74cc6efca70318e248 100755 GIT binary patch delta 112717 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 delta 113560 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%0AfIOMbJM|QI9+M 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 delta 106429 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 diff --git a/wasm_for_tests/vp_eval.wasm b/wasm_for_tests/vp_eval.wasm index bfab45916fec91d4b815c264725123e54bd67de1..eae4a94d2dd584451f55d49fe8bc68b746a54225 100755 GIT binary patch delta 124670 zcmdSCdw?8OoyS{ss=KGBdwQlbc}|{HodhQDghv7s2&sX*OdtslFROyex{5Oq2u5UG zpa%#LmB;8rD{92(B8hIIqlr#bRwsfQ6eO&uSr;)XLR7%0pizO`&-YYyPfsAMT=$<# zm_Cm>bsoR-d!66;om1Oh9KYkw<9nN3Z>VdA~WmsW@a=ubZyxaW}fD3CFii zS+M-0}HfOHM`kwEEW?i^%W6%4C9`APb>>PU5Ks`r>zGonD z{jd#g*UsGVw|g|ZZqy3b?e5vrGBLB!S-TCS1S0-zoO=+%@-gJUueENDVuSr@T?Y6{j8<>fX_F#n~<!R`KP!u=Bvm_Zqe9 zh25sZH&eW9sjl7e)3(a4bBCAhv)=gGs8Y7_OmFm)>*@_k`zgJl+(YClgKFZ8Enb|F zsbuU+GN>#ru`jNuIJlxN6)V@))O&PI2ac}kKwQ(P!8LU!#j0KEKf0nrM^|)6Gd9KR z>ghReBvAa1^DOLv68Q|ZeK71FJ8u+){(RmW1$zL~(|g`9GS;4N=idvrBySxx|974L z>ADzZPR|$48>)Ho!UN3iOIx`10?lr8!EfRge3hSN%QLSpDNa2$b8ve*?|<$2X-%lH zlg-o(g18B{RG`OH>3z)($eTTZ?p($5}#TvcRO9t-`)S-EyIDeCqO6=^` zzN1M}CHz4ed)_dS@&0{ebize%pzQxnM*A8XBr%CnNo zQ=XaS1vt*4@R7|u&u&`*a|u7Q5+2j@fzMiI^L7#keY=$ESTXMo%H|}vdY;O2e&(5u1???gF=6h$jyLT?U_wz1HeCO}) zt0&yp^Zd7Fi>J^0cAJ{$`1Xy0&NJV6&bU20AOG%1WA<<8dEtSMI2gIJ>%nQB`Q`g} z?%4OIl>5P*cl|K$x*K=){^+BE=JKDM&C4J8$u8r5c;`7kea6u0=?BK~`}zYD`29Eg z`>_KPVwSZJGRlEY2^xDLbRzVsG9A&RSY5Hgg$|G*#?@HK5INM7(NM_{X)2>yr_frB zR4esqL@X;`d8IdLrCO;Ni(08xDsHZfYNa9`wNkBATD?9VQxWa0FT^aI!nDN; zWYYOKQxMfiEJ<70z*yboF&1j*3@apW=19rA7&Zoi{!4lP0u+H~s0;P~jaf9@jJd z&o_;^-Hb*L@zb3py1k@uDk41H;phFjVt3C2fBuTw{h=oJxSs8YS3|%r9?rUHUTB!o z^YjZNdrE(OUsBNz{`!)NPOh!!oqwxTbl&r-=+n=i>C%&5zYzE2KZwsi(n4hy9El6Q z+v_%?qt28&rRTBd>Ob@~_YwE@sM~duo=0ym?n_#nUDIOpym6BzqenfLHv49#Ts0b9 znRY+rc1L4}yT?WIGiZyqNB@~|X*~LI#{DwE?RDKK4;&1SFZBjanZSX_gotLbUtqE*A41&bVtEujM4l?TmFJZ^(|^@a^G#+8KZWN z*FdAMHN_(>4vcijOGkR#ppgz47-@4n(xL7$jr8ha?!VIxBi(xRG*6Ce$Z49R$A-Io z@wktR?ipeG-!#%~R2Ab#RjN2HIylO`{^)vw+IrTv4AgVUX!qQ#fY_Y(Q$0<;9oh4V zKV*6qJ~z7WkE7iNs{Zg;TQk5uF8c0RcR3vxG0wjK{c-MEK)7(c+oUe6nlMmsv~LT( z)wc!52ex2$;NDb%2S+2%axYi7;Vi&#PtV7`K0Z2pmV1V~D>`M7i`8pKzUh3YDyovTKcSoJTyC#G$NumGr4?cGN z_9Hu<{tE zN>2t?8C|r(Lhq^-?)Z2uAq^Bpe^d?8=U2Ebr`jeYa#UbY7px-319yrussxK~|H3mL z`uzQmJhA&p+kwbE8_K#P8bgpQGAOKagKFtJ=WKUk5!|}+B6l&WNZ(g3cHbG8@7~xq zv&-F>26sMusTmgSzsdclB;L2=X4h{5buRso#h@K=@P{~<_hFlPO&sirgG{8%zU7ho zMbica_$k1eT8I4dhZmJ@=ARpu)*uD>E#692nt!e>l;M}GARV=Bci$3y?4$0`VR}hx zH))t!B&IrwxAuMWqi)`FZ;ihHarY8vXU?7OY*Lrp>9&%3|DEn}?yY@aywjbjVgCFR zEQg1wp;XdL%Fo$`q9;G;&K%iof}uRh_zkuX>TYRRvAb{jr`$PaxZXpa@X)O52zyh^ z0?)3z%l)%Uiye2{_8+|4w*TVYw*BL`+V;=c8n=J#Hg~-@Ps8wl1-1AMFM&n60*eM7 zqC5&<{1$JGPTB7MYb^|v9mC*T+uf%Pec1VV_f3p?Sg$*W)Z$)u3aKl4-EqL+_Fi{_ zVDPywxIb5ayLW;qw??1c>CPBy$6XIlQyryxKWiIR|LoxZxYMm07`%NLZf6QK_@*zr zzf@&^?6VD@zuPu^^KRR4?{3@h_jkt)Kl2rLzsi2+Ywk3?@-_D}pvTAWaUVsS?0e7G z-7Ac{JNj+E`y@|)u*ZTi^-XsNNJpUy`*QcX@26x$$!UFi?sLygiqD9`@2K^@PkjfL zEhPTaUiW$Q);~nge%Jji5IFEX_au^iBOY+m?ySSN>~Ur}&U{C@d9forM0$$j%(Lli zM|iL{ec+a8{9DaQ(RB~HKck6@zwf?9K)m-Mw`^ND>tPHDRQ=Y6-FnZxt?!CQ+y`7c zNsVBNa0@^Q!@B!c{m5OQ@!#=ddV6bh=*RA9acX&V^?rA_d+XNQ_q!%}H|r0v?-uO4 z(Widm-bAyl|KqN4J@7DE@Tj{W`r)IlpCOg^v(diC+~HC2r|wjydj3y^ZlL62wx#bq zhOoG`Z{*M1(J0{2>#p(U_Fei5_iZV6ci+Az-0w-%k3N3T{o8D7mdVQ|WAaWOWLG>k z)?|p~eN%Aq`7p8h+}9QD*<(gU2Y&7Tkj{PiH=3XBzV@fUdH1u?+n;uQfd9Uy-PaQQ z{Ap&rJ1RWm&Z5le&$!>GOkcwxw=N_24gZsSO^S>U{*}52FMZy<)KLE67v1sAA{Y~H zV?~uhbKDH#MeY%I7>`FBaW_-l&Li##D*c3O=F#$aV=kK*zjPQK&JFiDmf@IiLmkGE za2vC1Yx%q}=TQDdW7hC?r)M?~?KZ6I_SWkyICS`UipEB#%vhe!OPQ{i{=(g8-L_a< z;Cm_47pTEhtI-;Z|4VMGNtH68zp~)A-_XT>pY8kiwD~u6b3)c!oD8bpQd}ndga&m- z)||m;9?F^@TI9MrXYL?9H*a=gQ~N{o+k%;@aAczm`_61M{{_UO5k+$*!Rw0V+S#uX zyZ1!yFf%+_xFL0XwBrFc*LU_1Q*T~1jqL48wf5~8YBDMH?@J>QQ-nVrX&!vlRY7j2 z_Z3^r9M`?AuYI)HHa!Edy@NlXZe8a>vWDm*`bocR}muZ}Y(6CARszSoX7 zzZP&7`er1-g}x~R%l*E2n_gL1vaj4-GN(ftkC)8En6Ao!Sr9FqWF}MQvPotM55GLg zut>FZGpp~B@t;0l#)Ofd9s&#sa<={pW1c-1n;)rd6G8 zoMlG;-_-c!S%Oh_bZE9|d)0ICjqjV&qaQ!)HbwW$HbbM`b4-!(_I-DbX{OG;pPpd) zVrJ)rccEuMSzb(8ecMhluQyEx{?hMEG0r^C;o1JbM9uTeNocZ5=9vpHB=p@m&wSTJ z?`<=yUUkoeCGPrY@qBaktA|q+<=yokKF$2z{bKZo)6BC3Po7Tyc1B|tnAancu3liC za4QDxEq!lYXxiK$;eC&E?Qx1FCqJ}eOJ=Rke{S(ZeS1Q4xqHHaS}8KBBmCd#Qi4Wf z+H$6Oqr3jgXPN8V`MX^ho@32O?SRpT3^rkK7fcOCfN;w|qAuJvkjR9+(N`9ki;9Qe zOFt)DUY^Dje{*!)Vl$N~SiRVc8hNvkMd;E}D%|71rqDB3T^DbUx)z(ax;OVdx!8Qh zbvN{VV5!;Y|6XEz39xJs2$%To)((F~xW zzr%Q2(6K<1juF96X2H?as+BMwW!d< z5>JIZWXW99K+0po0+|@@7VgV{o^AIxl(&|KQf8^2-5L}%xZU&^b#IDB*=PrNXu^%9 zW*hTY>yauNMKE-(8Aec?Yk1Lb1PoNp>>q}mRv>f8_|2=BE1tKvZaB^9B^o|uIzkC( zqD|3bXPec{y}#*Kik=kgrJX3=Vaoo>HfTlr+Obk_FMfRHZBmCF&S}?&0+=f)% z&&+btK~B}w1$BaV%CB!V#YF`-bc3?1#4ta#nBjYvc6i6+Sr(=Q<@ylgEVEx1j#`JB zmR)zH?_Ft;FicU9Evd8&r8Ab$n%=Z~RAwbzN>6v(@Ehe7g*rL_$uRezNN0$?JZMPe zmyF`?>;A&H`?mLIy=?E#ihIBCm3v?Q$GRW)J~c20|7-8lg7>A>-j`d=8b5tB@Y8e2 zwZOmh= zUb`lK?P|sk<`vgn3HA*_zI1|oZI!W;;l*RFB47TMk&hvl2b0jC>C>2BmUgQwu#9AjRsJAY4*Q)`|=;UV+T@%g2a4Dt0#Qd48^AIzatK zS*_GMrJ5j7@-!{8J4;RB5qB;1Lf{R47RG$W zE$zA37T*BV_4#oSS7+R^I(41jw4?oqd!u%Z&!=qTH6?z|d*`AZ7~At(3s!NE2tj{n zb5ae=KGRlK$NiKVuy|xSwiow*MFECf)8CYpzjRl974pP7PdfBeADmv)9i-sGc{^@d zZ*HxQyHYqs;XKxvVu!$6_VdVsQqHzdbXX|`w8PvoGN9Ng9=qUn*wp2%3;U_ALt~CJ zwI@NDtbWL|aEKuo4EJ+^Yv-&kU;_N%s53rtjNTbLXvSEo3(L+qYFZsnLnlBxXpk6j zXE<(n##);>fjpkQ(au7cS?8y(Bm@4&J4snXS>TabcV*C|p2oFZp;0t3)&}xzwGCnO zI#kd@4y854XO!3aO?vIhQUm$-Ih9@ld99^rA2HmaRv1JldmVXrUmD7906hRxLBK|0 z3#VYOiH?-1q7?OHV#pI{nh>slH{7myLE{AeGn`@6S1IMYc7F2MTp^EG_E)70^g+p3 z+Q+P_kbWtTvJ~D8g`3c&JOsYc61XR%5swwB&+nj`3 zy3$|5CEz0(5WDfMc&`YAEfokPN(riU*gKFX+o?s- z?rI+0P*)DrW_V=mt7L#n(`}K;JIuZCCW~;=B4dk)0)?ApIJ$F?i@x=GGr1|V2ti@O z=j}d!sV@4<>&*nWK5BV`nSYimNSwATRSq2qsneDq_~!=zXX9@l^?-3WayD*cvoqjT|aL6+z>(}k@hfsIws_=-nRe*OnSrC%mOH&H^lurIvdQ4^ZL24un%4L!=!^scz9)It&_G4x}krpAWxgi zB+9~j{+wN2sAH+_gPAsB#QCyW_Nhrcr`#gP~$ z4ZMTuC%mgev&Citq6ZWEks}kt^1Se~-Epm&j&-cJ!s0S=pPaE=05RdMG4?9DF^<*| z1%0QW%?7NE!}V?l#*bhG(Xlo*lGr30V+9>fx3LytC)t?n#;4iX7-IKP5igG=`am2V zNA!_6I-cmGadd*FWQ!a4!qIM*ftra^yi0>X`Bwxb1)JPpq8^VDzRhs9ffv!=-e_9N z6J(j8qgaT?$I<6mnT(60&k`LQN1q}(CXPN%baWhjlxRyFeT3+!IQjt5k#Tev^^S<6 z+ldZ~qxTW5v#a=Wcn@*bxOBo#w>kSE1HUlW>}3%C#ChIcrAza?EeeBqxTX@a7VcMw z4Pl!?f1bBbVe>q%U+-axz!GKg@EWTuI_HhqD)u4#sSgWUza*M!S@Ptx#bad7sc=*D zpF|0#OLNVARITNAzmfKl4(Bh%cS=xBBQmWqLD_6|PR+W}3Bm zuqA1sq-_^BNhb*VAGY+73cJT%#()`jygKB?ZDye2?MGEY+E%iSO43>(N|)!I-kNuI zop#hqyONiBZOZ^Sd1-geOZQaXiMCu~W|gg!Ho{W%XOSqW)oeEHCc5A ziElT0LWgnWI?LOO^UOm1^Kr$LZ>`K#U0tbb+po8gtIubsm@$ih(8VOi0JFtO%E<~e z>9A|tkG@hT11wn$R*ca@F;q*&@KrfRyH;;TaSD51?03S+VgC{ItocrUd1XItS66J4 z1_n8(jES5A*#=qP2^*||vfo_*TflBSkJ{9Bi&;2s z^B)<^ym-38y}u#R`z+&Xbl8CWPR~0Ym>s?GCRCO=Z!>R*T@gk`cfZYC7{}l9>TUnk zT^B6vFMQvOj9$FdT=lBAAO7bdb8ZHz4l=d$P`mSZczF}GxT+;6u;2fvqUn5F0OE_{|4Qf=@q zd`$HfF0k*GsQKGwS>_<5So~o0=5L$%Z2x`y+vY6yTYbOyw#l<|$2p0SQF^a=D6pkC zF)^G$Soh!(J3^2>ys4PUe?Bt|FtkQjoZvmee&3=Ky*Z|D%Lh|;x@P}xqlFt&!}|W% zo!a3ZU)=^XD12RAruZR~Z-UiG2@nq{w&n9bGWF5J?{$YpbLM)larZ^n%=IoK`0ZTp zUmKsjX^#`m4DY(xjwO2U$==xf0fJlR_uUDB0$^;pCPHCSY4 z*}p#Z=2wj+z1P>ipNbl8NVS-~Pe;e!kb1{Jy>-!-Z%EzX-E!iH=*{a>Em6m6uOa&S zYOgN(+)vD~rgXdmr18Q$G9w-(jht>07ct8g^Sok6Nnq1+ zBrK!_m;rF05yjw$Yq1XlY%r$O2OBGzXbj zr}fZjp++#i1O|cXyrJy?skjntat%8r;Kr>VT=*@hEyPyf>c=Vid5MB zh)E?SQo$fyLn`<>$O61Sy9U4Ex{%X{A{EQ>dyObX6rzgj1T=mu6S6?7^UKVr*oCsi zF0}0RE!4;n<0!$&5+I05#QQo*!>c)3g^E;0RC6Ge6r@rbndC_HbVIQ%FWZlDEVpd4 zuc{w|x-h8qO2e--?CPk4V-GtM9&$RdS6_583i^*RDuuh~%T-k7L8l&8YGZLHxh@0{O%EmPEDen@)Os%= z2ons&6PU@VkaW&xV^gSax58>j+G8`e`AUDtm8Dc6)zG9Bq!qWtA3*Hvs8>iIn`8U{ zSz@169xcW>%AAai-8XZbKDT}L&AvI&`I3ug&-(SY!ec&cq_tx{#Fl0*I_A@cN=F@g zL|SxHR2K$%g`Mu0Z=+zO!@6ks6K3q}M+Uw1NB_Mj}LDjja|I$)8BT88W1eo8ddl*r47_>vL{0fOpa zMYGf;Hmk5k7XRBd3*&z^1W>6Cq~QhO#!qS{l)bkKLF=)c7`oU#@$<$18B{6}U~we{ zjtC%m@QN;S4xmD7<&<^=#XVjTenQn_Lg<*l{X1YQuRpOYC+yNXLHy~b1HF^~)Ug}R zvk>A9yU;qT_CWx|l+Dt-fIY=q zC|^TlwiYc^YF&wdj5S73GwW!4Cuzgh<`y4g`^+x3jh9MiGj-Zs=HGU;fICCjg^=cl z*BeSKJWCR*oz|2Jk7yZ6u4X)il&uK}$hW*fbh z5y?$7Uf=CvZLd`$2N%$@EDK>tA)TT_eZ=C*E~fqT2*v4&;(O$ zX@Kp8Dh)urmIfFWd^;JIR|_49^rN67-QbwesjcQ8gw8%e$FGIXp#(ZLVFJ8OyYPVEXP6_dKq)gO69aXSmn0?88n+^x8j|g%>_18%MasSl5;& zwqlmJZduz?j?Oh`W-g|WJ2?|?CJo026$=4o0h-L1jAHyt63P$&U#~_ zuVlP28pDq=l`)J?#-J5!Jl-ek;xUZM#^b#-TPfR^lpRwo`>*wJ+0WK{9|z1!a~=n6 zqsw#Ni0Qj4qtE$;&?bf>Ka+zqo0u*goWYN?5I%lW^o5)^d0O)9uwK-&A+gU|3lX>Y zklgwzuWyJr?R%&Dv%W2P?;{!ai+yd)-dj_2;FBY~N8PVP*Nyak?Ebv(wWB=G)F;(G z($#m#Xz#9?bksBsB-q(Ef1G!maeuD2MntbGdBwgB6TJD{m=N6;aKlx1R4jR4_dYXp zI=dhj_Pp?wx^f+c0T(wDEfVU9wb~d6FRI{&Gawa%yN^{Ok@498e`TW#Ynn&rhe%2} zpGAGWmKgOAQhk`NTA2~DiB(xDx3v=JjUb11B{Gw`E@xis(^FzAiY=E^UN3y`#>SvLX;6wppygEF^gf^-?npPb5q5T`x<(96@a+&eisj4^^YD7Go1 zGf%RqVY=eQaC4?(mg|5%c+aWqN^7If>9O>_lpvlC>aBAPBhX>>?U@*3X+d^*+)S>V-2AlIsR z(hv&-J5M%0C085}7D%nJ#!uYzECPpHGV(E#h%l^qNznECdC04QAp#ggM4wqH0q+4W8froxcS|txsy3PU@wj|No;ZLe2 zSZ_8~6Z9fmP0&SozsD8Of9=hX5ME*FEvIn*$zByqrr(n+ku)oL97)R*OGA}Bo}}fL z>|~N`B{|y`9}5)c8VHXlq}C6Z8=71w9+$4 zT2@jTqa+KgWKA|!Ntr^2*}BFli5VRJsJg~0sVR&JeS(sjU*A6UmCTXEb+EdWj2V4d zJAcXiWJ2`dcsZ91wC{*H@7)wU_d{v%~?Ru92T!?b56IhQN&IoHnh!|PjGyj z)25UyajK1}#3{r$uQ!jNwauBUlr3>G=3}BNauS)G!8?&)N}F?nQntt(8&iqd#749^ zvk0cPIWv{AC1%)|N=zpkmDs2@=XiqYZO(DNSN2EQB9ryN zc4QK&$uL#m<88KI;tGTg>gWEiorZ4SpUwG+^+lr1sD##Ew6Y+ReuL{MmR zxE0DDXG;`pOeGqKjc-F2@%(I?gTdAxZ%eRMON*z z308dHZ*y>t_H%6x)(qdbC0NE2Qwb5R&|2ojZ1iT|8z+ebBRpCnQB?kKc#wgQ^&Agz z(8{q^*R?vs=2l`u#0TMP=m^?J(lSg1^5__B8~ROZuTBg8NlsH$rP}f$$cxsMs91Gj ze73poXRY2X(xBfq)jNBfESdBbvY?6T4VothK@!WoaQj zdms(Za$y^>G85f5-CH%o_EyUErF2>{gOkoUl6D5Tx+34@LQV?|Cvz1?qQe>9P{w(| z40OWo==vGnh>4rthbD^F%3QE$vMH(ao>JTNtljDR?hJH8UU=^u@1E$L^Stw4a@_q# z^Ss%dwXQqGyUaZM*XWb;y%FZw7otyw-tcJ3sa|vRPRrr#8(|=!a_4eni%GDnz}z)o2Kqh z)uyTYv$bjJ{(M~bVCR5P2JDcrm6dd+B9|F5Z8T(y3g&ceMY}` z*QTkvzcx+Xdu!9wy{|S+-9LOjdbrJ-5Uri>&8$w(w&yiH$43X|dqd9s)87V<=Ed4H zE#6#PBQ4%uo2JDN*QROlV{wa@)aAn&Af-LaF2~OMYwKlX57(w?=f7*ywDa@YH0}Jl zHcdOv{LPN+5{@fW+mYYu=GtR8~N2Yq~ffn7@F&hQpi!0c{}wuIiCXyX~)(pUH52EBOB>Tmva z@XUO-HqA)>t2WI@eo~ueB)_OlGmJQaE14#qjQp=j~k>{c(7J04ix1y%S-WleH&qb>id(SFdyu`cTeI_a{6-)YE)VkE0t?+eA zy-yB%Y6BLPX>i94nAvYV1k2m<`@W`S-Ug&W-=^2VvUK;y3hxF3Wr`&+(oh z_l+yPf^y%n%3Ga&aa-ypmzDDvU2R&3nm(7RkKS~-$wcc`d&Q{nbE!=AL0vVLRxC60 zI!O)pI{w8W@o4pGZ(KC+Hn_;9=7;1(a}Eansp;lW$A?i%># z4{tSx+|rey;XpN|H(~1<9v-v%e-s+Zn^^)RCN!_~*#tPn1>QLY`C=UvDtdC> zIm@{oZ_e}MN;a5zUa-_3KEvrU!P_**^(Od#6mB%Z8x?Lc!KKlk&&8_rzu!KxXF%R? zbxCx_VXl*U{dwN;<$-G=aGrD8?Y=g3Z#Ka@wFH(Ml;Z>!T5%emZ3vfxXG-+gR7zRCRwJ3OGIyD*8DfkHFqhbi7kY>*Em>5xEn8x;9aaa z?HmUq(SQ)WK@(v;e>#>hguh|@HSjlzzi~XDKsb@V5`Q!Jo6O&F`~^H4LpX~+)_TEw z{zelY!QV9gj_2=0{!Zd=4u3;KryQI?WG)345T454S;UtRwh^}S_fP!2j=#6#WpyCO z9?2vIUis&{@{;0S4Ea{Y7npD!!iBh??wVPVr)%v^WZD_AH<9HNHNb>iMfM+WO^wR{ zBdh>X*G6yj8!D57DMl!w!%)R_b6w+)Y|ja=Muy&em;5lpUL30Dj?-O7mtn{)%e9BD zIqs}UH0YeF0RuYgoD$2Hrs$Iwcq7Zrjaj*$I-YS^aH0TlgI2cq1R5-dKPEUVbz*3;qbY)A$m^eKdQ>bKr zT|!f6`Dn-d?5pGuXEE!Ahifu?Wo)#I!FUi&`RVWveHEGPrg8y(m+IF%_y#uDroKhAAV&@~iF37?G6XfCx6WhEmdwyoY@Ej6 za1Hje7`x1l(uDR=HwO#ay`V`}06W=Q77P3jGVessAo_3|J&WiM<0wnd@V}Wb3jC9% z0i3uhMm)6heSdFe?37>EsfUe}aaZmr@RECkIB^%}itY!4y@&CA-Sx(BM4p zpq+I(Zk=`a*6Dr_=GD%Y^_+~Un8)8mWq!&Z1oxh=Iy zz#KeGc2^+5Egs?;%smGnS zvpQe~<@vcC{&*;xeP3KH*8BCk2#P&l>e0zD0I)k1pEDg+=E!LR8bjqATZM;lKs2_? z*aj>ZECI@ZTPk8aRuvmezSJa_4CqTBz-Auq=dOHor*`Mug4b@4um{O#N3TJWDu!<4 z*g`he&PLEls!P+`)Lz`cB+}yz%%QDVn=J8AX+hu&Ql3aO6@BEg^u)3>Vu7h%r!eG8 zNrEi|;TOqP+18oD&XTd#ZYtVfO12u?U9=X;&DT9B{sh3(-u2>Rxv~BF8`f{=-qPRYUI+h^Pk0~=Z?eiiP#0i9wK5(cx0-!yhWeA6 zwwC6KXXvGvNOgdU9cN4L8--`L(& znUC^~tH8M-{$#MCG#RQwVCVh7ALh?pTQY)oZCP4Fy5ltt2EvXy5Z|eA1@5#dUNM@Y zmwQDN3V7(zBb+9w%noEg`IPQR0++ddr_8e;`of#M;pLRpRhIR+YfHIBS2A=QS<{!iE@Rw{2 zk2s86`XLwCvCFoWY~bnJEO1vi2t_bVtNI?O>cZC9t44nY0kD^jOUTpuTiHDw@pem$ zQrsokTg@_HnL~#lu<8B6+PP*wlUxt00p^J%TXk6BI4?&3r-Dt{t^A?CDRxSI_WbS>!*jI+vO;2J#0ME#d|!!GQF zm5HNB6|%Eu8$&p=3n&>J^Hq*q`1KX0r5AcL^Sr|{&Lc^0MPu=s=6Q!mC##dY+-T-M zd!xz~g&noAWKM>|(2C`Gsv4F;ljwsiC#vtoNEyGUJv`W{Eo)^jWdUuqtX`)iWEv~P z3#`zRVt_YB3MjF|B1flTY_G&Q_8LR0JTK5A$YbCUQ)48y{U*tzVYXW7yXyAa<8G@z z>@nF+gXKv_KH$Qy5Du3APK%E>#AV7b(Q2WZ0^$W)vncCcw%FHQX%_>7v-03XT+N9{ z_W2DWSi8W{BByMd9JJ5@FYNk55++fe7bLfI3x#X7=jz({*b5!B@Nv-<8@;h*_}w_@ z#VVVraPuSa`E)ciP$TpL_=N4e1Q41lH}=ZqP|{&91T{R3}6YUqIZl^CT1sGG-wxuL9psfdn(0=d}b zR)mu^j;tE``YIam9OO~e7R5m+TZJUIU(~F)u{O-8I1VGtq89^0s(2ec$B!@**p>0_ zOxiEwy2HI@CqY0WGQMpiEMzG{g^<%^1rzK(HOl*3rN&!s6|j$K37dOcw0CwI!5Cdd zCfuX-`Rt-{HCl&12fi*oY5CjdCO62O{fJM?M82cJ0^PjcOe@8W>)&1bXW9(+NF77E2>!cJaZjecF;w# zMxR`>M#p|4O3^w!rW6=F8*VYR91m4$xTtGYaycGyiK(SLKrXooxg13-75cD5Qxeet zeM>CD@1uxC_|U zfLM+fR*6_9TUt53qg)}DxgwT^m>`<`IWe)wDH>w2CuPT5uZ}^)QmQ2u3ICWVjv|{G zRkC6Gv_dQuS}6mqmn9Z9r3VqqWJ@fAmU+FI{Ja>y!E@P6w0bTr@lQmQv7L`4J{^>R zE~-CvM82M21rH~!Vp3F10 zUlMo~V+}|xX8d1hg+(A1zXenDbE*T5A*t_v6SVQMsrM_ieVyli*M6W%9i*GArmz#v za1L;X*AiWJaxy|YRyQj09M)H>aaqlUoEnRzYL-1xQb5u`HVds;Z%)=kQX^RA**nBe zHush5nBSPwXaPzL!boTbRx+9wwdBOhKub;jYr2uuI>4SLRqI55T1;jXwIj;2Vq)DL zoairMwY(MXyJTxH%}V70R`5LQXEY{U1#HiO6-zaNxZ7r-Z3%oafMeCEOMs0h@B>WX z99hts+EeEi7?$OTSWuJapHC*Z#Om9E&prp^ajP=Bm{k9GD?h$xSE8|nZVpZ$dRZH;iN#u& zSQlV~T)TwF>TRYJT{PN^i@tK1moLkBEjL8InIn!?v`a!yTX4E7eZbmJoJ~0NkwMg> zZ8$iw)thQju^)<(DN@9VNJa*LwKJTb*TFIwoz@Op;NdNPd1&P|_MbXResw(rj+34g zd$v_Dd>>Y)4c2wjRDhBT^SUn61u*#Ek!`}XE(117#7P$W#$~Z@!aCecfL|ue1O*04 z6eTPj6o??=dy(*Hx+4}9j>8KJP3p_8LNr9eWDXi}jV`|vUBo_(S3pydqky(l$FmX! z2<|K&KyHbuDZoB<@wNCa^=~#=@&e{cd^@;YjOCiNhLsSj+M&vPC)W-acz=cy;MYpv z2iPNc$k%I1xX+0J!1Bf_Xr;IG!>_|gNk26IYwQ6HI!~6qcLS;Obq*8Y!RZ$?1R;l3 zbJP8))rrs|Zl*t_n%+zLG=Fv_ZSfpKARLow{fsWF)bMq8AI%2hha~aVwOCtsHpmQf zodQCL95`U#=HQ$!|2tnwFr<>WFItHnV}J?*Am5?~j*Vb<3}oyhaVyMijOnEm7r7q0 zg;#E%Tx|h$s?mas<*91!#L$*}`f6~OZNFLs4cke?xL-{$mWunP9Wooi6e?P{!vyHN zW&sPHKA<(4G3iX6rqW0kmI{p~trz4ntohNv$HsU?w>VqMDdzvHZl$QVY_THg*U)Oe zWN&?Gw_?$Lx<9>w3L)R{Db4d|R?}Ue$|?S7NgDUpWEf(0v4BDp+J%&)*uE6{l<%KX zeSI&>n@Rq>YFY;WI{)-aT6M(sekQ+&y6?uDx7-^UQ}bBA6^7gdH*N$Cb9O_i818cA zlr2`uYh1%?(Xu7x8)fby)GZG@8D|-XEi?|4PFL8*II)d!u!sU|LnbpD#ez+UrhK5v zHAH_$bB(w$A(prX+6+8pD#m{i4Bs;g%SSPcL9C*}B#!10Mm!>C(Uoe7oxWL8n06G8 z;8>!aLDoYFk7x#rRUV;h<-{Y9mQ^N^CQs;~sTY$Niq$9Pa|7IAfG@l}M;K~>D+UlW zQxW~l`z^Tlm9WUElVkN{EWWh*MjH*5E5e8F8ry0Su*RDMA{#^#Vu>qQ>BugZ#XTS5 z(2+PlrEAwgQ$Mv_e%1yqgCTDK_Xe=C248ECFwH%8g)t?z9yAq2W?#I^5R#-hJC1^Q z7wV_oWr2`!2o>+bAzr-8u4XH=Zx^{0+Lv-5*Ke^1QE)upsicvdZA22>Zz=oZST(|L zs%_xXtTu9S8|4L;o z6=qQ>z%H6#Uepz~c2F_{gdVnEDpccATz1izOw`tQ6%K3hgspUoC(r;-Y0oM|Rnq}d zE98c29-JC_6bP^LTaxn(w$6KG?WRr;*m||=gooE@Yvz1-jDgYbf9ek7NWDczHUosF z_9Vzr<&yltFEf$gnw1M+FJrPcT#U@JD`*zAv%xHiNbM{h1M|ufFULeZYN?_X^cT-w zGK(Vh81Pawm?vRp%<>asjy2At>|}~8P+Bqw41xy9Tlq$tb)XMd(F$g^zeM6XE17l% zQA@@5KzDA?5ZT(HRpzotWoo-Jmlo~<+Bm=20u38s1;_##lPKO2uWZY9L(onpmOss< zVJ-{sYwEQ93N@F_%w=JZ+UC7C89T?^S%Gf2Gk2jXPWx||pjn+)U^I}e~gs`9}J6slYY?VHuT(FXh zXQf|Oaf-7QQa58hM-klZs@xNe7u)hp4MV9%D;j>Q-b=(; z&+uDg3$Pt~g|&=bzSuQQ(5yr5sW2Zteh?RZIiQ=`1jrUX8$aO?wEaNcsbzgf%BpuJ zbgd#_lEsB3Q)$Qc)OD-~hJqJjMnDq0(3TYyz!^pC#b|Q`bUT&=(%c$ga~N-uW9=Hd zIH2g+_Hu-{lWzUFP>`MDvzyYz$9d>_2yn{TX}>% zKx{np#0&4YIX@w%V#NVg_p&ecMcG!oGP@AaiZ!%gO-Nq+ntjI337Yaw;<7GS=M66O zDVa%*Sx6ox>=J7qM^=T5bwWT50~+kGO;foH)^VEq8!*>UP~Ebp zI1JjRIxll5CK&TtcvZU$1x;JwB#p*#Q4H(?lHVG%)I2=EwZe9v!n)E}V^j<_7E!FM z`%Sw`MHGCzE_RJOP^aCCDYEaks@82eA%(W*D!RDmpP{a>ZrhSfs0`Twr|yD9gj4yO z!k<0ph_~dvG4@kA@gVF#ve6x7Z%pm&oPUp@CAw&%cY4QwFQoQ%#He)u2TmTRuqQb} z@8&Q~Y`%@5+`s}7k4SiFX9)&T^`WxN6;%+Dkd0egbs?(_zb@+P@`mw!A6D&rAVynB zd|1NP#0q#fpCD)~84@Q&$G_i2j8~rx5;aC~NeP@+ZsAV!^=f zm_Gsp%%bMY7bWh_P|KPeZeAXX*{&(v_Xj-l0zT^;jBbaYX-$C=HWcK=^r2U|TCVzP zTBan5F`T#b>aixM-us=z>NS+8+6O3I=%UsTA6xG7;o*_W zsG2tN;USw*uG&AC0c+SeIFi?UIa*3LMs^hcO{W)o3mC@<_Z5QIDBO>Gmcj#tpk3j? zLadBjll&9cNc;;E9@@>uUELYP!29pq`NWrXN8*@gSRN$ z(ir@U!flPgyA}2}23ITG-5C6H_aAN`N*9~^a)KmNv=6!v5lSkeC6Cw~8{7hmZ4_D67!p~OJ4eA7JdfXXay zzoGlKt}RD)d~?5J%hV*9cojLn{YA{w6YSGChUrcZmew?RbO-jTKzmJ#gE~;ALvSgT z316`TyH(^hFVlfuJs9twaAS!LkZuy9(c;xCqWOMFaV%audZH5eWRtV&MdvheH z8zVBmAa(KIENzac^e!yxTO%}0mo~JNW>)jbW<8nLfltOXBL3pY68wJiI#Eg1Ol@RH z+2Yg0Y0FCBB=Vrh1g70-;0rs$?Ph$#q5_{FhdqTq{aN+YiacY({Yuxxw&sTDj+?yU z4Z7E4cJtAmAt`+q zjIUU#qfk%m!;a*%%t#!&phJ{ay|dGZZP89%W$MI%VG7|E*BUE1e2Ll58b_^O!LdxG zV8EBWCS|@IZz0Z2}J##*&_oXN6lxo|z~D`EV1$mP682Bnh|Jj2gBmaXca!61s%_ z#@YU%U^aN<+iM!7X3>4h**;f#+{CW!^XwsE)tb(yT8i z;5T3sZe*EDX(+hqMobRvH{fsD_1W9A!Dv#67cie2O*0!-KQ2@qE;zK#9LkS321lNK ze(NTQ1KD_L^zfG~Shv&lFzm6c*tO+w0u`f!Ar#oX(ToC zZq(O9IOF>HS2v^*ul0&AX{{Uf39EAGFiY6|B1xM@u}Qg6FT*rtReiH42=LD?9#djW)0KLq7Ziv|0m^ z*`jk34z+Yefs<{IE2N%)>(Ef9*OY=vI8HWzdg$toY3LlMifZP4kd_#8 z@Xauw4?Dk=SjngLwfHVvK^CC%Z7phxAW!X*!CwNi*18y^5Vt#l{Ih=%P; zOdT~nz|LSDs)lYD6ekJR0H8KWQ1Bb!Nq)v90 zO9g9@S{(k;(fTCgPwxn(54^~y>Ec&Scq7J%Lg-yp&G?0*3^S0y7dBLBB?Iq;xHY~n z#ym`ytpbF>`*OVI2VDl8K(}_s(~*bN^QFOjcoKsNCi#s!{6z_WULP!CzO}JAy}Ek^ zvXY)zk@KRSDTphMmw^4@qn_{&!8IVV_Hi4+LaPT@uMFxV<4phT3IhrINuTYXQ%!%F z^f~^@S`l>!ch}vX+M0!U!rqz0x3fDtitJUkFv|!ob5sZ5^8;KyP!6m7QF|azE)+{<2D1L+Wlp!DmRi5z7*V?vP^1kCGhQTP)gv6?mMgl%v^O2fu9O-!e|i z5Zco+jbV4)nt=Rp{Cgk0!?ovS&IO^s8IZ%Cm%)rpp=jDEsR`aP|J}pfs=uHlPIdYwa{7#wQWhmLWWRYwe9h77!7S7(3H@Hq*f(E zwnm|q)dYB4PFxXNfgX!LUO`~V^RTjwX`K%%dz>->`BSY>(@iq~989R-03WLZEfP~E zvmd)G8h;8b7pt2;7CucF9^_H-6}bZ*HuFXCksaYwEHA_TM6C-K)+3_H=jnD6P1H_m z=_OUsI!(BZR0Y*c$VIt!G+sQK2bG)!Hp!S`!iPwnlc1d`>oW8hp(?0E-PrC{i?~hr z1)_);Zmy_YA9^F|+H1trO?ZPew;2xiz$k@+re;RzAgc-AuT-luRA<~xc!yHq$N_~+ zXr-k?xz3+t4UWy~F}_B!1X*`*tfqR$q5=??LRGO5Nw?*{D{e%^k{&F#Dqa*iu+=2& z5UWBs0n=pbCN|vXgp8mThQNeDXv@7DBcpH=J5J2GsDYCSa@-bY2fgI#4u1gyo8=EB z<5aezozHWTgY+8%QpWnPT#CVHEl~N@a`1MSG8pIj4eGYFbe8^&>N%Twnu2B41NS}? za0?I<&|z(F;?BtTU^ah4QB+PKT*lwI#24}R8VK}2k&D-55sm-(|A0mAXoYPm$Bkke z+|;TKZmNWlmInUR*j_hP;yPa630gTUZ^4;X$*mj@dursZm55ze`YuoPwcUn zqy^9hw(H^6b)n9#uEJc0xL-j4nJgt2{0^=m1hZw1yO!v)e39V|gs`#TY{E_T9V~z9 z!rg=?6CNgiq4IMb!8wFmFyBpAKIxT&`w3}CE-tF_Iz2+2PnE9>%EbFA-br{M-x2U} zyKsNr7JG*tQS)Vl{|*DaT!z3d?x_nm<*}$@1P-ou{nOwX!3}P_Oh27f<@n0XC`9;K zy&GLhN-sMYwF`l>bfX%;H0+5%m)I&^a1orz#41&>5a+Z}S?4#*a$GQ06?sWT4bdAu z?7e49P9{d=pG=2wfpoRN??3E~n}`K`8Hm_`=^Lr78tN+ru#Ibeo1!_9_b%uXo{g~M z8y9U3>LlJKbItP&q`~pSgv3z5IIvrY;~C=X<2cKMo=&=p^ja$(^m$C% zs|GA^O<^mS0}8d`@oZ{($#_ukxy@;RUZ=S%>IAu3DJlaE8cSh$;Y8$UP80((TUQ!^ z=2h@VAV&$U94&CN2CLQah2+?&Sr@S8h;Kp%I`Mf^OvE~X$`(cxtV(eyrr#1v(`G*> zF$#mzpa)6Q+<-I%4NrtCnOK_A???0OVX=U>LkL!Dp4etfNmFKKcIQeg{ja-`1^;+! zWH{Yl9Z%b89RuPBj6Nu=3;4=rGv_5@HLRH->-6Y)95sRwmIg-5V6DWWP795)Kcdx4 z;)oZxU@wJG`xFQ?b7HcaoBVmTc9K&_RIMm8NmOkt5Ja2v5k51F14|nSMkF?)9L_Qq zOja^+x#CtPhnoPJ&{GJvG^s6a2x!VfEYyO-Z;=p0zfa*Z1a>i@LKV*l92C#cYiNk7 z8>yQ5@GdHDQ`Kd&1x>{^vbnM3<48I`28`LvR~ziG?t!GJqcQL;z{QMg9gV(E9e{w% zDCVDAGJG>8SnMyuRD3;m09k>zRjBFnLK884eo z-p3_kyBDAGgFG$*=n^qw*|?nLVtPN@>h{)e0?BuJ#WzPc65=ma0$WNd7~f&ZT1{VP z8LKr@Drk&9=gy|~3SD98NqGwzshkoLs??{O-MGP0)<2XPkrw@|H)i zn|?y&Qc$THCDtTqv|<1zZ^amzIlrN#f-y89V>vvOIGr!hF&b@g2RVkTuW>t~bL$b2 zfYw;hQYH2WJ#G|eG5iU%jTW>p8w+d;4M41-jTW?p=>1#0=`0a}sy=F@Vdi2mL3G{$ z;ROBUTxm+rSo-G0n&=jF#4@T;vu@w&5~)cnh|Yk@QS|nX;`?+91Rbk%Tq9Cn77X+o zP-tm6xZmws7qa4U&q9|T-q4tzzn)B`WVyXs2~){Beyw)zsoq6bKE zFh@tJAOfI92`y6-Y-o_qki$8-!Ow}th*oi8ik)=1Sv2Uw*QH6;9>`UDfQxTpmloU4 zGO<`Wg$$M=m|EgpiJ7EN>nL56Btd>|?kpkinO)|mKtte)3@^z4D-?|OCGyyAV_=Bk z2I=+}`JsaISf~&z#{Yw05?;at2{xAH(qd1EfqK4gg-#W1|6Z(Zp?iM^*0zWtI3jgn zbo>|Hxs?;(wTK+Shr6p#F;&CDMElg<0CO){85Aam5H1d#B|blV-u_~oEr1*; zZItPNdy7_H`2TgXKd;4<`j~JKIqFj>5DU)B`!~C%5~E|zQn2zo83E2)iWu}4>*d8j z(MnfK{s!UC7{~hB8_5OvXx}e!2Rb?LucmynU(sYN&)bqggs|RhV+_E-E;YzkR^}(`NWz^TkS?&EcM!Ol8+~r+>pA`L&^~6t>2g#O2Y^bjb zKMLZa$yFBgmsc(Kmuv7fhWaj-RJ>>E2pZbYnCE;;p7BZ@?!YymP{!xqfO91FMb^+8h@h)&gO78dBO4!xDAK)9Kd zR4`V7L#v``FI?4_BWs$$I6}Kls@7+mGyc`q$M5 zpoAW5c>4Z>yYKkW-}o#~Topn=JvxP2tuI;$0fmd&H6^~92VB8OpDU7HyW^Vp!KnBF z=Vyh_wNJ9~6T82aJfJ;q_vF_u1e5TTp>qz~N_Fi(Nww^2D81RX+fWJ>_BWK; z74B{*jb6WgJ+}~z5vVc#$v%9=Yj<2*TI#o7TY7!_i+z7N^7*b`KlTIXnvy(f`cY|s z);%K4+OC2KcXm4*)GOaH8j59UkfD?E@dEmycdUs_RVNRC@81{%7+Uw&=rErS}8 zZx6h^uF@ZWh1!v!!GFDf$!mA`bgt|#rJL8ZpK%LA39l`!XuqlVmIu48|I_9ZuPMEr z+g!LQNPT^a|1Z2iBmM=I@=N{muPrUFEq{SOn)3fIdv610S5@Bsp0oF!nR8~&%$#}6 zOlFeoeKJWVZzLcjA-rWr2p}R*t;Kh&)?x;=Amw_kdImvFE48U_JFT=$|9@^xThwUP z1QnfF)TprrMVnS^V?`T$Y15YWkBa{9_xG%|_c@aU6y^4QKKFCUhgo~Cz0P`h*0Y}V ztmkdn$>yo?b0|-h@m60xe&K7k9{k~d9{Rv{9{jKWD80t2K3rqzyE^F%6+XlDC4SNT zva0rYkL+rVWriU&84qj3tS5MDSO?5@j}=PXrdo)sW*AFtG8ZVJ4v;gy~wA%KzF^#0?E;NSKn3jNxeF}-mO5ySeuJ_oBncUIUG zuhgcN4^ncZtH>(!#ZHv8jVz~Cw*AC=(Q$x4+U$SZho~Y4$|>LhP8i+cga9ly#h15Q zy^5Ejy=}Y{`s*&Q3b2M8;NTPcoHe!q?UeA+qIB&52_2@i5Im@KiqiUMf$E^;9Ba!t zY&pmCoQ=TLv2>OAx!@l*dY!_P=h9I@(QdkMr>`S2jwg@3J>S=#CjR)fZ0dJUt^s8v&M< z{FWKq61br9p!&q?PLnt7}Sx;Z4b>*gsg-8}ZS5<798;_yH~Ev+JS^LuoNXwtDe z^nm5lZl#X{~Qg(%f9&I%NwRKpU>vdNJs)q4W9M5z+!N>*S(VC0WF2&cy| z+3zdX!BO6FU76!iq5DT7>Ezqxr_6V*llQ}uq><|2@@mq_^YFc>HO^yb3OHWaQiyBP z$y4AF44ri7upbG1)&g?O6HF(sKwZq}l|#u` z`y4*T+UGt}E!G~;U;>h}_UVa@1@V>uFe1z#`a^}ig z6*^QhOF`9424IvEcIuvFbSw5V{W0h!kv>a`6ATa7ld&c11MKv;EC&F|%i-%J-eC#C z3>uJ|k77C?nUxnw^?A#I?sy!S=07AZ9A(Vtz*!C;ILhq;f>f3RL_lk0$Z~-4c}8J5 z&~&B)ea>{CySJ=P>$HbK2ciuGupVu|t={=Y0xYdPvW#P~B5?`g*Q9%LUT`+p&hYZr z>EKFe4VY=CQFrrDpVtRG&)gX38Hd7)de2IUu_Hdz)ar;s_&1I^K#Zk=P}Za^gFCOK zfA_ZkicG5>3)rj|aM39NdR0bYD3SCzeZY7e=i2o?r%A?z`~-bKt)&l8KR`rH&lKA+ zy-x@c{1mTSjR(!%FL{c-Je8i%nnusk7KwBO1K%b;_yC1=c(6=ox;Hd~dw4KE6*Kt^ z%w@<j(PXwhd2Vf;m#;0>(qfECEhOa`-YPRb&wxtk9tHHX zu2Z8RkLLnlW(}=!G+`Crosv7AwBHCWx}XX{4~M2nmIp$asTpmUliu}E67fkuMHz?8 z_>D7da<**?6_NkO*Vq2Q-Rh%2CL5g3m>Fz@5EKPR_K|DBUN^R{#=(A5N zB`ad{F`?DO;xMDrUP_j9+D1CIB5(wX3gJDTJ^RDqgfq;>U9Tmzz!r({08rodklQ~; zP+s;6iJ~kfuZ0j(;K#Q3$<_|h2F&=ivj}aA$EM~Ft*Sgy5J9*%xDqoXMY+n8M4;j? zj9%sjjq+)BtOpDVuAfM~^jnKX#->D!iCC5bo#?;0Gd&WRYcFdInV3{44*Mc!W|TX* z4ao10YPOh@q3uabx|bM+t4MbYZwH&Pwjf1FoMH+m%#>|&vW67Lj^s4bqr*~8W7%+? zsotXO=stX5+9H|%d|)Lk)?9z2v} zv%8@%kTVl61?i{A-IT5SNVo)N^V!cy;k_D_{zCYN%63G$7&7!ZCNfChih8jxEv%Ta zL?PoWGp~`vXh&bX(g}dpyJU?^PICz;Ftj~?Jd!`gK4)tw`@%=U8!wj~?Ov+w11wyu@rnHNvU;|2)J3`Bg+u00a)w&r za24kkR^vhX10<4@xlxrJYC6;Z9bTS&V_!J*OHceN%?{ihPOTAjQ*?isV9%aJvSuC4 z3erCm#%2Q_C&1iA4nUM=)BI1n;g?^UDKLs|_zkJ7cJ+xS_Ob7m2qlbASX`q~OwE?7 z!T*>S4)dLbUM5HvY1TJ^@&;x>Y(G|(bqZqd*0dD_=ySkB@8GTL zIY?P7km!xA-yJ5l=%&^$Zszr@R^k8T1j^Yy?*=4V-RjIwHbMGrGB#yreafbEm`4$v7K+jy~BBF^j|S2iwu; zx)|@jP8oB&F`ecbV<2u#?0@MOc{Jr=XZi&m$Au}K=^-AW|9XUd!~WAAITmXEk3|E*g^ePE@Y;~h zWMTF%bK&Tvn><<(hM%IQn(R!!#iO-A+;)a&e6==IgwlAeO0(3hT483irQ6x6JG=Zq zI5ycQ$^yT|&kha2+V!Qgue%;K3qR?~ZaxrBUu5h+!6x{iq&+ES6gmhIg2}T8>>PbJ zyeIA~_%nlfw<#jJvrqg=vJt_>zSpuy0GmH5G6N zLilCuk_m<;p5Jmc;{2$+5`2WZQ-a$7aOKx66S@+Bpu!4#cuyBA`&JsKlsjBdfuy!n ziXMz`Fp6=CLD75cOoD@soXKvn8vJ38u!XBZq4pSsgvp21d6J^)lSc6pADpmBxI(_@ zB!PJs*p-J;UG1uWl2(Pal{bQal+73ojPZXfI(2@ z>FS7D%m8=6VhX>Q@M0==lE>APn)V`ZmOKR)VB(8B4C)d4fur*$eGikqqwFU7DD(U( z_js7cYxOu?`fL@Z_8L8>hxl!YOTAvi^B&sZx=IDO&f8FgzfV_*d0_SFb{QjQAMn-B z($sD}-$d*KrQ0``K1xa?&Ik=U=|fSnTIs_Pvq1U?p{l@|MY>9hc$~0AWrrzul@q}O zAq4_~_k22Bwmug!8^-P+>H#MkfJhwjQDA z0z34B)6UM7m?{Yda`4D5%ATxFJB<6subu0r#r+e3&)B1?yxO%HmAJ;h${>%$-rbdP zrl%d=t1%6>#ntq8hX3aF4+Y!gJlm$!&OY*)@WQ8Xg-JDjj0>~bAT2U&uVca|;`dMW$1lo9H01A{P_vvtQ9}ckD>}QFH4shH- zvO^{2*@1SnQ6)Nc0DHg+<$(l`Jg>)UBBbp(!aXLc*l9A?{`2B$9BA1vkyMv5Dqw* z+}>oVP42*q?zMIpIp8NZ$Jzm;8afS*c(xxmYAd0I4^PUJiu5px`r9NL?d`U9=epP% zAq~KjtGchvt<|s&wn>)ZdSe;sVz)}R`cQbGp{M*wB_i!hkID%(F`i>XfSe-k z%yvH*o>k=owg+W?^o2vP5L7cAOv`xME;sSE(^ccIksyevi!SRGhuy8g!%W@SP?R%F znBcHUO;{RH>vfR6DE;(%9|}xZsuQ8iLAcjI3#JP9O&KkkDy)&&TW$#Iy4{^3pxl@) zQRrdwse1NXz!v*WDl$yeBrRrGJHM>_g$a%M=G9`qs|EYL#$EERAqo_0OM)k&jSlf8 zn7w0}(Wxd_>~u~dI7Nw*^hrdQ)uwZ=K~nlqg9f9KEyYo!Yn>*Kq`?lvJ*xfb;;cKM zyRxvkN*uRVs380d^&LVc@s@7@fAEU#h|hba@4i=g5nyA~M881}OVhqaNQ<7dQcdC! z=B#R$kgB2IxjbV!|@%KR+VI+0(xm zPR+x{0Vf4G85^5?aM)PFwdoYPK4-VAE(sIv+3wu^14Gh2CIxD`-ecVC!1-8ja_CPTB8 z))XrMI@_)24yOR4I~S0}c1%{|!g$#Yjdj`4`;d%(7dAn{eQ^#cZY0NC$Q2x8^gBZ1 zbGgG!$yjXw#?j7frXI~7QJ0Ak0M%VEeQoE7f|pK$Kzku=0HjryXCf^Z8S~PKY>!RUHLG8o2YT;W*u?ScFac8LVNV>q5vZx>K?4Ol05xYIt>% z?uf-aMR!os5~pQDunCbg+{d0WujoxaMyhRyka_Z>;_!tlk9*$4BT7ii)|ls1^eC#w zUg;w1?=U_`W+Ahfv&u2;Xt^ovjJy-2EWl9bDCZ?K0y;0@Y>b(QyJbaL)5_w8K@9Aj zgdhEdvLG{!TzD8E@+9kFwli~awYp%Fd(-1&4HQ3Qi|$Pc)YoV>d>*PxX+;U1E!Rj! zEZ0bW1{vyAd_|zCN#s|SGv|W*Q9q+aj!L($NjGtN<5b4RmJb^$Wy5Y8H2XU)9+!y! zqT*(0ds1=d6UTwUsfYt3Sju`hFgqn61HO^qI^FymVs|4o4y-%fbR8(soxbg}cMRI* zCg-)NodJs|;s_L6kQ;&>$6D-HbBF-1r{urHns;l+%*+Y=SEY5VVePDM@m~z=spj@% zLqtczT<^j8P$nlpX-~N^ZGw#s*`14{9B{nd3b&A)F0hrbq`x8Az~h#ghvZjM;&@z%-3tvz2Vu^+D$%n^_RmX;auX4#9^8|}BiqT3^(*=!+Afz>b z;5Dw+GpljE4kqNR!R08ZZSpW&ID-e~{I=PCl?;Sie76t~=_%eUOXai8Qdx3!B=Ix+n&Z*lDCwX{St@S^ z-ktnUAW#d)9e1LDW};N8th0M_vwpZ;KlI_kIfn->RJb!&R*Y0kk%z<zG7Z4wct%GjdAravnqyhc0Boo|eXF{nLnf5%u9*KDWvbcfh*%~d z$ue$}$kutm0kd-(70p9-^Zlq2jrd*7OfhfI0IZM&kqyBY%Hcpwp8xbzARnK-A$YD8 z*(0iW35`+dGw6{0`Weo>jjXE~2FaC4Ree^d*f#Gr;KgF=XtG)Xh`Q;*t3wYea&Y@_ zx#i)eK(ZBZo;}Sh6>l}B8VR~H{I=UZb4NE1#K3?^-7|ha6cCAsC?FyQp+njqlM45d z8x*yrP_}AN?8~OpU`_UqU*}$nUQrF;!(tAvq*8k7J=_@Da~n=a%};G_e%v^h?M`r+HMRri_y^gbQ`~wl$+Pd7G?f!@G zg>E)&YoqBqtqTIB^$+1;PRH5htOsNqfjTFo?c0v5g0?qUDf4z7+cz4k$Zg+zdS#;1 zSV=DAq}eF;pM3YzzN(#%>0{@HYVHV;cg|8bGey` zqp0p!)ilE!|0W9D# zXFiyH&^6~f9Pf~`9FA{jO*YXLcL>`&%X5ue1G|+4A|lVSHLwdpeR{lFMgVNYy1OS{ z4aZb4BXCk>I4RMpvQ%k?Q^@7zs%6}Y>feO^MDNt?}hz_Q8N6q<(Hl?Ppz0sgE_`o!EXP|BUwm&pn=%_VpCgvKql8X6N zCzDKY@Ct;#VS7~CkO;0Buas*Xe{hXk>0RSi7OrvF5)pk0N|4CpK|$AT$H}h#W;png ziCFX%sBdMJZY}kIgcD}JMQ&s98+30j`#%4K@~>%}f#<+Py!bV*X-vQ2maU~{u|5;k zoB(g_%SPhPFh&8AITT9--pz5$9Ouq3H$7vQ+PEcDO1jCyBM`@nb{)fzIE9=~9ul9N zBdG#B7C5Ttj&Y8na!`v~7;0=NBHAmT&lJEb1Sa~*Il65k+s3bn$k2&B1#j0APfOJW z@tXDqc*(SOZ7#lX61bSdny{`e30H6S*AIl34YMWb9Ax1#*)i-?lr_E;{)!GLAzw~D zpya_7;TAazN%mf1-c4}bk*gsv2b`c~r#j|t0#lDo-x^OSh>h0EUdbrj;^F8y*Tt}k zQ!FCmwWWSkf++V**FZ}PvaWB37oJb27SO5K9pX%oZEv|0T_x$vh=jI9XYx*VX21RI zaAKI_ofdLK2X>wDBz(;Fe>9pdF4W51SJSLeF2@;`HzFS2iB z;Qq!kcmJDnn9Hv$yWehsYgia`)ORTI!}I}nGzZ!!3(^Nzrv0KbVfsBDC*0#hTD(?3 z{W(NLZ8X9h^>tD|NVM!DG#mF%ZVc`(Z$&kxvpFRWE4Pcd-XW*+?EP&$eArr^-$UI+ z%e~+8dZ^oKPwe6CLD9oIc=SEIlgAT#sEcd!9`0lwup**VH`8OyBM+4`k~BG+w+7Q|#A>W5!;s;iE8fb8s=!{Op^Jg#Rq9}Y)rY~^u} zCbkj}WP868E-J6g4jjhKo8{-F=4b$N`E*)_RqO5Gibc>KO$YJ!QoEavcnfU9TqO+s zXRk)V#=XM)Dc(8BS9Jo*zeAX+P^aP@+9c_H@h*4Fsy~KVg^(y6P>TXkDWnu`O*iSziX%YfQf#^E(+->?gm&k0LmQZ`9dksgLtB{kriQ->LwA)CmAX`BKSE10Ep!XGbO1VFPlN$8 z+oTS#03{Ed%Iig3;D$w(5kTaPmStGw>hCZWz8_b^N2*J5b0@6c@@7sinm&8G<5oL# zS!hgOWQWIGtS!wo9XbAhEN*lmw6sKai5Gtz?GwPzX0}m2motmAx6wUs0}4&IobR>n z^prmrWgcqFd57ivfE>5XnovJkv0wqwElMadW)&VoAVp%dq{6c z`d|mIKGL}L?lv}Ip5@bOnn-CEN zD^d3$=bR2EkqQL_2dX7lXlo^&t=&@p^jhJNMiMo8XK3=}k~JtY5=Pw9LEIRcp<6G9 zn(=lfH}8?GZ*ZA==S>YxS#dWMR{=;Xq@A2wQRbPpzcc--ZyzdO#^r^WdUjmL5vtU2 ziQckT97kY4|HUQ@m>7*jq=w$~#+$bx<`Pp6-R?*UPmyrP5h{@F=3g3zTgulInT-@__!iRLgjVZj<3YlA+BPQO+-)~NqM&&mMGzl~ zkQS7>Tg$JFQg>_pwNYvovEBhg&5s> zI!60WT)aXZtZOI9-=X$s8uE8FxV`aYOjUjVFbmmk8=C)t-068|FLM=i3PKhB6z@Q& zA_(Q*=|M#ydW#Htprc6fP7idB&EM@%Av&N)Gv04zT;ot|c3()5l6fyGk#8mMMJ4zn z`I6^hle@dzG&n`^lfg|M`MVwVWwp*ltC=r$Or#2cQ$cz*J4da7c(pM0Z1|Hk@!5Ry zI>-%VOuReZpv5Z=peLR%6Ea!Jtfwx=7f3n2dq8Y;z?n2{?tk-vQo1_bbrc`GhUlZ# zgUE@Pd+l1AIiz|bACQWgBNZI9=FmN6R@H#NIq~#x_UnTp}W*XiIh-<*8hTOK6z*fRam0k2FgrfpA ztiO&t*c53eroqW%5E{WfP@)mMuQ4B5CXNNp1l9y&XrlV3Oa4Dn}W+Rk5zrF?WI^;FU+^-tVn-Qgi-!UE2aL%Sh9dPHoY z-5_XJV51Su9Pd2Z?P)$b-ogGF-VyIdmE?Fww&7jk@eX%7!@JS=LbRj>-jQv1cY(vZ z^nTzk+lt-EJVa|Udj+OxDl70$BV5`1>qsAF(-;L^j!n4D<{+DjaBTmi!!i8%3{k)piXxz)N8Jo}u><76A3<3_xQMI=t`M^9RcY6DRwgw>oV0PeP zeE8<<=#22OF#t-5P{7$CA4YDsKZ@6B8w}IWa~d{IQ_Hm^Zt2UG1E*Q!e9dy;G>e>X zS`M6Mk@H>4fzvE@pDID-x`KNqR)R-7QY&C`W z(%qKjeJX4?q6%?qaL)T_P8@9K%0M?Z?{?hm=em5Y*2uc@K^WaRdp2+c5A%$pfw$#7 z7{MUv1Qsz1vVG*P`nFS5oJhCUV`ydDniTPc5Gc1)sbk9F%@WK2dOxn)h)Jzlv)$(x zCeHyUVFIPoq?YO6F!$jwg|Pj_*U)`sU0S#9k1WPwDE5PS1>soS_Iq_hQMKTBA*sj{ z?r|7~Ovhvwz%xgL^mfbH)0Xo=a-QVCx|hc(_jo6d%iZH19?x`-cknoDkK*lb)vgOx zKH{#33%Oi9+|hNFLpNLkg14){T5JK7F2xo=DWp!evUo z;?qY+pL24rZ}q(f`(zrm*G);m2O;H1cXw@1OYtyF4#tv1DXl=_Nfhr}Hpr=)yzDjq zJN)vQij>g@e)qxr*>S@`)@+qK)5-0~;ooW?Jti{%WV`_D9k)bh+V$h<@Vt+bcfpQI zUa$or8d?oO?MOL6Zj+)qW#?$airtpch80|6Pl-0H5Z<5&XrYPlMgk0G+Aa=YrCLrK zS_pB>#@Zu}yCEI8(hQY0cGw%!>x3;bc&?t6!FUx63TPZbd5`t&IZXjN*^vK=PNy4PM!^; zF)VtMV3*6Ds3)CQJvO{Gh<>+BQ(=^D7E;J5s@sr4xCLA4J4Qd5<~GDQ&Rya{4Z6!( zdsi4eYd&rqHN@fDsc{3%L;e%1Mr1=Em>*MW`Ff#(w zec78kqUG`}waI*npWIX_ish|JnfyzXf(+Oq7;;>u6l8fS?Dgw~Pisqm2lXoP`a>jV zPZeiTP5+(8%iQC4czlL?RCJI_+~eQ#xRpm4EqsaR)MbB;N4wUbntqZ;d|6eSf`|;b zHju2DP_LTi(zdE3aHbTlriqukp%mKg)W%hb0nc&OAS^iFp5kXCD@@B^XixUO&S*l@ za;P&hBKaRaUDy>(oZAN-JdB4-G*uF==Kr+qN|;Z|B@K zZswoj)9YQjZ&z=0VY$39`+8rr4h-4X*B?Da@6W17D;az;8ogcvyct7@VIB2#Ge}=H zIuO0Rydir_5{;grG42mFM!D#^Sx0-#jTj!tY_)8lf=UkP{}_l~QSMc=9iV_wYK1Ca zF%+$(!9N;`l7)E3hJHw)vqiE-*od>g89bpw0(M_EGpr81b0lgk?@S%KF}t0zR@6i< zr4N1v@;+QL5(8v9OZd5rT-#2QLzjJ}ZfwAbz=MSm(NEw7KoCs_*@V~MNBj+GH z4=37q>GsC3&i*#Hb2ecDRy}+5c(kZIob4Kq5|WRMM-7s%k4KXW>hZ8n{x-+%7aC1H zt1q-)oVL(@apl5jbP2|3cKi#r^}4{cNMayeI0u3U%tCPnT(d@OrM)OWBTsPnLfr1t`D@Yi$Ko6>hq zMGKp<(vveGk(iD4N-$SShMhMd3a%}vU`sv8QgD^)#&GI`QZJS1;#xCZbj&NJ7!VL= z*e2?M@=!|#sYya$E@z78O&3+F+(5y98h|KoUuKlYo8rL_wVUEeGnrIquP?(9INnJ4 zna03HYzY=deu#O+_J|(PH-rQ;98YB!iTR|e&cnzLWj|>|Yn}lP@MAN#YlDpF3}#!h zrzr@ohYuuIUu8MPW-engxbJ-GxScVIC$iTqjgoPIDLOi=9>}>2feyr?f?|9B(&#iH z*RiG1nM3{jf}6bh<+@BrOvucRY~7Twj!F7|Vq5zeceP=427rk~)k9);;&^IGM$HoY<# z6)`8;*Ce`*yAhGWGP%;A34GZtIv*iZE4K0Misi5*ouHjA{NNL|Sl~fH8IY1%MnR|$ z<5@;QsHn{{3d(?h&oToebSzFqI z8{dJ_rPjk^b_`<((z0b=Tj7|shgYyubY~OO(fGD*t^JO*rDL$QiXV)bJb>m>^_|+? z59ny#A-gcT6gy9>1d)|xbWWsi#AXo^t?G6UJ1+5nLTS|^lRm} z?EA#Zs9fgtz^Z7R1(2q(SfahdHl-{z3*Q>w(neVhJb``!`XA!L@{;0c1<+BsoO~R zu8>}Vt5mU5kIp=7haMfLIIBlz8iq8jBWA~56D=E%tdnWj6M~3}MYJLtS{r>;IR4$W z(NlYtLt)}=y^(0c*3+UDlb!P>pqRD2*ch>ApXT@M)1V>~n$i6s=Tg$WgmFV>$?D8|zr);*#C61LnSQ^7$cEga{V^+A0iqQU<49ZHUdkcgOCKiB zi-}Pl5s_{+nQyndRh&!=q2WPr?I6l?2@sF-yvIEUw}mc3hFq$#Y31utov}%e>5Pp8 za26kUrMHH1KAsMCgvkcgLp*~JGiM8JksfN&oB|qrlXp1m5OF$X?+KITO6Nkn97sPF zI^QbbgzV7ZMA!`r4!%MuArmbi+#O-ERPVb(hy>~Fp}e87Ar8@*lO7Hc)05)nHLQA$ zgiQ|mWE>48Bjx&)&>6fO3zJ0e-wTt?07aG*+Dsfwx6F7H5`folj|Yn{F@~z_#x3X( zZ~@PIHKi~Qz(tP=?LjxFzx2&!bwg>$o&gDN!dttNa}*RaH*$ezAebgQCmN(e;nPq~ zHEtA|N4x6;fqtt96AFVVL)r^ecr?C%6PFjyjwxp_9+P58jz~ys?M{XjaSTfNLd5WJ za^E7n2W&(sUZfqf@cPE*Tbb=n-wO~I6Z3}JD>o9a#>M&oZbZ;BYA82qSe1olSr}Z@ zB*=mSHnm6N3pmlG$KQ0I3{)C*T^uxI^LMQYKsH zL-F}+Idy%KAB9DgU_S|EpUc13!77!?+$UzNR%9U@V(;-YnTgdJPr9fV zV`kJwp>$B(9}r3`{XwOe?U{%e>y#$Dm>sy&@(oEXq%oboiSzXdgzQ+(N7*$AWrdlDTp+}o^BvuKkUn?q%Dr(;6U^g^=4Jz*QSxpdeZ6Kz#? z_64OfzY0@K0EK>cd-Oy9-p`SP4Cso zCA`HLyA5?{&0<;2@hgU=YAIrIYU3(KrQf*qh&e%PJyN%=!vfd}Idu@EazqQ&ViP#1 zIVyFqcbeljCPbB5!j|RlY;~(fQd&b`Pb=7Z*Om82=ajE4HaFIJ0whEPAmMHCV!D@i#dY&jKvFMD5Mur~sqUMC9~8XV0IQj_c}xQ_&^`)e*5ymRaY~Sz<)#coVjI z22yg=9KWE=rEA=b$Bn+A%%yw0$*ZU{z2Gudx5oa-5`vWc_nfBf=jjKK@iz%ob0TlC zls=8Lcni)HvKl3pre`-qR+r^3patK%$y(dW;&h9pevqEk%KAQ8YsuPdStWJ93Ww6f zUf1}dm8D*VZHfnECsrVmVif;ui1gUgK@6x<<5BbE2vDb*j)v_L+%DBYEHpv%uYssv zl>sjvqPTisM7Oj!6d#Sq85Y|ebM-~G zn(^}D6Q>yKz5Qs~8K=7%)*_`YSSfh0zsBG}hIuk+WHJ>N&pmed93?t3%G$0`&5Ir3 zWgvgy)Y@zex0OGr@_Woe9A2dUTHX%wwyOTx8{Bmtwg-y;4T?H=$(t0#YBi-ZF?d_R zmZo*Q_Wh+-0?C+rRc+#r1v5BF&b`^w?uI%;`r2w>jBPbAcn4IC|HKMxqsxS@$XBUG1i<&O61b+wif%Bai3iXBE26>Jl7m1Fg4tf%(v81doIs zSQsX;>#T0iBe8>N1)Y*YI_k()Q_@BQo#(`F^_bn5@z59`!Nce1LK9|lW{AX#RN+X& zI38H6ely$w`^}ah@KBzE#B{<503t52D1d*MY|O)o_anS_x1l|j-p~)mf4n8T0P?EU zs0Dr9)1hW(iKY&Z!M1&cIr1xh2nWtwUl~c+M4SrwfRV3j-pc4y#VuTAi#KFvDrKVP zs)ylZsL#>G}ZJ>{%JSaKaYq>%&BeBC>E>9mNae8IvG zMDn#h3<2oDVa1v_F2WPL>e5|6uOJMHc799~ZN4k%Kl#X+^fPYaQgT#5H8lb6p;KYn zW(=6_@!fPS?Dm6jZ@YMFAvi&4+rYDfHz#ORBa996!Ejb1lc~Y_)_#mr%X&M;ze;PA z4Sn7@ih%G>$mS>?i&HaMO&18O5HMa~ZbFpHsHYso*sJor8hfOT!e# zfa+UpK??IghOrK2vt%3wIR$@l0{;Pj!qG$QYL;CfW>8SL{U@dI5 zvoHlKSMdfZES3#7RDr!(7!HRHH_6cYV(k~12gz&WDYOjO?L$SXw(ZXK51`qaENDc^ z8l?GEMLn!RNs)?o*5EuE%o=PEqjeshDzv6nprir+PK2cYAzI6U>Np3g-8#5xjhJ(s z7(81a#WG8^K3d(;`mjyLR;SiSt1DU`Moe_EnJtk0L};GHeK}0OghvgKT}#`}#q0>@ zUt~9O1TMxRO9};AquL@5^GC*Oj=)78hGW1iRM(2Uhso14?IEuak^i`?wa@5^>1Ncs z%jc8{&1@Z12x(k^38hCy9)Oq z8^>WxtIb#V-+}Wa7kjn1OnSzEk5~O+gERO&-HicpWYgS(ovaJDa2CYTJswzB{^QQZ za@=fi@lxCl&W8j~+0L898}RtJ4IraJw2ss*K!A}1geK^uDQ07tWXO%-i{USZoA{lK z`7i}zE=&QGBmL9PnPhoSypFclNrk%(AG75at>8|(_bnNKT!OkfO5BM)*ikWse_OV> zv>O>9mi#n(4&5Y$U)n_)bC6<((+uqFKBuI9_BWjf0}73yYM>v5FvuPx&_wPc5HPhf zV&Lblz_XVrf5Vr(tnt`vFK2F#R}{ZF7bQ;qBAx~6WXq{~PU#}5{0ymmlj8_B| zBtyPOC;<<7P?wbX32|Vrr#)A26fdLKjx1)%atoiVGVyYWsAu|ufKws>>jH{Q*>LJ^ zM72ls;H1kv+?urpM)r$;;2YQO^EHphZU^OdX@`-;6KbBgSzPM4Ez6#Tm(uN={} z7?^SB80QvbliSnJc*lXXb_H?JY&LL)n~AFz_r|ow@5mh6>9~T$*5HQ`F6Am4r;D zkoK%y>a|rz?Rmu%mpO0UdQgp*gJBGq^*0>Xt>M zQEfC0egS-nT(JH)SSLjOObh9nf=x9B&jTcTjJn!BYS}W`U1P-`qb}EBgN0Bs!JSo&=z5c2rU~|}P!n3a zfOHsg4hf+0K)1Gwi|5Ix0e}fY5jhbPzH$;{ucO7=JL4&NdKitb6EO^2W({8|Hlhv{ zFy9tG->vBe>EmS+v~NJEYs-S*Xw=X%>+Ld8kXpR7pdj=ReZ7?@;s6xKIx_&vPJ32N zJbVlv8Spz?yF2}2(l-XB4N(M+X6ymuuqLF=Rue*fxtZnP==xgyNYmg@GDp*@paQXz z!Vs9#j%0uXK!kY}&&r?$9_xW%XVq8ZF-HshN4(%m%<^#a3j7zWughpDCB)bmwW$|^ zKR^@AWkpsJVKrDY&kokadZ8aSr?&298e?Y4wJZ%4th3Hm%3kw2?lv{tuwIEDPwG?& z4(Othra0O(oUxkCW0YA$H?42>DLC zXpyBXbPuGSi;b6QqUttLZmt2Kr}gkLZlY}B93b<&M$Ju-=5782ap$bYC=iOFTc%{G zwi(2HHZcO0CP*zeiy6vuZD!bYs8=%vijBofh1Ay3hMy(V>a@+0fm8rsqcQ-nb$S3W zOO7mpUi3D2V^?FSuAX z4W6(Q(6n3iiSOl9Wb0KRhJ^UV=2#j|FWvg6dQQNVrqMWu59_oh*ZKKd=b+4iNZj{9 zg@M!U#IS?V7*Q)&pMxC7B_x)4i>YwyK!;T*j8kY|*XFqx+F=mu&Revg2>Atv%Ko#y z#iEAsmhBKDqmPNmo7IofJnvwR8$|T$n>#TYqJ}qt;DmayMzB+5$6(STv zS3Kib6k(L;e;a24m*=@*@P42#ESJQ{a^UAk9C+bYdYBikk#{F(ov6p!#a>-;Y+^67 zYg7yYCkF!j3NYZ#LiR$R#_asZo3Go~n%C##3>t(TVI_u8XcxWpwGLToT<3G&YB&c+ zb*854%y^~q`R3EQ^0geGyD61yDE&{R7=CbuY-*PNM>n<#M2FVBw>Zc5xex>#dM4hT zTxivHC(nw<-y=n->NvghXWd)Zzma=;%6D|@s-9bAzlzkZ1N)*u__?$vec;%f^X3|E ze_4Up_#yu#l{b0zyw`-Qr6QCBTSA6iKQRfm9wot6Dhaky^t|^lTRg#ydp~ld5XI#c z7$xZ&V*NG&HX3|Gk#Zrx=Fpyp9`-`)=1+`Y)DfDOpWq@ZOR0oSIQPMqVF>jD z_8?w}(l}nNIBdGa$lG2pwH9|quo0_B+?)Kd4RDVQu){`7T10KGt2qy1-40?%3~9m( zo{?=rH|L4{p*)WzvIAZix(E)Y1~;fpbMF#oUO%u>F|ekr#JG-WP+)PGsJnWCb4nc~ zgSzcuL7ZsB3+#%Bw0;w$MK=N3bYoHS9i$m+F=&E8X0{2^<0c2@vQq!9|7MpO@_hj% zupD6(>EcC&^l5@!GCpya1&Q7r?Q%v!_je_$^?sxa<_t=M?a8zBjxEYMql;ZyAQo8a zf~^tQkC{tb{g_U-dI&x|N*|l^J1IAywn`Xg+ncJKf0q^@{ds#F(qlm0{8>6#sec$5fnV z1r}&L#KqCm%mo%p6k_g*Kt&fQjH5akrVMTSBjo*Rw;^*ht&WFlZTXI zE`-Oey8(*?lb9OGg_woL%>_96g;(>6sP`HYDD7^QeJLGNT`a*02@A4HSL{wqTY|hO ztYJ7^8qyVrbeQnk8%ht_)o=c?t)GEpUCziJn`ZTk{}IWOnZ03aJB^1-3667)#%KLk zL{n=|(6Q5bnQB0lplaYeyZVByn95$Q6?!zg<_c7?BdCCM6B+4_pfRzv`zna<2p(|T z0v zm(cX(oDF(iuN9+7g0PhHUa; z0$n>LDw_W<@ODuuANI zWLD%Jro&Rr3R_#cT?&g8g>cV5sFYsJm)`Zr?f|h;lI+*E69m-@Vw}loXUdOh z+Bf4EFC^g3vbDo;bleldE}gOzQ=;BUouE4=f-5Fct}Q96o=8pb1mb9LuD|S?ilb-W zN^Rc?D?_PU;U~pLP=|F>wg)bViK`>9zNEyE^#xSXarahbI(#ruv%C+|N9Glq4fqiv z&kh;)`x3B&z9RMZ(EN&us4F;%`f@ho_uC8g5SuHnh*-B)krhA}#tQ}VxGU5R?Z#=K zmMwZ_RB1kFP&$s+pOtsRp?u)4$ZU1pzFW^#U+eo04JJpy+w7(N`*g6y*X_I*`PLfr zA@m-tAG<|8ufUzwS33PMR*6_$I)b-XQwTdo z&4(-lO*X)!?zbVM_flaMDFDbavZmVRz?x#M*##&a{*K(oY?A3bsmXgBlzoebb=p`c zmODuA^G*86wb5m_e-t;r_D(D0g$BR<@wg{o0J<7x0T~;}MG?8h#*4+oi|fI+kKsPJ8`C~)7_jg6*ez_zi;-yy!X8ixbK>FT-~w- z&x)=oe=B%vE$kC=SQ!lj+eh6T2tPYz3T+j7j|JCS87XilSzbLw!x5*brR|xQQZ8*F6#T5K-_MsO?=RfWqHGa(|@|s_ZUi`R!`ycMN zr@th+>~a70FJGc|_dWQMXiK>m$OYF%r!$c2uO*tq&g}A+Mn_3b+aCRdWbI7!kc0ko z_LS?Q%lYxH>!OFtkGo|*2S0u}?&LeOx4t5J;p47i`^yZeuKA7VgTjRCqbo^Xa((nd zl7rVrmkizhAFQyA%q43&y-zQDv!ypgXFdJ}P#$IhY}pZM0etF)XeV8M<}0I3kGso@ zU!pF*^W0$JzL6WFP37`!+0%YAdOgX#zZv~<`PjY{H$@9O${)-Yyj8ph;}{ho`2$R4A?LG?dVnD|F?fT`t|a+v#0$|^bWA$ zf!{H@W9#X>1ZKRwt74m$nJP&^!eca9s91&qOoB3p|biL zW3zzETR_mma{Zy~kNzNfde7W{vil^Zp6`UcZ+l_SQ1%WovzM^WAS?r+)PH6eddqAlAYP}{y2J9`M-J?{sZtJ(7RM=#q(*bq+o z1Z`k?P5WNvEXFdDX?3o|kj-@?a%u}%V>i6zZlB94<2w0w?~k5LjFCkjh|VCn@&nOm z*j4GwUiyLP%BB7~$1r`}^?*9n1hGbSmpYw7rh%#`dvzt8%pU$gwC>3@zBRhi*IX}; zPwqV6m6xPT0q{x*ZYbP|faW*u;^0fDMrCs5tFb0RRS&XPv+aKs{n8S6QWfd32F>kD zvy2C+$B3`}RkUuQVT;^XI6{i&&Y8S>X0xdeM!)<_*xsZIQ1}Usxrq16 zaXQh-6M*oANo~Gi>+H?1zjepX-E*_eTN*uA8W)fE>P$lTr>*7J+Px56aZmQe4@Or& z=*DkJda|hxMV~1@l6~(((LFWk%a}Yx4e!oA_Tgx8M>ns%**|_bnjGzw>YQ5=@rD9$ zKnKnmuegDI%w})4W?%HO0sO-tw5p;USCB__XMeGe<=C5jdS7&@(0*Wlv^1MLMx3|{ z_D7d@Vl9nEFnjC%=+$m9Ab_;Rpio6_;WX}w)}3ZxLRxe(m>h*re>Gbu{QXk7mo58f^xnb95%%IJQH!!~ zeKfkd9A@W#EPBzRN9+{L;wfo;NcQJW!L~lK>~1*czU;?$M_(5Z?*Dkc_IrKHXit61 z-~WWI{e6q)qR*C9_`w6wkJj7xeK&yt=Ni|y1JGoiShgo1&w&HM$i9_-9gPI4W6P)V z1_`HZ@SQhQBTTRVbo3`GyYw@8*_?=J!!)qG?U7GSEt3e|5jcm~a?J&;=eNJ_wFilU zr|RzdT=b&}>poI*Yg*?qtB%Mljo@wNPmgEEJ|7LZrJy!X8qL0;L(v}w(U%?w&dJ{Y zH_;7QypR2T`4^$VcW0Mru@Y#+>qGdX_gXY9A7y}uKio?RZ_cXEd^@suAf?Z z&l?Z0C(BL*sk%Js`{FGZ#i^;(f_Q7ZC0lSfni~FQS(eRnVS-PAIyxIQMzSmTa+Pkt zkfhG;l;iKQ5EG>$k8?M9N6E{zt9G9pc}K|0eM;=URnKn}mVq;c!_8?~XVfLMSiPb@%euFXb8MyQk?LsJr7R276 z1Xx^3C8-*^^&-R!wt~nP{U~H%5$7)`hoSZU%P22JNExorqx&&gc~BYZmHX5Hmv%~) zk4rXR0uL>$9vb~p3b(T40kwQk6JKl)|X%4u=*?xY_QJ;MLG zH5uQSq>LtD4#CghR7u-nfOzQL4K7h^IasiI*bNzOyT8A!rndMLwwl_63RQ#(C# z%Zbgwc~}(734e=xIdSV+ImV}4TAZF@HQ}^Mk*zEj?V^KJ;BG-4jQb(Ad^*|VH}0P< z5vw739Ui@yAoP*oq0W7$wd>3VdgvkyQU;~ViK%c%x35yKT)zh;gjX1f(U92N5|5q; z3Ih56oS-0xbtxYzpnys|CMaqxP~=LY92D|1X$J%yEzwaA4ZNcny)MOLim?IUzd7lW zn(1GZS)fBCK%#9tM#0RE#QajRVMZ4uu}o=A2RKy6y&@j}E%oqFu&h z1f~rgDxkyA3HShB5%aLKV^WBrDsAE`X+By{eJWldCI_oQVB!Kg5Nkw(mK6~wzz6R1 z1qPc-=XflxD4GK%nl_{Hpn^FJt}X2LkVK6^4?kNfH%8#|&_rQ3 z&u1Pi4g^1nM-0l)jZ3iW8nI24Nn;Wy#aEP!c5~%m%q@O2MPvwvEWl;pr@{px?tF>l zDToKH=?)9?&UzHuG4SYciF7#nSjHNSHz48o@@F{|?5b^U-|`#yFH*sj1n3qRh99K>(m{ z7IoNNy_CdC=iJi&L1B2jTQ!gU8-mwR#h`@ED9+W!VEVuG{3;#*KFW7XF$y3E&t3@! zcI%N;BjyQJrRh8e6&N%<^xzx_E^1frZ9;by3)GrxYerRLz++XDTGfZ%_qeL=)uNTg znLTw-3RD)YTdyoC)S1A&mYVB1n9|P?itJsc9~VwooCk_~c8vX@pE10he{u~Y!Ceww3lrHJh40%6oHo+h7>X2b>&U+o1uM%&}xcm zq$*@z{54l}hOOTFm5JP1@ zEJBDywp8|t@X&+G9)8tS_BFOVj*7MPFS)0tbSdn&1*Md;l0s0{OjF++(v|mP9u+smv**)Mr`q7F zsr4BhW7gn<$p+U{jnEa%4X_cbZF~>QNTUSGF`KyE3nTOxb6Wbjl7OY((NgW@*g4sH zO&W3O-2_adN%0zw5Su%|F28(}3Z7-V{}Pt*EYdj+28%B09f=!FjCYeWApnYiIgr+q z&1`#(c(^gCUg_xE{x4n^56?9E(V_x`@zmm?8x!e=P4}ypHAW{ijbjurh$iAiUEp+} znxGpEw$KP(7}%jU1Z%oCfb2&M7%M$6*fRBj%XDZEfFlInMVxRv0NMesX9p1N^=$y@V~Ic)W8`xpdC;`DZjaow-dG_VyS`U>f1>{>zL_B6OjQzVF74y20PYl+9o4Zj*>?F8Xc zUp&ny8)z9NJyJ~^8dZ=Dk-*a|MREzI6<3m)mJ2i3ycl-0=BG}#l2M%ZeByLhuC>(G z<-Esk3U&2%>0+4);_YxfuvFb__w~5WB9+Xlf1AXgYw|ciH+c3D=sslV;(f zRf`v@c-=%?DxTD#bBx=GxEOPGZhyyA_66<(ZHiGr1f|hYji^9{!MDr4a-oAt7AJp| zS7Es?a7L3L&B2hLo2bBguAe$N!!%Dl82Xnkfl88GECHS-D!4Mcx7IO{t`MElt#8z~ zK3-3KC(X(-L!R}T8O@qNApG_-lb!kMj$hGoh_#>{X;ktg;Miau1vo2YXy}2n-sV z|KD8F7dPd&^$RTNZjj;^Skm>?Ct~gYzog4X8vehsq}lf8FX^~g(YTHP?_k`n#^J(6reM*DM`4$mT%z*Be~6WM*Oh@;bd zgKxs8fc;74sM;t;pgP9f(D>w~)`J_gxzm+P=|T6U*V7?B@jEuZ+BlJ2Qyl**Fjf3d zls^58IF9312u_0TtLK+b)PK-qUl`!#RH_>ww7D^G5b<%|$~O{+tr9QdF}$%+lOLqs zYLp>AS=8e{NleI5Vl7L_Pj2uPJOG{7H4Qom|!8W*>nMUI1V&e>00A8p3>&Ezuc;lsw zY0oT9d1i50oVcfEvQm7bCdo6-U>2JjxHk=;`0>SwMJIz@nF$f(;1!mWyFo5HApn zSDnB{4q>wnvogsyaU}ihq)lO8sjt$*#W+nCj1wTp4tzHnZuZ*<(?Cp;mVk}1a*?%v0|ZTHX^ox`2K4bn)^ou; z?h2`{aaSsN5_e^g_pO<3m@f8jSmRnSM(psTLN`9u2A zJg5(y2=yUjS5-V20;HV49lQFdP`8c%b+tbq>YIKl)Yo{ZtK>;gHz=J1^`?XRrdYpq z9KS)GKqv(KhN+dz$IhjIt&HS*Tts6$o{AH;9&DQVe_MmotadVOV0J6Ab}@!bl~Bt> zXS*7|;2c6MjJT?^TrD2GjNPi%C`FK_3~3vQ5$S%BM3L!9 z4l?#4GCdhLhtmh%z$d-ww4pvMBH(Lijv8>M68>(ctF<9BvX2{Sss5v~-E`j|j;*PN zQ5lqA$W1KQt3#7wx|HibKtOVvlNfV_6L+I11j6r#hqn!8FvjDvDfNhz7Zh|MuDyG; z7;cqL#YFwO+GjEzNXDVt)x>1rxDuIQ62HDNk;XgA33hYF>Ds2Ur<}8~@rXEtMR7y% z9%zqwkvi{oOh_Bz=F#R7T}kvEX5HQ2T1gsWAef1GOyAAWYYgGCYN4_oCU%iZv{&b9 zGr=t1>G4=>Y=~7|byX7pxCePVig-f2Ya5gE=3b>}WOA($`{LL|Vv_MI=dKyrlW@B+ ziX^)+VmB8whIoD@GG@ha_Vl6oFjVf)`%aL-XuQQ0Es9d6g zT1ud?tdGyl0jz)83ypkR>=kx6_hir~lYG+>JNqS2ti)R1&UdI`ailiIfSCUa7 zDiRGR<+eBT>THv8t1i%k-=I?|)3hh)Bk?F-5;T$!BArJ@j5AhosiKyEGmbN+yH1e% z$yXxf9ytZIUU|yRQ6*2J*0^Los+4=AZEsv@dt=V&O7hSzSxVZJ1%k)~K#l7h137=x z(^Wd@qplJWMd_nMc#nqNe*%bW24d-58q(VdC@m19Y0N>~uP?(QEgr;3f*pvjHW&{} z%h(2ERYqeujMX+T=z$Exko-|P35bUc#40Vh#SmEKKumYv`GaUG`^Y2F!t6^wjD{Dp z>{XT}g=olVeO(qRhu$t@!AiFFpQ7L;l{ATshukDv&P~!hGwK0 zRGji5&c=}2Ay7x;S$a;$A!DjE#u+qf5)i}aZ7uuW|B6=ku_m?39JFfLM}HKpTE8SV z)ap3_#+(S5lO=+2o7M;2LiYY|MZ+&sSbd<{Bg93{?x1RKW}e&zR8!AX1yr+y@@oR> zEbvN*#f~PRRt>18o#Ai}c6gxDzijWTJEl0f+dO0L`}J3MENd>Ahpo9z2JPI**vh_- z51_Ms&Up)|*KGrlnV&zQEpbz&bD1=oVC%TB74Skeh_q>-^MDm+V75j$!S%>J zm*7E`P=5Q37s_2@fH_;347p7J*!Hhuw{7%LUqAb>O!fez6R1_}(~`8~irz5oh?k&F z<)|bpA!w&7(`<}eq3UH&(Q&?xA=R_}yOMVJl(~ca2{!=p5>g9vWu`7*3m`$yzGTKx zX{mH6ZDLelkHo7kfuppLGIW5ag1iXJ#55r}gfjzL+76O7a_;g)*gB9q{NSg|mD@wldM9A1OXdQ8ZHK#-|7 zXzEeJ=P$xE^;+z%tjhF+__V%3%xWmru~q7-R7654%&lhB%mE!3Fxdyrt+}vQ3grPJ zN}xXVJQ%4eHkND$ESXsgvfjp>Aar3eR`6~k7oj`HhUuJg6XuNv{m{<7xJ}R*#D91Q z$a8%#-SJNI6~MkG*pjYe_RWBXzcQW)>a&5+(MpM5dlfYa3fPlO2iG>FFeCHKWD-zex>_uTHaEE4{s_kEXE`^@=P5VmiRKzKJs5b>+U?kCW{76 zRdvAp74^mt5|~-5gFZ@}ZcxCbpgTWHb5{Ldhe z*~KtHG-c>uP0CV(S0-pgJ(nthZLPpT@W(Cjv`1p=aemB7s(EyhRM}Y-I3&_`W^NS} z%Ta7xY@x?;EJkQA=I7SlxJ|R8!s6}0hjKQLF`6^~2wuBUDFv`!Vn9JE>(d zsp-H*5$0QQF#sj$?sBrIR_b922BqY{;6Y1;iHgl?juMdud>TeHLt#ZmOQ*RdaGIbv zm>mc^MwiRNeZHN%7Vo3miZ@TN6+g|%%1(=OvrV-_Xr1l#AD2aGyd&ixF*&xU4`76r z?tO@n^{LnTsTrBM7*V@9Nhr%s5}>U~*6^8nhL)K#gxkZhM=$4ahP;w=%M5>H(*|PX zBm=Rr%!al|G-!lqP?2?jHfZ5XVS7ecW@l7cEey-pAcZ+qZ#vkM*dka1!`yEOV44U_ zbi@}|ojD2=o;`w-Ni{#2u$Ss!lA>M$%e(=M91>UoK!t8l!2H8cV*NCy)8@&K5lyj! zIx8nz(Xtx5j6#!e?InNPlX{6cl}@&N8FR8>gc&R$JO7r2AH^h@S!7(ozn!zpVD|lv zj)`G^rK%bIr?=rBksjQUO?Gyi)uh)?h#|Pis~^Lb6Z34HSK>DRlPFkjU(|JgCfX?Be0_$VbDU|6YDl|?e<-?skj@pLL zF}Rm-ULn(i{{(HraaxJpl}>BFXuOww}mCKX?3>#NO{4sJkpNMkb+6^JpM2KK{P)14JUF5{)BQ~4S8 zCdMyAgcC&+)#{*nyHBMLqc)wk`5);9DpY_VgOoDjooN_N>d`s0iSVm7uV~y4;Ed~I zn{fOkY>c)dqR%dcysIu+wAxDZYnxx0IJ^@p6HBCDyZRbSn-Y5^@lt7LsacwK_J^A| zPfYT_lz~xWEXj)PCnK2HG!$QvOBmQoSnfK7Y;P>ivqYDwPOrY0iPJXFA1{UoH{^k6 z15-ps`?<=-azUYS;BlyU=qxkZx$8-(%_#(4e0$-H26JYsPzWHM1x;VFcff~XsW4g z4Sz0gcq+^u;pAy5{2)Iw(9$?6d@9aW_<|;ji3IK;k-$Su#pBdCUxQCJJ3J^eEQ>m8 zcBZkGvYHzV2w|R_3ZF5kAou91V6{-;_o2e?5>ug?fW-+_Nckz_Lv0AK<}=A!;G%!P zX06WkYc(X|E{o6LyrPyHXVUGMKcz;4o3aEN>rn$MwWzUCO9=1_G0%iK;u5<`yiuq~ zcg-GdmDXO54r|&;kg8VWjXLP9k|cSRQ{PMGBRU}U{Uo;(*pgX==AQi0Q*QuZ1kFW4 z)C@(qa0wH(&oq`vNA8Fwt8=EY(%!kMu}sy_o`Yeds*t%n-dRRLMS4$&m{``{D7DN6 zGl>~JAE30_8hK&VFsCsIw56L3jqpy;&fG~uIxh-e5kH)&bRThYJU?Fko?skN=5 zg&0adP+>E+oToGZ_WA)xSdaBncLpg!~7Pn@_OjBbwD`tUC#AL}!q)VWm{0FwDP2lXN#Z>6AszWeV zwzf4Z@&Dc1xj@Nrm3O|ndupb8x@V?GGty`tnyKp1V@9KqG^6*}mQ?Z!#ee}rFq~iu zM(`o8G z(%e^qiZu(Us5L+Z*Y*r7vkkChP+8LgmDI0UInRQM4cbdU1yyba6{0o*mA+syAi8xO zYlK=4VfhmBFT;Eacg~OWQ_@~*R`MQmn4o7kEb}!}d>9(oEd!)vbwGC_^$H{@?3Vd8 zWTc@A-$pr^D!eO#TY@2vudn*ml}-Wvka!}e06(Eya7})a#!o$dTl@!Af2{t>Ih)kn z-GOMoj{cL0no%F9lu;jc{_|mw5g)Vmc67(gbU@Trk^^5Sl2ZpOxq;>|49zrW#9{Z# z(j3f-&60k_B2du zlEzpYS}Dyc!yThE8A{K#pmZ9yLOIVuX&b7uP&(00uCi^rqcpRI(<4yMk>L=!eGW>~ zN@$wRyjKOQG(3}wM6nPo3R)#tG+9nD^=-qAa59C(q{h|ge@|EvEG8YLNm32^-(=yG zkO5$!x&;d;tzdz2vjoWo7S71lESwWGO%=1jti7DIO681clc3E@AWf`BcueL;m}N`D)aSIoD}rrQj!9}QSZi8fOz1_t z;DcJVz~b(l78s*Z*e9{CnYLGKskSqNsCWxvD(BGUXnUeFz~w5tjwPgs^%g>CT+K|! zyG#pZDUzz1S8Qs;okm9pVF*iVYNKV6SN(e_9-#n4uC+bm!_YR%ufDODe8|#?6Ff?L zqkUg3hyio^XZDmM+YuX3UK?lWEWU*euQGSwKZu30)QT9@1KMPD7h#S+5j>+F2P}Gxec3b zDiT$|py+d^3Q)foE9FX#lS28zVvBnJyc|KA(To_XFONR#Vpam#MK9jY$!WlxPdGoM z<&!(o7llPHj;1d-8n5MxJJS~^VHz*uLoc>%Ws60hoFG){zG74oHZyL;sCRyXJCu4H z&5V=E(HCI?(W1&|>2fI6G}1D||s&|$6nf-#M( zCF?zCefXG}R9i~LdWukI&bvEj6BE>9UI-KB5eJ&1+Dz1AnwI-~H^$%f3+P_M3|9Tqz(}E1mv;M81e`&orch{(l zP7u)h1mULGwl{1iB%uVMCC6|NW$JEb7V0HkqLIlYl@uYds~Djli7kcYfhsi~G2Pt4 zDglA0m^s}y7nR=)^I^smg+d|c0p-Tmb;Qto-tr9k!6Pbxm>kQ|K(0>~(gwQc7@zR; z@dEN8*?2(PT_dRIQnBxQb+!RH*oc}39JhP|8F5D)AdVyY2YQLRU?XISp5g(D;tU5M z`WEqI#B!X-0uu+_Mtu_X81~VG=I(a-u|OcUkO^8eghe_R!>P+4OE!;Bv~TkyTSbAV zV99j>&gOn{)U?xQks}x{O#0kxAF&0N#;sAXa4w>F~2YS)BjfXebRiD#mMP1 zu;9c$wraj477M3^1BlVVg=q*G!$q3VPbH`M>e4|6_k)c>`(wI}#;3;o6|WflXl3AE zux61i3&}n@fEOU@X$TUuB-9We4%pV>79MmFd&bxo@Pjx!S{cU}FO=flLisUv>JS|4 zFW@Sn2CO=4qB-nylo1>Z#>85fV2u4d?j1&cn1xMx1QYQVPP9ikKk~|8a~Hu0#Ex+4 z8Q~6GC_5SgHGwR9xx5(4D!B+CL~E-5kPD6cbVW~CxcI1eFs#P=LVp#sb$NU^^k;H? z@t>1EU+Y~KnyJf)ZSwR- zNL>T>^bEH+p_@t@ouZfifp$@M9(8Qi5aD-LPX z1erngRaV?w*0nwPH_#nv?I$1^DzEC|+}F_5<;*8gmjJa=GHY0Yur|=<&Sr}u2Ov7; zwe6wKHCdqBISF6Mz)aIDEwV$>^eD(;vw0@;io>YaG)voqn$1$`!+i?67}PX71G<25 z@555$fxQoLHOV(a*gjwVYnX{?ctXDJioVPVTdV=o-Y4xmX5z5%05YY}?6wckg!mlK znDNmAJTvx>Fp77r@q;}Qp-ZIh3jQWZY4d7)Gm$@)Lym+VtYe7RnuNB4%npm_vcul{ z;?jh_hVZmA6Mo+XA_0Vg7ei~4K(W(AJkYvl&&2C!JcwzZweKX)R>Zfe2<=;M=&|Uhjh|d{M8A6Y6Tm~thSHXX!NGN4s!9}q`xW$H!$h1 z-mC6g6gx5Vj@^#F1~yt?GmlZwcpT=evM(h_DddcFboO9Y17}<_(f?$UDP^J4tmDrz z9XaDQ%XEe`=AUUgVblw!RNSK!U}r)b?RuD$?FcOOASri@g~0fiq()SRy*nnkHrwhn zeGj{2Mmyc8S=(Xo@^>=zBx*mZEAvbfi;XeSQQMM0g=ofQmiNjA7!WEOriKB73=Niu zrJ;a$xD8R0O0rlv#Y~6JTStP4B3S*`riHCT>xK}sv2I`z%M@a`2;i3i_ffWvHuIRj zuB1~uk;hf`Ks(`XGF`=1H$^`SM#!@)+Mk0q`l03}N3i0sW97<_jz=PvPPlClJ;ft- zs`0m0`Qvp5{gY4{xL($gtVT`=Z(1PkC6%5I&O9U4h{DJI)P>r!(xGoni;i~6*@7fo z`8-t9gh8xoKgtL7E?MxN5uxM3Xz3`=LtOWi98J_bXGt)gcu!f+ zvf!`xAAZ0h{L>vW+3eJCmLQ){qan7qUD2H&*LV`1P{+cL1>=qQg-c0f@eM~vWMjF4 zMAIm0@}raoaOqeF<8~*T1+z*J&9+K=vPn_NCd9a#42X5feMie|_%Nx)T=*cVMm$1B zP!r*{Hf@n51WPJMQkpe`iD7mVm`kvQEUanw{T{{GJsH09^s z;Fm9@WGzXwW|;Y@_{`x()d6q2f$KA@S!=jrNg7_jl{%66hSS_)*A%YhdW7q&qCBq; zi1Iu<>4H0ZcVW80`8QhWI$#7#g|^O)_~KcAUHr%azY^Cs`<+v?Nv;1Mjn-e%)lWw| zC%pYzJx*xW-P;McR2jBUaRJqCwNrZ%1hkBa4Z`AL;*W3kYw@dR{Z(U%IG27P$CPR? z9Idm}zRcZ3{0DFGH?AmewLCHgb$MjkOJur(+FZonxzb;I4T|byA&}Do^@FHxVW@z{ zq`~DhO(0H0b!i%~F$G+?CGOCelu^yw)`B)nqfza-gohu!(q9!nc!l4)8F-jlrloUF zHIGqFr~3>iY>V!S){$$PI-;(^Jg}#VI3~x8Ra|)q#yr$0kK=}D@I!!6BFu-fUDGhF zb$rn|FsGs&TNUNwa5SP^Saz9_0ycc2B*Pecg}WjzTptt>j*$$??f~J7yPTiJ`tE|4 zYtL!>wu|B31)_wzq)fV}-NXiLyF&^Km-E}jCQOI72Fo!i-~)1ftllnTvN3%)uMd-B zys@_~)+{rJ?;>nBGhQiFBBc=smKK2b_hv6Ru@5uS1#cA z057RaA}z_=TFaGCC@mKb)XK$7vQ&4)@j5B4Qwm}Ab*-3YFPL?g&gd{X5|({K`V2Br zOST`K3Wvv8o%T_u?22pUB%#Ybn9u?);s`n?3;VWt+7<}} zT6Hav3ac$a@wRqaA|Pr;mTiJ@%n}>tgV`)WeB8B3qJlN2Fq?1!Z8coSZw`lO?#lYS zkbg$$anci(#Gn6Wj9~{Hsj2Nyas|na_I6Im5t5rNd7hGEB)3}pCAUR&(u1U(o7OtLR;&h#?M8q(lAH+{nH^Vcvyy_xdFz$39Mg8E96DL^{5fxm3!xO(DrGq) z?M^v#=w>+Qt>F^Pd8?JO9IJE)WEd&SN*=D9W6>H2M&~?$k2#F`8`_<60L5VYoCm0b zp*asA2HPzMn8BTLfE2;DId7QD;G743VKt>P0I=+*xYIeG>*hRyCFn5bWjX|Oon=|7 z7nVh5fNq)dz=8mi)g?+5E#bL^ZsjdITG zRLXLI58Nq-4z^r1=XLDmTAB0Om9#86dv=v&Y2$8k&MR;!&3QTybJB9;>`sM=8$e_#}GOmew)9cC;Gsb@A%V24~L>Ze&+eFyg$pC6geCn&d0Ca=x-FG)Y~@9 zPBTlE>!RGl$#HT_6IDDx#T)Z1-bS!a!ku+8J=VPFq7ouwnd8-LVeBLv zrw&ACCFPG+oMNrK5RHlaNiq>6q;I3Nq&V^5!X>c)FQ^vzvkdae;?YaY=UTdL#Uu`f zx515ATu|-kAl;&oGWzCy#?6QhhMqGPX|w|}+~L{*_haqAfWb9{cCZ{-?JP%Drj|(o zfi1^b-RVoa)30LGNp(Z)6r`sFDrm8#RsAiUqQs=VW-(9k^|S-(3-v+oJWmj;M!V6F z*wQ~7x#RBy9^(@ea3DocyUqrO>{?pkVNQ&Vap=w9QSWsCu^#ja{Wdyy@VwD=PRl)GL|9^cMN;SK$MdOClgKh>gZ%{p?ZsruERQ^2`?(mcmdA> zt(x@qX$l%jJBBOKuJH(@b_`i}hWH>(r}lM?xvfUZw@b108pHyA)8S@CgCwl9CpL&= zG%6vi)E*=$+^|lhAWKufNJW;Wa*>iGo%A^At(qasl3!@C2CXofMYVO;4m}o;;7KwF zJP~?AtkOX+I+S+bh*a8fN5PVcHTv47^m1LO^(NEY9jm!`nxD)$-fYo4#|hEM?xDhU zU_wb^$)?>=rKwL2)6^&IPpnVEMx(hqC+5xU~s6AZTq5A zhGUD{%uy0Hnyr|ZHkm^~*%*`}goY-JPZ96le1>?URjoKtx0W}M!f?VNCX?-K)K~-) zhnNjuWQduHP7OW|F;kk5w(AHJVi0#*wMj0x&cQid)cR9AY`lL&=0}GYa3V#^_C(azvJjV0 z7BBFt9;s85R%HA=RTQ#2)>`c{AIF9?Stuv+kLFnW*rlILuBW-edzFYzBEb9`sCK=X zY}3l0it1bSPR65&3IXJdyZf5CsO4()qgaHa^{$pH1J>Ls5?NYp>r4Fev;J^CYLCBi zz~50XBA{}dkC9y@Cn-%cnmgQ}d19JaGa59Hq0>|s+vj#_o1_aHPWEXkPC-&ky14iN zEYAYzm%>V&RS@|_5$W)PgmaGD68lrD02J@+54#Xzp!MGr)q_oqqtCk|9ix%oD|rP0 zGZ1FfkeI)UdzoHBB#g!pcDf?f6V~Yclz>>_9lg|%`?bLPjWCC$S26HzxhpE%99?uuYee}9nE5nwd;r8^RLM?O1~oT|$GhF1RM zwk+OK4S|OZa?N$KFE!BZlhu+VAexop@9BDJxcUf>C-VE9>Al@8(Sv>AY8tjFvO^;1 zdQ-(6gyM6->Jb+(+KO!vQSc#p({*n-++XiBm(ryOYAZUr9)TR< z=Rim61aHMm1`VKn!*>db9LddyIQ??d*(M7i8iAjgRR)2emY}G5rm}jhe4M*fP5-4> z_VwfRG(|PNb=9NFl6vf$q#o!2ZaK6LBvcDD%+67*?0o&IIQ0TIwTI!g7I{Bqi|S`L zDQ(dk={c&-v_*uI5pQtL76n;@wtN&mE^@ncPt7mItQx9(xoyZ z!%d4qyNQoC0Z-m33N7&mg@EwOpc9?OiS5VCEy7Ak{J5gYg>8mZ-J;Nzf`I#m4_g2* zoevvbbgzKDCcRwPkdVtp5Of$sV1>D6YZTfb7_9M@=o*yhMgbIOFwm-Ok_($^3Ifg9 z>VojEyJ_(GKOcTdPS^R%IEXNacGD1E+CWob-t$c4ko#VU+b*Jp&f@X z>@et8TpZc~5^`b_S7=1H80>&44F<6E4F)c+TM*ikqs~Q^^jeK=4OlZEAGU7uVe=uv ztLDwm7ZJrmZIteYA@pzeg5U(KH9qU)!scjVXtxvjSJhB{Oc2|lTP~H{T~ym{^szQW zk#@R5-MO-DVg8Cv%HYT2p78LgCtEkvKtnSl1(U}Gj$nPTURCxl@?=0M!ME$BAxWIg zBWROEN5!ft}yJm)brm8O0h}9~4n>Ob)XF={23C!x2Q5PplXe6dE z9)?Qb$>3tOs%p6_u2e6~=`3k(nq(z3M>aW3pbTvImn7}7*2u5H&af~~wi(J|`4tUM z{2IFDkS=SWBoN7FZe{4HoSA=#@@Io){u$}10YpjB2RSqYGl9N!{w3?VD+gPk&|8K> z>39Ij?w0||b_Wy-QaTgNP#wbGRzJ3W1Imnmvc)yO2`KC94X8AN5LTTfSQ3OVNi|}* zI-sa9!gm=Y0gCDtP_P>3E?h6`(e(m~3+1ZZ@};0_2~b>f>zJ22AT>j!87S7Q?nX$$ z22i%211K{sKvDP>0Yy2_0*Vb9=RpWN-I&p22NivxZyiu(3@E*MqZQ2d&6vGy##zJ< z)@k*s2B9w9^7+xrsuybiOz z7}Vrq%WBK&0^_g4RUj`7=Qa+BArV(E^T$HxqjrEv@0{6g;Esa#aXE9~%}-+D?cDH7F2-3O_cnflKDYS^;7wK(3<-h>!NZwJi<0<4BO`PPY*E09&fC z-{cz?;rq&y{TQsXI_hWPr&AQ)SCjV{=uZ6bl@x^{^)~w#lS5xeur$!S$j}d|HNJN^@onABv&2%SqpjFNc z#g#uDG-jAh$ppn2eBKB>`^fypz{22Vz}An39>jc$|B)-yf!Of=)PX=4oO(;?B%6;|nvnSlwiDk=Tx? zYD6{*qHtCu>}!1A75-A9TGG!$2dx9eEl{49Ys&0dP0>WP-6c%Db4nPNIV%HT^&WD%#s5F`Vn&$O zo9HzEt@W4R;LSKSM1PKZy;T_lB;V(03|^%(TZx z5BPq(@k+#Es}=UIfrm2X>XbdY5YepCWna@Nc`Z+{$&vkuJz;Ekf?-bjgcRJMrHInP zH@lIybHU(ypPQKtF=#SVa@F|iS$~Oa@Xp&?45lZWgrU<+!z_)Qe|nKHbh;r7l_<3A zH1EThhGu$ksmYHul9jr^YDQw5!mY_J%Op{OD6dtExwT;j%Nqmv;BHP zFlzjiw6Jx`G2;+0)@QK9y6h|L=ElfY_0zmkC5r0IO`b5u(Ua@TT+QhI*XiM7gn7BqSGU3Kr)ooL?K^c-BoE$aE9&x z$>uhX6~Jl3MUQaJ)j-f?`fS5-$PC{lNVSF}aEh;(^+z*&DPED{#nH@6KE(@+FHeRw8DtHoDLaqt3$c&mMOO|sO0oZ)01s7;G(BI$EV;* zpYS8Ktq@;83$eX?D{-087BtyefU0D*;%zPM)7-oTi?}}2#Pi%;AoW6D^sz!ZAL{bp?1eIeWS_u>ej7A;BCOrO+Z^al=opwYTLG?n^nE?Yw)NHyW zC78^P5@72iIccN@w&kc}o;lOej0MInxn`65R6$*UXZS1=KBe~pd;I0A{gGul#GYI> zf4QQ?R{Ep+{AKk*&^cMSA}~i#lByPn6Mim*Aa$bN{os%#4#ohH>MWmxtdzz zjj2_q$K$~6L=Kzn{xocXI4<{JFs`#=Y|2PdH!c%?rOYaL+~RY($i#|loY*$x79`Dt z3ggje)QU(4vrz0@sHhNh7L6cUiua2m*G)H62Ej~7i6%;CgBfcsYg9=&(AI6pv8fMA z3Yjn~i(Ew8yc=bDykAEKl-Rq$*hlx+Fd2uacNTWmY+8%h;?mJxE+!_GXCc!aLCZ24 zX)2=B5TFuuAOVh}I|^$cT9@S;bEHQFsXyYz5%C8VOu?G?|6Zi_y! zQ$-(#_!3F1geCYKTHmGP6%Hs}LlL*xwq2%ylOm2aZyx{-xo|dBX4MBFx89-)z2`SrJ59IU3b8aR_MC4 zLAPq)MP@!9PTBr7zVCoPvL%>m?8F=iokAi`iB5IJLa6!Apz31#TgbohHT%y=180b1gN&xU;gsSjak1H`4`%umWx6!el+mHpuKylJ=Q>keNqi z59pxTpkzG|hw3=F@yP<`m`Lrnc-NS&@joZtlG>dbiI@jXyP3ukJ{~=21T+|zuLQ$F zjjTbAl<%vFl!KqYH}4O|kN%S1H#IJMGvZJ7FCyxX+s8nXU5LBw6;WTiqj}FMyp;b2 zq$fJlhW`fh&{Xkoj}Se@d%+o35!AC`n*W z#>WCF2@SF|16Yc${sn*O9xMQ&yJ(o~DSwH%RF(6O@)h>!GTheO$xtd#v|PKJQW{`W7J{Yeh*Rt+b~UQqUW^?$xxetc^!|LGj| zIad6W&Djf3eyf~*S*h-NnvQ0j!t7N;jQp$m^~SeoXSJ9O2j((89BgzGbgNh(3%<>nEhRCDlRC7{pn$5*|}-|EY7X+Hk?v9|FG zOUW)>E13s)*duG!$y^klInsHIkq z(%wA(Yc=mK=bzTyk;@m_I@*0$lc8jWTa2iobe1Re4XODiy}z`p1Q>?Y1=VV%Rn}tI zUnf^^Ev~e*I2dwUSuKmMFstW3IPE-Dn@AGCo~S9He6WL=psXOSLu2=HfPEfy+$&mUUM1Er^TR$f|NE~y2O0Kh$y5!W!afA>?=?#m{(WA zv#3@owMD+xx5RiBRQbpjVL7O>62Jbx<-_$NED779J}kq%s>{~DUgx*f16CO3u@i>+ z1iwZ&nWA%@>eA(IVmLehc?F;EVX!h^?4F3=$mV+lV)uXnW$tEiY;onB-JnnD4IEdo#SKX0H&53OwUSU zJ);#0Y>U5~R6x!izz*_(>ry;3rvak5?#vmhnB(rM?#vl96-^rbGzhA*+=xzm*beof z22nPaNgPs41DYt-AWpo{Gyu!Eb2=QIe784f#_43~k34z3~Dds#}j zcQ~WDckKsL+Cu;v>x5O#;<5PsJ;+-)t6@meDb}MQ8IqC*d=-pi&k$W@qX856+&L5TxpwN5b^LEirfaiHcCwvg>#TO2r<*tA#AyA z-D_j%HXZVb`@9|6W2$&;n8?U&(H(`w(X-$nCG-IQ9w=J@UJzp1M9m5!p$a(CLpF{$ zDVIa`VVdtodNUe28!U}CzSj>gZl#lU^vJpCBqb+w@*HH+c6W=&ByN577aG zAUbWnwpbcu1y)S2)Nh)lMHq1z#}k8 zwEd3Ot1P4?>A)w;NLc0^2DPv;@MTl?n?ab68Extx-{P+?wG8+Ax+1^15aNgyeuhz2 zP)0}CHQwNf7D4E%q5HTJ<4jI1@rJ%4N74?`R3j5uTZwFr2IG#gh9W-bsDmaxSrF5u z)PZfE5hAw}Y|tS#K#mUa1^XJ62w^8Y)gr>9jU`!x{uph#;_K`ZRX%(cL?flb&YyiK zI@2J)8kz?2OewQS&rsqo*ODQrin&~9&@<~i+1LT4eX1v&ab)^Qt4}!!S&pY0Z5T@2 zU&z2NCoO`pg-}Zd!{Ax(@>H1)F@u572n;quK}XUg3=szhmS3oe(S+vWYrudW^n(1J-0MHp<4$oUO2|Dqf~b7H5M>9~e7?YGXNTD(-OV36T1X*y$fv-c zjckOpijLg+z^oS?z18KTOD>vRU(mHhQRb-Aj$?rnHiE{42H4#Sg*!gk?S{&MTpNBN z29iwIVGE3m0FNai@!?%&(z4A>@uyv|Nq$>r(8@$Vni_5b4OCwpGRzSk$zy>Row_~t|A@2ozIEgQ&!iL{4{;d$ zI_X57;YE)fi7z5k{`BqfJO0SOEC0jWKjrVq9XbBJPx%+Mk=*oYfAe|wVu=#1ia!4$1}Wz?M)laC zWEAfO38KwG8~doB5Iz3u4kgM*KAiK9|KX?oTXVUK;+4lZXYiu!RqrjH=RLu%JD&N1 zfAR4z9P@ut$i3dGBE{(E2a*YxC{dCl=JKIVV0g9lf9-JkM%4@6b(8oqiU zXHhA<1IPcvKlop2i*J0=Uzz{W<~aH@e_8xj-}c{_+ZXqpA}sD5@#Uxdf&9JO;|EV6 zYI?^h{}-l5C_w)xgI>FTZ$EhO+UsvP7#w_eu>YMmzjOb!!8N}U+;Z)W?~Y&lU4K{C zZ*Q%7W8}PB*LdcKL|*Ltj(=t86zM6R7vqKRup<4{cl=8B?27nn-|@!>(=0~{o)wX$ zNd|?5^wl6s>M^^^#gx|FnXIUw1#fGkJ53=9#9#Qn|NFT&#n=A8zbQPitLptC zPw(TmS8p$@dRKFO3zckCI{ud*_?MOT@2+a5cysYe+EgyW5aqZ%oroTpdc~kmP(t}Ou$4IYiN)IwV zyPMLxNUPjaQM~iV{@jwZ+|Tly|MmO>KlXR#x&HSb`?LAY7doWu|7U++?uPi6|Ji@@ z1tS+#y-xCemfsS7Y5IQdFK9}Cl6#f8@qM0`j{lW$=_me&W@3uaFx|$l#4kwZHj4pts18pgkJNiXM&~p?qsYnqy zUXTe;uqZ+y;4X+76{Tv?a*C!$QG+-DUwx0E@wQv9H^i9uC-!k40ZZ;bSC-`4DChz;1zz>3q@AK>X9_fr{ zJm2#I-wX85&+$)X0cOEI;hPLl0i@s#l+pJ?gIj+hCv zt}s`b*Zk4{lYfu@_VWh)FZy5bXDmEux4-B={BQZ&{iaVnI&tIR-^@b)slmCy@%+9s zn33P}!MnY9Ui|RZTY?WZ``2&nDt+2a-#~}DjJL!zo1QQm`e6_^_r*^QQq(V9Hu$^o z=PjxxOym_}l@Eh1)4arZ&3=L6%2{IaVGw$;xiH>v}X1Dz$i_7y9w$ff29tVN>{zq;14R z!Ou-!PVwE-hbE1`(G*IyXlUYfn<;$b;3t>7mZ#4xDN)(hmP5~0aNc2i+x+VW&pTl< zzt5f7!S5$*{HrIdB>th-D}UOF${%_C1b$baxQ5^UvnEfu&QSGkuP+RGz1}Ofy#M}z zOaF4qLA_q-y1|c~rPp#NeJE!OEgD>VmRkA5*^}H`CHKQ5 zq^nGY7l4=P3(edhUvB92!mJ)DcgW?I%DMX7EiSjCoUhLvA=g(8yd7q$HS8u=8C08A z8Mq8;bQzT$X%4lyoE@&F(%6~?(qgrmw(MKeu6--o)!Kre1Z7EqTYQL9MOd ze)Z{D&A+kp&+LtXxv}$4Zik)!bWTmInbw?wg_(0y^v}az5Yz{Ur04SeEkjNzbvZRcGd&0h-$un zcBKd4ojUYB-+yZBj!*0k{5^wrfBIMwO`rL!IqFV$PpltUSlN&LKDZKm%#Xcei(b4% zPxZr7o|S!`^2{7xgn2BFZ}{lopEj+APaO5xld3Fee9D3zTklxV{jKAZwV(E*tv~+U zV*#yx{R`J*&4wGco_Ob<=+R*OCw^9{auyM=Ft??eF$5YmlF?kv5M3!F zMbsb`qNeb+)(dk}@wi zwoGB#;srA4yvr0sH4;mt;)EJ2Js4&9j6|>1su6@Wk{TZepnAcMqoOKyq;;m80RBvd z`d!NyB17-gT4m-{XB8H<#cCqnke05!F2qss>g#iZ4Su;L4CV$~FaOm~S`q7K{pHjC z^@AUJe$L?jf4zeAmcLFW{hh!5n}7X{MSsrV=k}ZuTyLff?t1px>VYa`_KvxzI2~C*o3kzXG>H5L7&s1wU<=Imp^iMr|v`+=Ue$G|!`F&qL zxc=qS_PUqbVNUrhyvM0D{#t-~Y3ff>R?~@S4cKqAXTC;TZqz3a>oIKc)HE8}9b{x(w1Mej@qBG0f9b z$&%$h5+ix93r1X!UE#mezb<+23g4=tjh0ZM%ie*%?6_*fuJ3KN^pt#Ig^${ke0znz zT6#}oENb;BcG)L}es$ON>+k#w?6Y)Ta==QzL&|BRWo0Vx*+;+k+0T6R$*)^Zn!I79 zzt&YCmhmDLJV6CgaT;S-(+l69cC3FL{rKXs)lx7Cl^WaIUB~+E{&mAoAM4+XxJkZo zyz7*SVM|i8KmDH{xped1+n@Z6)%B7;9`8@0SmSDcn)-(BL*HPqy`R~0?XR!;+18y8 zx^nSqfAVRzfEc0*tbg*}$G2U3<1;B+GH%p!y;2#T-h0RIZ~WrD5B+M}uTzy0^#`cw z$vzd|PQ^~8-;x#>Q*p9uwLhH>?xmP?NE3@g!|?YRh@R|DpNy$sc=ZYX%o132{_Fh} zC?LbbXZi1l%m>yD&mZt_$O>x~U+K3eKfJB`r-XQ=`S`D z^d7>5hvve*cuNK}k&9=Y#HrM`pH~H&=r5Z*6 zET|=HegQ19Rai9h5PeYqkC* z&n0!<7JnKrxO$5}LonEUhyP#d?=@Rtq1Pmvw)zXE+Hp4m)J$KwG0fXW)jvDI_y@l}7GUiqs3 zS@3DgH~lk)|9qFf4uw*Q_Tj6)?w@J=J;`rI{9jY2P}T}UH@Q`!|nI^S%2ZS^>=#< zJ#U#O#k|CnlAh~%OKm#e7jLRh53Nrg>@Wu>7vJwcN)u;(&wrD^dG`Z;#h^UF!JcqMiN(|C-yb-szk4-F!ICzFV~KCPP0#G+sYE=coP}KLA&g z!yopKO#bs>KctGM9)=jN89wY05Yaw-@TWZ7^fUYL-k%{vt{I;2s6Peue0b5%{f}k{ zzxONuyIKh(=Z~0Y7Rk~Q7G!ua1+NggxUk z0#wfvkb*y)yyZ#Sygpg~r2lGyN1p^4u1^ZT_ZL!T+3)@DQD(Slx8IP{JhlDBzc@q2 zhQIqi(1UZH_0Khwf8cq4`hKD#6K`T|l|h@l1$?vw%0erTjB7?8wV6r#UjG&8jX+&gR46Z3QM?-++xI-UI@u&g6DuPNe*^#;oD(w+7~xw(AY+ zz3q*93-%p9mZ4Zj#!Th;AsI8^h&0}YUT%xI0{3Q&l#5HVW(FhqMAp1ly_uFbXN`B= z7_rosi$AVbKa@8|(dqm1<_8vmZ*4Nyl0LX#wi+RH++rquxW%+pxN80NwEfp^kg zGDj1fQ8Mp)#fbj#W#)+F>ihlD@G0Y1$Gy_`Km2{uHT?NDlgp%pu?BcT80UgI#2}1* z1(#80*HSYnz!hcBg^)cTg&DMh~wvFGt*Jd`yz8> zvSOB*O_?>b%t{{KIm@t!-IG8$3x~hIpIHp~B#_T>$%*sLO`4+L%r|Qmy+VF-ck=c{ zWc3V?vFShrhDW9HeT0zsPjI(z!^UxGHl* z^7;GxQu5VBW_4-R6{6+;!0C2!C@jbD25e6~8MoF`IvzlqQ?W$zPY5ANhAC4;*fuBDm)WM)0NN zZ%3Hd`ClG>)sf~`e$@oNYxw9M)9ptor@Z0PyU`83f`*3$+{7&T`3EeAKNg#}`v(ry zOQDXw_V3j9%xKGx6QtNkt#^g%x{g zL-P6+<{W?h@I5QcXMKPB@Oj6Y8-l{RC$V+iWD2(&R8C5(gGoua+T@apKbOfTOIDlC z!Jbp|$*WeI*2*2e>DlN1CFYXQEbzAZ#{+k{OgGYdRVzI%ds%ZWRGJ0dcp z%~EkW{cfh;@e~P7x^Mfg6av(ataW*@nSQr-dwGJ*ysILBk|Mo9bC6tfqB*XmzRqG( z@~acgyv8OexpRYUe)5HPWhNb-Szc^HB2Q37nOa3iZo!9Pm&$&oN0D~ACzf2TJ%r%F3O-{3VSSmmR9T$d$IDg>< zVdjEzMwm&#iqJB*!1Lk-E6E9Xm5fYmPNGY>`JNwtqq4f#K+EXn;7BI+`(s3DZ4@Gi zaNj|^yx#ZF`%1O@$Gm9wk8$1ad8zLI!@aNk@4J6)9q`w@Xz$m!-k-Z~?}HTh^uFSN zA6^hY<&922mCL{x#!dutlTJkN$|nNEwfK{-VpG#?@T;#+ggxUQ7&wNK}2~TVeyWd9P7)@@@$2Ef4P|H z2}ErTapOuVEUsJ&8C2p%6y{>wczkE1riq6mA*HSIug>z!wKkEIx*b=p?keyqhn(W-bL(U!b z{!=oSgu(5-d;QC`7jZg;$6s9L=d^b$za5i);kKd=7qnUnLARH&pp(?sc*HRYL^d$& zjO+gDA`H2%yA5e~GwLgVuhi-bR39%|C^oa*}|k?_jX zK5GvoL7ClvAZ}VkMoZYDT~#-1*hz30RU2tijcU~U*N$Z|vMok%te$sqyIj!I(8!2-m`QEMZOX$E-&XKNNpaSlmz z0U1GDF}#!(HWWrej!_zTfccYA9c=~dslpj;yR9R`l^LO%_X^5cA*X@?VXH-#-R^NI$^(eZ$)Chn0*N*wE+q@RhE2% zrEp8GVzM*<)X2fcsb^|#D1S^oLS z-Dj|@`0*L0xl*)zDi_b|Z^6CC%N6KV(ei4hM~Z|c1sFy-Z#4#h7zcHa@=&6q!{dt? zHEzmsazg1S$9Zh*Z91TWho691z zm~PjH9Hbi47OR46HLvNUP6{k>1u`eWjTlkd=%W70Xy56{s-h8d%vttCRI7fP;&0@G zDThimsFa1SF6PBDEf?(<_6RttL=^HU-02~2rAwOl?6vW~+Y}?PECndU6%DLbN6-&4 zQ=bMtZLgI`FA%e|+gz-U-svi(Eg14Iv}W zH=_JjQSBB#Y!Dx_T4ci#b4w+~sg1OojZvS0kBCD2C$s{;Dj|ld5D*^&H?_^WWi$_~ zZD4VBLoJVPs4KhbGc1M2#aRoi3M_2|-3DY^P}W_BwJ z3m(SL+6||2E*W_pMz4Ib>vd+?F`3SCOMLjMOeOZRQ0d_-(FB%7E%Cq&zk4_+fIL*X zQNop8sFGW3&E;{fz^YCjj7!cw(?pdCCoeAsVE{)&b6_F31(jm06br8q0RZRdq(U+j zF7WQ~DGAr7{yTjpqxeqn+wX_BHpF|6TCE9SCl`N|^8g-?9{9k&tYJSOOU{}QP6o{v zVofoq*1V=Ku4r<@mOhX>2*>qB<7|T`gGwxWO6Bok_V%z%_<2#hH&`p}{W0%tWq4pF z{!(F0Y~E>S=$(C=dqIm!!qVpVUEDix-Tim{+J9fU=@iR)GMIQRTtrCYkr@8PJb?Rv zD-8g!P__fV!!Ku-uVnxpBeaZ{8Co7TjAl_j10QF+E7l^_oKz-$0lh74mcTvD^?G91 zB&j>`w0DeF$GYfK*$S-_Tv~2NMp2}9U@=S6v5O@&u0F6t0)Aip)4V=bz}aJIBZ!|g zedWRb8kx9XfvA*Nh37Hdh4`+&=8rFCS+)i7R|XM}3y^D>r2j0lq*90ul z(O)k(Uc)!>)ed*HKXrqPvc?wj&aHsblZdbL`!J3~thwWfEHX`HZg6fiQ~Bpd;}vZ5 zS@!a{L)f;!+oS~py~fgPz%G%XT~5bWlM~69L*I#pF8VA?VTOx7MRdB0K0$Pvi#|ql zs*65Mw6o&k4-uc@qW2Mjm=_6;moDMMun*TBMMpdY$B|L<)y(6WlUTejOfJ)OR*?~?Lx(i!*(LxX`Q!; zp`4Gtl#Pp4w~;Q3Dhx^-zM>O7H$*$L6oAgEm6Di%nz)CWwLl*+(oc%0f zVpY@RvNxLjD_~lexrGK&byZC%Z9B6OzTXm$JP2_pvSI3Z5DNo@R;ZL0H<{6jH=D3f ztE8~RkhYa(Y@fB%xfthB5#XHAKqzDP6}fmZqq|c(v-YQO35-2ED1o0X6wLu4@HzW zV#?Xha+{SMR(KF)$%OD|s|gP`+U?Y9U%AhK8hZy3EGJM$wv*gc(5#C63mvl@!_zHG zZ*wdi&OXkuGc?;e!HwonSz;cipF-!y6avIugw~K}tS?zEo+|e7CHV>Z&Vj^ zd8E0083~)Q*o7X~Wmp7&%s4d=_hSBsrG9E(YOK~6=Ish&@RX4Wl{^a(rX-K?3%1x) zniZ0h7bswen|}Cj4YJ0P)hw>7K1(E60%hK10L)vR8O0;s{rrd*&xVa+=UwL2w)LJ; zy6lO3N{|l&lYuXiC9b&-v)f#V^hgNaS>(vI>{jLA4Fb&CLb1SV^~j2< zYH-9(s3k*cCw%C4&fu8Z387B$6YR;UZ4kR(NcEnoPu}%r(=+*DwqoO@ZZ6{8za_Ez zDb&IiFWK@nv)?PW@zulIoch4u*@1BFc^6TKRf_!TiPO;Bk zbPs*_J9nF38dY+~J?0r#31Z96oOp$+$*b`Ny~QgKxB(?Bw~Wd%z8WX!!{hu zrIagtuW9CBeCUe7j~|+A3SePA>RXgcj%p6d6$n|Xw0MgZ6`8UYYY;npIw!%b&6jcx zcuek-=LH*p0j#dvK+d?)9PCN#PQ;C)IbCv8@#DFpIg9$rP2?;d%{jEMQr6zaVYMs{ zE_l9egzU&=haw9&WPf~=%p>sf7@&OKQVaV8dYX?=7*IQL;+FHMbr4ax9xN5=*P(cR zrP+RrA8b=KQHi^7o2{l`u8b~}^~brGbO4K5Lawc~1PmO$u3}P5d~I80;`~L?1X`OV z(SV>OIgw9{qfQZCYg6+Dn)a|tqgxwwVr)|e1hcw5DID!@v_*VHZ4r2;C0iZFP=%s=*()iGHsWYLA3jKvG+|%7%R{tOt9hJ6P)*=fT*i}FbwVu?3B;Ntg&03k41Z~+QK>T+8%p>YERvxE z_g-38S_{;dzJT7H##m;&cqMkkOje?iU|w+AH;Z4Q6|0G3$3TZzV%|Uj0@{yR6Wv02 zVvK!>IoC!LMQwEs1UtRHQXzFQNY?;bN(8bY$l-#w0Vm`swI=nka7b%C5jdtp@|=7>RmN}#>6{GS^;ZQyGUuX$<9x#lQ_j%Y7fRKtX8%308^QD@>uVx(xE_> zh!}e#9SlzDtVBY0Yb1tSyf}>hUxKLeGGH_YM1oH}Y6fy(U}$tD=Yl zW<8oz>W~c!OY@%hIVXZ4BTpU<7>FZWrd6LpgcK zZ$|Z&3vN>7Dv!Uru^ViyE)V}u^1uw0!yiV7F=X=?pYq1Jyp1*wlu;gLDV5uS@*2oS zWwD6__E?wL6LC>N#;;%<-rn)YZ9wW_xcv^%hYEaeaqDMA^-;_>R;wSJ8$ zhGwDnA%B^VLr?r494RpI)7T!Xysf9dhLmkadgmy5qjzSLk$*FjE44Wj=(eNp%4|7N zRqY+y&U3WWE|HN+k5TD>RQ(^M!;1-ryFGO@Ikn#`tx5;U1d%63X^{(ZX&JM1sR!Wt2x5vjI6iS3~>iZ zpK?&mQk%`r-WY$BiOZy`5-Y604<>wU+3IY@U!yc@3n8K{{H2P;rl-LsnzLEA+Z?Rm z)f{HW`=wdxeOhSnH9N@k?QJAPfS@Yrt?S9Is_= zB(rIh%7lCpgYgx1OzODn;{a)LU?3f2Rr*v z+(Q54Wu6}r!$h_e9n)i1TUPT^rG9u!Jsqem$2@R@beDyieLhR+MWgBYN*_9!K3M6V zevRIiKTK%`q~TPQBe8G{0eYKK=pihc*nyIU+etwR6rT5~#ZAUa}cay-~kYNk5mGc0fT-1&ZT>XDZ8nZfavUX#pZSIii zFPmAO>4^vO*7Ap)j{&RC$I?@*kjJQJ`6bEXx!Lky>5uITWe?~yXPLbWZ%ZUczxZL!OQ9gtaG0cc-q)O zD~ezbFFKftTg23lroI+I0q^PBephIgfDm-Xs-aGNLQr0e+@hIsw)ADVlXh0i=sGL$ zmd#Q!iEwH3A< z?Ke+_lcan=HX&B;9aT;#i;!0HqiOU*>>t&%7(>Jkq54s&b|hcU^~VjaAC#^21AbZU zhg#3UJw&~Mtx%mBGaPGoXmhn>)g_#9b|b&v};i5sItlVKQ{9#99hIr zB~u(Qh3x2}OiJS7{8~t}J*SSp2&A=f@ZW&?Wk9-OE&BhDK>acx{igq?pmzA`O3gk*c!N z3kaq}N%oJjYaoG^cvpZQfhfnK0Dc#Kf9XB8D>XVobctewzbPH%>gcEre?i%Bl#X&% zXP67AT6}hEC^U$2V~wmJBdbK0n`&858mm}JwWe9wF7~`@0w$RmH~YCUYAell^t+8A-D5-dfnwFy6FWI-NZyU#RI__wrg9pR*7=8iO!{y{Nee* zVcPwzPLr4j)l1QHIv5tZbdqWr)hS9dax@{vlO+V$XVC5E5!%9s-Imb`P&nP;meaqaH%YZFYMaj4M7AtsQ&9XeJ zj#kJZ)l^uSPlqFfpwob>++NG74!Jxb&8m{i2FPWy$m1XAQw3Drw^L(!Go~Na9@sV| z8zdk`Suc*74i3t#3OV3l^DP{BV1=A~@^;HCSE(OnotU$bs1tJ*T6JRXg`@sOMv_S& z=L8~xcHg;hGeEmKpokBYD_N-$?LPGNfDDM1o;V3v727zI)2@}1_=I`=)l-rpJC4MQ zk7ht4QBNZwr!6c(Hie}N!f_mQz>N*rH-;Z`(BhRbBu7hI>(rDL z#l~jq9hpy7{g;_K@&0|Dao{BrHzXrJHysndH|AMhb!Xyi^2mRgNd+nE={|h2_rJ{k zr(~Quh9-ovB2@}XmKK)l$E^V*MxkWuTCgMgSo}K`9s^%Q%V7HL90-*79pKuJ?&ES+-dkZ}Rn@n<*0?9P`Awz+o`9Z%rHf%z6lBW00MtF+2YFs%ze(0qiw>nnd$Dynr z)R(G^t!2DpqJ81`(huv4QOd1v7>QFvQ2#h^^?eK(8kwi%xgDJ_#A);B?C36lgg2>c zZqU;kuD@-8XEjF9tSr@gffP-9I*Nr&H^M%osEC2gA898<%cCHZ%{4UT8%@&ln88qq zJwRxxrb;_0kDEQqsr;4emIk;?KK1(%FP1->YPsP_5*z+7B8LflU-&&2YaP zs4dCfKF_-k=sbxY?27gO3Slk&pTtz76H-5T7PPVS;X6DnW+z9dCg8gzDf5iaE5A_6h4UyRKHCu#YO$@xD@`hIOr z_cO^ier?XFR1Y{hD<9VE>LEvG=_6zJ2eD=uXMB-W^4!oUcmtiS9+kAxy$4@tdX-T} z>^ML?-Hv2?DRV*D(|aBd*`ZFYq({ikP_Eia^*n?@2!BgoQ8kFkQPT(Van$sIWb~5% zdfaqy*fcr$*Jkqn?*=yQM?OcG>JUx1gq6VJQYN|kw_vom;$p9djhM_S!XMns{0MW4 zVz~BNw!F;}glD~pz&U6}C!@?EY(^0*_EtvCp*hG~j@zJp-@WVTgA-J}i>~B470wy1 zgHXZ-M=B49I`$9e)zQkcWLa7nr3}sFJ{=Z|f7u;IRHPk7&Hl$ae6?tMc6d@?!xKKDB__p}tujz%>BDUCt^FQ8H80hX8! z3n$^x`o)#^ftG~w%Z65cwf`Wr?h&-YG1L243az>h%Yrth!|lo5CrqItHREOX8t$C} zLrz%#5K?Y|LC15#=DIoFncVoKISrOX-7ywndF5cGOL~59ZosqWk()Cg@$X93{(&1S z?i#-459Uk8|8cVVW0_9>C&O>}llg1b|7mi@9&@w*aPsFp9NK<3`Q6{l0m=HmnSb&h z9wvT*-}v|ycYE>t_=YQ!_!+avea8>Ijx>lM9I?lwyW78GMVSX@U*3i1UnYCl-kM4zCVooMTAZu1n zf4otz1j!M8(7EWpFS*{9w76ahkvrVg@ohg?R2yo@P>l)Z`PU`~n4m}9KHmhX^Og=) zYltkAsvcm0?RWC8L12eyGS#vzY1z(N*|w}JdrUU?C=mX6HkflX7rmg=HM5BGk4N>^ zhFKA%WDldYAZWrH#3m*n!qY1Uc4`Rn;?%=iuS|~51+(X+&$d;cjdQ1WCR3STdPJw{ zs;_TPK9UPQ=KpxOyCJwK=ifQ}P%$_sLx+})4<7cvnsl@UKk^?P-rW`irZKJdhD(Q^ zoezE zKCD(s6sLMcEjvQaYI%n3#2I;kT~#5^TZLR1R>!plpiG&=94O~fYMo^>d!bvlOG``M z{AbgCY{o6?aKp8>OKFzu6Qvq+fXtT0jNMRHOWbOzD|x$|({es7n@z5n5loD*R#bDq-#(|k(WwZy`U5u4)_E}e}Ea4zJrI; z0xvIjVk(Et+qWsu9bkcqEz`KJvhN;qtbQ6%}^o8wbaYbo^7!Lfd+kp_HZW zW=>&EVck%JHAh`i4K5$)L=JU1(|Zlp+^jPe)(t^VvT$lJrM(7atLd=}L5d{Ttuk%L zTfoXDTm_^o20{S5(Hl;k% zGx|T&0ddeI1>%ocR||-UN%_n}ys7IOZD-N#CV{%BhPaZ5j`wvxO*49cjf+o4Gvh;bFDw_pL=B+PFn76CX9I*x*&h%c8j zJ6=;d7ZOlyBO_qCweZup!lstM^RwKO28IdCSS8SVRwA2o7AJI^s0nv_9UlhEGYkEX z<-+_4l}rzBP;6sPmsZ#Vj{+_CD&_hX`X0oCvZcZ&SvaFJ^hG}HSqNsLtdJG&DOg=! zygBCxmL{|l%z48G2Mg1WLe>yBtS!?w+T-L_zcc4gp?lJ%bvDs9P>35=6+OyilX2ys zJ=uMGrn#9SV7!~_WaI$6PBUyO#6vl4o@wo)8tgPwp@1T=999+)42uuN8e!5Qm4O8{iaLdSO|~|@^{9^6+`AG1Rc5;D zdDJm@aW!4N4u&^{m~<0z93IydykA1~rn$ihWvzdpJ>u3Yw~vJPs%8sm~#NPTeC)3`~tk<67hIeg!I_!&+`t)q>N_sw7bZ9Um`SHO)>D2GkR|ckk zzdlXnKdDbs`OoXqRQ}ugG?oA1Iam2>525mp)<2~3PuHiZ{Py}Zm4B%|P32#!PgD6f z)5?FU%6C6oH*6~3Q=g{tf%=!Je0_bI$~V-fsr<&Y@-vqN2fXB*JpOEQQa2O#-6g@e zQ@>o_B0czeeVQJ8t3FK+zE_{72S2P&(}SNr>tJ`nQigX`{X;6hu0BoWH`S-9{1f$Q zD*tSKn##YBR{lLz{xEo1Lm4W6tUgWUPt>QW{Hgjhl|Ngbrt(W|<*(JP;8!0ST%F`7W7PhDWZ5NIk7u<_diz0cGa;sx$E#?+9{XScalMV zpgzqYudh!t$eZia4DyrpX$E;)vhdI#OpZGO0RBLij5)o{(&QucY3lxEeVV$TtWQ(- z)AecU{`=qE)PGl%Z>oPt$G6m{seD^~n#xD&(^S5_K27EK+sdaW#~&Ho;BOe-b!70U zKYqhsM!YT$K_eXiKZ6_ol04WGba5Ez?>)g$=ElDy%i`cEg^PQGdnf-1nGGK{F}o7{nF2I;Gc_mFM5l#oBIFZq%O1DFTW!;Txmo3jqI~eirE}XU6dxp z8*I+5x*Ud0nVoexSZc{()3^54o(ldrleAG<%fc6moRPYmT{ed^wo(RA3nr_m)9JjY0Bnou$}Hz?d_qPHeLJ0Y0yioMR~pBNlb=dFiBi0<`bj;Zw)6J02+QoC)Q7rhqwZMfON zx$tQrMPbtuzBY47+!DSvd~MuvQfC>zU$X{}i{|nhmvgtqB+1cD%vkuwCFWLzG%-Yo z15#h~PQq>YQbre{)!F%tI#9as!H$ZA6ZmW9Z!&+=_?tq0NI0IqcH$EW+xRQ-C*^ex zf3x`09XR_D&fsr8fBW;dl)t&;PbEB%zeW5V#NXoBt3*c-Y2~k*0x{uH{2j~R(WGC+ zUmt(3lW%_$y67whUHu<&^j=E|BbD3TD#zhd!3ip_yQ)trOZ}~KGV<1(>l>hG3^nVM zyWbNWac0%|iYqOI4D#MAUAV+IVMi}srDud4G0t=3$E;j=bkXfc_*U1QQU>?x`_Lt3>y5c6)TZIiT)D~7A?qCwoSP_emV7D! zU6NHOh&Q<$o3ThmcGP8r%6P&y>_$Q5Lv-m-21Il_(JmV`j}cXmgKaquE)kC8qW#o| zhjW}O}{SL*_fVV`;3hC3%rlW9ZkJj=-rfC=HHq(mr(W+O$bP0trE%2X9rEIIKTf& zP$b0==VI$sed2S=i{p|vems~_QFYce-qh~abNJI6$ijVlIqdDY(i#smms%MK{+|ZA zM2{f)Sr=VO^mZ3LmgpVK2L)aQP&MWM;t64HkQLiO*oW`@|rj|84aTp%MQ{c)<9z^RtB7U ziq(F6jbfROZ2dKm6?aAf(${qn_BKVZ(jiue!9w z^&Yd0SLTS=4qcOx(QPq-&R*QACAf3=9I~r%4*VNcNX;i(j>9?}3rOt?d_Yz@W00ChOGyu!w7X5|Hd z6q_iQ0IUZmn1-w~s*IcL z$}KO>jJX9yJhKT?O1T}YMJ8-t)mhecN0}1{70%_hI2IYEix3G)m}qjGeMgYiQOz!x@rNfQqJcd8l?+kyOlY zf4MTwT8}Iylntn+Ek(tm(xuit_wr$21Z3) zOr>!G0!FOy6DxqjLCh^E@xbq7K9GRJJ6}AFXhi~K0|K7HRO4T)Sqil6I|SwFY7^YI zXN8NUvj#EyHR0lLR)5@e9w{ic^h@xicpHLgoak#7SGHk=v_uvA7esiRicOd2#|?c* zJ08O00vu{OjS*~pusNER@TBeqR$ikHBvUGb54)Si% z#ElX-9EhXfn?T>iaKttAOaC2P`4tzFF<*{B7t&c1b2gf`2qUJwCS*$7)gR3TvXj@B zqu#yV<-M0)wr>4~p^*XqlIXDTAh6ZycwAD~1=oY}XawONDm`SPIl!YlBQmDPA`5r$ zgmc!G?HTg&#PF~yz_iL0RPSm{?s-ixzEV6{rbEmBxgRW~_4nKs2N#8t`*=4#gKL8< z*PT#BwY1M5px#N}!@a`z2I9yI(fV)+zSb;{_vw_3gMJ+hQMwQ>erX0HKc!Dl+46%GZseJcr{L9hF2P1>J`zbfdH6rl}l%5oMxwN z`sQ19z+HzGo=r(kIWuSnt)$2xMzLS7g$rE3*e(6Ul9!HhR3G=!@Wl-wPI*o^V{N%f zDE-nMZtCN5L{Wk5Z%OUH*c-(ea_g>jv}v@X_5*OPlM^a{li~D*(QWZwZ*7^Q(q1@6 z)%UL@n^tss+M^yL9E2{QT&wwRtEs|L6d6#eKEpdiwP9;Yr0QvSP&HwxQF^=M?6>lz zE!}zvNG+$|#2ia8pjSB<4lvhzkJa`UpNL%;!smBIH3&ME!n9)-oF!6tE1w-UNFRq#jeW=x5fMyd)wdTE&p zsadGw(;_%XlKXQW!MYftacvjk*R-#TLKCbf-5YpL-4k1Wok8Q^;G|ASrtvOt0I3&a_Pr|j!GOvEFA@P6<~cIFNz*w5Z%4?g)j{AJwW!8R0E)Gesq8vyg0swOO7j9kpB zwKlIy*WK9|76sdtiakuo+6Xwfey8d#vsb6?+JWqE7l#f@H)c?r@)ubGvp8#U7yE`C zHBWN_iCzP)7CoR&-FTwA=`A`uM0?>ldw(g*18#rk1YQ8r3xN=jGE1@VTHs!nCTR-v zhBDC{t0y>P!Kh71E}H*4(pV^Gh4d8tIMA0q+7&7`1L40-RiDE@CyQv>D=Y^9v6u(8 zgFu=u`h=sKI;xQlPCf5bu0fo_O>y!1lWuNSabQn<;70H;~;Pp)@}*v zKwWzJQWVvMR#8t**5U*Ywq%tPSustq$cfd~zT{LQYaeo&Pu4!xnZ4hQx0G>g1C zU0EV(5n20?Q}bAIYO+?r-M>*f{d&!YABNp4=PjuPLEgI-yf9_wDN%0VwWmq*K7cq?02r0#jZUomvP%lD>4p3-W zgYmERa{MrM`CpNtw=uW6DVcwn8xiuW{X`eum`S*O~8>?Ny#tk%(` z>w#97UCq2hEh@L0tHzy4w)J>Kea&(|>xEpl^1skPKypN4igeBGwWwvFrFx^E^c%}* z-3TBF*65;Rpo0O1L*vZEA|5)~3|cK>U|?KrRc`6`W=%NAeKn}2l{u(~8Yb{R)>uX% zvI2WoV>He50OH(2KG|Asj>~HzU9)N8O4MW@Ac7_5o1-SJ3s?cL7Gl2uc?r#!xXhX; zmLW~ZThc+UIAjHkDb`y_+B>$BsLz@~SH|lO;v%(7qrz#Z{TL_oxjQ)n@$p3QGu=H8 zXyOr$WI+UDP<$JC*zQ5{$|xh=LMC>4sjXGCwKxjqZvsa}MH~@F1c1B?ynoA~fG~FH z_3Kg4XNH~Cx8ecPvn>O4IKwyK%3Wb|^|@-@lm$()rpMmTo`S3)F6jDlKVlUfwHQo* zaaN|NCM8@F3xV+gKvUe%Z@sFxR6lBAqyV}QXSwMbp6qXNALstA8pg`TG zA6(r(UHuSttg(LI^qwqz)es)QN7xM4#pS}5bO>7G9T1kQfVNA!h2gwf8q_E+2oJ8N znTQHKwVaJ=!$N1dV28g90MjfiT-eEHoeLJH`GAEF-n!|7Sg@1oQZzmvrW?`hTG>vr z9!Vrhgj#c`*4P$3aNGiE9gH=L<%(KiZlzApQhpWq{ExO^twVVSH&xuvsM2qs?%U%I z%(pXZy`;;tYYCV_S2dv_@6Ku{xb9i#SHCR@s_Ij!Q?%r_Uz=Cw*wRAWiE^e8113nV_LHKFR`L0<`=&zpX!PT3MXG50l_5jV85xNR3Av0vu~RqLY(p z;t?X*lt(m^B{UE+h(~mW)L}b3${ieEuy@IfWeHV|&}o5d#nU0wL_eEAa$PkN9->YP zA#jlGv|sC0i>dITx5l=b1F9y_O!1nYB9_W+>Ig^H+QLq;V@xPv6CSPvL{>>9Z-UDp zxkhns6e~g4dJIaDusQ4uTjU#|nP@^Bigo2A7J;a)szDsLh;<>d?aqzo5oL#l0}kx1 ziFav*UtwN>*J-`pqo?f&`hs|9&7&QfKsZ;~d9VO!CwVG)slbia}Ne1alVVgc`Wru}wYNu6( z8#P~@RXYU&*tD?C0*sw6JF9S~K6GQvXCIrf;7;}QMoH7^@qlSDU# z+tO*3;7z9$*xQ=9`_@jKRf*lyjXrX-sz=OfMQB!gre5;E_Oh0#X>AK-wveGbomNCr zY^@=qLT^;uy_lfmI$Bh39@!=#|Iil4bZxNO-V{7hxA<{}XG<2_r#8X_+;AYO;s^ zt7=b^eDZ3HuqnoAFP!<-l!GWN=`R zk4tuNX@8^6<7+0=!!e2zu20VQ2LActzBkT%=8R|K(}fONeEmwEWez!YEBTl;4mmHm z!m*1QyV8l;?1wDk$%Xi_$2mnHr~5-N^F5U&V*5d2c0e$P15IcAiG2t1bfr<#W4FP< zQmxQJ&2CC@))}awISXpII;!tkyYjL*0zG>xbvXjRUCyO5AX`MmF8kFUxDd#V<#8Z- zl&1fvkS|KnYYT3U;}!Tih)e`b_O3=g_@VN0S;>~1C1-WK;-_RQVTpbNm+*Z=^|Gjqa(IX6nhxh4 zLLLOwzzSPC?>Xz~An9l1zSb~$X}L3rjb2%9usibHURa)9g~x&&&xkHwl{1{|Y9&tg zX@CA)R?K|+&S=}u#Jjja&gr{W8Z!lT83=uQV}G@Tw&IV4W_o?@+O$_rQX^kC6B$_* z0U=&nK3fGsm8NfN7s0mb(i#;`t+PCXI%Ik@3D(SGUR}i510}b38{DYHcs?qIU5fHs zhsv78Tk%-57F_G+$LpN@ zq_={-xmR)yI|uqeC$xZ3K(BIF5}nboIvG3Nq8MXy#kxFfB(_*%U9mn&#-8gqu=zT9OSmzGOg-rZ7Su4qksz#0sD|e5ZS$CpJr}fVD8Y8*b zwZ-?kJ4e;adv#-tY8XJ3u3o)ktK2h588xd3SM}Ho3?AI%Xj{enrr6_?czsJzM?D{( z)K_}1cC@w>@mV3aGibdJJJEz!FaZfS|$t#DgQ^d5yH zEfF1KIx>sB9WC#}C5FuHEtg{@n*s_=4Btz1$VJ~nbfb&Do9G4?eHYR7Hd+bKAwJ-; z-%NDRWLw3Xi0*dLeb?@`+5zMep zT@0R~2dnCu+_wYURbY92i~Do{_C2C9J^yV7wyDVRFVcZ6dVovP@zd9?Ey_?8=yo1x%Wr@$EToRFvCrsB2QhN^o4Xd?580ZGnZCEi0Lc z%3HGoau5#;)rVnID_|zxZZm2&KrDXt(Uzh^WPU;F(t9m!wpDv46K+M4k1nmBTwYM0 z&ssGj)qpXzshoB%#*wwaW-V}=8HkvZirFeFfvbcVHE;^$V~T7QaYTTx6G=@i_Qj7p zT05R2i)OqtP3tDre7vLfG~LHUsgb~%;Cvx*iIjPQl&8x>V9u`YCSIM`7e7;bn>2j? z>H0KnJz1arWi4Twsx-?zs)^cJT1atC+tNY<2H)IL5VvGoMcc%hB5r(4r>F%jL7ZP4 zhgrw0Y3I5+(_-83ka);V{A_E1lz4WQ{n_*so>g&^2oz>(QQMi$veM#uRsph;hk<7S zpIoy@1pjJN*@s<{XU#C8fu)bFL|@GRlobtdG5^!jOrFz@nA4 z)JA-sSjLPZ*^tes!@5m2qYmrfLp$3b1kf&QvlzIcNw`Nj+vjSJBesv9Wxp>fR>FmR z$Zzl7hPBbbL}%#xA(32C`8XKI%)hbE8%OiRdN;7HVZ$jC-@rL=JKE|vGx7Qc3A0QLsA|;=kar?^z;o^q zP8rO^d)To!iASZ5Cp&Ij| zUNwR9stM#EFuj83rgaNI%PBHl0|Vz@9!2uU78Ml6?r{}T!TW_`U-=Xs*IZ5@Te~&4 znL`S5y+8ugiq~xEvoIJdTZ_grpgpbSQ)7Fs3mD)Q_|G%rkt(*|3#l9uKj3a%vio{` z4H8q==)RuV!z%|t^33IRr=wC0(E3C~3?5A2N}()@18mu{g_JGBr|ozT(3tF{-kJDM z5M<)9)MlICd+Gkt(E$Dn zrUFpGc#aEaicDE8S!HL4tkcMXP}3~zii&NRY&B-P;RVq7Y9eEcDhy8Rl#o4&Xia$` zRh4u4fUcV!2_{w>meWZYH0Wh4l)+3Zn5f`0w=@r6dXggEbA3b`3&n?l&^oeE)FTNGOEia#Im6jJb&(jUMhBr0yn zfJ&&;MG2_I$~C?!*u>^&fiHYonSsu&?JGMnEiJW1(pRi@fVV4B60_?lD^bg*ixO=y z5YS59^6P6^Oz=#Xh<%t9xASqL1@%$=enM&_M*^%mInZujuA}QcAPb7T%h7o$OV(RN z)@^ZQjgZwL3K{;uxHK|1Ou3QM943rOaws6Ou6=a812_S)fU}~9JMexFbh_w{b1Jtl zF?rN<-$ZVFz;3X-SP?{+)ipq<+u|Ay7x9QricXHVe^AHj-2}>8tp>R~kPE9I)9zzf z1(rl`SOt@0eHBcM((XetzrcwWF_?1eLdAPwYue+wngxnAdf47tCu^DW*nW~IR8Z3BSAV(1 z8o*Y>zwoql$%PC1qJ^U`@})`ls);Yh4AK$@7u7O;?kU5JX7EiO)mhDmdNZyyJ~RvX z7s@Jv)rr}ghy)Z_+s`;^)NUFIZXOWeT?``X3JbS~$D~YnU33i7yB$(mSlb%|H%TuT z73G>JoC|_&Abb39Aap}Gjfy3G=cd=mdW(PdQ#UKa6KkSpgaRjqC)LtlCVf(Pa!Ml> zUw5<;|G)kj%+q#XEq{6NLA^-R2rA)FkZ zR%>!6=~Kevs%Z^r!(?=RhNMe?EDh-UPM8H?(9WU*&@nVFFD_)sO({>ab|DN>-ulOJ z;K%yMbKs|-Wq3q>eAVoSuk}~y$j@mYlDqgBPQL}dbL6KmdgMnP5$%9_oNrdIqZVjWx4qc9g$zB;7|P&w08cov$mf)F(AGwDaxD?| zg@@VV_RDj;vW-_H%@_66P{G=&s(YwLhOBw&r~OVbAO{z!Sitv+K@59a3RWwk)`il9 z2g74gDZ(;*S*iuwuyXEF9lMAgLsVa95mv$Kl+6h}ac@OIEbNRns!st`bxW+Wq^i25 zi8qm|BAbbaNNF^I8_oSnE(D)sZZYu#Bu`2a4;z*qR)kVjWTI}|RqR(EjE>4M$_Tuw z-qCnDO4;#lPwF!1XA8V3&fp`D*2ZN_BZ{OKh9hDiu!}Rl9^(S|BurT~O~E z3iv9}W1OC3D?;Ctg{WEYShsl6Xi7}|sOH2QsZB}xtW~G#+}@~0Xu;Nzu%z6QjJqb7 zP|>+L?M7j1O!)#G-M~4ZF&v9GJS}4EE<$Qv>XsREdN2J`$MSu>d14X^J32u{JwyN_ zXSF_L?ZU6thu8R&!Fq=wRxV+$!IWCQnA$l!yG(&SJIk4Ld30g8jbxn@Po}Qu0RB4B zQVt_Lj=$50AH(1Akms%vHwVx1toG3ZmHpo{*UhUL=;qZ7bn_&0P#U~&o-^jnvw*h? zIDv{QvAk%dRb|{^cb(L8^*da8xGD`SCW9?z97B~d@?uyrK~1^ zLXIUD)Q;Xq2vW;PcL~v_IEnarLU>qoBH_lyKGrvl@ixLGglPM$a>(a2%1MMn81oh? zpEM1`I|)xA+?KOdR`iIKY^HKSG~kmMq5K-cU4_2rZG<}uw%mDoMAdI6#09T>zU+dR z>V=JkzVb5eD~&Gm!)5S`=yKn!+Yi^eu{tvf5qVa{#&t>h9_OIybbXfemJpcBFrTzu z7fkQ88=wtgexc`smwF*cU&trNUKhNF0@xOjZL%4<0@+%DN3IK|&BT(v3WURLiQ{Fq zhQ?|EZ0wrIVlwUe;GGqm`oP&7!(rD49kEf<{A@F6aCr|QF|?{BW_{7cbHvxVI18{P zW`MW=so&Y9TjqwK7 zg4Wr@X2G)?)bOM5&P7Ih&G3oZO_Ls}Br=U4 z*i4VdwuLjDtehS;NJzrPH0Uw1a_sTgC2$|(WF`H6xDZVjqq0MYPSreZYr^Z4MuEY$ zCf26|mt4-u-I)sx4^MT|cB)Psags(GdyR0w3eK^@R#EVDhOA?*SMWv5sLkSf+X7ZT zMym(IIhD39GmE2U*2g{X&XiCf(#(mO-qMOw2;ZZu+C&Z^QL~3EsJE6hYB%yG?T%L1 zr`o89Gl=XF5-?fm#5I&|V{-74Zbcg*9BNftc-6M*EDg1=XI3Hv(eF`s974I|$ki6l z2^@05)iK$us&1ibokj{9N}E)5#SCE}v5nl)Ql5?L>X8mG<`$F@JFL4PDe7p6W?O)Z z>)1M4!r9bOU|bwFZ3A`)%Fbv-cwAUkgrAV3be))JjJ>1oEcaH_6~IUIKSVuq{*`Cx zj=H1l9d%{8T!yRgKBq`F2T_Subw}MZ+?XlbQ|{(+(HzX!v0)I{>lzSXC<;9vM) zm022=RnT2er|)TEFe+=|SBmUanI)K!S*_dY?8gT2&ya@m%Ej$;^oq8O z`h}B=?N`ASEn96pugmFza56IDxjMg`Ka zG%PSq!d(T+BiNfiFx1y_)GWUMW8*uC}TWi$u^;LC6e zuMsJw1*)Jm7PM4}H9?R041B*#cmi#~HVm_|z_!o;#41{_plzw%`)88HNx)HBUIW1H zLmiFU#TUe&zhIYUkS=r9H6y67v@M8BF(#^m$EbTk0Q=T}s7?|>BnN=@A-(fTAMge2 zd~FPRJNB{ajt&8+Xbm}b2y%A7OMMiv#tf$+`QS}lX$0hIV^Hf=d4-LGUa120c!X3c zk&s-W`a}i>Muv58Dg_WWq(|L6)`nKfp!r`=Q~MdJ6;}ucf#sIQN;F%Mp+?|Ecxz*s z6T1wM_@>6Ps&Ab{1klwHA=|AEJcjG)C3$mppXWUoAvQX(c@q{|MK6+#}9cp zR$42c2Y1Zt!q)PN>c-k3WbnObOet=oZ2{@S`^smfN$7wN{khMDAZ^1I8Uk%(SV0w7 zt6*X%=@-$vRQ7pZcvjdWjsA3&8U!ok4ey0rI3W|Hh*^=ZjD{vG3};*UQ^Vkwi@-DK z-pfGXnKc9!a=X7|SrSaz2bJS(@cq$Q-9oDBuZrlePU`5gzBZ{FTOCGkS13_HD4ZHm z8rgamcQw8(Tq7$Va`tUffYDp~^syfeT%xlT6-OM)*Ro_m`1UGpSz*dD(h)~XU+J3` z0l7oOMurdt3+l_F65%*N^CKl&q%FKc2U}zqJ{W0`u}(dFH`eO|B`R859SVy9C(;=| zgcJx-Lk9yo)R4gl8LsqgnhvQtQ5ha%@Askn(@jq}TXQ#?N$rYeg1jxff&2k)4n&G` z;Gv8`k>$0!3Z_B{D-aA9p@P|0`UnplX^76IYWNveN7bH()0eG4(iw;nXCThjkq3S_ z@^E%~;2P@MJ9$T z^zsUzXhp4M00vEfF_uGZc{D_s*0Y}V+*ihyf#0ORzJG`!b2bPk*u{n0Cx=8c+UU@bqR8 zo)|$i+k7pYCcZ0qFL(+UmkaE#C{**WFln%*iANd|V1!~23s#e<--)FWQPv64hTKj@ z*v=|=oe2m{T=n2Qomx%+AZ<$pZ#vj&j5&U^*~`s-#@QpINJZjozOa?z4J<8+_zuZ` zvYhqYOkP@J(fnQA234_`ySkH-w)B&=-_gNjfA^;KCG#@sO77OZE8dsgG9|sy`N`IM zu&)Ls0ldT`vf{R^#N24lhfPhkXCbFqO9`9rZl`( z>srtC;JWO3G8p4ZP6qk%yOH9qUfiLDaDCT>-Owje3^?v4xW;y+?ihoL^aZU$E&dA+(LL?Y5gbv^%%ej9ad9Ka98^BJ*aO@=L}2f|OOf!uRz3S2!@>E=$Y%5RPzyvA_H6 z?*k+zZq?MU+d0B{JGiF%9o+B8?ssy()7>|N-8}5>WqPaiEBOG574A)}s=o>lmY$5W zK-c=_dX^?C+gjsd`);iPjieW~#_785tu>}?;cSu8Q^o{p?9EC8^@?ZQa&_bE==7@_ z&sqQLJ^%ijPi+3dx9%@p)sTbDK4~vVYh(4IX;)LUm!kYbhpLSis^Npx#xrz1P;H!} z>jTxsx%r2t@u72DA9`kV&ee?qeN5QM`V*b2?@0X+Jtum>Gj55_Zbqj^XVcBA z)<5x03}xNbjdRz(VfUN9y!o1+-+260jpvYThLf$;*B3=E<^?_yJu|O=cJz#^8|Spw ze!mFMoE=U;OX~KmTdzDr>sAUu|2P(b@ca#?xG1 zq8CoBt7Z>XYu&W0%@f|#G(W774Cl`i6+<=Gt&k7#K<5cuJG;dnQH-+1kJdxfutz!z zywkvt%W6GTuQ8aFF6WWv&Cmz_b!7@|@nd3uP-)mwY;@M;gS$!%TKpDut31+@xia&( zoJU&9qnWy*RrU#M$z*n81)6GzjyiPS-g|z1T#pW~cjyt%A(c2B-`Q63fMNaatOQp< zCpMfIoj|XOK}x&y6pCy;xt&A`rZXtQge(=84buhaAxofX&fY~0Pypp9@Q{opx`VL5 z5KfGq-1_QMcqqPi1`qmD_915kun!4vw$EYpD!z17cxh3(?*IwORayucs3cHneY8Mz zx0M`hE7@-)hw_p&z|`?}m1cz27MHya;mLF9sGw*`RE&>K9#C8bW$gO-hJT(IW%>8+ z%BZchTswn|<>8Q86b-OH$WQPbF{}_(CEYqUM#-KU(vI0?Rv{-pKjTx0D73UB^A#p} zS@#>HM3eFqZAHca$^Td~8M*+3o}-)L2}CWmo8hT0Gdya2DWedrkRsNWO#g@#erI2V zij|JtB(Va|rX9K>ZlLxuf!f3nqlqLU)Dp;o%phNIj#6pjvI{yZRV`3FC;I zeeGs=R8_-TIwrBgg>jezauK!HHtnfUuo}i$QK4YX!y^SadLRXB7A?R=FC;|4DmAav z2BsQDD=C>cIfxUv(v&!)KfqINC3DOwbpHViOYsz~D)XJ2-?QOK|HxYeH! zz|z{O%&;t0lrMgCb+R+(1ve9M;TMk+{zhmGm}z1uFfB2T%%c8Wnd~%LsQT$WYcLX^ z7tKuSXh!%q2P1(POXbkSi<4tdq%ryWJANLTMSY%tZ4?cn;w9kNzCkA0(#^Ga~+ZY86*#OUso~ry8i$%oFk`)+R zsCvIxR$zoSJG6*`TA%af(Bg6U3YRDM#)g;|?Hx|0e1YarvI~5u?W1BkWz{Qqc$frW z-Cy&(Lv6kX$<|TPj=5-mJVn8KBkj&ZEby^hUVK@LY3u3XO35)q%zMOs6MGbpLaB(Mq z-i3VCkTND|&YjeT*~mg0ebA!;Rss9m#4W2Uwb9hD%<6{weCI5Q&d^Rxte@FsmCX=r zSd2hvpfBv)7)Eu>5yQ7_)lAyji7;mW0a?H!3qj$lE=x2PZ8GziMcYWndUTIKQJIV9 zuoU)9XUEK}*XogR!TyWdT=+L3`ARB6r)9nK4C&Co{vaES;1kY$BV5n1Xux zx1S6~i@+2@Gc{G1RTY?m7T!I|X(DiiFZNaP|y~Q4t^}B;Ts8LOCye(Mj^`u|C zEf_noXZ;!o3gN3V!OzkATl=+IA!l$$Qortic0j0%_wkeeL+Od>=%>gl&Uw0Dl!1Hk z**%@3a0V4=ZShd3I`+^{-i|r3niT%WxSvq4%3Nkd9k*hoa9W*Z?y}rnmbwcwKDa5r zeIUP`mzAt9rF%aWTyd_PV|UYRuS5nv>*P)=Kx}XYN{3STxJoEdF~U5KtGkC9UCAA# z^FW|gup6)YbTHW@>PmCkwYIc#0P=^1T0V|j`;}J(XQ#n}u5z3Ku;D#Uv}RWvP=!@? ze-Ik$%2yH4K?sCeH1ldTsVX#xPw(yHL~O5`Y+j@_XW!e}&!#t%PfBf?w`lJbq&(fc z2j+%MKqvaU2IAOt2ztJl11(Hp19hG#y|q`aNGIEL_DWaDvLkw~Bj3Hsnzl?9s3wa| z4B!ZGIabrNZPOaF#EbKQ_&A7}oM9t2&C9)}>VER?C?OlUqf|LPb#E~KU&rwy7vHYE z!Q3UHVKq*T6J6ST1Yz3j+;9Bky+YLVQF?O8lN?;A&o1~gJ9Csb&5al48H<~YXxq)? zQ)MGB1>h;H4Q!y%MNN`xA$yqzr1Or#;^HSWHQ6Von?FMiNv#sVn*$dT2HzxG1whL| z<|hk<5(c;&Y%B=mkTtFM_7mTGV(X1-cwE)0{4?Z7By(1mo6$o&cM*HmldsM1Q*dHB z_p`x*=T^ue=QuG==>w^9M(hL_F|*>Ln7o4ih!I;gg%N|6vxY0l7vA_4=i0cQ*T=v| zHY71(C=Sz|pXDgERndCNFyvg1^BDV~={Mzvh6dDeV{QkKc3PVmRp9faqq3CdaAPO1 z|8_WTj6T_mIItn7R<)x={Wj&&G&Wqys8l}8i7mXa;2jhL-wbjYyqoCnXSfB>$pcmwOL|u8AM>cw&ZA9mK**H*T$bk6Zhqui0>uW1*a4 zTSC|t33j5nY&VwqNjo&mq4-eXsP!;UL}S9gdk_Hx0wX_)3ICo!csEGO>o3QkLMvVA zrMCwYryCQ{;rO+VoL{RZcuz>u;bR$Nz`Cfv@|Gye7q87*(}KO1>F-RxetR$z%XA^X z@FV#K#Dm}kp78+YJIE0$+JeMWWWIy!Cey`qJ7$Un7$~+nj-s`e-|vZuc)SjHypF`N zcw#`*yu28NTr_4ZUi#|K1=F5LVn{D~BFWyIi=BNmYmpQu*5nHLm}X5L-ce!vB;gLDM3v*XcW<-p5!K|=6dErPh++JgbKlDoUI>4_{- zeLrc!c4krQ`|+s8mB-5Wao^n96`i`?KcBtU;?5aljN_!i<=GUWoNy>$oshD`I#+z~ zpq0>(qT~T9p(8XUw!}WQlTRJ0xclwgAIR>vHhI`ziRP1&6w7^&Ng5GYBatGK{}Wvy zGhm|b?X7I8AN0rtov;pT!})KKVq6Ni2jUp&+vQ!MsQUJFzgaF=mz-WlTyQu6sp53# zg-$3S1F=i`XaZOybq7)~xPGNxOb%GHPJU4ORDx_2iPg`A*strXg>I7>loE127_*3B zkYQX=1IMl_tKiiA!DC`SXd?(P*GLZDYjAZf4A zxcl@Xea-rjcVG+4U$e=_2l&60g1O4k0kmc~iOvR-jQq>0(P`4w&5lkh3fiD70~(oN z8Txj_XW<^mP)zeS$~q|nC5p1m60<1-DT*?@oRRMco6kvxLxMxt;J11@d4Rzl;Ni8d zd_T9B=ysy?1ql5`x=rrk-4dsYy@30jd_$=a_O-sjJbO1)PWH%gquQKvW5n(+>=ErM zP43YBYgU(T)pc@h=`XpW(yPQLSpxrEWV%(s?g~68*V{OXR~_R7FU#Ay*Nf*1n?9p3 z8ODP8BTTQlBbc|s@@i^rsQOm&C#>Q36=+9t0I2-6b`Fp6`Bio)khzyA?w>zKE!!?x@>Q>+YOd zN8KhzL9>Uop`sRE<-ayvxv<=LsxpyB0hVGS8WqdQ4!iGtZwhtVf~wNLu51iFZDZ(h zOkeVmfBx0IuRo(vL;FR_DLh!|(#-VwzYf;D6#or!HqLakM5gZb0Rl&hTXIAKE8MODc-AJXw7>2lXICT#DOnTm3!AK20 z&!t}h^66)mg=4H0yiXQODly%SdG$do<-5oNK}&tj*Y=g78nS4{9l1Oa%t|t5<1_`1 z7>I&k~?Ur%bFPTW{7pflh>S10p7@2RC^k zRDTiE-A@J)O#~ZbhIIY$600+u@$vo1u+^aTqzMPQ3RiqLHT>0y2RGW%Bjv5Ahf>r_ zj3ot{Wt6e$gVq^LVc~2}ix*9z)~BTJWBYMk&&(NjO35B)ybHf?CN zt1}#-8GvwOb9Q7|`YYxBTuY**oKQRE0o>(V{wA2-1xCr7A9tp=@VKg6e?Mwi>jnbK z#s;WvGSY?-#L z-O)h0@)^O%1R2wX0d)lrnJ2W4ozkMKx43H50LQ2A|6VYI$UFdrb`_HfSPL_WJ37py zfuU1hBgZKF5Lyfxb-}6@w_>1?LDGf?Bv*i$2ME~cG=(5cWd}+aHU3n`93!OQ{BpkI zcws>R+0$0}_?wf;Oj@Vx3qA@07@WLQ`Z@1ZR)aNQ>t3(G>+)%#J1s&cbf<+T5EtN}GJ|xpVSK95Y>-ZF zSkkCh`PQW|<;j=db8Cko-9l|_VLR4^s+6Acy@PrcRQ_Dp&gR60Cm(Epa;xOK3#0 z~$CtEa*>=o|KY`g~{c^WL!(Li~ ziiz^D;1>pUQJ$K<08ycDAj&dG54-{&66v9wbI2Ujgekc|yvFKp0%ni=ZLl6tpM0~ zzxGXZ;o7JZ!Y=m1kP}5LfrD0%3OIn_%6LYtpZYFgJo!C}TXE~~)T}4=UG4dXEjpug z9_x2EB&Tm~39)0`v6*GJmoal3!55IYT73g}9H5TO%RD$oFgcLB2r5`9`^hXwY(MT_ zr1WFh`G4iX6Hs(I<>)$pRpjEzo8%h8hT#VQ)m1}fscO-HGKJ13fGrdam?pkA{nGy6 z>CeXSsq?31NG$0Xl_W!$<`F?L3;RjfPX>FxIg7c}V(o5Rt%gH5wfo5h-_Py7E)k4LP4w{z8& zLH4>n?vP%HhH>|6xW!^;#TxTIRXu>6u21;{>+dp7Bfa)_eY zMG=_YmmH+1xiBm1)1ui(-&v&R@FSPA^cs6fpAsH237SOSvXXtpA;gRpiHvSvl&nGg z@!~R@P(Ey^mJPdY&@A0PEN5bVXqZEenhBwht8)D@@j81WO*(HU!1>FyA@BLU7}Ju%i*I_WkNGf;Cm!cwCEM zF|c!R>gEd?Vmzv0?<9Ut{uw}Nr`K3uDu8k{Dzi!$jW+3__BSav`lQ~fF$NC4R1kNW z-!@?l?31`2H@LF1Bh~^o0*wjkT*2+SN$iA>SAQK~?_OGp5L-~OD{c%tnP`kdwpU1a zZ!FlNBht(ZK|Q2y9CtR|S6@g=APsekFfv0K3b1yd7zQZ~VJL92jtUf~eT~l*vbI^* zZmW90(B9BQ$Uhz}sK1+{3IC#ao-UW*62s+%@+fZhiP%PJW0gP7g`kL$j0jOjhFUH) z7f42UA=rpsGwQ6T*5V3@29zvm4B+k$?Kc=M$*!l^Pw{|Fi2O~dIS~!;F2h&cX?KL) z5sqyvo`~i}kgYMJG0>c`m_MhpS8_;<-il`j&_Ml*CPH^TUQWIzo0G5n2{J=Dvd``? zF7rva_E?8K*Z3cbURJ{8sCKToa;TP4d-pU?(Tg%vma{D04YoPRD3zV3uh``n%-2qe zK0t^fwq7o{BozgxEf1kH)T>44Afy)%TLc+B120&XlK>l1Pu~c9l&-bcjM&}y1VcNi z)0uh?2IJ|9zYoe|VmPKmlL3NLESRh>-T3#I=!^nhz;rQrPXjYpPNE%s02T7#;7wWf z(>csX!~r|cu__!60BzxmH2O4pWp6*tg^5vg0fXhTG452y4QN#dG$=YiL%(01!;%%F zM>k#Sb2%I+P%H-;mYB5vfnfRzT-Xq^2AyZ3rvlDrW<(66dDhR`v*H2vM#5_lX!yRi zNrBP;r%jEjod&ppmXCA+w{+HnK@S*>90hDx&A~>#Krgexkk)o;94)aw5s|UY^}?7fj)Vg2yKE)5lh7P$${Z6LAzl203Vey|Yw`PKzR4mXb_^ z%W_Ud;<7B7koc>vDHX6(ka5gwmaLd~#H?rmMV4y!*s*=(1RZ`H=sxk-=$>o?JFQ3H z1h+Xa0xp2OIUC|wiJSv*Y(#77W78cQDubs16A-QFjijT%QFoM#I9@@hMxPloOuy8t-)5I_DF`iT~|yHc7;n4%VRoNNP1 z7kn!ic=5QY$AS8K*6jLHl?6KS`|&8g>Z-Hcq%z6MDib#-CAINN`K27Q276K2m9$wEaA638Ksc=LaLaT>5fHv(AY1kNdoo==e0NJpA)~HoOJ_4_@j_KbTgvWC>I5|o z78xU)UiMuSTlMsY?*?njGVN5;FMl`qcC$0tSK>eeFRmGZEA*G|GyNrMd1er&{5fT5PNRrtxYmWvNpgX4jmYn&5Y7GO_DwfiY}O$snr}=% zHs3NDGs8j!@Mf^U8(Vx*tZRM8I@edIVg@6QFSb|bO?maK)~n{zQi>OwnbY+J7o~ikzEDIa6Ngr(J#*Jx=u*c9< z3_~ueSL!3w;x)k*JB6r38Mt$C)~{YPNd z=`4@&L2yO!PL2qaO*N!PTmNP4Y}&FK*#Q=1-NQV3Y*To8ED*Y3?-LQQJMwCogHRbP zz_LrH@^*DbfDMbHtZl8tY*?=SvRTTraW!1twevTP*~z04CcuoP_2)pB{1K*`9 zDzkmrm00T_I-XpiT=o8Lu963Ls+_(1CcBcjOQvtdW)a{`gRC-+GhXH2qo*)h2$y&% zkEFukEev=Ed_C^aBYqR|7C69t@*qszY*z6sFnb54T?~noiomkU&Wdr4p77V8Nb(n= z$Uqx9;g83QxHSEmJfgJ{S2*Q{ZyRr=ahyuS#==QHd6_g4NG^MPCQIDmoIIgcqyNyr}Wf+ zMx#Lg#ZSx@6hkg3UQ6_5VRW2MQfsi>j8lbLz`vH0%{;@=X!nax(=!b1$y|5vJcH{2 za*;uXmA^4QMZfoo;iZ0UQ@lo3{Jl@)x`SM03Xwr-Uw#G?u=I>qLZYB~8H!X7qtsO` zzcxx;)%t6r)KxK;ZIrqy{<4iwSH)ts5o#l*5NcwK9Zu3^{KC3n&h|OKTOBgC*(Dw3 zH<;XR@FFv&vaL{rNr)3`crAY#=;%D zEseY5ma$Ig**JM4U)G0Jc$a4Vs|iBd&>%djP!oidrloiWLKVPNJOiPM_OiS_J*X&_ zzbK#wl2D3gdLUspe=b~cPGN*uD9Q|tW3<)C3=Lzn)yNDDW3<)CjA%4#?le-*?eJb| zKF%R-v75`>@>h8{NIkZRgbJP7F*^l{fNC^uo?4xhKM}q>`BzeCJo2Y^loEWa4-m!H5IGe3i+YGk81;bb5cPnCS*ey- z>mnjzMt13np45m5oTU+yj%bi!6y$+oBQ0|>(gJ}Lxe%So)Gl!iYOxP3pQr_tq2?$< zDejv}3ebv*6jUZ@{xV!|cp7O8>oU}+I#M7_b|=d{bj#f=c46{&AN@OD%bm34!KEN* zNvl0fzDDucP31Plq6kR3QRWhh$dVIJ2^AXvg^U)!{fidVoZXNQj>ja6hQ#!WB=EeX zp&4bKSkKH?x7IU>Q)Y1`k0!QOt~}3SeIo|R?|cpvR(RXQ$CuTFdQENOLbtGmZc>x;T;Qy<u&ZC;nv=9aEmJuafX9;^Sf|xFV6#9ck+zmjpfsv$Mx=!P0B(iTx<#%Co*L8*`dqH zZsI^>p*9o0BnW(pDkAN~p}@XnPjdC#I;zL4p2{~h(28Z470u(f450^vr9&+&9T1id z2}{YZELuGvG#zT8=|G_h;qbtWJ_?J$_X3rL`A*)Y{#pEIFNvs- zwi9}2!%=tR&eOntFhg!6`?w0px0AD`4asLuL2_r@FG#5m^3O=O{WKVBqJ4v;p@M9X zCXwlc^MQ9W$Ibm-)URDHNZ#kG5{#w#XiVmZtpvuhDEXL`kXN`Uxz$R@?OT-mrIo-~ z7A4JnRs?66?caQEIqc-r6S37J&UNK@F!e5h;a#eL5FMbc!^GKH3MD4pq(FRlKAdDf zpJ)wkp>e2(#IV*D;tu5wsiL7j>u{~w>F;!62YjtO^)hhycbgO5LmsRjg4O{9KV2X6 z6ORZV+Ob(>U z;|*{Up3m)%{CW`E7gHD{KPr9=+^?)l>(;|wL;EP;aW#ZJu7-7kFbDHJY@j>1%V8K* ztrU0`klO+kH-Hu;H&Q|_Y2%N%UF&Y&$*proO}25{<|Irqh7o7lzU{10N^!5k5 zWY?R;*f8HreDWyXv&lREfoi>0t&)D5u$c>yCzh7(^VXJ3tpo1)t4p}#s1;mbODo*% zR&EgwRJxhl$lX4IwPeKI9^#gxP*vd|w-rQ*XZ?E+`@7zpUj6UEJY8?fu3zH%>?6Cj zCF>ekC%-AV)8s+5sL>GzIK;iYDJezsVQ$C_g|@N+@^cB1Ca{t6n@w7};g`YvC&+eh zERA$aF7Vzd`=OwfWPB4^__rG<56UM14KDyrpYk8U2}~_b4NdvAgI8cX5vX*$PZgF^ zPCx)iVFfE%1svN>jW%=;!bpixyds1#Nj}SP;xNX<{TxArF(O6z zJDEcL5E4>`2*d=nBf{_4F%%Jx(KGE*$I>w|kli*jNUegD*R2+CmcCAsS8j06z>P}R9kMra#oid}y3JRlqS+xMT{jcuq3a`FoalPUi=Pd{F(kUf z>}Z439r&1I$Mb&`yu}+xfBdT;k%h)wbS3J?rlE!<$odJW!HDyJ9gKLDbknbc3#TH+ z0Ye)x2}eZ?jr;eE7;BFe{%``K5O_PLSN$eft2MayH;DJYM`S(LE(r@l@i6atRye=; zq-^FkWHSluZDvo`m6<+US7!bhx`GMk=n7_>3r~G5%fS#vimJ}!muSb%6+6+H{2RCD zxZ59c`wVxhq#9?t+i!4tI=4+Ke}(&XuK0`G+BpE7$(`I1F{;*dQpb?{2HG=I+;t|o zMy*p?HWYlS7-zaQ>_MBH{kT)AzEj<=@DYjKMbAbbn0P39tLf{#a7?rEJ})#1d1rS0 z0p+K3Lj?B|Y!c2z_tN?Y88mIZt|%ZDLJ-R+cSI1|NZ>j@yuXP9x(`)Xs!i5_@)7fJ zz#i=ONBJ!-!gzZRv}hP-aach?!#D)M3JMx#2Uqb*LBo(Ntwy0b2+v3!LFp_$HzQe` z^I-)A4GS~V-$CW!qi?7<-D2hJn;<9WdmaeFH+tT-^m*m*0WNDg!hbjwy05fLE{Ugx z$-3pt6EKT%SOw{C9fc2%%Lf63i>t|A>3{>8UmKUD?;r8JR>ZzKcx_W{%-j@$QoddpGe@&=RoV-#Q%@ z%&55QI(Oakl1lg_&pRpI)fFxWTlRdjEBpgJPgKK&UUzz^9$wpTOZ~i_AyGU)#}L0) z4d3alN&l!8Hs%dVkte0nbdqx)c=HL>mu4W~E#NB73B+#9op z!)dee5;CC=H$P<{rPG?!ZSbSaK9l;iVK3|GajkX2r zTu8QYnBCG+`oZbpM_`C=pAkmsi$}sf(X!W!&@nmm6^mXS%lsa-UAT^Qx7Z<$7O@(K zbewDS_GHg>Fiw|@g_XmW3yLmV#bD~)V_@py z^tt2VqVAe}Iz=((rf(bP$Q4rDo*Ax7@0}HnHkHs_91#&`c zs__y~kl5qUDDV3O-<@7LGmKVKf3kt6h%{vQ()BU-I2X|a`j+{Ql&ufaTvN5% zG^u^*muH4co`xcVm#xGRKvO-4el$oZx)*uE_-C--Usi7r=IsB)cJ(-St08p;fL(*L8c_{SBa`l)%|YW;V-^6(*Ab^mu;nle5Q80^+W4zt z8hF~CJuS4SZP^pd1HWy}o?sw&+MGSXMDX-Thie7A=ZT}W)TV9^a%&7l%IT0Z1;5K8 zM@!zt&lf?o+k}E3`3971HXSvk5ZV|v?M@CX(<75n5!0bfN_yz1ioOe0$kj#{0Kave zWF8b`LB2hwvtn2cW29w&MzdyeO0oV?d0IiiN}!Xof`Ty7niUl5A8nl#6od&?vK18T zA3dHG zZ-k9Cs>Df!{M=TFGGdD*5SBrA7+7W4#Wx<^X$B zwsG74EwE?<1;WWS>38SAKGf2Qx#5evZF_E*8+sm(+vbHcxO{Y8IJ;7aM)%DN4|>(~ zv-88{)4SK-_lEcW_?P#-^G)}edXhPSB^Y@3f^c}+(E5)Zy8q!%{Oj#|P7y^fi{*k? zE?y8uw0X{gaAJ*1q_`bri*S?{w&~Up>8-kTPG6gK>-LmK1XDKP1>wAYDJ+5Y&Hx0| zge*+IvmpGMaQm|p;W^a_C`)uk52v5MIqhE3PFWc!QYcxU6y(U#29B^R<;o{;^Lu&c5s_B1zMs8i`z%sw-HK@ z#h%+xIs-(%qU;fL!o!r^Of)|sAeC;Dnu_etP2$d(3*vEaA)xm#|dnJ}I zu_)4Yw*+LadnF*F#@p{hNx6R2Ct8>51Ae>&9T$=Q?+GwXn`=>WW0P}E6zl(8o-z7! z>WJ#TGhlb%x-F0w$b^4=faQbh)<6nCC{ch=&GVzaiwJ(i$AHcA!MkMuPR}5e5(q&DO0yrqbKOM)zK4>pfVjR zhXE)Mb`C`BQiT|yIp+YW5>5oO;7hYguTbBZZxty;$%E>doh^Qu>T7~Ta)g$P9 z$qW-=Q@w($E-pm|i_(&NnAcCa{sRw|g%RT+q=Xb8p9`G>Da~mIg!Nx9M;?wE7e6y< zK8DCClGa-Z*UbAFX|6qiovGb+ZoQ+FY25uI6W9?_uW({ZYu1r&`XB~ZwTnzGt=+C4 z;&p>zkpux+1a`JA-h>cw`iTn&(<>hWYPuLX);2|u1%-OC;?^ z&;2_YTMttUzF|?II~K`o#tny-iM%8&+k$d~=0k2i#+V6mv*x36{YxnBS)XF9EJs(6 zd=#mcqTDe@Dn&Hc_{d}{LkTqGJ!4Lcbm(r&Ymgx}6oXaR5fdayUXEsmi<;ck5uc^L z@9v17t{*s=$ntgE-Vra-^S%z5BRDR%Lou>wl{?~T>Y@^K(9sr&lbK~_`D70xkDy0a znUuAquh^qV7Qq+%f>Ztd9w-Vjp6ILY%F@@o^()>;k{Iu+p7O$M5w}NDkZApc%j04Z zTJzU;uuA1Krd3+SM@sGVgUZ9?;3%7GpHfe{cPz1s;g4#Q=cTQ<%0NbvCOnUy)UOni zMuv)$OJy!NJcV3(P9<73cTZy?SUaGU7Kr}l$q|YrWblDRHjYT&CuK ze2nE|$8JBKRfE5?!D#BJVfxAA!=d$U`7)WM z-+|opIC!-$xudMOM&!Jfp)?{d`H_Qp;ujKhc#VF@;d;DOH*dyEIO&U(Pc#{d`a!!P zl42^BK=ixTAk7dvpeV@>S(fk>zp<$s2#=YVpk(rwK=R60_#IQ=(!SDV9GH>Zp0OFA zTo^q;5)*Ht+{j|e%{0O;gF=gd)tR{3wo>nou{VX$DPuT)abv!=s6)sUzz@lve*CRv zGsP=WfMVq!;c~atiJ{bS$y&19yJOLCEB7wGV3Ifv&%HY}V0KsEQ<2MD=+%ne@KyO_s}l_~bc zl@?e_`BxA z(jB7TfhlY>htGr%4C4)kf(Jh>McPuXcotrmjAvA%g?xOW?ib=AGQ$Fi;F833je>YY z_s9=y7YT_R8$(V~SwnVopt2$vVZv(pKnGXHLiy23?Wy=Su#n0pmzwHlw$@p=`#nOc zsSF!6J6m(02XQvyVIVF(X4z;-@h}%ZfZ}1vrf6>QZ~_sS#ltC>MT-a2az%t0KJk#> zU2t^jp7cIb%w}i?G`>8U@scx=PGH7NkWG%5 zBXf`&PS9RaG^2nL*?Ht1%+!CNNowW{G<7$TObxU2DjY`*aPlC!y97zpSq@BrW>t4G zcFSX5;mFD7ovx-ksh!s|kNNbC=ubx7XZDQKK4?PW0P0Xv>F^<_yc&(Vo4QgeG=k63 zR2iXlt>+DoBJB*10R~#4e=|TNKmgjqT?zRb-RJgbBAIu2u2EZ6fK$J#)-A0{_A|7q zTYd5M<7BfjT)zQP-u*})x?RVFY1YGG>mXG?w5+VPJ50qT_2B3@G|DRQHf4x71)Z9| zPkhqQSxg#RH)Csr?L+HF46_jlCU&DaXkMy1WM})G$0ozh(Z}|9hNdIN9_LySZ{d(5 zM~j6b6{522jB=3?(u6rSGW$4U!nK&dNbrbT4J)GoGzpyu@e8E_Z$iax?9frHv9m?` zjUmIR8TpbM&6eCiYsn3?FF7K+i2`SRjkcEDXtv}As>y?nFtOyuvL)BP;)aOF1bwG2 zIc-UrpnS=Zy9l%=o$Y_V@bF@E3$ND}-mGll^^(B0Sa?HXp={yl!n$kX7SHz{YvB#M z?lHlrY(g#XDoO$Qy+kw5?3snHF~6(?v!KYdLn;CC4CvnHPRklogU*s=GP*$Y5hZq63>6|$bqMeK+9-+jBszd{1oX^&ceq&VH!Jt)2rfD~IgPkoK z5g`;I`A_tGiES?wJCw{(bx2S#s^u#Zf$xhX4J1wf3g%Ug9MB^{&w3!>S^HRm9o5Kw zME)aX)SLCpAlmtDQBNw3h2x%l+76^hN#TAO4feeQW#il%JZU z8RQ)%&)Nc%*2{jlAi9U&INjx}pCqs_Z5$4}BO(>Zgra%swRv)L4g50F%?{<}$xz+F z5s6oU9{Eo!IGd+1X&ydN=zBC&+JIkL0(IarTXWSPEwT9#z0*9Y2gN+)g*HE6ktWS> zezx%1Ix7!W&D0FTJDOKUj*eyqRsmr^lg+Xqxj+U4rb;avj)7{EjTvxAgc4|`WHV!? z`kARwrJ>OH)uv`j268rIn+}^%2Xp9yHH=j<|EZZzRqHo5ReH@k>@{_AMutxSGi!^P zVnd}mGu5BX6kJ6PJ^4MfQK3xp|-)nXTotJF`9lCma{vjp{V=B+#%)R zTJ9VB(qimFJp;Ua946R`voiP@bJZQKJd?ypj!c9}_l6#wY)&A!XoHf|hyszvE@yr8 zpaqY*T(Nrs$YHD6kj25>op4dlrVvCIbP#96H}AG+aI#;+*+FWgyI=_h$-k93tWfK% z(M^#)5!go>!Sh~<(cjLn_9tx&Ykwk! zm4p(;*!H*Y!u_0QTX3xXG9>35s}EJ_4ZM=mTZ*Lm>of6XClCGk10<-?ojvG+@)8jb z!Pty~a$j@`bL0<{)_91UE*${K;ndk+c*xq$TFu*&TCYvrj%}k&6OUCRGvNTt?90r7 zeHkqu36C|urzt&yR#JeX55*w<*B05ldR6IT^pmMU^0q1YXoVckN=+TDP3mWmJTx+W z-&xAvOkOwCL}fISYj2U5uO?QOK3>W6g}W+k`oi^P^n-b#HgsPK@t3$iee>(DbDq>Q z(ZoJ{aG$xzCXb{mzT+*Ua|+w5|20S>C84wk5vs>6L|4*Le;u7N&DQGExeL!!EZY2N zwW5fGXRD=&*K?t0kj{Y5jw_q=0u5l1qW=e@MVX4yX&n&6T@HYz#Z|g{WY%9Fp^gTn z-w7hqO*BGTq=$7mOZvLs@njs_)25E*tN=sS-=dE0B3Z?MCYhreGd(L4mJO@Wqh=#3 zwT;a3Z3`&MyIpPRROdULDsd<%T9cO6Rc4l;nThm2L=h%cx2(s(LUhPMGv&U5OpINmso8cj}7w|6W~JSh_&m)rsxXbMrV$5I7P& z(Q*ckDE{Cc{qSs}ICLdU-~n9;e0xyWm6ir-B!UeAo+D9ZZRwz{40b|p0Q62?39?ZZ zo#VF=G;{h5ryYKa1Z`UnWanJvU+>evX~ZSyx^R`hMORE^n{`b%bX^~SYkOE%V$BZe zYNwTrMCe9qJh8g!TuxmbT)-t-9bCi(&FT(S-K6B!Tv>?~F4#J{=!zYD(##AXiu(XN zN`tFP09bfZUsd{nW%$qXrW>9VbnAB`TYXS4OI0mz5JTG0cCuA+WNRN9B5u>6XNGf& z^Q|(|Aici@nh#~74ycbdYh-$3sm|?uL}U8ow0NpiGB2c+mw-PFJBOo+oiD6*~BOf%Z5YvhZVyI<#~; zmEHnhEdJF{xpOs@J3cC8gjRg?eK&kHFqM0q*A;nMsN6eM$EnGDlp{QQXPPOltYP*uCp^PQ@lbt5ya z8+ATrU+d)pemDUCVE`zG?^@9)FR&%_Eb+$AlJ*cF?jRY7Gl(>+5bBc3E?Dh9i8e^H z;Bh(RmM>qOPUjHXrfbn=D`Gl&R1SP$0*aiK(^)S7ZMrPzMXfbD{$M)37OkRnlz#IIPxZWw+rw>yX%tt;Fz_vRMP2K;)g83pH&v*_yN?%@voF98DGz& zsho8jfPWsRk~bwpb>zP1#1rcY($4!-p?yiv42xZnau5`@ianjein8$2dH8Nsw$6xS z@X3mz1hLrn5$Jr_Hgg3nyd@$)m(Dhx!Is6vd?6OWDQhf>u}s3>ylla zA$H_L?BLdhsNgI58|o9>fmN;kdNS8$zq$42ek-^|*;(K{73N31v$DQ`(5~Lp&h!Rh zDP+1V;Yo*M{VmgpPT>J*%UXQ3?A~3Fy&SemZ-oStLtzDlFqxgNoUzh#nyo+hOHN<;);WI(hSmvyznAOB)zoyK$Brp+jLF_(-4?$^C&D@?IM< z(K4#6Dh0Hl7xpQGc**o+_Nm7@>FKDSWb%&q9mW&mwDe!x6sS>^OZe_ zVY?HT2jyx%h1A1|EB)z3;S;=F>B{GalRAI$1J4gHcaP&8(Wc0&e=a@lVmwMemu|l} zT;%;#`qvkS&*2iiAbjJBHV=-+^Q}A5m#^@L(;HvnFW?h{FAT3e=H8w&>8rQ?i^As~ z^Sd{^D7@6a=_l!7U ziOKLhO~LCX!!y0T=^c~dsmI)zWtZA)UV3Tx!ef5-H}2ghye!;s%

      *S|5U5zf5Mguwh6|YGDJAn$^NeKo2*zu->2t`QXFQ3lur@KkEAlKnpJR z=cQohm2+q65oxuuOHp@YD>(QK^7pN*tXL5O%w+T>7C?UqOw@lx4gY9m_y13*q4N<| zn4$*Nhyo8$L;9oaJ)(wxw5j2r(yoSoZMzzNOS>BW%kB2?Klvm3rk{%#6i4tMk{D$A zV+gvqK|c2w8$`7~#_j_Ow*md%U~~gq<{Y4$*TF6>`Cg=y<wxJ4APVOWPFY*<$f?gGVr0EEUSOB;om(Xv%M0Xs~}^ne2R#ji86Qo0-K{%Tb%zujs{xHnY)C-9OmOh7Y|J zj_IMAR;3YYMQcR@=>eKnsnTfr26uYlb+Xq5e1x3$5{ptrjW4m6(9BscvjfFz8bD|i zy5J?LrBW1jK#?Eo<(03n%41V`kPko&EX@&DXC^Dtwm@drj=_a=M`MgeN+h|T)hnnp z09>b#l{U5o41nD!3tnXdXk-&!WoE_p&uBs548pcC+K-7BsiA!Ic1PFHFqHR@P7Upi zx8*IbvSTocw!gm0!Ypkxy#*c~9o@F~H5O-VN!zS#Y%^1$Cj!<>Odo8QSpTxN8Gm8p z2-lXq4qUrI?tPt&wNuB-E4H&7cEj2mw=?d%>o+shyJ7XNyz6gl5hPOS8|-4HgR#qT zJHROaZwK5>NCi#5-0~K9Vf0Nl5CmKGCh>3Z__tI`FTTZ&M{eHR>?=NFGf7B-a#+A^ zmP}+}7(1MVvnVQ>cR5^gCumlw znbvkxt`~P$se~&(m>kEp`4o;MH-Eq;ytt1Y4MKbL zUo3-YH}h+d*R5?ge+{PB`(<}SX!u!o`pHf?tDNV`Ui(>p;y2NYd5%0|Kj!vUdEtIG z)iob&kL_o7kzhOPJ2o@cMa(2cy_L{(IO!4iMH{Ozq4L%5Sg%ZCKb1@hj1(M|N^x#xl8!@k(^77w4BAWxucw zzGo)3Xo}5ovDin=Hz(VFi1TSE{~hNOUBi$k>bwNC)#-e7)-sOxflXMC#8N3#nVn#m zve4kgcwTAndRr+LuwPIB#q0tv8oUt&&hYSl7WKn`MsEKfgW+w&yuzFwW;F}y@$Xi7 zw}uLUr`m{+60wjn)~Q-C7bnY^%u1z}B648<0&G9iFF;G+8%fg2Jx<|L}x30F`( ze$ilbDbs>-d6XYpeuNTtgJjvj`s&4oB7yux#<;eH89)N?jiyZg=n+fsP4z~pd?1Tw zkGt=;t_jYs6>HpS=mM+VY2fX0cY29Dki{qYI$<}%o{%#$_+WTuF^QvPV>bT|biOQy z7xn&kLiqU{u7t2Zm*21OeL4KRVP=kXuA5oB~epWN1TvvE7~bbbgx%WLv^|05ne z)E8<_=}v8f3V1Hb`I{HcVG#AUBa zwVl?Be?Zhj9_;mRr2R7+_^}xWNqaec zFdxM3kyj1omnzC1%r8E2;+kC!;(F>ru88ZQa&F4Mm+^Uneq-`7tw|SbGD4K22sH`C z;L`x7Q1SzQAcryPV!6C=h|Pyy9zvW>Muzgj|3yC@9m?lbb?Zll>Ib8KCrQq5w#+RpUHf)kBulc@+oz1s8{ zXvKpYM!AC3Suin5`DU+WASNUzP*C7?p#|Z*LbA>ZQen8TjF>i*y?{Wu((k1Nt6kYGK=E8PWYy)QmRwb zvBUjYadJHQQNMaugKLe{WDjETF0LhG+XEaxSG@?UFB@QJWa+u49C|j=@eHsKO)qzB@JHf*sVuNM2gVzbxOW&I0A=}f=r zr_yO+-t45gK(i56=-?-)gpd|j&nB{kIH$sxfZ1W-5GFH?o@j(Hy2WW$(-Om;DUqIM zcrR~&6#sx6@C-jXanCc+fGW!;nrU+Hb4K4je!(s$yTmq8!nh@alk`j4b3khuF`i)0 z7RcQ%8lgBnw@dozCDSd)3(J>6Q;qB)LUjO3LmATKEQD1kIA}#N9o;9j z6((!S65=t{0uaE2W)hU678+kdA`fXW%J}GDTdxWHY&P~G;$x87&a|39ujNZ%_H&>F zTz6u1SHdUObS1oE-4gkyiTsS{7uUlKL;VU5S#*)?H;E5~RyT7J&(B-LX(}&_8DfJ5 zRTC2rpJQ~Xte?a$V2j$`pTzHD!G;@91C*r&zM#BwCj4?OQ}}jvrMzw`zZ#dfqIz!` z$=AJYgO20BhWB6IeLTOiZg;jHwgde)FL}jgmlhBfLZj5o+Bz;~Rum?=B?KHuLmZ*r zC5iR1X8G;QJWqaiAvXsBO<fVlrN zeUY#S{|x+T3_m{7RcUR9ML%LB@fzU?A#^?{S0f_f1Nd?lBKi=|V&RC#%d`X|`;^lr z5l-wL08kkwAFADiMe7OZ4~N=Jyt0Ci#r~_jf1e!CpJfJSfbZgQP3hvX8l%NBwh^y!pR{|IAun=6qn z$my-oNzP;0>VX>b+J+EhFsC8A$EwB$2&(bns>ZkRh{hKWhY^v=#VW7_1sxS%ZBr%o z9L=gk1YH+dlZz9%jf}W1DVB<%ptMs2(@s9g9Eaq4plc~VTS)*Q$axBnAOzxScr|(h zh%`##Mt{H=u|@7I(T}WAkS?()hj6i`%t5`BLw;8z5c2ChgErvgMW|Gfi@HnsSlYT! zO!GaIO{ikIxMOkJWk@+%K^1~{3<$|@p&nM^WjJ5NPGEv)H~`}6}-DBrjU{_3-?t(GQ#go#EKMpL9HVPuHu90h(cXM8w_%LtS-qLg21jiuK1_{YMV_%Pv-8j36MNx`cZmH2(K} z4qFf<82nI{Tct7F=@nXtGD>;0LW|muLRDIh35MgT)Udh1goM&eP0&&R2IhcABXIF9 zaA_is(h=vmEt?=hlE`x8cr#K29mFY3;Y}CXfRz$WmZnIOV@(LMOU@g{^X;k6Eg@E- ziFDO}jD{7(Vle(Tn^NsD4rvAHaSu=jZdIeqa?V$6`SNj*UFI^a6f2 z))j{Rf}c@%=y(H5!$Rxd7O|P9GT;&uhb^Tvf_m3Z1mf{s`w~*2KgqoSd&xm_lRW2H zUIoMRwrBYS*53B+vmiyau{KY7HbI=Ib+5_trA^#7M7@DcPC3A8+Ylf_kM8^kiq|z3 z3~4oM7r*x8O{?xd@awkEHt{<=M+~7Zjqaf%ei!sVfi<_8TX-2uzZxjnt`HX?>d~v^ z8L#qZGk1JMeCupH!i5-9M4q}8{-0)f%WM3;!#{3&Y%8D6kGMlNUAO)EFZ^7cw;Ygf z{1tj~vpo54yj-4JZ&V&}h42dk1r`37^Nn+k`2Cjo?)MEDT3{6LO&`nt3ye#;>h;M- z7Z?lJHW}FjukFs8j5)xApWJLr?wO zGxV&LGj&7W_BWnAs1X{l()~p}EHm(at^2D$YVhQuJOc{NH zkBsAKDK95I6wk}S5(bkLtyB7^$^k(b(fiS%Qa;Ke5-&wnSeE7FAV?lukBVY?B8;ik&og7X#Jt*oC-Z@r4 z$2*{WIqNNW`1~^RCchS!6>su;Dqu<^Yidwkjvb;RGN%7cO)LG%qA7*fdc)gbQ-1m6 z+kA|y?Bvmbsm@1wc7B`P`Dn85^3qOjMX67Q=wx-#EA4*Y(a8tte#;|YeTNr}XkxUQ zt`t0bttpUl9wHhL%LC9B(^6Sbzrb8%;XC}=kg7OY>7AXtud0wW$&cRQClE%*ztf5*)od&~m1Q>!kmNX7z#jSWdvLnj z)nWAGcka~JpKQg1aCm`ErY zea1#ZId&J%F9bD{wTkBy8cB>H`mFQ(QasO1J-44d=R8}z3)VQ%fM3xf1Q*Dg+%+)H zK$VB*E9ku9D-b4zP1+!aS~4<6nII&hXm1@kBB?7dB)j+uoPhKuR;;`ftY<`>=sj;O zJe;u6!Gmml9vXI!UT?B{tq5-t0`*jBSi4|rq*wJQ{d~959@+;CU&Fzrt89?G(5<)u zYY)X8gW}-Iozn8N_Z0w>!16)$Rn>tB`wziNZO5d;hvD9Y{Y%h~rl22kK_Aw47gq-z zcEPYa^y3&mJ^o?fr{yCoH52p=a@<9eyaO{75lwn+w16gz+?Hs>jQ*ayj;=E4BHjsQ z;^0Cq?im&Jo{P;0T)t)``l1Walfz*D3UL*erN^5O|2Q4~&w3pZo$1k+T&3bYYRN>{ z%631BWkz3i6{AwNki}?X!Fgr3+oNG~0!-HFPEX=}0F z;#!j*t=+@O#BYEjm9R+>N%YSsLdLMK#(!-?rQXCu$EO|Gfo20uZ2uUE9ht}?%T#Fi zZx1E<$eTap74c?z8=_u$21u1auVADr6r;)fl3e*tRUvq7?nn7j6tbzmnOR;+uVJJ` z5Q><1$%%b}{}vfEG7oLNCx<)+Pc#N6D*4LM*Qyi<{3yt)DR$luUlUq{^{xp^v2l3) zmF|@w1etGLhFbiJ%2y5Vo&$Jf-II+0oZPMZ%g{2zD;j1dFu1h(9RT{=N zoWQoPm@?@7AKRB1Xg}#j)&X}gETBHQela?QoH2|$4xf+{5MicT&rjV&lXq0HA8#ub z{g86M(Jheb6-GRz3p_^#o$&v^!Bg|!gGb)@3C}$w&eD`9kb<0|&tp=CY2`Qu$CydD zq!3mq;Do9%MUu^m=4izUn5k6o5Q&|U+As^3VOphy1EY@CMp|L}eH+b*+T>B6^1M9I z+3lZzv?RDo0*ASzCD;uw+STO z<3FB2cVqt%c(@sq{XXT{am-;Oc%d-e5NaXrNUXA}-=y^0{XR^$9gT``k5sDvu_>e*RGVjeOecaK9O!uATRhlh&4HLwM zt?4CU>w&P1fe+HI0tX*F@LR@cFY2cmhWEn8W19`Z-k(uI^X zga*tN`fN&sVieYNxs`#Xw%oaKk*;#1SR6Nyn~5le?73pR%FK?X!5Y6D+gs@Dk65s) zlHwTcL%H0_#(tFCxlSEsjN+Rww{j4ToT{TwETZbjr8-Ju>0NaUjztB}Lis!acR4*C zh4uL&D_`m(^dWIfg9$1F!pnzwhdXK(i@3O>W_`GWE7?mI zHCPYbO;^ntxXl}*Az0Cjs%Ejqf;(!KSWv!=syZ}4g-4J#19bE76gZ%ZI2@XVr~B~5 zi+dIahoL3z77lt?`7$rT@rvjnw);>&h+u$^lwa)R+g6`VN{UAS&o%64j7`?={|ySj&6Y7=>W78`c=rjLUOO{ir+)PMb`zg61HREV{cD7`u?_Oc{Rm`zP5$It1W~*uXMV?r$WOlI=d#z@ zaDO5T@3?jY9c#1rw<cf+*I^DJZ(ktCy!nV`4NHdi6oUCEUuUs!MsbEcZj4{?V%!Q7^s8 z!4*1#qlG~=xLrOqfIPn%+%Npef)S@+QL^9_0aft6fPOomIVDZUUPF0Vnw~p&4|R{C zfYZPQR08`~lG_(H6HrJoq=&11D<4kN^N$&gaSWizfpVQJxGq^RL-46#!z_R;&Z1lC z#G_=9$5j!D)sf$^S7lRBUyCgSQ$qSDoc*8dNY{JGQ`7ZY`+hMVO^xb%8T(7ym`wfe zdhkj(lcJ&%%Gi~1V6HwFqqs9y-@#hsygUs4GWl|z{#*8X+iCf_&XdO+?VL~DZ@ZvS zZ|adJvr2TFq}5hcqR(VO=rRhiBB)&U(qCY&Q?0r3bnIMfTijc}gCWGH)Y5N7a~m!F zc!bPGV|o>5PskJc=vDeUZ$O%lv7Evv!dpnM!h#@J2kdED@}xUm?vLq%NI&)~HWKqG zHyF9l$cf+)o;j9RuckPn!gRx?ZNF`Q`(#;PeR`gk&dBwukUGQ+!C6c7Xy(e>jY4oa zc!82tL&-8ds$zkjfVaeqA`2pZqF{3@@OIT5(!hANUTp@z8x=A0pwi0HB3QgKuurwx zqI# z{q^Fw6O#yJ^8qymi=}Uzr!W@b|0Ws~UT$7AyIe)lr#VHPw;8&(iA(M&v*#&DI zeo(MJ3;;q8)8?_mHBE%2m1=t!XS0BE;?54i8i*qI#BOqnT=gX?&86Af3#6PJy@Sv zM)jb(6n_KM1C1j34Z39=f!5OdxcuW# zeKs@b{%$$2Tu+nR%k`EBb(4CeqHII*KpD6NTRB7@DK`((uawu1)QgCLa`MPCFwmBf zdY}GapvtC=#=L~Ogf+@BM_5V7tPlsg7{3{**Fz>!LK+Pb+i}5m zt=X0OX|c!u)uBQRm1(s;nJ|TNlR>~o&y*ij>LuCgz$A_gr8rO{(X(XXD7_K^jPjZ) zy(o}j2U=|TTHaZu=khJz$~y%j2nUSTGv%YB^lSt?zBo!B%98~)b`>~fW&#l@DYXI) zrCZ%;YQ;zqMb!Iz}IQ(h_$*>Rs+m z(yZ^p(>t^f+X*8m&3>&aHrAEBknZXdBUAWJI}b&Xy*l| z9Z2a^JK)1&-`Cy8Q}2Ec?JRbu(N3c~jdoVK(`e^5yB&GnF%XG3==08FAfETj{BaPi zpUB#A`pMuOPmUw8DbvR5*q(A|y4VZ)5PEq?(J-tVqF&iFULX74RJv1DTJ`hMA$YA) zV1ODgZtnqxd);Y(;X!vAV0hG>1{j`nrvZkir8pMehO=t)jG3PiyKwDF{+BzAy63y! zMcvoA)2RCVT#QQARpjCg2uTXUV1SI&*85S z`#oM>fLJCknW4}0)Zc0>V(Rn>9CaL)=?@w{I`lYAR{z8>v-SD2_s#Tv>1dBB#TZ)2VXytCe?>e7V%ec2=ohsBYm=q&1ja@fTHYVJh@6SNXlr zH5Dh}yg5{xkJ&xNu4FN<)CW#6bIY`PZlShPe2c>R30;?S>ukEN;?_lco~`x+nOZjSU%~3jb%u}jq z*6Gk;;N5Y8EDFB^YH zp=<&E`r*D5fBo?{7=HusSA@SI_$$NnLHO&1dmOWAjm32&{>I?1N@%%O4Q{IOHxUm{ z#vlAD);M|BDf*z%fEo=O%*O@&0CY9?aSZ`z;O^rZ0s_Z1+<$>law0}c3yWm!I+2b} zg(_4!Ad;XDz|H}F<)f+SoC?Ox{2FX@{jr%Z^eTpYfu+lUoOP;RoJD>MDhrbY3%D_O z>(b>r0iz)9jRgEYugB1Ij%`+?LsNJH&N84qIQ67Q=3|QyZ}5U_aGo0qEKwV&VkVql zP@2^e>>PPi-c;V7iq^PU#UtO&7+JuKSe4Shx_=16xLm621 z(nY%~1Inc?wyB2gQK0h0=+Y<*2)8Y`EmgO$k1BQQvEJmhdeODnYYn14Z1lp@iR&h> zHH5Bvyl{u=@lw9qYZXz(POpWKvQpmZwMyu^!)x`Y>vpe|SCeKBFW>A(aBu;tmDya! z)IpTW@vMs*;kie0p>j>5gP>t=6Hz3nnu&j6 zm!?=lsm&R1wmgwC{O-gZT3}|FWfgoKT`|sPTnRI+LY+EeBk{vPLYkGBU!+gMvXoB2 zZ1DCMg7VNg!X#|)D5QNjrXdjo+k4p@0mRUPDAer&Bb=zfn~BBK$HUzDID{pc$LCNtUyh~I)E|xazNCi zj~B(sLM6njp|jWR7Quf0fMJZpEKqCoOROm7EwTzsW!ch1fr6sy(D5EMDwEgqfHfAV z3=kHqg}(${o%?`Y|8^WEP-+I8>DS}b!d?jEEf_RbgR%HC2|G~%2~Vx%#a=ZyodSJG zVyS&&h=hp=goF@kW0&z99IuQ+D9y;!q8J@UX`G0wD81N1wphPwbHP-h&#{W|Hbobq z7xXQs0Q`8R7t@C{aQG61m8!l(Y2E`gKREI+8aytQXOEi^P#<6F$o?dxRGLTN(5k)LtDbY)_JTly0&;Q!XVl=%ZL&}4*vNc zFfC9$j?6~9O@qnRt{YO60tlN?Q;x8CN+H_6RP~n<;K~KG<^a^AH5(uhH2~D4I9pJt z38amga8pqY&7NQ^odSqrMF39e#kG*s`)<1wbfIfC+DTy?|Ant?)Ih`0Y8WJQJ*6-) zh(N`cqtsmuS93`G1yw~CV~$mgm|=8$agZ3k8Y;Y11TTy0M8gPLCEy@tRg=+Ej68}P zv%zk=+bB*2V@kP8aBu{;0Oq^S*_??=n>{g3RpL#>kH};C0EAnwngeX1ITm26ssHYP zZ(&2wxjm4+5S_xq2D2ZY@`Qi$t9$y%Z@BaP%!;NBUaGIfL*A zUQk*YKu8bRBX-4F*uX|?J60lmwUB*y4(1t%VTiSG_yKJBKyrgPX9>c;G&R>sP{;ZM z4$-9QjG03v2q^&^9c_9r5@vEWNH?*7vx*oDV#v_D1ejlD>Fih`^(2HU`NqN`>< zT8zdvL_&=kc8!_7FqS?8`f4c7q1K@N$ruHndO68U#b@z8N4=cf5j2bfv!I4uyRfEy z{(^?ZjZGc(@r796GYiczXgM|pv;(FTG=pXy!P+2LyUU_ANK-%2CXF9lRw0hXr{ERu z;a(wMH^74)?bK1unHhMN(FCs@jA`)-Z5lW?8kP^A4c|JvKENMi;^i2#q76Z!(WZ(d zGSRhDhdjue9aHMd;X4Y|BH7VoKM(bW?UP6U@)YVomriz2eNM>kTsBT9pvlJ(%+^|Q zKttnWG|em}K-A4fHUMd=ER-U|1JVQSloH&O(u!5|V3#IMObyQ9{tg8aF`D6Ig2&_oZ={$Iy~^oj&t?wcn5Hk z7zn9IiY+J{htMXtIpRqdO-QLI413rE^bQD@RjAvSO~(dLYRgs^?{ZZ6BsD8e zfcleaJ=Dt>b{A_Fb|u?9kJft-Zh; zXQI;)FixijDS8HiE*feK+z6ik915}3{mNtGgMDM6NtUS5NyI~cZ3%D;pK zAys}0X}xBl+SY2Ty%?6G_Ts!{tk5sPIAAez+c4h5mCop$V-|q`h-g6NghYOG2r9(* za_G{}%%e+zVnLQ=mQYHW;2_jNV0WcsG~l*5s8Ww(5g2AM+v2Ixj=|K8uQdmQlMoYB zOsp3*q4=9+-ziN~<(1Yd6C6+BBv4)9bdD|U?8l(c>rLEIKrweFF&bL|Rl^yn>^Y0j z98L)inc<%czqo^-=n~Pa1ryVLYEuB_9tQ~!c0lPvRNmYmB!R+)F90UwKu;ma&%rSx zds!%roKGmGoJ9~yL4e7t%3#SA;Zr7&SvC6aIyeFBD^HEr?JxQP1Of9T4;@n8I;B~hO5X6hjSc6UZr>rPDLRBxU<myhs_h$|2TewjYv5DKGnh`6{-PU$u|^|Q&Tz#L3e zWtm0Yi7Q|ZA>s-UalxNJih!aaz&S}}0iv>Oo66!Sf`~0eT#gw>G!1Ck#1%*pSAd8M zh}4a^;BUdq!68x?D})rMY3blW;&Wu0k|zb@fScPK8Rp7YHj?Bc>>Nc_kZy|pFzF6r zfUXK4vaEin%IrsG6aJ+y#KsTQ1y&s}M}m}X5~R&fFloSlOL2^$MTlaf$5UvQWEWwC z@<5?GL)ii^5o;N_QwUSOgKY}$UtHV*HHvAKOz~l4!Zj$CBad7`YOLf;avVbn-$^Fx z;$1Sa0DAjHU=KJTssZ1kA+y&=pMtB8OdEm<91HAkxKmxUl~1@D%d~hC6r#!0(~-n* z&{HLxsE5#U@SAjxQum+`;n(FJrJBk439hZ!5IINyH1pa@NE>JHFcv|=HQ+wu@p21& zBabSgu48;7;ayc(XwAt|{Urqnj-(_=N!$-3|5v#qumj8Xxnqv+62dkKUI^B8_%Z8H3k+LWSL zj$klqf+h~Ox)c@$$qsIx+)vCn53s@T#VY7jQM#tAFiibQ)@JGdua5U|)}u zgPJ`y1RWUpMG$-3;8~zZ)eK&Z;dl@yW_l?>NqN&>Symh|*;WR|23Y!q$I8GJc5@5V z7p%o)P7L=oGjY5UfKFHV^l)_=h#Zxt6jWY8Hwy{2Vh7V96=-fpmq_n2N zwE(%AB%IxG$5Wq&W5IE!kiXn1ep=}?00F%^SHD4eP zpe*z-3s;1ro9GcpM@=g|BMD9lG!d0jgcU+)Dzw)IGP!+JE0|5&O%w}F1qpO-;rkni zAF2g#0RY$r9MxP0C!q5o5p=m*h0r02Q&phHu~Y(M>77i_kehLcj0P~-AKf78qFIQ; zy{JCRK+YnS1^WVCO)?LZ{*njkWVJLsMAidsyu!mi|C?^boqi<`d?z?kzq-2R3d18nRpJTIfWR?E z!L38&K$cApZqSVn^k4w-6bFD?b2@ZCsuk7b)X~=+2ln6q_%tNVSge1F1CRqO#R2ln z9EHe4Dh>z8Mi$L6%`~#Wc~OVzuub|na!oV4sQ%FO-d~NE$lD^sML*NbVtgVPc#=n* z97sW}?_EA!tA&E>RGr^PhkK8N`@Kal|56rH0iJ zuZc4eEnMKYH!(brd6KfpE=o~0Swv@NIV=S@vmN{+EkW>@g zZbET5rwKaX&eeuui^(>?nnLIg#()Y?X&ppNiZvas!o$~xN>UxlRtNzO97neaKZsM& z7h{5EF%2UJXrdlq7QmW_LxE9gz;S%s2dusrN+NIpoubnpN-(7+SAJZQ0+?UbU7CDV zB~U`4T=F4oU;=yI^e~iFHL(6@6kEVzIi%I7`f9~`Y6+A~9!2sARWaa7o{23V5X`is z<%k?iFw~j4SdMbB_7^(sNbut1E)erPv$ziZq~Q`yK28pJR0$leqgwsg#VYhVRkPoz z8Pn`M1E%(TWTYOk9*6BXERoQi<6WZ$HEIHwm3PlKLi=O zu$eH;rguU|n%Cmgypm!8P&f~u=&N~+d+mwkYGR30z{*KL;1VSPiw>y?B_PwpQg>4m zo6J-b3T8mF3<8LnIVXaU)yPPq(ae%^OKsCM(9Ei7DCKbt+9a?8P{XR5np&_bf*R(O z@Gy_2Hcw40PTwS@E{CSpi>b}1L+A<(I61XBnA)7w)B**Pb7WVXlbTszgYyXVry2#+ zoT&wy>+xE5{7aU{)aIbi)LX2k*i#FF70OE!Gn3M-x0#e{hm>f-><^`^hxjtHV~&_p z5>xPQU5lzHG!$|qP{%EG=8upbWtt(2@KaJ?0;WxsHu9E9Bs7;M~U=A3{iMf6x{ktWOtPl@Dd7 zu3S2(Q5SzzIUgb?>AwM-wqhIKpV3nosM@QDq3clhVu$nIiz+#QZ__Kar*Ti_q~%AD z$QI2x)C_qYaWD$lCn{vaui_b?Orgi{VTas@SwO0WL`KpYQbI2z0;#kKJqY0s+Oa`>a^tGV<2-g_2Z)M}**M*TpeM_*+qWrijUA_8hm$~QbX^>=eni*yuyrn7 zJHpl(blnuT;yb4%DpWc&iDqrXvNp?9)(;y|3uCf7K+w74KPv@0K9YQXmp z%-%SHy#O?ZB~e=7h$3sK${K2~cR*524`VYqv64*UDkcJf5c=s43TU_RIYuUiLuLf* zNj&m)Y70>WBM~hs?N=VLh-j8KEz+|>6hfLq43V1=*|JE_9)$|vzY@8%Vyn9X#1_2d zPNTwS-03H%zPxxZr!HcyTp*<(Y7b%W)K#peBw2X1Vn>Lr2288#h@BG?!9>Cbq^2)9 zdBlUk7DSW!4i(%2;4{SzpMh)`NOHN@nHHqu-sbS&}!wqzc0)5b8^UjX^b@!2>v+T=KW^d&jSC!YYQlCOw*Jx+)qYsYHrGdFgQm z4pURXz5tvZxuW2NAb1^M!h)s;uYt4U6bs@pinD{&V<~|c4bDd%0PP*z!6!Zk3vhvH z1hEe;vXqj70!OQ1Bsqu!!@W3K1V%oML3`^9QOuQt8wo zz!1#sI6x7s$@X~zb&+)nvcL?SEZb6sSW{wyPUH0p3*#^|pe4pKgmrOjIBJOb<4_7s z-$=e*X+|SCG^Pm{X~e|&1dejdq0Yf9MrkF_P|+-$P2}(T7UGS5`Z9%v|5ihssIS|g zxEX;&tc{U01FhqfhB4aaTwE;#Z-EV&fa&9DX544O8gHiz;OTn0f-$zxRq=0xq~P9x z3^-SG4bTi?IINr*gkgx_NW-9%Fhp1bsqI10z?2XJ$)uqt3NLA%lzrwCTY%M*@eb^R zIPxG0d;(%Pb}E5S6$4@_Q5`!om4yj)yq|)B9paNih_F!0O%;3(>7IzVP&#ORwtCsc zIrafLU>bDgs2&mD$chU~c@mRDq{&|cM-`3C9wvp9qd9Dkfnl=pYU=&+-#ltCui!sA+TV#IO%K46SW~1b_f4ir60yioJWVgS9|3VB4!Y zVMR@Kqzh;fGHM-gL7)R#NjODFY9=8>x zBebEj8(dro$0e$6tEgnp^3Go0JWsogq*+K;Z3n)HWSeK${^6O<9 z)#Rh4?vwdEo6JE(S}#U%yG!U~9A;Lga%D{x?`dTC_|4(9*6^+up~~5>g0aBWk%>U` zRK~j+W$>;He8h@Ip3FeFhTU2NfWgh-J+Nv5m3liQ6S+E;ZZYMlDvRA|@feki0K9Hq|vx^NZCNA^rr z81@OB;)Y*v|1REdQO@(xcx{sZ`$VS_u&1P&+>Z22^SET1hSUgG{}v31&Sq0Yp#cxz zc>s@AXW0|*!JQ|D2f=hlDN@9-Ip{bzd^61BusH}^GfOkXbvu?ZwLRz* zAQW&0$N^SF{Whyc??6wF=1jP(bK**Iw&BAsCl!;O#K z(ub>}FOv(CoVIe7laS(KqXIr~AUXS7Yz9I&Zc)rT?O&qChJo2)x!>#y4o%Dc6jfC~ zyN$To(K5-t-ElOsZJmNb!-c8PY}I(jS~v>-J_9=J&_ic-gQyW=k**Cz+w ztQV&#^iYT)XWWd44~U2qQh?^5#T`#fnTrLa(3NS0M8}-;HbT67+F;AY4U{U?vgo)W zE|yUWA3#ZAE1?Bh6lvxtqCqo8kX7IDi;*9P+(g)3<)axxNH8);M~XSVBvN_tZx(db zR6rd0d}!VwTof)U2@4q8%R-LFK4fEu2KS;v;OJW;w)hZgr5KMwQ!r+dnRpymZYJ8` zLH(rQDe9fSw#JV;APc-~@DtiM|-Ec2cTD>vgQvIilgy zLPPYkZDTE4v`^2kmrG=3i-`tt{?kf58L=)1EQtT%$iTl&+exW|io+Te& zsRsvw;gE4tK(h_iAVf}2#3Ye3)9!-DF<&C`vz2;D9US;mK>-oC?ji1}kAY+Xxb~@! zPH^jK?rxF?|KD`;aJ^h2^aObUYIW;jwPfA8lI(6-vgDT} zOMd8fB0q49<&b0<67qn+BrQ*f6caM*vt8|2P8#x3h(l?>ke(TVMLv6I6AuXRH*{E@ znNG$Tl*E7n20CCsArF*^0fjvL{r>x$d+S!K<=C+U%oN�bGgmfArny`3& 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�>C92{L1=9V2u2gK-P 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 V$lqVz_cLD%AN!dv&U(x5{y%k>3^4!z delta 155645 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�Rs&o1)}0eQ}`w0Sbm)4(U-Z@ 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%0AwE}f@#>&-XczH$4in{T;e<4vO3otHXH zd5{XOvPvG__~CFgpIgwFX@rehGG~77MHLCT!4~BG$G8WI!N%=x4i3MlanYXegSj_0 z9^VuG{_-WUe{}oyVA9{)r%_xeas|Ja@Vl~c>F%)6{QyPQll&@#*3)?4m%}r1CmWCa zGMsYZR3+$d9NQgUQAZxxxa#&>w{15bvxW!P@`@xP2?t5~3DU!v^byjMppxhRo%E7S zdIYGg&7@yMTJY>rZ)IM7d$}=3C#mVf)5NyodDFJl7W`<-W}Q(oFhs?x!r> z_?ZX7%c5jxW_eFTGdGH!d>~wW!4ZnQks>?ziKiv$d$||pCuz+Z>Vl;kSAQ&gP414y z{*Q$hHa_$K6!DiI3peE6{P3l}8h$Td|Ih0x!6*6c=J#%XZ{v3pzgO_PlHX_?kuKBJJ|~!90rd`zF7y^ZP4)UwY5F PPlOMz`$Xq!zVLqmEu-K` diff --git a/wasm_for_tests/vp_read_storage_key.wasm b/wasm_for_tests/vp_read_storage_key.wasm index 9867e710095ad4057179baf948a27703724f50e5..240d434d3aa0672453c6d917585c649a5917edf1 100755 GIT binary patch delta 181544 zcmeFa34B$>`8R%M&fSuGZ*sG5gq(Xp2%Dl{!lq;*tGH|Hu4vU_f|gLUF6a#ciWN0_ zfkB}fDhgDVHM(F&+Jv_v2NIb;L_c|Mi|i%#GTY7m!9Ha`g2(hlH9RpgbXqBTwRGvv+v!ts4z7 zNbFg((TMa->@g>WD~+IKRC3P{BNC}xf4pa9fSr=~duS{>b^Q_HH<)k7gB?bsPa-?} zT;B&ectOz(EF>q@@(GC*rT6Jdq{5l%9e`=CcqFhCD%wA(EBYTYlR5 zS=oZItiY2h=p@H3^5Gx$~w_O;a&KNL=s2mH1MufiAQqsGpLWK zXdX|zl5^S6WGrd~Mc1m0hGkarP!)!Y1uavh5GG9Eg3l6N_a^Fd`*W0ClzWV;rq0}} zU9k)EZbFvzf6MzjXL}Ow6rSH#Atn$tHG(X&&SDlb!b8)DvPUGzC3xg`4J1s znl)xITO!5TyhzSi17@LqM(#>1ECI^aXP16LRkQL~uRZ8sT_raxBgZhpR2>uHE5%-; zLF`G4EiXm3v&u^c_mr)of%=s8CJHor5-0Y4lr2i|it%j8`bia67ma*+9vUyg_zn<_ z48RMOP;3MvXqWmT+FOugDNiNLQwfQGR-MI`B)(VOR^E7{U58g-TvQAdQ1?aCjfnvx z#tfh#M}0$#X+X&+{2JNx-lH>9^B!Gv{cR(v8DM*U6H`yfXNwb^#~0)G@^ee@n|H!Q{GNRRh4-CXTtpcyv(~8H{Lg=EdGxP;`SgE` zS|hSJvGRoJ$dPj*<$L?Q;xb*KQP)%6^G>`KxjN4;E>XEGooRmSO)odj`E>a(RbS3j zz_7mRq?iE;nN9nbvm6U4a^;A01c^VDm zKTo?Kzs=t(8LqN+VmNzjXsi9ATT35)@2|QIj4+k^s_pZA>l**^&TlozeDeJwA}2_# z{eWCwar###YhB;_?C&uec`lkX>e9x5D|)~f7b|)|H8fyc(8$wJflPJ6RwNL`Bol}V zTqML5386fJqKnW_Av^vbVy8Icjhb~98aJv$QBI=h+&%~9q6O!k14RCNE;{tQMacK{ zxF~Y|tH}FxxM<+ijblmWC;ocxWxnM<1^@R+oZCDJr5|X%ulL>skT1Q&-kXu$7eWK# z$?^h=3w6dHu2^|!Q)`D2^+T=T1*_uuc#sBE`VZ+4{g7(H5MMHAqCV?K{yfC_?$*SJ z`}-#@U%8oWPE_B28*kSMAKhObUHGV$K|*Uq6rzSnGMf00DiVVqIGjUsp8vq9?7_tP z2X1ChCXQM)6~FhavhaKIQw6?F5|#8%{C?Gd&^B}-(jQfr;=x4r>Pzyssdp;j4pVH< zId5KlG~1cjyn3u}5sVG7C=p&$>}#T6Q)1AX625y?V#1p0LI6_9176G4KDO>jB-Ttk zu(}EEBna-}!I!gh6DvkktRM7Hf&=nr*ItI-ArB8l!{5@{g47y`YQuD{L|~|gulL} zw(&mi^^tywA?qrp40Sb;)?7F<6d(6+sfMqS%37V`F3vUHh`x;W*%u4bcV~Yz# zf?TY;J#lzjAL3y+`$9Z|JPUfN!%vJV*@QY0GI+7xHCvIym3bo#Ak2z85 zBkh;?)~p74)+frJID$QrIO&NYY(e7sCuXu$iBFz5msKZDeDVtL$giHP!|%|iy79~O zr%u6GJp0t?u_Ti)kz^9E3=>VJ&>WQ*@$^neiSlQLB<N<||OenqSQ3t8bGdmzdE^;%qKP!0uds%CjePbKwIWa?}#ja=l1w z-FR`2=@o_7Y!DP>9LZs%S}Za)QTp64w3#^ZxkvkS0!?*?8OCUXOkQ4Z z1;q0Bbjx2S_U$tp1e*nmr|+h7S!d#gP5trv;HJs~W#AHtW`Hm1M1RYykJKdI-}EXI ziMC%|h~LuZXX95sKL@`hzkblS^C6&QY2t-nSF_y-ws|bumJplgvsV1}PW)+e9m`If z^uh?=*r)-cT*lAyo>I8-76=_Oq&#(GAPShF)XJwXeE-OvU!g37FU&wDwxUy!T8xt` zmYDP6YSz4d;7gbAil1SIAt0tPvw&ru1EM1Q9B$b7S-9K z)?fOXj}4d-MRzd4=!<59S@;1(t)>Z#+s$0jE3 zc@ocGnvv5I54_&Dcqdd3B+G{Nc-+gyZy&>R9mmV}Uf-Ox$<|9&0Q9mc(f+%iICQ^_ z-tF-sG-zfls-rXn=g1BFgZJod&C%=C`i zJ_<9vo3>Bo!1Au&*N)f=909ojM+k&Oj#xmwx|;{jWh~yu5H)o%4zzO1h@6AgAi7!P zob?yJwUt*W1C1;}m_t?!HYwT30a(O&*OR@HIQg9laB_qCz2lt{gPMcA?TV-UpA~xdz##;N)c;ERkFBC~4`hI01^6^=TYd(G`_ZVc{vKbk(#9lmL z3nW^*ir1gm^|r|_NDSFs>0QK2Lqig5Pf?;_cRX|fq)jH-Oa91`#NOSrkg4GxRYQ>p zwxQ*%j{$2F!z0PUwR55PV93(Qg^*JDNH-%Fga#$1ep#CM01iEW=%!XxnIXLl#A-W$Y(e(&yni5K>q zkobIWHPTP~yrhsyRHirlgHV6f@Y2uYiO;{JVzWQ(mzey|QN=%SwOZwBb^Wq`mNIrx z;_)x2xj%ey_hO4V%{{dDgvHH_nmhcYDnQUgN1hq8it5GtYNIF%agLc`%*wo^ST^Kmr1zuZU&VYhTbFZ5br}^JZgua=_g$_XgTf5NkptowWbMHYthQWSBxQVz}rfn3@X zf%Ho!kdkzmE)5lH0*Tl)CUMdd0fAiVLPviWh;4mySTDxvq{wB1(dEl?*;3h3=nzOh zIU*Q^vsyB*8&nRZ2W$#`r z6pFc#@K7-!VY=L0!iE3|pOyd#@06#Cb(FH<^70B6s_5e?2H5k`8=fvJ%Gh0LMgLl6 z7nK8hv7qX3j_&Zaz0l#yWO2D_b3!>fd|5X<^^=j_Z1|wdT!UAU4gg%5ZsB~H{84Xq zR}b}!s$j#>*pDh$VJ;y(929drmR~F+jT+7#WW3gp9}j1x zORCsgthQ}O72CvAon*+`tv@`1JCqDut@C?brj$!@nxj98=A)1_vQ^FJaJaiR`7ARWlc{#iA6{AWz|TJX1u%#A&!PghScb+kHUHaU)a@t`{FN@-6t{j+SRMeRu!L*x|Lw9lE&JAf_!m_T)lViXy-BZN z`mwAxD!2s|=;Z)1I$?fyt3W<`tU}gyWY_t~e1(PG9p0QN8tG`y&XCq#+qfz0pNuuM zjXj>75M)=h-F60B$JrI~=(CxX`D2I`k7#C*C2iBrW=FBiE5S&1!n$*quXy;b8#{~v zrcrHTa!W4cSX6YnliHCK6WiTMTigCJi_P@2tJ=<)&7Nm`;it0i_3U)t@;`y!k7=88 zJzLH2a$qAngNJ@%g{?fXYYSe@lDFN!UIj~?Hwps z<l2OD7ra~EzdzTjV)K`_YPbB8PS~VV3b@#76}Lz zT%TDYmBa$eS55JK+ z<-nz^w07rfm^#3X_#5DyJj`a;3<}$~xZF+@&6Mc~u?-K(BwBWx~wzV(CdOf>SZd%4Jgtgg!IU9=D8OvdHEs=AUvwrN(w$;nop;&oq zd*f#;gR%MY-FsMN?-sNy?qH(hw|0wL5fB5#UKN-9?`8E^d~I8FFUs()d*!{&Y$y`s zYt3v;K6Tb(chzHM>dxM_f*o44gh%u6%4dZX9tdTze31KZSFqo(+U;A>Mt{+0_tN4n zR5UqVUqqRPiOqQQfQt9;W90?ZKIVOBgwLuItsaOav{AB>ea6uHoCg#xW<8*AasLAf z7q2{^aPf}^G%otCW?t5RJ|l)yjzcQ~*C)C%6aO{YgLanH=UJM}W z^(&SGrn&A3m}*PpLr=gMSkm_V6YL=tKX}3c?!0b%L3kThj*TQmOaTIfvJf$0s6&Fm z(P>7r zaq}t9v&#nC8#}sQv3aKRRq#+$%(Hn2x?}-7yjzhP@ye6du%}Uf_(8=VM?c8cx|*pk zoJ(6bP+|o1vDjshV>l3*C+9rGEuyJ%2W%%s&J_)xGs zM?-`se7M+af@LxWe=xS{kZH;zS+f4u>>Yj^OJtW$$h|~6F0Fd)xD?Qk_ibh)OE+)p zKpD`0utV@JYpp3i-OQe3AIL{uV8i`k0bzzJKX`%l&CQB2f&qS-QAPld<=bTWBC}ME zd6E5qZ~t7bc##cbd*$mdvbpRUdFD%qEs?jr#D>$$=U!q_woU%&B{m{iYu_!bpRSdq z)q2hrHj*{TC3rnqHA;+LTql}t*=X3y2@E!sSb+Ed!>BgsJvz|nj_>)Y^U~=Sb&_f}7wKwy)Qgd7u{Bz~Ljsu41(JgZB6Ako{g|)p^M@Pz4qfX;9>h zSK*e@McbNRWmT*Ut%Z3ggO(4CQO4Qy7;T)12N3efR%T7!{y8n#kT02!GR`2%QXNZl zcBDFrj@^QIvZHg85#2GO44+(9z)LkQeW;_r8KJftUt?hwoKM7|vd?e3=Qpg8u|!+N zHf$_oS+dXTY_rm^Sx_sa&>#iy3$3#6b#^qd{?TuM_3xDTzQM-m*c91+J1c;GJ!(6o z0qXeCo9q?4jsS@k)Dc#7$diB1=92>cJ)6!J|VK>D%_ypV{p&FILIpcCjyptF2r?+Q-F%=o-8k2F)VIvrHI=1C6RE50uFKk>c4K3D|>M+Y=F_lX`_944;@G@o@JkDz@bBJ*gwwg8i zXggZW;}H<_O@I9#s+Zn6~EROp}(^Q7>LDx zXLm3_+tNt>7c!G5kqhabcY(XkawV}qwSY;%%{@E#o2;f}W_Bev*x z{8P4CS4URvL07lxGZq_}l&0Z2@lLWq4b7YG_-o0C4GrJJj?mEX{{%GG?O_&3{GL6a z>E+wn9^V6$62d3{6Ejc^CNhw`{WJ-Q2J<6#{LjgV4d#|FSVc;@Cnb`6JUa8%uUG?WuieK6X6rI$72ivnZoZP&?qjRi2aEggF^-;Ed=XCWI8F)hvCtQ{ z1o-PLO6oC6wiO9LTI1bJlYozbT~#X5BZ9q%=40w4|JprZ|-I=iLI${t=_sA z>WcgrP&NSvFeOwNOR07`W;Btjmqd8c2$ZO0LHI@p5nFv~rUnv+8f(50x~dzMLV9E{3K!8wg%Oi8roYL&7-Br;Z+bPSLN_OK`@_} z%O6aWRR?Foot(#GXC`}7UMF6-$whrmo@q7(n+QD@mbccI$1$!mu3v1bsS1Qh9~2>-v`n|^ZIaDLUX zX3xQ-f!*x7i=VVs~-ik#5wbR0~jN$!m{<{#+uLAIT5>4+_%5 zFLatr*Uo6NkNja34-b9ags2(PG3nRyo|nxT-Z5LQ+LJ@J-K9a zVSvfQ$OK}rSBO1mwhFbT6(|j4+jG_YI%ZogE0s;R+O&&TV@W;&Wicq@qiluPC9rQvw!WAUmzV233GzQRHvDT=sv1_c~jtt1J|mJJ)g9AOfzr#T^G%CERi7wq@=( z?7aKj@k8pw>bWxdCa;jsyutlvsaC?M_;)v?xAKlVj#mEcj-!>2+;Oz>sXLBVzK}V; z2cI6j-D!k;;A`BO(3MBraWwLTJB~&+y5nf%1$P{cyrLUDwI<*UGv7T&E_jpoyC{q;>|%%`0LX*=%Wg2d=#B%1 z-?-y|;rH%1V0h0R2Mq7eQDb(Y-_;H|8yCCt0ii#0$I;IH?l{_6>yD$H$J}wW^Q7I5 z&(#k33U)Q7~7makSIut{3eraL3Wkt-2jK>@7YzclB)>A%!ZzK6qGodJC4q-{r_1d`z(xAjKp(z*G6;Xas~19=Gn`heHNFyMvcNhP=6h z_v(>3d1s>qyD!++NME@E2*nM!m<)|PJu+;>=b#C;<(L? zZVdYpcO1iUk2{Xxc)%UUa6IgeV>s69xa{{PFTIev8YBDtU6PhAfAU}4aWwXcJC4Ra zcgNA#oNkTX*r;gv2h7zDsoM?ia_H34?l{`nX_e5hnUDXz)|qgZki83Ek0tip07Z#yM^Kfmw_soXAe5)&phcfSkFMT> zml1lYbnAk-NE>2jXs5_#{6r%1{zYaq-m_XQhFUdw4JWvYNwpdP5sM3xU`)U%tIZwS z5ey~ns8-sw4^zO1023B)6VYAAS!Id^P!m)v7!`p4@C7TYk{fdTVzZRaa$K<3EN9s= zzSyL0FJ5f+Q66B9!-jp8r9gdYTXehm1Ab^85=5n1;}skJM&n=vGbl}kLPqVvu21fI z@`c~Md{Jg#UWyeF51pCzXs>}s z>{fOec5_*#JoY{_7Kg`L;nU#PW1eIfu>f3Cwd7CkAZig0V!aI}|AXwrvY07~rz@Kh zR+=B^vXKdgIUy4SNXVpRJT@~LGHdiq*(6t2a+XXg%-y|_K=(IZTB81CsQ&d={i7{s z$}5uAKVV;&As+}AeeHFUSswR~GRo}k`m;FhBOvwxyb$t_F*3WSff=(gWkPaqEWC@P zi=A5`S_oskaLRyBk75bAlF!0<2%I^%Dw;{_NR*CE?$&};FhDa_g-|ypneY*$`aU_c zTj#%R-!oO;gh4sxD*eQj!XmYX#^Wh1+hKcuciyA0tP zVGLc4Oj5`q>dlUNh!ybA!KfoJKBVnsktJhVt4uAgzd-)tubT&43Ek zRq_#9DOCc;%7V$lxF{y)qO>mNmy!F;vbcAGCk{AJxi|7SnuGf%>Z3;l+opmLVwSHi zh6R0E2*ZSn#Fy8~sD={oLKb1n&=w|dhp}Q>wDt-z1c&IgHuMP9&~^=+-H1Riviev+ z>0z8c3Q`q@h-0AuZw;*GDMdGL9yDP!00OSWN{oeAIv=-UKocU(M)yukrSuTm!=Oh} z;JjlY-r& zgg&6iORK5WTtJPVQgWn9$bty01^W_{&I9@ciz1_5jz#y>E?Sz6?+g3sZW;A=J^ey& zcHv+Oj)!ptHV&IX)uqJk1oAH&yu|6*&9?gkIdy?qC|4ZEtwFSj03?fE+R~Kl2k1&o zBg6z)5r$qJWtj4V<9LPkD$&x`!HPrq%88D<*tJpy;IQOZ7za-hT-=e}&}NE>2pmZG zQN}RB9R3^=z|0EcP8*Mb|BT~Di3u<>)Z@F12Ja-A&xjq0y_L=*R>#{eyv3q7-OVD7 z22~C*P90^$(R13^!^KX+S*Zs39%h_8nvGF}469V}KKYC6N*yPRt5PEQWToGr&bU)) zP>b!;qN+d8>r@|&2n=Vc5B4DeN-6fzIAnnRjyPH8@=>llS4S%O@EABLpSp4w8#9_^ zA%p~Q74S*)>Lal`wF#6YgNpM>0E6YBB#7lnfhyj1B>ylB9Rxew zaG~UD#Nl~ZLXco2QENzQk$)FCAoMGHxy33(1FfXnOGh?^oKBayi2O7g#a?eeDDzV` zp5{0^_ir?gMu{v7l4Mz+$&w^5)*O-;rsY;sK%@l0^Bh>2sW- z&l(KjR29MvMN@bUs!%!!LcvX+Fg1xjEf;-O+6F?(EMVOcT3`jCvkj50z(?me*ZGwJWb&N`U z>KH!Y^p%X0-si3f6(KaW?eLp+R}5lo$%s8#~bS4g&L6$|pMK23BN&{M&dwuoR04pavYgpC(4ui@;>qbM!YXfzESt=a$h#I3K2N<`c{)rqvosgrpfyH>J0 zc|NjrPUctW+`Z(?W3h3jMJ_&;-+@Pehym6hr%mBQ5L+^ZPmx!@#QS22=AM_Z7F{j3 zzXZotKgqZ7Bj6P~atkCGoGj;W;l29Pl`=pJ-IxJO0@H#>46194T?a@olc$rtElD53eCjyB4SNIq_PJV@BkGGuu3h#FuS)HkM+MxIV1St*? zd;bbr9Szr&y$0Oz0nskvAAF4W!xd~|2ZiT-f;X_=?;RGCTkb}qaoIJES&61oJaWj{ zW?uXWrYx%(*YEXku)s2Ehv_9e=#cY@g!$7fmQA*+5yi!I*nk80vTg6ll%z=uRi6zQ z(plQ<<~&ggyp3^4I@_^ox;VrUx7Z^Ke;vu?Y+DO!lhw*rsyLfw_Zb#I(K{QkR76>6 za}~+Jb}UmdL?;pC?I3kbtp-pRa-C^$EUss_m>A=og$1c%Vi|2LAr?U_x7viIL`<*; zwvH-^`FIy5!Y73py;t+$Rs_WdypATtU^|)=??iTl$W^yX2U{7!os@`q@fIo(M_>~L z^vt+}f@rB7PlP(j5Z+8_*!d%xKLpvSUeV;3heE)Nb}*pV%I!fhhqI9-1k5PT&Q5yM zFj&Y^Yid2}tBSj!RFL7lf(%aun4VsLZNS2rg!v9kDG2O6+!i;~odG~vwb`zB8>{8s zOe?N5ZaYh=TpHh0Cost-x6yu+Y;+f>AjVUk-_$aJJwbyPMVb9X$4|jR225n?KEXyC z@Q9J+fgvSo?i0ml*mTWb#3q~_7L)#WO_@Y(0yzFdqaa_;SqajS^BK5HhxKznO zkS*W`kHoBuA+YQ`yr%n~l|fT1AEZJCUHYM^Eik)wAO2;3UonzNws*#1hBu1G5W|nv z*vwU!@`lhoObx+iCc<&p?|}&zbr?V%*pE>1AuB+HiX#~yR65B~Jj)7-z^s{;XQrNE zQbus754M#ULK`eh$MWPS0wmvHgNbM3$C1w*cO}rOF3k=F$TO`=)QNanFTNi5H7W4< zxE`S&r=hR;_t3`=4*YKc{WKT!)2(<<$e*skpVl3Gt>RR01KHJ`flz zdmu0?PaBB1BCh?&DQzG?#fpFe4moA6ig`uo@@SaX5IM~N1!!u5<1CC_8*~66WWk*} zOLt@jbtE(c6o}kcx%xlbf~yL|2STB4VSWln6nWtk@m&?P;2aT=Su;U>X~c(_y&}F* zPT!G$iGCXK!He?mh!3L|PqEN`eeRKW8X@l;=Hc_0CO+o^4m1Mq2Vftk2l0dM zg8!TLV1c^_@r6Bi0m-Th3;tyn$SDY48E#0zniP$|WSD(^&Hl$ykQg8TH^H)r^noE^ zM1v4?I2@D(L6-&99mgEU4+#+s;2kcQiDqg+=q0xnm9CG4JvAl-AhKmlM2+Ez4P+@~ zz}X%a8B@w=IgCO$b_XRLs2dES^lY4350F0|uk;0o5Y{+tLQ2<1=}PbWNKvRYF9=I& z0+E=9#M;n$SSfS^Uj{7!Ky+G}wPSCp&7?EoxJw2?mwpVW{INHk?7_;>TI}tf3qfq0 zhP=76WB57s$K%)H0-fNhFwUN6YZs4EhKIZ%7&dA!ZiR_z(JkT|@<(X+kHcwAH@tou zUL2q#w`!_B=p5x`QAnhl8No8>A1bu(bEJMdjl%~@6!-Lk2>4S8bD5*lg6O=2^D_Vd^ zHFe1vV#M=NpOcFW2#ik_ya-?qt^2iT2DN}ckW*`WEvn$r>RG=xfy22Yk{2lkH;HIS z#-e_;Yz0U*fGZ~wTWXb$jEd!((BT6}Ep&ib9*#s(`HtTdbnKJAxX3&_9wrS0avM~i zWip?EY%Cg9q8XzhsClA%$cI=!83@3cFkP<#gjmIOQ{ZVuQ#=+-OHu*>W9%w}>P)C3 zvNz&B0t>*8nuy}4n#h@_=k;K)m2E=c&;Zv%fI)7l=Dbi*YH$e#9~e`hEx1X%4iK3q zmLWrx2GVmPgb#XTH#)RFo`M~aOvctU0OwQE2tm*iP(y189k*z4h~|~fvL)tmVeEB+ z6htzsCt@MwP$k3lmG!1M4UR7ti!Aa=@QkT0}+uq9k+L@=+uLX!)0JiTrXNL<~(@?XdF=Z>cPhtSZMF1FpM3_T8@=b zl3L1UgzJBK+@>I$lNY$g)bap7!~^PTK&9Rth0yF^fW#I^5wVR zg_T1JpkMI>BaaIp$3OPCUI2r?7Ziah1F9-hc>eZkAWI8Sb@FHb8ynA#@c~H%>SJUmTPMeVbNJT{K5EcoL`y4M$?RmUpd{MCXaF!d^~l>d6H3-wT zs&(|T4l?ayej>FDE_~!4fy*#R6<1)(i%C2PRfHW``}S2#QLsJOq+10no>?N!MXd#Ft9ZHST05!8{%o+@mZDN>bB4Jvz4?Si?bLp{^ zVG@kD#YBBWjMbPj$d~HPl6X}65$E9$neveXe6VYUPTh@QZyo#q!EznkiC`}s+<{=3 z4sJuRR0p>pSfYa)P;apgwjfxfgPRc4K9#t58euZ5^b~$O@M`5~2MHswl2Huo}8T zPX%?ER#%w~u&a}0FbhOnm1#v8lMrWS=|b&xA^C&L&A~?uCSvMD5Tsf`a$)n7QNm24?vOGo;3nH?UlR(p0+Jr2W*1==m zvRGbHJ0OHv5VS*HQafm9H*1G^B|N?u|9uH)j^j~9+*^hzimgf}<7#3p9@C_@654rM zXhU}AXaNRe)uo-)ejDWn1j#DbAW+vys3SL}rh!O{9)9vw5^+LT@4~gAipskeaVBU1 zSfHvjc7&--4j66RFAT#TB#V_wgbjf|D^lMQsphcz(A|KVGbriX*yy>gb`CZNH8x&# z8coLFcEX?p$cc?Rpd;~qloTMX3z4__cTf0F1Z+qOk=!LO04W8?vw%3<&!U=el}> z$UJ!yw}G#%+|of_`K1e?P{=DkZ{9||jRqqt+Tpczw$aGLPUmI+3rlWT#8HRvW_VWI z%lhIPl``41j``xWALV-Wr}w8&j6#%_dUHKy_MM?_J63wRcC4s@=;q%4Itzwb8*N{| zy`a_OQ6sF@VaG}ljg!3mCbLX-9LIhAZ~|FP+L%QS;uua~Vj0T1;y;0Hrv&Pg!vFOsBDy7R#QQL`jsiZxwO!!g^$rOL8 z*dC`dh4~Tcrvo%x~ zBXgn?y9qNQb0BcV0y;|WV4@KbTrH@3vj?mN2cM2~A%cq&bz~PJ@RO+sJvyl(LM&;q zPP`1m%Myr38Yvx)lvdRrSTjucv5?h7qfJ^GL$Zj%2^(dM<@a5YEY}OGzq-Cd6>jwg!9wBAHI45s{!1*#jEE z#fQl*bx}>|(sDvq7hb~R5>0p(5!!5o*{Jf%Mvs}V(d|M7Ty$0u;Q-ry?9qj*$qwPh zVLJr(jvaz4-45x|XINb%FgDvAQvK<0_ov;}pYfvA-67oikk+AQ>Igctg`UlLnP+8v zgRbPcyAs2?C){1CGqG$6>+Zy0bQ>@Ns6#Or)CR2%P&l8$cBf*nxD_ya07Sr2RRP6_ zU;$U<6JvHE27j!Mbs`cZ`<#YzJ0c;=t`9YB1#&g@rVU1&qW!eNz%DeDRl|1>19E`& zF517n|KGRN13?#Ac`1TEXet0MA%`*QJ6+ zls(w7IY4{=1uFQz-qL@a3eZEaH3lUq3$`MXq5@n}lcItSM3Pj{j)#aV4|2}*{}4a*VB=-|M}1qsC62?wa5P}jHWsyRk>>B*uRqEUkAfYUbwm}IecP_(%%lq%8~g0E zP|^imw7=DY_FZ=d9ALdbt#y3+1p^Hzeqp5QRRf?-fvla3=ndlJJJ;@JIE)Y{@U_dC z#|3cc@;k$6j(Cs0XNAwDLD$GMA(9-K1&AaErV)|k!0hQZFkP9rv%(&c@HZHeu7e(u zuK%4O0iZSosf8TiENw`DwzMGu=F*1**h?D{Ah72lL4Pn{?jh-L4@tXwNLt-PvKkRL zuQUf!Jc4CKoSW54ItN&xahRkzc(6>;Oy?f3yDXqC*7)x*30Bpxas!;Y*aS#R8x!Cy zZA^f=)R@r8C7>^DOn||j#{@mXu`S>?>6Yz6B7O{tJ`T|LZO7C-!O0Q7!KszzM9D)a=DNrEl!TI<=r?FVwf; zJyJp=${s8w9H71b0wsLc(!oqczQf*k*h`R8f5%VX@zdAhryguE zvM8}6pRy>)p8Li-*}kK|?}tgh;aG_i={N>4e5_u(8L>?`R&Gb=vEM%7zTaqnXy0$y5wRJ2YCTrD?TG~Z zi2JS5WPCf~KC2`d??gQAwThAnyO2<16+3Zf!vbN3!mS}3@bdE-UPD`lvE3LaR%p{O zHa&m!)xNRQ)rR6wJ-jM7xk-l^zuLFYRH-YG8VifUE3uo{htE|a19mQ(;+?LzU9OSJ z1+eFQI@~0*?L1a&1@JW#oH4a)8ao|_7I6yKK*nN~Bc$Fh$9u}RkZK627bWUNGrb7v z0wpRvsM1&31r||(I4&thW2Nd1Hb~=mjxJHE(lb?hi(O(lmB>^t%GC>OqsF;(U7%d0 zn={oO`UV_Sqh0n5=p@yjF_TWX<%vq1!6Wp-pO%LsJ(f3~jNv9qwR>5;!XYE&QC1PU z`pU^h2v^gnNx5jzPsiTd-v_b z@d82`QoTrS_Q-X^%>usMelE42i|l8U{ak227ue5v9y#(zvm)Mz6TdkB*6LA56yRQQ z7#PkKhezRAaf0xxI6-(->>xdq1c0*y-GZNA3j^EVriFp+YJr0l9G~3JAMZdcxuKtg zfqO&$e!_rUk6ZE8YvqyAhX!biy+RNj8c6Q2r!{~~2U0pTklbNUhXztR?Bn~N8c-`( z@HFExau9@e{Nn-|3M;pj&k9mlxvl(GCWV#T3g_Dpb~~-$aY7FYSJ5zU3t^bS!*nzR z=c-A%5Ru0#8Wa(P>Ot(9=p!os7WghzU=tkwD)4m3%2k04AsjFvN#IxPp?`fU>{Y*7 z24twP<~Yr$iovNlh!jOh5Mg-)RFMYi>38?-qnoG+kctM#a*(q+zYnR7CMk8II&ErN zMRY=j*i*6cJbsv>G}f$AWghyevtBmS8ta}|f= z3Z;rSeIn~Li23=Z&As=LWh2A}bSCsc_JoT}EEwF_yq zpaH?*q>%vJZsLS7ou0zgbIU!T|6LFxm3%8*fB`|U*93`j+*hEFy_;gri@4?!@EvJ< zNk@R@dg=~0jM||$B0R@aHw$@s=7w(nPj(ioKb4h-9nF` zYjJ_Dg_C#oDZLyK!}%PNqxiIkQfxXF$CaolzEzjmC&2*3sIuCeic+{0-rYW8N$4nB z2U?tj!Ed~tlom*0W)wnQUui(dqYGM;gxrA-hS?{;c2Y2I%P!oFSjD#!g7H*mtqO3s zNZAf_S_)_X@D6VwVQ~Nn>2$sczYvDW8)I=u7nfNRIGyVLI(11rXh$9IM?3aORDCv8 zU&Lp|lQ;3Ndhg)bC~G zh!WfbXy5OsF87GTX3N1{$uW~s)dB&E!&X~OrGAT2IHH>@upM#W$%*5t0pmI3vv5Os z2R&7T#zqyST8x({Nc6$f4SSFl=3FQRq^aey+E9Ff`-Qp*z=P^*Sz5ZfNdWw_h1L4f zUUX1RxEJ(!R%@ocXh*Wx4vh!^L@O?9WRdd_YKHD44mJ1i+Acr?`MYoI>{uiP1ikFC zU#fT6wZj(7))HkYO8czr^vt^skhuw&z1=f+cF!EQt6qTIIo)$_=e4gwncyE_Ou=DA z08(w<_3rGbrjfX3HR{O&fp+`~XP?j2$X{*Zh7pV?y(i-#4BJnmqstQ~3?Tt|>5FSR zc`3vTE}v4Vkjsc!D2n6Pv2t9mj#|Yoq!nA`_|^r*njo$iY(OfVs-+#N__BvxCmnS( ztzyfgOF;jF>Mb*_q8*6RRWLSG>Lut*y`wX7bYG2E4IrHzLovG=IzxnNM5cO2XG!qJ zE=Q*qK)WJey~BnECwM2u`9T@d0YR)Pk18oEV9 zvn(X2TIs}PDQ+g9f?=!FDWdO^0P>RZS}5y`&}b6=9WgGHorYv+K=7k2+(~|6^$ygG zROi?t5j~EiD&q}J;eN>Tu;N&3g#k#3Wns!l<5{8*iVZa?J(`2v89&OXVVcfT~=%avjdeNado5$pPxZ z*E6Za{)7#6kcA$cjeC01VE_LP=s041K+sFU0!uYFW?7}^g%9IJ308@s8cZW-I$-&% zyqS^S>NY%}QSTPOU8n=hU2OhbD|^1Pa_~+SJqR`-0NZm zDktDqd40GqDc36Kp0^hfb2iZxRqJH-<0|BAE0>5nKVE3lcJeJp7xt$%t5Bh$5UruJ zc~&vTgg)9NJ~Qhy#v;{fX8JMW3dPwv{yyS*P;~qch^viJ1u70ZTVXW6+IU0BVaycm zReUucbT*`^>7cV8O-%>w6@6OEhus6CANQHj7hdg~Hnh=0CyINtZ$u}qyMS?ldzh4c zgH0gzSB;cWtK3vMdMN*ZQ{h*pC@?i%ico;v{m@QW*PFj+q=9;nsUlUi)xfXD%BBG6 z8E@ttk4jWNH3+dX8hz+f{PjpD3cVl!SCQVDV2B9vwa{t}#nNllrMVA~A=6J)pp4xC{yKn7A|v4_wSe4^BJ&)U2ePr)DL%hXAS_nvvHj7mUhC--XBh zOk%SuBd#$}(~_;Ov<{@@IWzNiM2ekAD(3n(L5@L-&(DR71`W6{BV`xxie9 z(-&282HLZZcn8kUe$CAb5v)Jf)tvOsT=W} zS*!lU7+q85qyP+nT5V2EF)8@OrJ$`fLim+m%e9DKrdlouX>#R4GWOJd{ErsF?u9CM`_B3@ZvbMNiz4hFj4Lx<#!6 zPZ3|LX1_J{Heni~NhOSMgp@%a&qQ-WQwfbKp)!>K@R7qxC1}bkP9_j4AbO^uVO)Sa z6c6016Trj7w3WUX!)P+f$$8U#UXK?@-KoA%ls2u$H;Q&DhNB65a#~NH59lP`(?Ggs z^_U1_vPhsbrf#K=K_EFS<9wSy--49-at1zSRZtWJ+2YeJ1P;gm_s0{kouRhYA$$qr zU904AyVw_nU8^=i?%AC|w{WSB=(<xS}RZ=y+d*OAer-_hb{VpBo7Sb z#}v@FAq=c&L{ULZKP#@?&yl?Q=)W?`AYQU94P%^aW z!$+y6LzUp_C>mlvRwo>fdEAd1)tsAh{J0@4W@u$<``5in`C-%n78q2ytUw7~VoqmO z1h?wdS%%G}wkO{9)px55*E_nZ7>+6?*~PqKaHRhx7-qhf14+QbQaUo;2CDOqR0-B#cPbAL`i4fZEcHr>2YeF6m(9yT-q zEcHbV-Cc{7#W)}XTic)V0~IOM#8jmiWV*>Ym}Ox6nb`C(oEg&O!AXf;MN#_NHt>QA z^%QPFvh-CEj<0QZoyo`H+s8+q#XsRKOxCP1i}B$WaWT zu#z9Y@d{kQYL{33Wn7vJjNvL_*j(h8j4?T9884JSS;q5Z-7=mPM-hEzHoc`xSo_*( z(6>|INr;1+@O>LR01*bg_)1*cMUfEQ!i<}`v%x2YSK>M`N{nD}1(%*e_W4Erm2}NF z67#V(N_TzdP^1`CmaL;!4A+RAj#s#hHdTp*tHG#}JcyxWC4FNdRY^WoQi)~RWF>=f zNh1MLAaFAqy&VC{EQ=OOwgh&Ng9~y71A7=VcvbL$JPSjI8;`FXWmKq81fkvt;p1KK zHK9*FB=l0DEQHDsii|Q!@t`|*M;Y+FAQVEV7@?d|MiCwX!I4m?LYW8^Sh!#rSE3<^ z&zD;nqYSvnFqNWaVHhJs&E_DKI||=MW55D6i*K_aM9tE7Z1P4K@NEGX)NDwFs9EyF zLg!@Sfv^4|fxbc#64Y!!g{W2k`3Qzb8RVW0t7geNA6CtJ5W=m97;w0bs9CyHF-tYe z5GtgFP*X&4hq?*Lp}sr{YE*7xG8MrkuVnVYm4XxGz31?L_+HWT=kVuPOWRM+<;xkK z{m z+1Epsw1X-2B9;?ED0f}L`|0oUq2^STa^J;# z^|vkDX8n-Ya@~Cl^TDI~03Stc+i@wsz|7yNY%IE4mzGYN=$R)^zRcCh#><>e(#R+A zCfhILhncS)RYD)4Dv=!xyw`wcZeKGg8le*ON6|?Opk_>Y2=(I-YYbE+qVJbUYbHPL zNTgTt8W1P7Ods|ma%J`ElX5BrjtY-03n$V2+Q>dmu9(U5;<_k(GE7|sO~oPR_RDNR z5dQR)<&W_yumXKo42lrTAm5<$1AqJS)$6;LHsS)8?vcD#5*>Q--@^e6bc4YV3%_k8 zr&CX;ABMnX%>;qZz(;oRMGjJ=5X#XE zs97M_lA&3=cNQcrjIIFIgH+mxS^Vl`8fL$g@7Y;=1SG?rS$uj~tC}6CmT;eRT1zs1 z1-^jxZK^%Df{aGA1-S8}0E*!o%K(@RMSLDk`~>rM1tzt-B8oO~^h)#{dUg{Xs+fZdcY*>)_POwz3bPuX@7 zMopGp3$f&`6!@5aEo3FqFf&LJ>vPxgE0X!f&gNvsoiUpaDR=VWTL8#U1BPMVYSiOD z?7yGS=EI8*n$)c9kosmC#t>JIb79GIuH)CTr{wnQ_%wWvP+ZS%LG0!0`Ed5M#0L@1 zX3xm;;`}U(@e^@=6CUubU9P`StyQ#QSov%tFD`}DQe16_PBs0msgL|tGqn5!?+cUf zkq_^-+3zamfCMJVF>`ovyyn2-m5h6cSD2ZOq=Jxui<6{`E#>_6G_zB(77NTt!AxIQ zKuLJ)2&Z_V>`p}Jy9>BIm&_1OOZSuDa??G~5WembM-#$cogK^lPWJTNze~&Qp)Xg# zTs%f~!TKzG%Uv7b^~Ky$K=|HdF-9vN~(Ukt-jOH0`ixN#xJ z!OoT^vK^8(-<2gOI^hiNoivWplJUte^uN}}8oN^N%5Kn~TjsGENGrYu*Q#HE{H;g1^DG3}U2=af>@N7CCuf2jMPVW`Q^f8AyFo zt$x>M1x%0p=S@5`?Gd~?+-PHJpU^PlF{U>OWh&~UpK+1jBa7u-iw|%F@cnwY`NZzO zcNl^`GC`Ft`UH`t|G~r;Ukeom{+cO*54Xbn!Z)k6eI_qoz$@eG>y)sFHV{NG&N%rD z;nqMuqhyW!gPbsSy*T=56KX4?FJ91xIJH9D044!SiT_bZ@xNO5Mgn!vM_)hywiOaW z__Q6@9AdVPVM$a3kdxO~#tDxOvMB8MDAtkRAgcL13${(}&$-CY8e{2RQtwj+=>NAFktnQuSJ>12kF}*+|tu zJ1RGm)7#{VJ)t7C004KUg{o=xh_Zk{ecr~wC`(7^knb?+EVF=qzBWeTK}^kJKjfu4XZh zxzv++n~g-NWH)}z;XXnyqS$Dn z6`QX&+yr+k^p5D~hI_lMmXNj?6D`b5v4rJF_zsl<&r~u66DZ`Nr7$}W#GElzt!$wO zit#o&Y%h!Vw?BtLODOotua{nm57e?7bTgw$Ny+);c}=_oHpo>? zysAqJo#ah`Y<`a1J-415_n#(o6}%yL=t8}5rU`lb}B zrCnr0wLXVN!?KIAZc&qC+6Kt~3;@7s&`{L|bQZnUxIpjJ%HcPzAnvL`Ek=Ih8eA1X zyJJ1&8`Xfhi0Xx!!RujyNr1(Gx6;PY8A6Z?-o2Xs4w$o?Mu8xV``1Sww(ludEb6Fq z>i7o5?a~~J2n;SAPBzniqYWM*b2l}7noNjDLir%i{R*VWLv}vH1N|!;T1YKPq$-06 z#Ka@mn$ewn&oE)r1ag_`hKZ!V4V!np)vaaIg&%Se5-&w60dT zQ32NbF%$TD<3+rJ6=KDd^4&X?(CE604=(l#J|T)pMfa}A;df&;LKbwYk2HgD*j~>x zwR953MBPVPAw(nOHNy_RN+VQdz*9ycd?3cK;FAKxRR)7R#k>j0IgH&VTYtu{3T4I0v9G<6+_PD7_&xAr?2t|O z@JsMma4$bp9&#_gknLzg_;?oHe$z%n3>Nbi(6XL5RTEvo zi$hEBsYq-Q#0pJhe%tsJd|cz(IEd){J9OmyC?2Xx-C5AgZNF9p<*Vqho= z%U(r_5b@GC`SdXaFUe2Rxa96@x^W{ylMvc|4~0%b2oKEt0JB&ib5?O{=)cai2USF{ zUT^uaJ37PiV*-7_Dn2yX@nUp*`6|`%&8u|BGgmvEDYHACne0s28r_-W*65BeU*qJZ zqXLAayky?B59++{Jjm|?zOQ-+YU)mT??b$B&@O_C(16e52^9evoR!+mgd;2?sh5jn z=R>???0g3B`_uT5Ve8~v?c~hWAAT*cazW5cIqp@tFOwtdzgCh2?7sy*jH|JBNT&YX|!?*ok-eSCYJGr@tomrTY8E*(BbzlYw1X_dn+!&o9eA=bxMVZvB?eftS|c zQ9EAv95%^Hx&}`Fa?A6+o+ zub{gOL~l%JZ#{gN5p1hp^{~H~Bwd1kc-X(L*Ua?@dF$h&9oNdm^Qr2xFZu6cGJg6c z|5%x-GKMI32+1?KcqCuFYsbl7_S-bn)sOhANp5|FwPWC4@n_VRe#PWNo{!G$uD|mu z{>orap?K%4zwW=Z-Gs^oCP-?(ZqS|_J-3!>Q!-1Rk+iIRSxl8-n^CsQlCKqHJ!yj` zhiy>BwzzErvgt8j^?MIGbyp;mBbQo;;KFi9U@D#FMc*6aZJIUn z&PY^{f13rPzz`&N@+|R^FVT3cw(hQ49|r+kTeRr4LgV9u_=Tv$AV# z{R;KlzUI$3Zd<#J$Go!`0VAE_rpI3&!5ZQzSIQrVnz_MvJrfI82VK7A4;=mC4pP=t z?N{L>C19ynANTuO{VIT`;h2+zvRkslrFJLG+!Toz1`m`ppDLDT_r&EXsy{{M0jYyk z%0-2#9=aH;p*?svS+6OObkwz#XNRY-tJCazuoRd@Bw_;ZrC)xF53@vPldDK4zJU;hPUp(bE-$dcM?@^<&{a^Q2EXnW@iX?0Z(Kg$|w$xJ4 zhTnws!pT?cUli)MpWx4m_{yA!Km<}CRa7LjuMjo?$a?a1|GZdAqbDKYO>|9LmZNCs zP`U_G4c5tp4p8KS_N(=i+&cVt6&FGKc-_=wKcDuuaQnOJC;zSAd)!m+h1E&|$#YCL zwl{I*KyT0Kw;``wMa%he{!ZB)q_a|MGG4)@^lu zeQE0tD|(p~M*wSiiFXD}km0kR@Lx{(u_vJD+v>Rw_|v)@iZvpz6J786rjc6uc_M{a zuB#;d_}V1QA^p7b@BKN0cXC&#R;yZTr+O|EbYoQ(`*&pNT4;t}|JvXCHz1F$dD4F? z$<8PJzo^`U2pTVnpLCMw&^}|df3eSa{@3@hQ@5>t+Oz&?B)2_lJBJ^87B+Kp{oBv_ zN09lS&-%v(A1?RQU;FXgVf7FHE8MPQ$5;OqA+?kH7*|(tTxU)3WKa;y_$Jc)BS0v$n>nHxX!KaU|)z>}|%&vdux?ETN!|%f^ z@Yav#+Ut9t2=WOMIfjf8=z)CA;F6k>@8$ee?tc-QP*giV&!58~0X88pCr-OJD*M-q zwB>8k5Su4a+v!q2*I(cIu(#OrR(c|eT!B5xyG$+i4ow)z-lwa;fm^a)Q^#4Z*=?`? z`<=nznC{ZkBn=-CcS|d)CjmK^og85<@_0OoWXmB7v`i18%6qQHD}cc8wCl;n_6qNf z8eZ7b0e3doUyufM$a8hJ6T|cIW4{=enSYR)NkWqDrT(>4l9zR9slUV?f2hZIkS9%E z^Vc~1t5FCuxjb9`*Jg;9F<-r;H%%vDP1>QymrNX>Ee@CA+Mx$J5{+l9k0dC^os2*ljjrGh7LdU`9R4O`Bng63tQr1eoBO&>@=XKA4r2{R&-L z=!F%Mcows;&^toJ&0GRBqZ}RdZQCLrS2Rf{=;WaT2WE4z7p=_E2OO%?QtIz)Rh|eM zv)aX~pV1^Ys+VDFsuFy|vkkrx{siBL+)h5Gh4 z`-df2$AXkrOo_!WWY}RE{TiG4`szeL96dSGe&cxxMEB1tI#9l{u_;{^K+e`VL93^&6%LQ$STDUfaH;^e7z z(sS<0sM8&yJ9KBCHpjfIvx)VV(+_sduXU}_-!b)9mj!FfKI?F^znE;*-@U%*P1@gm z=A$)%uxa)V2@++2dh%budfs5bV4@Hg*HjoaPz1Iz0|NaianY8G_VweGd0vi#LMqeM zQl@KCnPMbQ*+M*h{TrGUO-~C=ITP!8lbij~FvK}@PQZ}54ud37yMU0ccR`@ltt^1T zlsK|J@zZq9Ng2pM3qK1aF7&pxf%2WF!N5Hq(`*_<* z?|lY{^ZWE(c4M5@O*1L|9~aTU%}FGXDe0MMmGGl;ApGL)MS4 z;!$kE0AYCUjRIRFSOXpFBvgqyrb=|UFNJsk+r7g33A;W1szfz(_&JZpvT1?c*%D`y=t9vDWq=Z_Ysw@2 z_*<6qFgcEsGD8jwHgPzZvdp-Z-G!!_t|^-=?<PWkAsi}HqC4(c0dTx`-?e8R!j9Qqd}PLcRxbZr%2Lr zWHgPR)j~#*wGKf>pSP~ZTnF4BO#AhGfc$t9(G-{}M@vaHL%HhTsCl?LTXQDWQ3e#gs$S${+c=@+#4TO=f#svs8emwu|%7PFDzND3=wT|Lg9 zA|rr#T`5Ozi!<_%s|y8+@|_8!_i^;Wi#@haH2rAyDe0MQ?p6+6bcM9Y2}#rr;E0RY z|MtA#4hkB zM-iWM!rVUJ3({xqE+d>U=PVF)6T~XZL<_~_=f@+^oGeeLv0)tXXiJ_BWJ74;O)Yt2 zh3lfqBs%fFN6c_H739Kd zqe2e8)9*^-eVq47OOz@dt}nHm%GUXM3}}t=I%1D3n7ym90|51y+L9pFXCq9EiGGVY zQgq9d`p2B;XUw(MZ}I2aMUTZ*`U~*}h}eiX2M@R-01M^>I@}9>sM$Tt zF6Z?nB@B`v8-(r$4%;We5|9XtIwEZ>U=13h2(+7)9X!YUidI%?l#|AmO;2F{3)$qc z0l{zC;q(A`!@rCcJ7wnz;-B%GO@SsLkrY8}zZKr+F$2kU;4@06uk`L$3U>uaY!tf? zP#@wseuT-hK%n4z5M!$2Y`>d0$_+9#OT8yl?n!=O>A$Rl9g+Z?7z0miH))5)?ycn# zi+GV&Xh@D$t?;C=f$6CVhxr-$%c&{pZW44jU43;+|pq96y%TwJ#o zQ8k{Be5wxT_oivUEo5C=w3a@Byq5Y0bO+i40B0pb>S2% ztO??ajh69hV_3+U-nTs`h zUOY|j4qxpZkdp-=Nte!xYs$bT(D>q5WdLN>jH&=I^D&lz?30ik&C6)C!`V+^0I%n5 zrcPve#M$6PmRV8Ok+A7|7Rj__{;4EA&cYHd^N8@^DYAnF2|Sc-<#)5dsFdHd)5sok z2s@2RariE?=0Ll>_=HK;9!8V?F6+%mjwO)0()XscXPfT1>vPv56z#3Q@54dQYeF3n zHPIS&%6>vqboiqwJpYAB07zkpPf@bci%C%bVX%Y#Dktl(#ezYyMb^=ti%cG#zsg^Q zyEIk~Z6;}3AkJ~#oOxjj1ThFOMLAu6vHKRTW+GA$duK?=#w3FB z8P)?Qcb|$wEiq$9_RqelHpQO8mse~bA*eq#799SHe2bp=N0A*t&AjXqsnPS0;-WAx z4glIbU;uIp?KE~sm*Z7r5I;$8uuo}rk^&$WgQ0JOAa+8?1Ws9JY710tkXRCnDRbg* ztY88>brVV9I6fBjFq;KWi+Nf?3gDgZlCwxgwo7Pd*3<&a$HNi|t|JYxNB?qM)p25^ z6A(6MR5j78S{2e?RY;-=AN!Ol)FHh8s>X`;{KQ*KKC%5#>%CYPTyIs=RKa8@b5(=f zNsZGq;vnLHfqj#h zN7fcdpyTI{Too*E61wX9L)))EcW0&(OyCdonI8xa-?8y+!89Ct>YFzNN8si0(1zef zl9S&aydwAXjt{;)IK0i@^Wpma*93EOAE>fqIN!F&$N zsq^SI#L3%^bYD-d3;HV)a_f&>7fh%8GuH)+rt^#9d#>;>@A3ppfaQ%3Cs&s{RCU)} zAI$1eJt_F8CRloP`;Kkb)7|knP-v$gARrT&A<{W&k% z<>RmLN9&(?ssD49^W!J`ivpCS`tBr%|EJ*p){)>U!0$IB!Lr;}>Pv43ew@2~$J`r( zya4Rzn}X=iexA$aumd>O=f`qLZL+@q_Xv9NyMtT*h){IQpZKYQJ`sQ}9S#1R3D`3l zyfOFv`l|N?AMAFLBRs$@td3*<@IAqt#=>^r63ji+!pcNhf6XnyEdR!G{rX#iKVc@n zcT4cvB{%0nwy1H8hxg!yELDQ7CbVU3U~9{63jE1V`|z_iO|Q5$IFgU+BoQT{-jtkE z%fW0t=iWlWwhbx^*!<^X!9wIQZ7)(6ZNZA5+O95R_StV<%WpV(SU)5p^$%BfnKn(q zGty@8uyd8TcIvtJ2H&Pnd)^z&C&}LyL?lPv77UWCb#GUa^wJ}09LGKCL#}POT=kjy z*4u&^l>EwVpwrFuXGmsQNrafR!AG(N+c&6V^*Og&(bcyHLwqrMdvFZNU*FEme69Yy z+k?Y-d){R(y2JYPsyl*XimEh#q0Xs){tAB+o|0!>>7TwM?)N{O>wDlQI4y7htKtnk z@lPN6`qy_n`1n`7@+tMb_XaawJSfS6_Xj5txVC=o*5JnzqmuO1Z@n|<|DWL)x7NS$ zL877b-ud_!`|7{`V6ej9dVBqZyMm*0ojYECSMZ};&rk8X4-v;D+96%A%T@hp{SBLg z^V;A0E5?1qjxTNw=H;e6_n&SO(5`~`d3&k<=ZAuG+MjaI=iD8dbFh z@Ds{S%h=?!t-(pT9-9xKZ&f2mOJDtpj|WqVTgA-le)(H>y$YB7p8C>P`TGx1uHVXi z$S+UzhQ9yp_uuu|oxgnIn)3I8srB7=`~7!)0wdp3^%Fl4+~iy@m!O&8eDL*81oP#5 zfP=`Ozr=(MdE*%(D2twUdW<_w0U#*jN9jyZw$kKe@cU{(nCkTn@Ut@xkD=JrE-_O^A^h z(H$|W|Ko#!yg7gIpwXR~JAxzULU(YGqv#xq^pj8Nj^Cg=u!em7@y`VFE>J1CHb8r% zfQoGRHd_+5v)|BR8^1MaPd;@5<6~Sl%=wFQ=1o?=W(Ux{t^Uy+!BM#n*T1m?a)(7RIFZ7gUkDcFZr*Xy7lJQXgtOyg0e&^>z9cyN_Q_IKl1Ju>9VUL(I9H?n_z*nv~^OW@tj^|QW&R0<#ZQXt2hu`dNn zNS^qTk=b8=$w>d~FB|DUkjhnEZc$3%xFBH-iu#lI9IE_{W&k;xX zGsvnx@#WwN0*%$L7!P^|JuLY;J27UwmRjNFmSKzn$J)a5wm!|HN2ePTlLTe%Xrc-zRXWi7@ z{Mlfc_%T#+%IQ`~eackuuzyEwS8$%hs;eIj-lp3A?a{0@fsqzM2;&xlKwT+_xdlB` zr`P-~6zAq0xBqSMeH;E&-^l92PGj{!sMGpx`a9RV2mUTtSfO{ZTmz?KN-5Mgort^= zJRY2@K3(v5R!2scBtW=6Ss1-rcL!-0JsB2Qz(dUD1G|G$x-|u!aEl6RR;s?>U;Q;s zFn~~)cub-4zdhXc?i>?zf(TW2{q;`-wL7;jpL)dg>6tO5t$#RQWjXaLH|D0nZgTnD z_4V)V%=OhTKf`aYKmA0|PZfFl<*siA1F63jTZ>aMw6T@_QvWH2A9^pM!O`ZJ|Z!FFOf(|6Pg z+SMvZ?fA&8NyD*AJE8I2w`Q(e6nKB*B~`9V`miL2h(gH4Tc&&;rr!^9%J*UM zZrH4f92Od!2OL}cv(@3B*cPuJUK#$GC~#tq!Wiq|I_|At>Rw*i9ca_8 zv<9-hy>?aX%UC-#-VV#3s>?1?gEY^UgO6$>XUuZA@1l`IkbS-)q&zv?&Y_AnS=MMv zA;RU8KhlzO0CVQl_@T^=gU-^g16)fnq6M4E?hp2v{p`EPKem!zHb+@mKBvYwQ}FNZ z)^8Vk54W$(CC~AJD%!=zdwE{yjkiY>9`qk+kIq&4WP9|dO82x!>)jM=%hd|4mOd6# zCs`&cvbMl2j(WDf4M#op=gm(qwY@eMm`gz1erIEWTds^q8#3*-(6}-JU;yF5g3QQ- zM+`PP10G#|sy#ZK;c=vC{ZhBSWNuaO<&Uxzh)xJd=y|ni`Rijvk)IZKtR3Lz&Aw#+ zjv4_LrZ929(YPjg`cfa3M1|}hlWIbvYe~7BCAuyEJOnq<5s(mhT37j#r*ZF)7kQ-I zu@lYWkIT@aIiwMP$pHV%=I==ULVn1R&gJhYp68P;AoWS-@wb@2WBEIpzhn42fxngf zE#dD({!Zd=6@RDkw}$Ut#@|^yzns6bd44T_ujlV=M-X_Sw7yoJZGWfe+cm_zk*p z!@&1*x<_WS9C(l5N+^E|IO0vMsK7mjO0@-S#^Cy3zeV2Al<0J6t=adG4x%i>p69Ec zJ?*ug*qm9)wu@Dcx2M>h;AAPIak+(*l+g;w0K!tbQAX$^C*Dh9)-b! z_UJ#&W50gh*&bORz-eE703qfo-P?{|E9u55(J^5;;f}H?(Hdnu-yW@0dY~Pr6Vjix zM<*!V-yZc3mE7=-2eXWJL(rRh3dS|A z*Qx+uj*29QXMCaSj|5{~tuS^75K}u%5R+Rj9LdPYP!Nff)aDQMzf01&Ej1t$ZQ${v zOg@jN@%VA~xQfU7+~do6yr1Qwz-v>8uwi<&l0KSkKq*3$=c!~ADE0eE!r5-~VTKvi zM`RXY8;Y=Dvq_8~4LW)>YjtHB$UK9l=<|U#CUzDMcS@m2`$+|v(UF1r<$xF$FI$yb zm18%EHD$YIqYxhHlnqhNq#Pb;zC8pIXRWuiMYATXBD`w7>9jhycg&hvYIvSh`vZM}|R)geuYyf*ZmWP`DDqjW ztgaj$=jk0xuBK}pxm7N=fg5uw{6BNe0Ims@IDa;2Ja`#S-Ie%(XC9lrCJr`4A%a66 zeWnN6SSsLoFnF2vmRR*TU;ov&^M@TZGYt8?I$XUSYGPf}{17iV9|3I^vX`W<{?0S= z1Ig;jfCtRWjs*aixCv62xH$`)pu>YiR4!=0pP0j8^}cW+2pxI~MYJ(2NmL*tkw*>0 zM%LIZ@-{?aIP76$S|wE;&e0hIE}T;IRVGOdX(|#nbHTpZ0Ay`8a=xnA-&RKY;6wv% z6V^OD`M|x%vjNM>W?wwI^U4 z238@)%|^Jzqd3GS-#()n-OWVi5I*~35FjQsAev`?c%nQz%P}51;fZ1Y`griIyn%Do zf02fCFPvwFK%hUWN(D4TB#JZ8ZiKcrz#WUQv;HWl2CKpPi-*GH#@ zCjoO&ACx^(`Fq;AOpiw3-t+Z7=0^*dkJ`+r;I9f0*utZL$pu%|j#O7`bNuks`WbtJ z1xXhjp^^~P>KYn&Ciy`$6@@(~trb!NfU{S2r@xxBam@Rq z9G0dNz-N$z4vBN>lKu}nNCzn|3{8kuV zz|11+pTqStM}J~nwKkr=bAn|IchjucyIiIcV$i9Kj8w^v;NBPs9}a= z4nb5=5KI7$;0pw<9Pez1m{Q@$$iz~SKwKM-2HhR0q>hua7efNc!=Q(oo6>rudFII8 zxB5U49F>Krg6Gg9t;s|w`oyp*oM);jf5FsoWAv{4uBs`%>0$C07oHNGFJT&khD!~u1B?g|dfd=-&`Goxu zBQ}&a;4H`E%u2>G5G3U4TuLX2nSfH@`L-R2L9G7~rA+2l(o{VAXfDOVNt&1%$wX;H zI`e5)(>niJn;~)$stB^$%w}B)l{G(9sQqYOXoZhT3%53$mIU>j{(`8$L3T5s#c@%g2=xwg+>e7<5FK0J8ey1h@ zDa2^#0!TOgaDzLsrA*83LVGC`%KA$-C^lSW5@RwkuPoKf=IGcVAKhhY+5EPX3Cc%9 z_c)w^PZVhd1+8Zd1t_f|tutY?=(o5j0h5OVs|^MB5Xy%dN|lc-Ps&3j(>>xKnh`tM z*Lr<)sxs679Vrba^`@Ew7jcWIGsp3`(-g+NwTWyOwmaBS>t9`&-c%LFfZhw)o`XaBlsIeL-)s(9ujtEaHwx>EN*G z%{-ymrxX=;LhW2J4C^K|vxa2JVzo$?*6(8tW*t0l&SOX@Ty3~$aAHu-`q&`(wZsf0 zHeM#uZ5G3|XYfr~f`!)qNi;oj;Nl^5ZMaHT(t;lXn7Cj@rk>as{bZSdYldaV-%cQJ5<2xx zM5i7ATmm~V(TYxB(@Ccx**I)EDa9tR$V^0I`L^(+GVm3yY#@`gLgaItuoGdEAslO#7VJ7{GIohUm+30l zARHj&b}O*s*otqKzT?GW=LkJPEJ1|Bs}wGzc+G+1Me}I``4r8G|2l8lh*LY2E#RJLqgfi&}(L^l0AXZUT38FfzjK|?c!^)Gpa+2b9b8_uux_Y@$K(&rAUeN(+F%i zZ&{8qX3LR2L_7|&;AkMmbCcAd;~?Hh;z!W4?1onR5@iiRg?c=FLv`=h^7pLF85ltD zF$d)CCeH*FC$}PMEcA8~%0PimFikj~kkKH?P84_IV+w!BS!6YLNa&q2T8aS)&1KzS z+QN6C6Y^+-M`MJY4|(P2bUxn07L*BW2BaGFUdy4iEXVj0au)U<*WHflTet`h%Mm)6 zHvQRp!!Z#yY1)3r8j70gKh2zm#~A4U6-*KnsM*!90qAQfp(}$` zjkfO1)uV3*hb1PzNMkL>w{zicPq?y$XT=9NU{>M|VNlUC@?VZ$Agf4LXH(@|Y3%I1 ztg}0d5$rE!;!0=pSQgZ94gfxp>?Xgryn?s_n9tFo7|>1SynY6MG8a`_&26gP*+pyw zAcdVx%!SMj){o+{1V}o8;W_!&UOJmc=z%T6;JdZp0QY-KD|1?LKo1d4)Bkj_RyCOs z`*bmyYXV7iaqhuftv9Y+mIkj$q8|GJYpoc4Z`32j0u^F7N<>K6R+ac(LxYQra$(6Y z>V|_jM5RTZ@lNO6J7a)HE*bSuRK?+tWy|4QDx8bjfKfpNSl57YqQ>L{(-o0^uzXcm z-lmF##82K_^0p=oMT!DsVnCO)J^@J4m^f)=SX7(kwh?*xTzeFSj9pmHCSYx_ai|5; z3-61KgqpIYy{6i6VQ*`#TiFEM-{vd2f{!7@rmPf~35kt<%Kjf@wlxGXUU5)tdSt=(x;I4%2(G_=2qb2C||W zIeqC6q#~{e7iAM|n&HxLdE;G&t(JwyXYXvIm{AyhqH4p=0jxn9{ty#PvygB>CugiW zZOXdOMy_VTb^2H|xDZAwQ0fZdEZrF;Rl_Z^eiBm@6SZ>8j{^_SJQ>^^bHQw!SSze; z$+c8m13dqsEx_P9nLnF1RlJ^2F@5jn$kgN>*ZrS!Vcv0BKaDEb(5h6RSr$?$1td49 z2H6HI2U#2;S+caT{whF_8`d%iw}%|~@FQ2^a%A+nu4sYwpZlN%vXI$ho1%tA zbK$%VS}>0_olFZ{TkNeRv1kFZ1f*h7*lTD2XbXy3slWvMe=*GO5$1DuFP}3(v(|?_ zr&msyg!ydA2(W4=r-;vn>dDMw1M{PBmO-!(F~$5|vIL6)24Q{_Qi*lAiStctpMd8L zG>>dg6uRqMt8x)2IJ=kSnOSR=I`Tk{ zU5vDd>S6UoDypQK(y(CT z=o3Mz8ra$8KP9NW%#s0fmKiWhaj=G3 zd*XoKtwQ zixyOHjz}S?fTUC0ut#eotarF*{cNmjmT7CLElRh@0B&bE>ufO4M%78SR<&x7JeR$n zbXjc)G-GqaSvF&ACfTw=V$>PdbC_$sft~fWsx51$mX%|oTGk$xwNH{K0)SPiRh`AE z&PrERtTJ6yXpB`ni&e#U!()hmf?K=hZ*E!jQ@X5;pVCjPlZ{MJn%>EzAPac9s=7Yc zEEP@0)nr-5tP-cnG`Uq6Aw^B%Okr;=c8sDagCVuy zLM$hA+4RT6R5dLM_bV4!sqWJeqa8)7#-%eWGSmrQYn?{j^&(bL3F$a=M@Br+p{j@t zAPa$P0$z`fX=JpGnIW=ggY5OhyLlT#=rfYo6aNFR>=Pqm$FTAcs|NKNFlVL+ zdYEF9Eg_naG@pIWm0@3TYVk#6BDobE(yE-ebB9cv7;Mw0rNyl5%wx_t)=hiTV)%EG z4nt0hnl1%~oEKGJOkvEcnI{UwWrIsObK=XmA# zsUMDe@sjwx`d#m-vcYf;uRrk{BKD>7F|H7qjA#>$tgPA9L?bWjQ7dJ7SGphs0JR*{ zvqp|q%!Z%l7z7D`1Ytmrxrppz4b})?)`Z8Lo=8Kq6>5tW-eZ>x1N3Pxp+Cm;fm}p7 zs?L71$%jan<4>5);~w8EGW3nzYRmaQ zGtLKm6lB$lQQp zDmKo~0L_MSZCG>k5mn9$h>3yvE*V0aO@9~3VhSk#w!pYn@gDr#$828ZR^yCL_KFgQX1>YCGXt~Gp#M0VTF4 ziAek^0w8-4r|fY@n_zUWA;W^6gKSoHvzdthP&Z<6-kjPtO>tgrSU%Y17Y>RbL;Uk3 zsy8I4-E*D8(Q*8`?eO7fHR-15!*TwqDCTizWjMlA691ASCzJkansk3MPmxH?|B9$3 z>8nG`7o>50i;P)#1P)xpw&22e&o9T(cYq<_h=M3a$Se^^g<6&9)3%mREdT)J7_2Kd z=;bg$s2EQ4jTS6Em%%A`BPJgWdTr5CD>tvD+&ttH8)&?j&Yy{@(6~B`IQG+sjkAut z#`R*AFe0`a(PF020aq_kh%l_Zrn*Wz0#ZqIPZ7NmALvsCSSQ1ZW_`b9 zG>nqWzx}kYkKeXeh?q$~`i865%I2`Wg0Bkc?n?9urF$yT8A|t7qH~n)t3>B1-Cv0= zReGQjU7&QNBYLIM(T?bKN_SSG%ao2+qBkhrRf*oBbW=z4R;8OeqRW+zbtKUhdf3_# zB}%tZ zJfi1K?m6Lc)IDCo7U;hdXV-j)UXRN$3EKmY&!{RhAK^_^e+P+}!oUU9-#kqd@y+;rQ>*bDb1 zU)tkYne<(+EWgTJI`kX%8fM$C?g<*CAI@uOa&iZDslYkEwFBcSaz@&L)vr`}XUv)aUq@U{9E*aPr|sm?;Xsl<=<4u^5P#YOKUVys0~ABWxX>) zFiq2=(do5i%1+d4<)a%{Bx*1wd)FRF7g@_JYnj^;sm9^j3U_Nbf&y&`t5E@;&O$jp z%v_uaU4cCf5*7c`KaYDtG{|TtBZ>F4zVB|lWI;UB)OLM2SMCA~2<)FJvWs=}&c9JRI1R$9cHsgK9p!XGDoAEl&;SvZcK^6n^;y~A80UB8r0 z({ZAGHet4SwJ2N`KSWdth&5D<*gjGGlzU|vQ1)7Ad%6tt7(dwM*6qC#q8w=TNvLt% z-VE5BnF=J8c#POU;kw4_W+LaJay3ckm}Ruk(yf-!0(Fq0J<~u0dC1N(y1J=EZ?{v< z`keK6A=}W;vu_xA;nG-Jh*PeNj^}Z9a&@!_*Hy*I#&FEmY8RS6r9t@4o3OSF-AGWG zk-xm7z{WSh=bbXpr*lw!j<5H{nU4w1aSU=O$e>a#oVX(528w$yH3qnR_L*bsMyUKE z^gd7_Io0i`!%5iD(uy)EjTzCF)|uonZCReE@1_d05|7>Z0|c+K(PrbU#G~9my^c(# zD*GfJA@4%+n9oMu0k%CZ68~q`8<{^Q^HmhQqm;RVFtM~(qCGBt2`h`e+t^lmPN$Jj z{jwm2AP?caoIurb-t2dgrw%%wB!lj6bM8??2RSK}1YOQaVWHE*6tTcu53aZ=S}2!n zp;CF`c3T;s#FANwKUo>BUCi$d2Nw z#AYpG)__Cergb2^gzQ1IFa_9zVebmfMOg&368{I}pk=r`-9PkG}ugGeY69{sSknK6sPk9~(7}!(T zm@|%r+&_h$*vPbQEbTD0?FQV}@{N>@#O%(M7=B)Rjp%?C19G{$nXET9vRL5MIvwXA zm8=!#VMx{Q=k!kaFOz9UdhFvCs&W8eL78agSdTDHnFC z$A;4}!;z@{lt~W^ozG@oS9m@LhDhzeP*;p8AR<40&r^5g?8MNk0V5!#8<>FN zxFbUp;>=L}H4kwB==|{2{PZHHg(_i}$#WuJiYci|Y-_D6z5#LR9Xh>Dw~Q15ha4f& z2qFTykV)>u7zEy97 z-n6Cm;~jd7`P0@-kQu~#p zX8yY(LEde6=~0hX9GO}GAku_*2YR|aI_y~j+9J8yufw96(q#eECJrCjCQ(MJsKL`Q z6ijaRvpa7k=&Q-4OkFJu4;2y~fwOq`0C1;Y&G5BT3>Bq`f2Eji%25V8Bo<}7g=7=1 z-K0Q+QExb;#Lnb?z>nmRh6UP8jiSa~{H@?GLO?l{^nCta>9Oy#l=4TScSp&TNpG zzTFbE)B6A46O|_meJ^5qY;IV*xb1Oy!`QgIVQgG3)+G%lTyB<05*a2<4b{xsA=`B( zM^8Fr8?KX={IqagxGtV1ANfUW-8jpmognEJB&`F)5Yx{hS+vwY0~_Ubz+hvJhpmBG z9BbS3?rw#YNL2KR=asfb;+W}a&h|<4PhpQix6yD9j z8cuQ`t73gooYJILTU{waO}jDDTIlAQ$WQq%wNf}V13>3C>p<9YchI9 z7D4N4<^<(?G46)sfR}qU5;oGGB9-X9N9oqi;o7Z&+0g{q{Ti@V%Odm`;r*Q{Ut)xG ziU{GGJL5s~YRbm5x$~g$Xu}s@>aq?H8nQ&irufkbKqBGwomt^bQD`TY;RYMDca zVM|ACG5*WPX7kdKK0E~a;1{u_BU)@TE@EqSbcBnkgY)6+Z?f74AU5 zy9W>l3abH>=uPgc=s0uHS}Wa#sehAh+C0W?+FV3$7ePk(w8WvnAS%%yyU5X-xKzQo z@gnx^7w29QcH#L10j87*2`|xS!}<)8y*TF~3KwcB=x*8MKrT0mg^O%kH>$|3ssz23 ztI4)Nl5B+3paQn7rRl(4x1O0U=;lp&6&wlVs$)p6*0G8!yU0|X&Ugwz66j8)e#|Tm zN1@f@N@Axa=|4kc!XM%^v(}>i)>-*5G4ivI`PBkGO)7F^NN%i5i0-DE?Cj^KP^!Aa zcc6bO1^q>y_LOZdY2axC2-U*}$Q_nE)@XXv zX*YK`Rn$~6y`j`i6lM_f-DV6hI%bn$5y5~JpE!~7Y?Q4MmD6wv)5Ut(S~ZasTQi7A zzs;>pBonH#6`RPu`mS1j*(3dJ$h|M){lwwgo6=W6RCffz+9}O+_R&t1^qJWs^1^FiGg!RDZLp?6 zn~d3bUic=|J(Aa;GLfte&DL}r?%=#-FoU;6r?3zB2p1c<{~bZ=B~92Gq<^ij^&+4( zXrRS{?u58D*JnF#nGZ3%)Oay-(lk9ZmS;0#6NK$jDsoFI2piWsyy_vMpR&}D0 zxX#_40}Ef{uL>6n=NGeL$3=q>kv_hFz5^65q1D=D(IRYo7_OquR75tKTZpRD>F1Mz-k%eqOihv zigcKY%JGv=VJPg1pZX`Pbt}E{)P?2n627m64LQO{l4AQvb*h9l89EwbpqVi;F%UhF z{r^k?G~-7m`@t_#vj(suj6=?XGr$ol;;j{Tsd6ggXaK3?LWetzQ5;I-k?GAC%qHMP zecIff)Ij1<2|THvjP74=?oi0pb>bl?_44;TdWwEhWSI}SL9s?b{b5dO=(lX^w4OX= zf1*XJ(u9gobk`p~GJkY}%BCI*U?D5urR_Ix{z-&d2bm33ocO*OoVvzjcaB3KCpsIX z6Cn>2@UleUW#_CAzB`xgv6{?{_V6w><965)0>#H&WSWGb%;!68RC@P@g;b*2Cb7jW z(YBHdx`l8^tc)JUyGz5_2hC_JtS6qmQA-1)dhm;}uPAQ<`HA))#A0Hj^W7 z$(mW!F4nq@rG?JXXRm_dDiLJaSFhqLXM%ebg+nX!o}BB*L8d6;Zv__S#YyfZVdNx1ojVs~9jDKR^;s&-L`Z_1 zs!F99IV+j$vO=;T?gUyX9jIxM1)T_^)}09R;{2tvMPgWipkq9SirA~upTuu=X|{vktpm2wv1Y%$R(%_rQulGz(i^(}#~=LEqfb7w z^M|}tKj;HOg8&;peC)s-KYY)3KeOkF#t*Eje)#C$|K$zaUbyc^$+L}LfC2q7`lCnp z?Y!fIzshG-!9>)f<OucRiX0jFvz7`K0=v0wwXfA?^Ox%*!wmA|VD*A4CZ&!0c`>3@Cp7eDo` zwYqm}8mvnCLVf4glLf%LYS~{l#ab*CY1E7>$e*c`%0(hZm;y_gScFXvZ?uvmCbEH& zLU<;`iG5VJQR9pp6*Adeot0)T<(1lPe^LY}-4;SerV>H4+7-wZtAsuXPf>+-x`x6P zUa86s#_+n7SE|Ymoppz&SR0b{oTh97g6g544tO_roLilxR|myodc~=U9L}g4NN;Us z1$!)KdzyorrBew`4v(i-jX{p0C0s(5;g91JGU2Qxi>>c;D$=u&s0j$+X{Ov@+|Nr> z-}%-Fftb*q$PDTMV>mgyu-WP*yfoTd%S%g3ZcoEnYEE2p&JHh-U0^?Igw(wR z_MLI=izFLkVlEKs+#EEFm2c(dbr&de%GrpJJfkupJfOMAVFaBWq08BFfeIO*j4z4d z+ttP#dR&Mtw@!t(B?KWQ>_#XkpDnxtURs4{oP{B+hmRw z^AnRsjcWQ2U?J)e?wAeJ)BcQXn3UE|lj2iq-Wi>NoMkm^maxiypw~2KOG0TltA54Lg6WMDbxpCJiO}v|D%KxVHNent4~YNq`?Sl6j(>3q z2y=8#ClM1&29CG!hzhEid+NIieI(e3_k8$a9tAe~F>%C^|<(&N8#?Bk>D0BbN`u;@YrMWHF#ylN1VOx$j?KU*G02Qkr)YTSXN}(t20OINR zyKMocn|_n_&NAQE)v^z-7Q6An)eePMXDAHHVh(XWucxLywBhR1qUii_&g`+9FxfujQz&21qEe+O5;_?bR*Q#_i2dKn&8k2oS<1 zjYsT4dgCTQye4xKP=wLWAusYs6^VWj>>lrfkyDdJ4{4~l;HwE9B^ROF9ZUj1w5dOl z0NX0I#QL&DY>D$%jX=b8Xt0=T=ndL)7*Jcu1 zoRyh6VPMN7nR=$ATS=|D@iOb9g!m4rIaf}ogTjbw_g-FW)rXoY)ccC|6n$An>^3$}I(`2^P#VWFKIpLUj6%yfXsR~*mBnFFUlc^U(3c(GKROwR=@bhHvTeC_dhBI6YE+Y%cb?Ff%|7Pl2HS?ZEy zE&<4=4QG#gvd81n93@&BrCWPQlV|S#(r=#L_4Jod#)6`Z7w-Ao=vUtNk2n4$(JVGA z<3FDH{J;Fwy}!QqqhxGS#@8PEt3BV|{coT7JQ<^8#3SQK>D%?hO2(Tw*%Bi`DsJFt z$8cP(PG@v1A){Cf6-)iGS$$Q@Zc_R;#=9Q0)E-sdms=Gduu_hQ%vI4 z_OxJxMi+XYCW=y3G6c`}L%sGI%<0$~=8*JxE6=;r=P{nyp0Tw_v^e9usPFs>a8|D| zY@@P$G;7pIE`eK7N_5^xryNGROnI~MreXoNmjDa&4x5}oHrm}O_6+Q&`KNFsONW|- zIT}GFMj7LbA5HD-tRY~QZ|z25B;D2>$>W!wY9&}~ve^k>@a{qHjt=<)4jG_#I4{E8oV+b%vTBFm zHZ`+X;`v6+OYZmsL)g??tC<73zTY(sp9-46;&xoqck!1Pz!zn{uEyz-Qv5=TBV0;7 z{}{YZ)O;eZn?!|?(|T4Uo`Mi$hjkFuplcan899i7jW`Zgi0@{tD>TqJ8v+3l&&UC< z(3Jq^WCu~j7|HSHc1LwQk~haJXqS%}k{#I19V?{_R}p@_fNr1{;IV0JmC!-y3Z`FE zANHwYnC(Iq;+g8g$*qKDC$7#^9OHIs)QQE*mJXhX9wOqzk~9}&ULx2m#4Jp;@(PN;t_V)TTL<`;mTJ%yPIIe!}Z1DL@v@=wh4n#rOyOU=7Np zjv8ksmi5$9O8?3UJ3flxYV)!%7fse2VN}f&-k5kbV zwE^Lb6YY{)Bn+oY15Bk)-e^u?0QZUYh;}ePJjNoMt}!*nT20j$LZz4*BPB;Yk&Kfb zh@dl4V}#^%hB)g9+t>uj&4p_Sd)ZK5=ttTJfuXFG6U@Kbwes6)mw$D$b}A>J^%P=F z_RBfnF6I?=B*cS7WZ2V|WOnDWoN>|cF@d?z9{_wg9&^PAdEsOv6e7#nRZPJkR8NT@ zia3(S_}C2*!_&?3$9WzthNlnt=W-C&JhGXOs3RTS>xua$M@R>1)}Z!qt#^$E_gM}d zY2@s&96CZ>0vl^;D^2aE`|8eSp7*BDqdf2C+6TLGirBQW5zGfVU0UQ49~ZjwW$NF~ z0(T1M2)O?;PCeD@HZBOP$)&ag&1FqN#WF8Ea@%nvNzfVJi0xltQ&cBg9-uO z75;ULLTGHH6BP22du!m-)%q~rYt=e+x=iRJ4)N)n=?oH%w%%k_^cdhPaP9)2t0hP- zadhpx>#?K-q~1a}|6Z;^BY->CBmrMX5*#}XYArC=q6O@RB|0N}EN!}P2(xS7P`zvX zShZ(8$-1x+IYbLe^E3Ht31wgAW)xlIBK3VjJbbop!zJO_Y`&%e@|!cAm}Q6<+KhiQ z+LHhfh-j?!Ch`;^1h{DAjgVI&56Ecbal`_fPB{iPTA^Y;ZZtR#*m(Ey{0{fHo5wfl zaWL^7g~ME`=lC(c^}MCtpYp8R+_;5A_Y`DpDE#U@#F!)Gm`Za~myy;_r`7MI&M`e- zzs&oL(hV!T&y!+)FThzyw-F*->GlFT3F!mamMrGs_FM!MBShw+1p=whj^^6XA zf4bD0rj`c%OX03q!ZzrRfC##chbCm>2($mmOm437M9+$5`x0&~M(PatkRwj&eSOUo z&<>)JJ1=sK2Wya{nM_5hc`V} z;4(6#?0<4RQ}NAnWgqXEAO+!$_qM+8X}mNwWqH<{aQRYdJV?jq_+g27RK|>Y8p0*f z+vp@LX|^GdJkH;7XY|7(63jm#cO*dD^K0-oVQ+c-8}H6zF7j27As5qWskBT>B^~j{ z{_WR~Uw>My7bRe(iI>>3W-`k6e{159?rwd@s_~J=yHxPQhU0r18LU12WVMcXrdwnN zxP?%`dfnXKuuR7st0EJ384iJn9ZEQ>GKl3Eqm>qvDw@OWtL5fpw`ak&oF$s&g+MWj z`QiElalVHrvQok_;Y$ow!k2MpShmiSvc3|}C!8!RH4V~mOB}C`keFZ+nX{+}7`M}3}h7;9qhG|(G8nD1#jVx`AcVbwSI4EUko+8y|yz;no z$;ALbe^CG@u*h9hX66g=aIL&6lCF;d2i`&em*6L{lNEH~K1e=GAC$RQEdZIkmwHcF zI<#c;MDIK9F&sU~`&Ize?H|2YFamb0wapHIrGjNl_|es{zRe&6l}%p*hq?%lsWOM9 z%G``NIn0WPFrg?cVw1 zvN-JJ^z=p{20{;PC?cvB#j8VfNVeC&Y_E);%>jNJgH|WS>WA4j$~6CVK(5_~0sx*b zfyf|_FE}28)*^7k=pdI`3Ag%Pu(Q+;?MYgqTnbDRGkCX_47@+WFy{s9aP5gl$`<0e z%2=S|7SjtAXRjg!NE{ZbETNXtQhxz&*jNThT%a(!iQIwgs`cbHoCIieUVwJBoO+Ob zb5St>i_+$o4_7~;y)o;6={7>JL7n0tia9%8y$-uMeT3F_Bg|1x$0{p!^bQ=J*-akHYot7x#xShX*D#m1?CQBW7LE$^q9rdFqZ=Q z3Wo;TnTQQa?@fFs-C|NSO+gYHR7W-%TM(I-Y(k(wOY{N9|4O#0LyH}llvVwC(zZI_ zSn?`7S2|P&y;S?>YprlZk_kO+z-RRZS*}+^yld%JS_I6-z$x<3A?1mt(;AH$0?uTJ z-i-&TegT3C?1i8@7b&s9NV&Y=qoW%bH4z;~e9$3b$y@Q^{|!1E(6LfBBAe&{avC%y z!iTmdK2Qeng~*U*Ui%}U!o+*0=p+mYLlhFYZ`iG%I0^x7Phd%@z zM*Jo^aB4-cf217*0o@!^ISRZ$aEZhbbaHK^kYp@DLbGEDr3oD2LMTnf5iW^{S}nw! z3YfwXME{8;%q>#-!6+IzBKJnKd78@89LqZ}g-6(gN#`Qm)&DINNP-K+683Trkj`#G z_#jyEUQnPf-aJJdLA(Zzz;>4i!EwC75#SFgE)9wrI*yRBh*Wqtme9W}SVctB0UD7-4v9!4pafy1jBo(sOPo(!_YDUy*%(hih6W2Hf4R#^B^L-w zNoA4ibm0aF$C0uG30vyaL@x!g1a`~>5)AA(z!Wso5H+I&5LW(gO!vV@CTS;8fbCGbYP!0P3Y?&U8oZ3bC^ePivbFxS2%!K#iF4nphLDCszwfM{Mb|!r2W{TYT8O~WVch*9LJc{QB+^HX04-W9%(<_aeMXC zZAuKpI%mxe*?=S>f*08}4wGua5fP!sYND@^f+k>=Bza!oD&bzT5La%agI zwYI(f7^7y!o1+Gd?aiB-;8xWym3TR(Mo8+`9Ipc$mm(EV6N$K=C(J7BExYICJmM;3 z*;=Y`72S&wy86gX)rq+`Z+b%$Xto>xoY-Aw=_S;1iVVc!1O1_S+ zBh8-0Z+X`L41ESo?pFk5R!FeNSC%uL%dAL@7Oz?QeQCTL_Qj!lhwJa6!Mb8DuPQ;%Vv;IvP|4>5BawpT=`RF~}Cev{4*+l#XJ@1N_r{sL1 zgx{p*1Dry85o+Ew?O+MNRKIS34VIFl-HhTaJ8fm-!2rg>auUllYU#zK6|`qC%|Xan<_h#4zcK zD&{Q0&Rke4X@gTIyn%|r8gZq79oDqwZ(N6&$%}g3VQlQ?8C4^cUF0MSQ&6KIWJmAL}q0fiWr&YcDJfM1$cmV&elww;*~0mshk|^^7?LA-?$3!~G3 zUzN~)3p1q}{q;;TI^UHwdPZ}g;d)jZvP$1duIPYO->Vbfd5VOPg$>DMiW{!=~gJ$x-Wcsd@ zEKG;Q_%-V`8S?s}sPp3M(;R#1bL$*;sCjC$W$2gjfN6sW1nX#u0l*#GG@*n3B{k$) zR+<`3lmIrh68dBx2q2#HG^r+Q67sFA-ey~VlLvz|GkGk`Qyfeli<{*M^UyjlcTa@| zc2L0@_Ghh7%eND<5(m5!@=|!##NgMEPK-untd>!3v(Z|$nhLflGQI-W4K-LY_P{U( zNn6<<#FJc*xxoqX4Dxt|k=2%ywsOOMdG>PQ*d&ISv19Rhabf@n=>)<)>PJvNB2maD zM!LnX^+p{IX~uj3pnB{eK&X-fOY!RCinw9l#J5feCP1z_!oev4)3o zuMKdixpHu&1aqaKEi=;Vp^*35n9fe$L*6x-q4XVsYghgBTKrPc>Oq}?AIxsFU9M4` zY6o1zXOWJn*b8K)dS$*F*|w$P{6G+@yLldnPlX|n}$%tu!B(+J%fcy z9Ttu$3;5h3&;VY=VNM8>W91))jAVBo9_v&;lbI0sKnywUOP_lFwuilVe!T0)I1$Y8 z8t+d%>)um1EQKd#B9~fUo-$hQWB8C-Wn0%$Z3m>~l14X?uwd;fPzhJ0XY36@U?s&^ zP}L!*N@26WFiNIP+VyyJ;dwYZw57j9NF z#v9kDi4*r+t#G>jNjP$Ue0t>m_{NcY1>R)m3tHU+PPyZ<8R0PwmNEr!TReiSA@F?2 zD+9(k+|i6<)E3@6M2L1|8~zv0Tw6Pp(}uZl;kDP+{F`qY@-E6lVh7cXXpw{u6Z}s# zX$S(3xWTXq+^jYaKAnHG9pN}gNbCr4>l?_RPnsW!L8cK5NI=STfq^*W6k7)315yJr z2p^CFkOBAr0}7k)ZQ?fO58|asLh3MMK_)zvFVgS z!qhgkLxLkR39ZKr{(CyHT&Ej4aYH-IP8l!=?xd7BONiRZkpYH+2*NNgmLY|Su?WVY zzcI|o%}0XKc9{j~HTEE^7n|FeZ?ldwRR9ay=j=9h#G!4XGHk?V4e6HVwy62s-@%5LLuv(L!!L&< z>aPkTn-+|tnxwH@{3*s8Pp!T$+W^#Nn(hWpvfGbq2vux_rq=^MU^gP`8Up3*qhL9H z$Qhad9_2kmo)PYH{0NU0DHGob9$f+T?;h?C#_a}^l=Xu9W47y=&mL&wvKXykB42{7 z$~}^6a?&kF>+$E+f(eBZ)7gg4!@VjoS05IPCmf% z?cP?F#a8bzDL!&(@90sN|%K|xcKq99h?D{G743g?VOo< z!J)*gchY+j*{#Q+pwkP$pS>M21&4vuq z7_P!(t&g=%Uv3E<3q2{eSWpyFupm$iJLY-kE|cS7L6o;6evji)o-!bq9q|n<84%5m z_?Iq_jFkwL@$W4e(9Vwd*_I6GXGi?KmJHUZBmRd*hFLUHMu z!kkw&wnzzd$91;Od;;s+Q0r$avoGw&9^Q;|hf_y&4S_?s;B!MXkLr6gmm*edhru!1 zH)y#qDA(_g^Lt8w3~FNGmnj& zL5o4enEKH3WwS16*IaR~W9dL-a6+}$-TBK3^=eT|{3A)j-dR(HOKZHdq$Q@J@t&}x zCFZ@6!HSA>Hr`p#7AFcx0K7X>2Mt(6Oe}BO%&5rb;-c7iQt;VJX&DY8ZgV&ga$ZGH ziL@fFXB5*SZ3`=7T^mN_LJN0bOVo{dH`1@kH1z5W4YBYLGsM!}(M<$BvVovjLL5$N zB`^v(oRlbtnIm!E+5xZza=*O!Ei6j~mz(Gqahba{H5e}9Adp-DQ_H!`<>@014%s7K zveu=j0N`ckn?=g0v&7 z*GgFq9_FG34MP>6l>X+LQcHdDY)&7E!LTDBnWA31JU{Cqd351ntYy)iBrnnlU<-*Q zjaVb73J3IR)K@@dVpJ`?9I&LH7S=y>dA@dP$*`HuICg`pu3@{4Cj0#VXYWnm?Wn4J z|2jk6d(Iut&7E>5Qs)FRk&polLjY4z2oVscr>H2(BqU*u{=~>TIz={ujBYF5qZ% z*=<F3Atx`c3VGME4%~S_sh%J}8d*#79xF_&8XP)E zPAG}HqrCKXb00p8#4)0!N&ZJHO>Q+|2AqH^510B8+MzcWI)xB3CqIhvl}m@V>uHu8 z>82?Ym1L>5OqXJ9?ixOKK@Ezpz?#S^bMirLa1Bkm0MbS3FrvP5SyU^p30vNPbdO%( z#1WpM?tl)X5?GFPxex4Q-3UMZ=mWVEI|J^<{k6#a-U*hti)`n<5=a>beXVp=`#50L z*5?tyzJw;TPt%Ku!?dEAbAx4yYmOysbv0m8u~&Z$ZO|9TspCDr% zH@gWrEPeQHUN}w#x+HG#LdR<2e{jW|_-w8dge2}pS{n?O;?)=&e*7gMDgiWNwCNVT zE;s14Lj93W>2g0vRd2wqpwvwjr$$dR>mG0+YZXsblZaX`m%wX`Ph*Yhs zQTN{*HS`4wh^J(F%g24im-^H zIr~|)3(~S3#jZ#TRHVaE5l;tQyZ=N6N~~gBinY!))P4adf@xoeM35+%jg#Sdg(FW)uFj4@Ut}3j$Hh};JG!DjU!yStx zYxydD7(4NAWH8&!3L8VTnW-&ouw=3+01!n5(m2A49{$F zlZ_cB10Z<7-OT&^m+!7?U0fTBHL8YAhK#+U0ci; z#b2L6_3?Mh!D1j}m{?G3(b&+UhALj8+Nb?#(;X^y$(9SBE4>YfCoiJJxuSu1^FX`? zLK^9ugn3)`k9jyJ8|ICnMap0v*@k&@&~pm|m$UvE<}D9iBoB{d30odx-ti9e!pG@_ zaBZTxFRtOrqW^?Vr5e80F{W*9O)<^TZ)!xVmrN@KetqVbzwu7&oWb3$QjBRz+)egV zVcNW>z_huBX=B1P0sydZXo1-?;*g6-UmzFu)NP|+7Y_((VOV%S1%!p$NDp$|LK?Rm zi>AMr>;2PLTM$od=EBA~2{uA_+QO~q%oLnAc8O_&r`lB#!Dq*>Z9=saa!0sf7=f7$ zr}Ab}nynVKL!n?XZY?G&#;rlo%Dx7{)ft1NQ-W)e1~^Hy(W`m1?BM!K%d3TB6oXsKfAu$=F7Cv=q|lGXz?7c`$If;-P3;LseeAJBX(LGyXW zBRKLpA_R+Fh#Z!eg#VDCCN!U@ioiO(loZ9#I&|qZ&0lfuuvczR#!doUXo+kOKbTh` zcvJO_CAvNQh~>bWra2$C9C*_-=hK!`hdE8NK5tntr)kc1%YiqIS9@`#aHJL?QwkV3 zW7ndcg~K^ZS@$74^8)Q!{eZ|chtt_=oU}gNMTS<$I0L=WPQKCTU0_@;2iGAu*sV_V zrJ|c#T&>sIM;7KLV2$OK9)lx)Klg;Q&bd7?yK`_|q#w>{Z_Hd`n4(H)NLPvl>tnx} z6V?+7BiYyFI2s1JJE?323~*>ZO;VLfNiV&=)oa=h)LiDA!4Sea#$(IlJ-PVtW9j2U z{FueTTK0IZre&A@KjF#Y=LT|C8K#7r zxjo3;ZsK;4yWPm`sJp$I4ST_SyAKW}Is>j@in7E0TZ604O4=LWvkx!-r0$90aEo+V zhr#XZO0b0uy21eO(R0>*9inZHTQzgApO8nf7U^$(s-bi03444pZ>*rQLEr)MSv83NUBmSGE-TX0>aoQc+u-<93WA zc8nD}Zb3L>iIWWcddNr_J_ge=QjU+^(tO&O;^YzvROua;l)yQ6bnye5tap2n9Am8P zZpO;LZo`%*lf=!dOw0D$Ffq~c%YrF@#g2aTwqkEx1~$R&d%4i7Am=aezMF$ogO*$H z9o2OrkKvFj-T_3l(3HTw&K0i#=GEN7xc0AdeIi$Vp00ayL}nNuER2Z0oHEQ(##ogT zQYFp=7Iwuuw|p$RbbaxP++g&Z^~LZgVU%(HhEYOH_;Vr*O^H=|ahDOU&_*WOMQ<;T zv^f-FofwF&dprBR@cZ4JQ!H>JZ`N@TCxcB6+wx>iiA;jkUw}+6Hhd5QK0P+=cg&bx zB5?(-@SfR>x?kAEj2GJi=Yrs@Nxd-dv1Ks*Qgp6E4K z7H8GZim~N?=nD3npexw)d|kn=7wZbPy++rGeD$Tef{ibO1%9h=K{zViVQ2U|)R8X} zd&a@2+`iP^{*2q#xLX~V_+oeaJ#L@REsllZH@UYn5jw-KaBIi8b%tN$_AFOe=PI&& zP!%63dz9TRmiL9-&0X#MM-)5KIh1sAyuI@<>0~Qlu+o)-FMFQdDf|e=06+BFqxBnD zJkv!X9k2DflJQc1_dBecnu@W|Og;Ly#Kkn_A@)1j%3E#_dt#zN?NP%c=5j@uGZ(tw z<>_w}Up7wT&TszYy}$qN&A<93Bwcx1DR$GY|MlH3 z#*vMbw}re1-~NGL{_Y!_u6!^qH$mR7sy~1HiNB2_9;x7FGC#ieTaVxIi+k=q+Ukpb zv>x(Q7Jn$!hYIZiwWUlB%F4N)Wq-w%YyacAKR)ok*8hx*4dMfM{(W61^2@*yZZ;rH zur)T1vQbAdK$PUvMq;-m?DnzbmiO3ZCVij7dwGB$eUOu`9%Y@6M@G7O@CnOER}YvG z%ScxbLYQH+kR~9WO@yZ#nmfrxbdgs*EdFE z4_WbO>`6ug1>HWQL0po3Mq?*=znU}{gy@I|dk)BSZ8Le3x)%NFeKr+0@M!XE9w%>7Z$kE8P43KIvL>Ss4g*PN@Ds>% z1`~gCXZExP<+=)do+s9u&$8%CJVfs63z5m;YZy1w{ARn0SqFv=Uev~uD6ZS; zbqxXhnR?X<`JS+{qoeFWf*&U+gIvWyLs^GlDDNj?#co^O>k?zEQn$Q6lB@%h%1tVE zS5vW#2%mg5UVIEbuC{xhwpiU{h=?=Pm!%uH3v`+iArpq; zD*7)i#^3_210|#B7SPK#>Wl!q+xt~S3Twqc-!G9 zO0g#JZzsD6{M#%eODZiRODZiRODZiR1OCmHAyP>cM*%Vh|3;ciFqBdT{6cPl-#QAz z1|UMFcnto}p{PK-&*E?lkqsAFhWlN zJH0%?JrbAQE2I#zrQJI~X28GQD1igN5F`Qr_JkBH@HY5HMfS4>)&Hv(A(%c}gP;e( z=w7WvYOhf?pD3PmR|~7CMGVw;!A~YYeWx#=Zh=x7P>J?55#Mj;esg@kjr)!9{Z{Tb z#P?gcACK=RxPOAlqk1-Tzt`@GLbH*?o|YJ>&yJfXZjoCX{TQXU6+|!#DUXHhHxND? zvot1yPPr0Yv*FHd8Lp% zhn6fdGIMj6Wn|{&PRq#5&HF8bxtUNx#U!8-n__NmIuzPg5F5ktScsR$JgW2--m{KJk-hehONl>Vma*Gh zSiR!iH-92Koi>sc^L39(S`rp+Aa63u%24jZp12nlT#@#>gG0FWugvUlJ6 z_8)CZg@owCn~iJ!>qugMrXYrTyBWw+OJY+?Tn7--Uof2fyAR@$xs9E@?;_5 zzenO(I+e)t?jJODt+CMDoXm{>GuIi+$)&Z`0Dx+}Y2zx1#|Rpdbf1xUSWEdA21KqM zk!yib?*{WTJ*D&8jq!mNWjIszw=+c(@?Lj>kJ#u2^Ex8WI}|A~adJgq9O5D(TqEJV z#nt#%G!+py=-M_Sg_12lu2~|=lbZ#x3^&%{Jso2~jR=U9rV6e5nGzE;3xjflsg`IZ z|Fc~{r0e+3&W2F6Unyu)Vo5P#UEhxIMF&%92`I#tlY|}F< zc1u$+w=Af(SmM*%G}-Ik#Bk-7lKnOAuBPht+t+)awpc9jJ#9H_+#^lJ_6xbkn~LqX zaqBe@bs6cbuY$>*mIj1D83&SwQjnNb)Yr5!fE;~Uo=fsjUzX?EY8e@xYl~$hJeT;4 z3Co!z5M|sV%CTF7lZQ6IgB$a%X(c8jBM&_->z;_Cl846Wc2EbmBoHO?s05-!9^EQg zCl)m&4<+KL_mzDl`+ADXBGDOCep=CfA5{LcFd07c zFGppzJ_L0kA_MK=?+&ibGibZ=Z zBI1TacxA?14gORCH}XWZzq9aPE80(z?3d6I5ig7{O`<(o)yt7_rT0O=*Yc_ztZWiM z5UB-hZ`0%xs>JVU;Yyf*JuP@ATOg70v%H_eQY`j<*|K8MJA(3|-p?)A@_G!l1pOG$ zk=UxR>$tjw`v_c!R=g0FS9>s@Rj0$}1Z=f5o6dB_u$XD*)H+`T_N$^vbs-G2;3eJoQu%VB-K<>D|M-SdooL?VPJcTif zr;vf9!U?d&Sw^>%H;dtkE03Nk9t4|^JPh{irAmmT>22UmP}#sufs>8#Z17UP#>H5r zFjrqw4Fsp4giP5M$HQQ}-pjx)_98zXuj_mT$6l{3wCU=+(QmBIDZ}zex;pP~%-gGA zd(iU<1-E|3dZ}2aTIC;4>yZbO&E#e?9XGTV)*{46!Ve!f(?h=UQ@OoT^%CL!83QOwsW;g{hg; z6D{sN77kK-T}romxQ)%uW}L$gyc$PHoc5;TA?sq|9bAoEMmT@x;JbocCqPM zw$3Ka2Cj8vHETBTUn4L63MyG=zp_(*aPKQMX*RZ!q33UtW0N!+SLlXK`-&4lbQov~ zEs)tFJR)_TH6Iyr($&cv{K!ZdDXOq{(!~jP70XB$C%OBo)^u^g_sKHS#R(qL*o=(| zvqEDA>*0Et+2st-w!m8sL%YLUWer5TqgJyrv^n)Tju?CLj;fn0${q|R8#Asb8>z^I zgIkgbOf2b~Tu!alQ#uc!zD%t)N9v}TkE@n1^ix-TS6p=m=il+txQ|?%!ZP6={}fOr zT-RR&OI8MX?Z`zuJ1-LG;Vy~Yku4KUR-p!%q;;S6ztzXiDL*VFuJCI_rrHpL;C@K? zcznN|`!_nsY~%JKce|C_bKUJ0ZtsqAAlqC&U@arW81bL|KU3^wr?YE@|@aA-sCy8g}i39kNM(Fo?Ce1W#(4= z-CbnHpF@k0nOr+@Mr)c}*o$m({a9DCbmzqy7<&K^m*XVbjKRPj7?hu4LL zP66G{Nl?;?*&fKYrlJMS5^&hfTBZYLxC|7ZA;F0*-hy`U8Pgh3yCxr;47E#raP~)% zvQ9E0MFOnhU40*#wA}|UCw~c_i`qb<{fqs5KxJ~foADqFj8fx)QR~?U8z#sdY{myg z1g2{E+ku}(AHhdd}+pJsX zX0uVZ$d9sVZqU68GcvAQx6R=RkjeJV0x8`xQ#Z)^m6vJ7VF<_F#LE=^j0DPqNjDT) ztOB%(e;o>m!ilJXHx+23gy8L}^PNXCv1 zT3JSh?2Dl{JGzr8oi8qPZ7Y4oj-ICp&Xsx+#Y%dvO&?3 zGiB4(CsjOEF*IzO(sHml1?Ta)t>8Rfks24UtBmg4&rS@&0|w^d-6=0X_TxAgK-dW% zo(eZQNFdt-H@Zz^B;&JsCJYL~;C4H|N5{xO8HJOQFxh~Bf^r5|=&vEF^3Z?OW^sKa zFJZ`SCeW4(y1T{pZqQoio}f(y`G>jJfj;Ixd9bcq<-N;wo4j|~J+U+IHefuIuO6iI zu6%WbjS}2??=RrxZ&5YE8w&2+g&$k6mdzaPq_Ud|)p@#ZENEZ;ocz@VcIj~4P++?A zjqyVDETx~!SJ|P@8Qyt!KI`LlKI@$P-aLDt$bT$P_(!gL@@(7XI#DmUz52Hls(~uv zIOpf-0e~lbG^ei=s&jQ^Ku*^6oOnu3ZD6pWCq6?UM?j5HCf4rXPcCq)_O zY3NHjbY_nAAE1&=d-#C&<5GIO%5Fj&R92L#D>>AdH*`*dom#h8vRx-T^O8+2>}XV$ zWZ`s6=P@P#2FGLywTE~jveTtKI9?Bz2giq->*?O5*~+W1J!&G|w8xP^UNDcnGHz3; z_LO?J#^HdGmvkslUoc;VYOrVXVX))F8`=ZnN_x#_H_W6SjsRnuVQC#_bGajmgnup; z%4R8eDnH2~fCFZCj08w%FeQ{fxZIQX3i6gKNKJ8@%UrzP!9;1W`~6$ zA^?xba}su$op_QPTr^`slYk0rlCfyUj5buy<78r13!*G!_qKNB^EnjHR*O4>)uP&j z7W9ZHI=|J2C$tZXtM>8h4A#fBTPNO1yM;XNwcCPgh^vYpGUsy{E-( z6x-gS4PtZHQ>+__pdJ?5`yVfre(ho*0PjjeT5 zGsg`A9T(<*+;CY523%5(CTtIV<$>~*G{K@nEoa1|V(zwTIt?Rc|0~f~i6Q zN00?rhn*}QE$+NFdn9Ed>{eJr)z^Tl=2DhWS%9TyM5!hLmdX2+gz9M~ZS7zeE36K+ z63qNKoJ?{OmyYSGjY4B}P}TT&uIh!|)x`?6*cXg~x_zAHEg@H18@p;O6dk}yR7raU zi7s-3u29g;+A~Oylj{& z)9YC!bV^1Rv!C%2JPENogxKugXNeI4?Yji)Lr<{;SG^SlreTcNE`ENx^tvGW9D?kL zKST=6-=0zfM->8TnmBOs-*Jd;i*Z*+2C{Z4nAkCer29?$NB>``^ZoIxW;?>vo!5t+ zzVn2v*oP1%e22J>YT$a5U9OL|py$E?B;WcXILGwZW7bWuZyt(ily>=;&&6;{U@6m8 zCs}w(*A5~Jv5I>Hw z=&C!#C3IWC1{sbA57fWiug%sF!YugJxeV8Axb-!#j&Qcnp|N20!rYB5)mf;0OKy8# zFv}_V#$ndybFddPj?iTFpa+0KP6BbSwHYg+FEa=_L<~3rFkm-vQBgI^Fs;lY zHYFb?KIIzZhS?A@nP+ZyTTvt-y?t;M7sGXxXh_Eun%0mI;`u$8`=9i^?<5 za5bj4>IRaq3=GnxtO)j0CyL(hL06?8V+cyPA?XfjQBxSzJ}Q$hJ2OB}*l|iHheiwP zgm+jI^sMYWjPHOZ?9k)IpvTMwd`T+=wX%wEAya4s_obnNS{p+v0ufg{n-~N$MgRjf zfjP6lBf82rVETl7wZ4-(HIR(EV(w5{MF7sIE7rFP!(;LsLWT(sm4=?Ksm-WdtGF8W zE^X*@?GmP017}zRDFUL!d5tAzUsReJhh_(Lu}#)J$jx5?pQc17b)CtiuJx&FJ&mrh z{){3oT9*Wr4DhXQN#38{w^2a$^j)im&wQ>-**BqE66zsAi@72dqOu-OV~MPoAPu8G zTP(U0Y>y)TAk>0ca5TZ5=LKc74s)v`M$I_rQt`&eY&w-{fnn6FWXjEs4*zXoPJMP` zLd_1DP}DR=*fvLYm`|fq%qLe<^Lz>>&8NU{n%&t?J*(;+&C_bBn^t6kP06eZ_L)^P z0=~DuSvA8tYIgF2n25~XPR=XFTwMwdTG_djSX2<~qrn=;ZJmlb6WU7`^6NBdJApz; z$52?~pv>agAi&FV#G@LFgW{o<#o`W5a$Z1KUG=OP%aA6VGY zCZkri*3Q;M?+F$q6J1RlWhrrlffqFEnf{PVzGual@2o3VcOkATUync7kJ|+M3!d8>vMaDGpK4 zNR2X5v(3Lm{ZEEUUcr6oP%)$l%w5g6GR7mt=uUp*4zU+kmX1{XmKr%LMkiotja2X` zS~nJq)-_ZF0I{J`yzrRvqKMvy@&+>+1U3k2F%`DX!9>DNB5Rtm8Gf=eA)ztnMgUF% zk3n7IwbHRB#6Khh=z(I^FcXEvH$jx7{eyKPcHT;zcpDS7wi7!Sf)PEdMH+&#&0C0^ zXh}TjjP;;X!CXDml$ioq9N2>@@{<=-<1vJ-R4WkZ#1(J#RV#6$;oG1!(uyzz+rwX@ zrPF+?^^v1b@JuCV7}Jdwan!M*OrO?jJ*od)t{+ zu(8C(JQ@{$nYJRen}V~Q!|nm_$-ycYSByvKB8kF9^kA`cly#1imy+_6rC3RMdnu!&T;XSI3TV}I>VOmi zHgK zxgRu>CR3`301fGS;`Y+F{BrtXTDIlKaaUZakf-wlWieFuF4)@FU6)@2HNKmfw-!9;-399epZ_gbIS9XltBB8z0fq* zidXDZpkZa*C88CkZ#VVvU9r9$J$%(LFxJP{QHi3UM{yM^>`^lxzoH1*p={06FQSyT z5QKO}ZPdQ`Oda$xlTwWfz51WtfTL;IJ99E?I{mPOoWzb*!|p~I z=|fq*G-qYi0_>X99F)0IJs~>kd@jUmo5O|hZ3l9JTnAiEKOA-C%-}^*RjSX07aUGJ z^_hzM{1Ps+bm$0nHsY_I#Fc1pCvf5H1vjQT@a9}l?Ix+@kArJG^mbaHJjPI1?{gJF0PJu*{BcoT=D# z_p2bmVIR=-EOrLyN_@Fpx)M+IVO=@NY`3m3FC55awheICIy*V=%XaRWM90xq?wMlt9@mvvqI-39 zpa{^pc93FrRk*B_BhyT*L50_FL1jCkqLI`g{W)~2J0V-dKNK98-&unn>zj}U*DXjzZ12P8&w&cU z9;>8S?Dj*p=v#cu2sJPm?}lDJy|=pKH}DnpaYAz z&kDiyei^>nUkG9E2sa>&yd??K*5K%gGU2#i z%WFTY2$q62F^n7pxUNYD`Z3RNWf@?SchQ z%}79ha4#4NxNa}_L4S1dcZ&UWgFylTDgWe3r_e!k8e?q=4ELJ#n5kC?dc~vnN<|4s zw-x-@kkby~?~tPi;vrR=yT2wq5G1dS>&8sp_I!Oc0P6@hXEN~;snN=i{ciCT>58n-b3SO-4Qrv6>KqcN zp!c}vLI%npGqcZ1X*P8{3vUPEu}v64a#t(PJlKX8RKIO>sMwS)1r;VlwL*lazLv0+ z9(6@O_+D|&v|*dtj`jsIdcQrI{{7-X_2Hx|!%0_$d7O4-DCx?ux-yh>#VRl&a96H6 z)UF4vOX8m(4W%08`8uMJdhUvgJHr+egWjIh>Xg$!SiHid92|`+Cy#Acj$%qQ71JRv zIyb>}ZBG29m@PI_G^ke_b{x0$GsloM_p|QC%(_xkqq%dY&7?6fLwv=aX_+vyC(jxj zx{QEu{94#3ctYHq2i%wsCv1Aso~}aC69v>_R2yF5BD_clt66|GVF{;|^g7|K&0RoC zO+z85WX)kq*qVjloF4*_js6XgttdRUdKE3C@~GhgkuDutxo$Dw`E_s$ zGAK8?V3npF$P~bm*J#((Ne>$Z=H!>h)z{t5E9%em-{DSN!iA-4E^xbx-(13CuHfC) zhvb7gKt6mJ-e3qV)KIMX>!qnf>U(ckO-@D_Qc%4*t1q*2O>NlJKMe9V*K<|FlZ~mj zoNVguWAT6pKK8MD$#)++a82dQxu^LkgPZy0Vd$Cp=)FxJ-I@C1mBNSOkFxxvJ&Z2@ zVR3*1ANUfH`7*VsvM|OT$c$(0BWrIl!3bC$r+R2hIgo7y^Bj=*I3c-`-tih>n(luk zhJUGL zgIh;{yiPGlBJ2lh9q}-roF+Ov47?H?FRPC&>~SV619{?Cn1yNH2J*zOFbUGUaq`6L zVA)RdXp8YM06fjZJKA^{w|vCww-jDDGovT7MPJ(^b`_}XtrYIz%Hp3c{Tm^6;$dI` z=%`fynai*xfjEzZE18pJQ5I!66a=}pwAk`BNf5!9pSUNtEQde2HD@c$*#NKvW?hWi zKDlRt^)tB>+d<@xt{o-!|DSH=s=yqEL*g*ti~K=Qnv;b-RZ zJxNJ6bmL-cknk?!!U(>R3vQL`xZrkl5tlQU=GO-Pt(Z~@P3}^nc+cFaq;85j=h$hy zP=oz}-`>BwRIe7gUMKVPrtD9z`E{oez4c_1ka{lthpPQatH9DFFnFr5^+Vq@T0A*hlIqq@OONAAU{JPluv3^@ktlR1|L& zq`f+jNIxuA9Zu@e`FnDea>7rYJ)eN&uPgjKT;QBFy0=@x52t~y)tPmrz)lL4-~$N; zbM+jzNd!BCUz3=#t03{FpH~I(3#v6!tle4-#Qj$V6*|W83^e^oi`rfbb8k@T!)$P- zGl*=Kk{CQ9Ml8T;QI!!^dv`exsCody69fa;_jn0k5?5p6U!2AUh;j?V$T!ANeTzs} zxO47dvME+htPR;IDuZOZ!{-OMa}la#pzK$5dxN)6MDqHB0pI}@srJ@! zlkN=qp>-r3OV=BA9}km>Nulzvt>0uQ(7sqJnn9P{wJqi$DHz|WS#2kdRNj}bf%8~Y zgI-}QXX2P?V`V!!zka46SX(mozI0qP>(OG@YUEoT!K?t+p$_gQb$n;OoyK=ohl2{Q zjq!OPg@o-OP~lSsgBdXl5WtPt$31WAH(rH#X`}mt;poOkiCAns?oE3r=C<&=nmNVnDytrNl<`p5MNpXH!87+Pgr?$+&^pnC)pI}i8zOyn|135-CnMA_YBdx6?oWlzCeLa;B~Q#@b+bV|+7>#6FoHuvgW ztNg{6fI|jzdZT?vz0t;B6o*IDeJSb8fkohgpWAyATa0VH(H(n=LrZCKTwBS?8Nf7| z;UgB&2>{1sWpxo#61eYz?|?^%cK#7&hWSQ0wliSeA2L=Ad~62$T${@VdP&|f=wazn z(0f**q$jp#K86v_02zqkCfWosb0s~@`cHG5`-e|OL`H6-ox zKvG|AhU7pD$+|%jt)xLxRJ8#~YER+7#8F!e3PK0Hz)%fHq3N*E0T++8MZvt0?4$** zVg+Rb{Ucs$@LLGq;*-j7e|6Zza+Sj<+wje>9rv2c42sQWj~V&bn#@I^Ka)8oVnaH6 zHorW&{n29Qlv7(w-v9TeHXP2MIklq`9xHau_`fsSIduQu84ZCoa`|*KnpJ+%jBZS5 zR=~DZ(CvYs#(A#HdsE3V{oeo!sgv-;$MoZ4*2_fi#i_Om2@U$?T?+vgCfAJcAy&f! z#3|9Fe#elZ7`K!-rGCnD`dDwBH4ffoNHVn1U=A}r(OPhc*cqC#iiWhUx|jxW{3b6# z7{Xmw?(o9-;rb0bob9+TY!ml~8$RWA$Y-BCg2wC(_zC(#CApJFD!+#cb_EB>a>*&t z=q2jTv$jAow~l>4I?j_r*4NeAFdM*>jPRnA7eT2y(jGr!*>XpI(s^}=S2>Owwiw?S zzAL9O_aEiQ*gs1D#;B6lAj&k83vLlL`Sx|yc@T_<>8Y&IQ&_5#m5-+k3}(LC)d97& zCIKW>qC!ygpl!9>#pr~}v9nR-`eEsLPH%fxpV(=~7pfx4O{zh1GVNfLF+O(TN`odc zZgN*JbfWl3^$8UywevEf7R~2G&SIcrIcwAOY=lC}X47J^w#a#<)sV>Wsx$wefHhnE z949*Joh2k{y*gJepgy4z&Qn2s(HcxEOE^+5SR&^z{J(*?N&^4dFdbnKmW19(C^6YV zeNtyjK^%F%#|1G%?cVPZk12(M7NT;4$82lx zm~+Lxz+;wmg~x2eWMNFEnCV`}WcKKGP0%w^ouh{^nW*F$@CK9F#`nZz5)VQ6R~GBj zX$FGYyh*IjLcECJIOj70B9hb;o41gK#BtW=8P7w{+c<>~+CV4R%!EI7uP}OpPwAtc-gkCXKHq;aoSqb2YvOEm~|$*a=rz~9RK5WmjZ>`3kfbBztIwT;xY;Ax#xI7M6R;?Lqy9JGx< zrDltCjiBwTXl|B*;S*WZI_k2u1hsJUm8?~Aky-@#vcw=y2lPKguYye4Oz)sDOHR@n z2))x@8opMWjau2=&F5?LSJmdkR1Oo33V>VP@!iaX%GDdn0Y|0gFtvC&rE&|OlFH5e zOQ~Gl$lOy=xy64ul{?l^xr2a#&43J*s~eg7e~-$&*d}gfW~q_SoXV-RsGPjm{|l+y zvGK(EbEur&%~H9=qH-+5qH>G>I#lkU|6fr#o!9y2QaQcbOy%Hcrl4{ah!xzG2pq9g zko0T)4H8$GMB*x9)uoObhVK3`x6;_UVX=CZYPYPn-F1klc)f0M-VizEL#Mew-KuOb z(${!@4ODIz?_fKJbVe{OSb}QYV@m*$9xz?NQL;S?u2SCV@E~HTb4Et_2(m!9=N&N> zMNDuBs3`tHb>sn@h(u#?F2%)oAlxM3fTt!ys7)iBrCxBRNGPtfxVVm@jl=~>FK>xo zhHwr9LFiTfGZ$3pV!(D3Q^;e%RG&&=CtV~PeX!(-@M^Tc5+jJKfs7*e?swT$9qR~! zrKsR_rMw`758D%#j*V1!>+SXV<`6&lTqe$d#m25k?@#cO7Wf~o8(P?x%ym6M3Z(MY zyb^aXj<-Jl)s-=%)x9eqN{yUbP)Nh2+gAc{=xC|)0e5KgbkSLvrD`BXg;5Fy^_pb4Y#^0u5Kih_G-X;Sa7ax;W~&%ovwH+uIDPp zwQ=^*pf(J8apv^{VonAl3owtg!9}CU)1EvSknZCzCFTy?C?7(QtCpQ~CHdrHx|=wX z^azj9ddd9)^6~oSphnUIzP4n-;L#(M$ic zc;HK?E@_pZD3{)R>JnBL)*tzxs)XzewvOZS6%0l@|FbwY)@BXL39+Uq()P#V*tsgg z&Cj7P(_!=wrV~y^ju078$}E;b(=jyLb}tsM%h$%V zP8-6aPZWwFJBuBSQ>MtZMYC+8f$FLqI}|VO4cTDG_}nU{V3{Zi7Y9SekE*zwYlbDF zrn13BNTj? zW&zs~gRM$S80!S-9BktT_9scI7b%RD(5Vz=?EvTr@tQy#~0VS*T~j~1|pD{ zTL9o<_}8wU21|z4qEj+ysV1k7&S<#cA6u7nrtcbmT>|1$$Y~f@)H*OH9j(fwc`?`+ zEk*Vbu&rkGjG;{jtD+}k8mu-m)0~P|S}doT)n+UhgP3bHoXl)tf?{+A=E>Mu*j}%S z%q?$JN{`vtsWf{#q3>hYz286JjLCwseI40M-)xr6q<@$^FOng1{00=>=7mb8^Md(+ zedmSoC^0PvUPn3ihLmRvw4|>QQ84F%DhUi?#xZvSjSR5DIDiW_I5#3T+eJgZKY|}i zd$2^t*8ynXl4@tXHuNrJ1vUq&UKVF5pg=jNIb#bIkJ>{2l+JvJMoHtP$9%gxDO0vG zNN);HJRJ0|sa0%AXD@nuWy%dP^XlLYe!Wsx*@iyMn6#Wo%y`bBWm&Vbv!BNt$EV_5 z!ZPGHR9o89s?}W1D@dBXV7fR1DMV|Ua>6B926)eePC1G|D6EiJGYz7weDz8!l0xS6 z4#7<5ECqtTxE6di<2vF-tGL>F04QjvHsb*|yeh@4K~Jt0 z$lz->NRg`fMl~CAtLuD)2f5}4o1D85NYI?WIms_H=iiXz7n}1Zl6;_^ewcMK93N-r z&`@~8xXze^+Y5K?Bx80s{$T7LUIH8FE^Cwo@RnGSZ(N9xSB!N z$gpo!3qG8wDZ+3?GdBX(Nus}NGsM*j%Ix?^uBzAAN}#}zbV`<)9!tV5kZnnI&~c!Z zuBck_`|DC_);f)}K?85y!RvA^4!3-Ghi6!^C7)j&E(Afz!@n7KZ1|#lWqrPeH>?#C zpSdNkPSA7nqTuX$M}l_|PE`MeKbmGWpy>>E-3b4jiz@){gO2F4CI7%Wwd^8RALJUa zymj1#Q;A(yrhK23keA(CFgSo;Oi|nznH1)B_w7-g7Qr&A z-$@-*ikE;f3(05Lzm+WjJz~z<2=F-@Z~H9Pm3RU$@ihYd%)k`Kz>frbq%U{KQm?g5 z!k2xJM3@w#P@m01H}7mRLsty%hg`59 z<=4%%${2ER1xgL26VE|OSq#7+RpnlYKGx>fqHS${um0()_i43sHW@32+{25<3W1Lm zDDks{wVwk64-mLM;bVUAw85hzKpC)6PGiDiU6;W3n?uF=0@#&$rps4rf1c?s%pL`% za!r?6YT8q{rmNzqT+_h;?GLH2jVJLOm%E5-F!Mu%Qch^hv3iFEL2KRD!;IjgELML; z92f-@30t^kaxIlEScxm^tG765dDVq8T0&-uXh1uLi}ku;2aRekuu8iRTTKx zYs@JPMqQ1@Z4`xwe>N48CT#b8(DjX!-2Q%J~U5pBj8fC?^S^8hR+u`w7z-tEG}BCdLRz=7zj zs4}t*@K!K@-M4h@=Qb?YpYO~;=^FyQhQ~n>~AU=^cs;h>)uf8&MQHw91P*2 z1|^}Yy7n_!ZP+3AUz?=b$+ZP-W=Is*Lxr_5sfeZrW3oUFh1f>(T(Bl%jpSxJCcxex zfafk%2WfDZ*cZ4=b`i;@Tm|G3GMqzLZ8+t1Obg%d9OlqmU^#Vc6Le1cDW&4FZLS)` z?KmSgL=QWf+9n*(V$E!0Ksup~49H*|mK1V1BIbb=sEm|oYA5NE#yI;c(LtpHuO6z{ ziDt4M!dk6PpD2^{7y~!8$+|3)H9{gw-gHdX6cm(j@8cj7Xf-x#WMH#d|1KwzUkT<( zB~vl0HQFYmha4%4*7K-h3AY%nWkg_hED`f4qjj5{klZtU4BkQOvn^nbRh5Fr2F9_@ z>QYc&5_G{v0s#P(iK7&{hoi$E(TELAEuhc7Rl3b2XoUztFTQ@$WFE-`u(|ljc%{h%cInWw|{t z_1A)KZNXfbhX!S_9+btp2Q<~QS{dNiz!%)=f#M*>YVy64E&(!V+>kB7ac3I__px6$ z48%-T4A`-icy}F>pj%dJAkVOF@lLGiise`>&~aPN3A2j*PY;}t*dsB8c-rlFNUTWs zn>tNQ-z4!AJw5N5s4_!reY1SZd`R>*eR|UE{4aeI5aoh#`{%RJjdIw&Wt$nNGop zn~Rz0n$Rkl3aE+k(15c)<6*aUBF93j_-`4VhlBYe)fo=@Pie%hIq25}efI%G&1NI+ zh(RAm6U4z7_-JC-L}C&aj8_7EgJfCIAFg%_`UtJkn#Cy_TvHAV)9<1aHcah;b_r?_ zL%(d!`_*Fwiem+R>DW9sBxnr!zyqh)!8<|kK$PP&UsFZwb5m8RX2+T}e4MpLYJ=eg zo~K6V@yLTOH3u`juQ%v>%|tFYw#t)AN>yu zHJ-wVJ8?Q7RTeMM(r^=EMB+tZ$Qf{lc$t~3oxZ(ttsGnb2MO$ZphcA7uPcEmsCLbh$V+_!MB~!kwuI`)qHr9