From 8d1dad7f32313db059a8420fabc5bd11a3c84b48 Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 12 Aug 2024 14:38:21 +0200 Subject: [PATCH 01/11] WIP: ibc_transfers and ibc_rate_limit tests --- crates/tests/src/e2e/ibc_tests.rs | 1789 +++++--------------------- crates/tests/src/e2e/ledger_tests.rs | 2 +- 2 files changed, 316 insertions(+), 1475 deletions(-) diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index 0c1abdac72..89f766a8a0 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -17,189 +17,70 @@ use std::path::{Path, PathBuf}; use color_eyre::eyre::Result; use eyre::eyre; use namada_apps_lib::cli::context::ENV_VAR_CHAIN_ID; -use namada_apps_lib::client::rpc::{ - query_pos_parameters, query_storage_value, query_storage_value_bytes, -}; -use namada_apps_lib::client::utils::id_from_pk; +use namada_apps_lib::client::rpc::query_storage_value_bytes; use namada_apps_lib::config::genesis::{chain, templates}; use namada_apps_lib::config::utils::set_port; use namada_apps_lib::config::{ethereum_bridge, TendermintMode}; -use namada_apps_lib::facade::tendermint::block::Header as TmHeader; use namada_apps_lib::facade::tendermint::merkle::proof::ProofOps as TmProof; use namada_apps_lib::facade::tendermint_rpc::{Client, HttpClient, Url}; use namada_core::string_encoding::StringEncoded; -use namada_sdk::address::{Address, InternalAddress, MASP}; -use namada_sdk::events::extend::ReadFromEventAttributes; +use namada_sdk::address::{Address, MASP}; use namada_sdk::governance::cli::onchain::PgfFunding; use namada_sdk::governance::pgf::ADDRESS as PGF_ADDRESS; use namada_sdk::governance::storage::proposal::{PGFIbcTarget, PGFTarget}; -use namada_sdk::ibc::apps::transfer::types::VERSION as ICS20_VERSION; use namada_sdk::ibc::clients::tendermint::client_state::ClientState as TmClientState; -use namada_sdk::ibc::clients::tendermint::consensus_state::ConsensusState as TmConsensusState; -use namada_sdk::ibc::clients::tendermint::types::{ - AllowUpdate, ClientState as TmClientStateType, Header as IbcTmHeader, - TrustThreshold, -}; -use namada_sdk::ibc::core::channel::types::channel::Order as ChanOrder; -use namada_sdk::ibc::core::channel::types::msgs::{ - MsgAcknowledgement, MsgChannelOpenAck, MsgChannelOpenConfirm, - MsgChannelOpenInit, MsgChannelOpenTry, MsgRecvPacket as IbcMsgRecvPacket, - MsgTimeout as IbcMsgTimeout, -}; -use namada_sdk::ibc::core::channel::types::packet::Packet; -use namada_sdk::ibc::core::channel::types::Version as ChanVersion; use namada_sdk::ibc::core::client::context::client_state::ClientStateCommon; -use namada_sdk::ibc::core::client::types::msgs::{ - MsgCreateClient, MsgUpdateClient, -}; use namada_sdk::ibc::core::client::types::Height; -use namada_sdk::ibc::core::commitment_types::commitment::{ - CommitmentPrefix, CommitmentProofBytes, -}; +use namada_sdk::ibc::core::commitment_types::commitment::CommitmentProofBytes; use namada_sdk::ibc::core::commitment_types::merkle::MerkleProof; -use namada_sdk::ibc::core::connection::types::msgs::{ - MsgConnectionOpenAck, MsgConnectionOpenConfirm, MsgConnectionOpenInit, - MsgConnectionOpenTry, -}; -use namada_sdk::ibc::core::connection::types::version::Version as ConnVersion; -use namada_sdk::ibc::core::connection::types::Counterparty as ConnCounterparty; use namada_sdk::ibc::core::host::types::identifiers::{ - ChainId, ChannelId, ClientId, ConnectionId, PortId, + ChannelId, ClientId, PortId, }; -use namada_sdk::ibc::event::IbcEventType; use namada_sdk::ibc::primitives::proto::Any; -use namada_sdk::ibc::primitives::{Signer, ToProto}; use namada_sdk::ibc::storage::*; -use namada_sdk::ibc::{event as ibc_events, COMMITMENT_PREFIX}; -use namada_sdk::key::PublicKey; +use namada_sdk::ibc::trace::ibc_token; use namada_sdk::masp::fs::FsShieldedUtils; use namada_sdk::masp::PaymentAddress; -use namada_sdk::parameters::{storage as param_storage, EpochDuration}; -use namada_sdk::queries::RPC; -use namada_sdk::state::ics23_specs::ibc_proof_specs; -use namada_sdk::state::Sha256Hasher; use namada_sdk::storage::{BlockHeight, Epoch, Key}; -use namada_sdk::tendermint::abci::Event as AbciEvent; -use namada_sdk::tendermint::block::Height as TmHeight; use namada_sdk::token::Amount; use namada_test_utils::TestWasms; use prost::Message; use setup::constants::*; use sha2::{Digest, Sha256}; -use tendermint_light_client::components::io::{Io, ProdIo as TmLightClientIo}; use crate::e2e::helpers::{ epochs_per_year_from_min_duration, find_address, find_gaia_address, get_actor_rpc, get_epoch, get_established_addr_from_pregenesis, get_validator_pk, wait_for_wasm_pre_compile, }; -use crate::e2e::ledger_tests::{prepare_proposal_data, write_json_file}; -use crate::e2e::setup::{ - self, apply_use_device, ensure_hot_addr, ensure_hot_key, run_gaia_cmd, - run_hermes_cmd, set_ethereum_bridge_mode, setup_gaia, setup_hermes, sleep, - Bin, NamadaCmd, Test, Who, +use crate::e2e::ledger_tests::{ + prepare_proposal_data, start_namada_ledger_node_wait_wasm, write_json_file, }; -use crate::strings::{ - LEDGER_STARTED, TX_APPLIED_SUCCESS, TX_FAILED, VALIDATOR_NODE, +use crate::e2e::setup::{ + self, apply_use_device, run_gaia_cmd, run_hermes_cmd, + set_ethereum_bridge_mode, setup_gaia, setup_hermes, sleep, Bin, NamadaCmd, + Test, Who, }; +use crate::strings::{LEDGER_STARTED, TX_APPLIED_SUCCESS, VALIDATOR_NODE}; use crate::{run, run_as}; const IBC_REFUND_TARGET_ALIAS: &str = "ibc-refund-target"; +/// IBC transfer tests: +/// 1. Transparent transfers +/// - Namada -> Gaia -> Namada +/// - Gaia -> Namada -> Gaia +/// 2. Shielding transfers +/// - Gaia -> Namada -> (shielded transfer) -> Namada -> Gaia +/// 3. Shielding transfer the received token back to a shielded account on +/// Namada +/// 4. Refunding when transfer failure +/// - Ack with an error (invalid receiver) +/// - Timeout +/// - when unshielding transfer failure #[test] -fn run_ledger_ibc() -> Result<()> { - let update_genesis = - |mut genesis: templates::All, base_dir: &_| { - genesis.parameters.parameters.epochs_per_year = - epochs_per_year_from_min_duration(1800); - genesis.parameters.ibc_params.default_mint_limit = - Amount::max_signed(); - genesis - .parameters - .ibc_params - .default_per_epoch_throughput_limit = Amount::max_signed(); - setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) - }; - let (ledger_a, ledger_b, test_a, test_b) = run_two_nets(update_genesis)?; - let _bg_ledger_a = ledger_a.background(); - let _bg_ledger_b = ledger_b.background(); - - let (client_id_a, client_id_b) = create_client(&test_a, &test_b)?; - - let (conn_id_a, conn_id_b) = - connection_handshake(&test_a, &test_b, &client_id_a, &client_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( - &test_a, - &test_b, - &client_id_a, - &client_id_b, - &port_id_a, - &channel_id_a, - )?; - check_balances(&port_id_b, &channel_id_b, &test_a, &test_b)?; - - // Try invalid transfers and they will fail - try_invalid_transfers(&test_a, &test_b, &port_id_a, &channel_id_a)?; - - // Transfer 50000 received over IBC on Chain B - let token = format!("{port_id_b}/{channel_id_b}/nam"); - transfer_on_chain( - &test_b, - "transparent-transfer", - BERTHA, - ALBERT, - token, - 50_000_000_000, - BERTHA_KEY, - )?; - 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 - transfer_back( - &test_a, - &test_b, - &client_id_a, - &client_id_b, - &port_id_b, - &channel_id_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_id_a, - &channel_id_a, - )?; - // The balance should not be changed - check_balances_after_back(&port_id_b, &channel_id_b, &test_a, &test_b)?; - - // Shielded transfers are tested with Hermes - - // Skip tests for closing a channel and timeout_on_close since the transfer - // channel cannot be closed - - Ok(()) -} - -#[test] -fn run_ledger_ibc_with_hermes() -> Result<()> { - let update_genesis = +fn ibc_transfers() -> Result<()> { + let mut update_genesis = |mut genesis: templates::All, base_dir: &_| { genesis.parameters.parameters.epochs_per_year = epochs_per_year_from_min_duration(1800); @@ -211,209 +92,19 @@ fn run_ledger_ibc_with_hermes() -> Result<()> { .default_per_epoch_throughput_limit = Amount::max_signed(); setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) }; - let (ledger_a, ledger_b, test_a, test_b) = run_two_nets(update_genesis)?; - let _bg_ledger_a = ledger_a.background(); - let _bg_ledger_b = ledger_b.background(); - - setup_hermes(&test_a, &test_b)?; - let port_id_a = "transfer".parse().unwrap(); - let port_id_b = "transfer".parse().unwrap(); - let (channel_id_a, channel_id_b) = - create_channel_with_hermes(&test_a, &test_b)?; - - // Start relaying - let hermes = run_hermes(&test_a)?; - let bg_hermes = hermes.background(); - - // Transfer 100000 from the normal account on Chain A to Chain B - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - let receiver = find_address(&test_b, BERTHA)?; - transfer( - &test_a, - ALBERT, - receiver.to_string(), - NAM, - 100000.0, - Some(ALBERT_KEY), - &port_id_a, - &channel_id_a, - None, - None, - None, - false, - )?; - wait_for_packet_relay(&port_id_a, &channel_id_a, &test_a)?; - check_balances(&port_id_b, &channel_id_b, &test_a, &test_b)?; - - // Transfer 50000 received over IBC on Chain B - let token = format!("{port_id_b}/{channel_id_b}/nam"); - transfer_on_chain( - &test_b, - "transparent-transfer", - BERTHA, - ALBERT, - token, - 50_000_000_000, - BERTHA_KEY, - )?; - 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 - std::env::set_var(ENV_VAR_CHAIN_ID, test_a.net.chain_id.to_string()); - let receiver = find_address(&test_a, ALBERT)?; - // Chain A was the source for the sent token - let ibc_denom = format!("{port_id_b}/{channel_id_b}/nam"); - // Send a token from Chain B - transfer( - &test_b, - BERTHA, - receiver.to_string(), - ibc_denom, - 50_000_000_000.0, - Some(BERTHA_KEY), - &port_id_b, - &channel_id_b, - None, - None, - None, - false, - )?; - wait_for_packet_relay(&port_id_a, &channel_id_a, &test_a)?; - check_balances_after_back(&port_id_b, &channel_id_b, &test_a, &test_b)?; - - // Send a token to the shielded address on Chain A - transfer_on_chain( - &test_a, - "shield", - ALBERT, - AA_PAYMENT_ADDRESS, - BTC, - 100, - ALBERT_KEY, - )?; - // Send some token for masp fee payment - transfer_on_chain( - &test_a, - "shield", - ALBERT, - AA_PAYMENT_ADDRESS, - NAM, - 10_000, - ALBERT_KEY, - )?; - shielded_sync(&test_a, AA_VIEWING_KEY)?; - // Shieded transfer from Chain A to Chain B - std::env::set_var(ENV_VAR_CHAIN_ID, test_a.net.chain_id.to_string()); - let token_addr = find_address(&test_a, BTC)?.to_string(); - let shielding_data_path = gen_ibc_shielding_data( - &test_b, - AB_PAYMENT_ADDRESS, - &token_addr, - 1_000_000_000, - &port_id_b, - &channel_id_b, - )?; - transfer( - &test_a, - A_SPENDING_KEY, - AB_PAYMENT_ADDRESS, - BTC, - 10.0, - None, - &port_id_a, - &channel_id_a, - None, - Some(shielding_data_path), - None, - false, - )?; - wait_for_packet_relay(&port_id_a, &channel_id_a, &test_a)?; - check_shielded_balances(&port_id_b, &channel_id_b, &test_a, &test_b)?; - - // Shielded transfer to an invalid receiver address (refund) - transfer( - &test_a, - A_SPENDING_KEY, - "invalid_receiver", - BTC, - 10.0, - Some(ALBERT_KEY), - &port_id_a, - &channel_id_a, - None, - None, - None, - false, - )?; - wait_for_packet_relay(&port_id_a, &channel_id_a, &test_a)?; - // Check the balance of the source shielded account - check_balance(&test_a, AA_VIEWING_KEY, BTC, 80)?; - // Check the refund - check_balance(&test_a, IBC_REFUND_TARGET_ALIAS, BTC, 10)?; - - // Stop Hermes for timeout test - let mut hermes = bg_hermes.foreground(); - hermes.interrupt()?; + let test = setup::network(&mut update_genesis, None)?; - // Send transfer will be timed out (refund) - let shielding_data_path = gen_ibc_shielding_data( - &test_b, - AB_PAYMENT_ADDRESS, - token_addr, - 1_000_000_000, - &port_id_b, - &channel_id_b, - )?; - transfer( - &test_a, - A_SPENDING_KEY, - AB_PAYMENT_ADDRESS, - BTC, - 10.0, - Some(ALBERT_KEY), - &port_id_a, - &channel_id_a, - Some(Duration::new(10, 0)), - Some(shielding_data_path), + set_ethereum_bridge_mode( + &test, + &test.net.chain_id, + Who::Validator(0), + ethereum_bridge::ledger::Mode::Off, None, - false, - )?; - // wait for the timeout - sleep(10); - - // Restart relaying - let hermes = run_hermes(&test_a)?; - let _bg_hermes = hermes.background(); - - wait_for_packet_relay(&port_id_a, &channel_id_a, &test_a)?; - // Check the balance of the source shielded account - check_balance(&test_a, AA_VIEWING_KEY, BTC, 70)?; - // Check the refund - check_balance(&test_a, IBC_REFUND_TARGET_ALIAS, BTC, 10)?; - - Ok(()) -} + ); -#[test] -fn ibc_namada_gaia() -> Result<()> { - // epoch per 100 seconds - let update_genesis = - |mut genesis: templates::All, base_dir: &_| { - genesis.parameters.parameters.epochs_per_year = - epochs_per_year_from_min_duration(1800); - genesis.parameters.ibc_params.default_mint_limit = - Amount::max_signed(); - genesis - .parameters - .ibc_params - .default_per_epoch_throughput_limit = Amount::max_signed(); - setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) - }; - let (ledger, mut ledger_b, test, _test_b) = run_two_nets(update_genesis)?; - let _bg_ledger = ledger.background(); - // chain B isn't used - ledger_b.interrupt()?; + let _bg_ledger = + start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? + .background(); // gaia let test_gaia = setup_gaia()?; @@ -429,16 +120,16 @@ fn ibc_namada_gaia() -> Result<()> { // Start relaying let hermes = run_hermes(&test)?; - let _bg_hermes = hermes.background(); + let bg_hermes = hermes.background(); - // Transfer from Namada to Gaia - let receiver = find_gaia_address(&test_gaia, GAIA_USER)?; + // Transfer 2 APFEL from Namada to Gaia + let gaia_receiver = find_gaia_address(&test_gaia, GAIA_USER)?; transfer( &test, ALBERT, - receiver, + &gaia_receiver, APFEL, - 200.0, + 2.0, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -451,51 +142,53 @@ fn ibc_namada_gaia() -> Result<()> { // Check the received token on Gaia let token_addr = find_address(&test, APFEL)?; - let ibc_denom = format!("{port_id_gaia}/{channel_id_gaia}/{token_addr}"); - check_gaia_balance(&test_gaia, GAIA_USER, &ibc_denom, 200000000)?; + let ibc_denom_on_gaia = + format!("{port_id_gaia}/{channel_id_gaia}/{token_addr}"); + check_gaia_balance(&test_gaia, GAIA_USER, &ibc_denom_on_gaia, 2000000)?; - // Transfer back from Gaia to Namada - let receiver = find_address(&test, ALBERT)?.to_string(); + // Transfer 1 Apfel back from Gaia to Namada + let namada_receiver = find_address(&test, ALBERT)?.to_string(); transfer_from_gaia( &test_gaia, GAIA_USER, - receiver, - get_gaia_denom_hash(ibc_denom), - 100000000, + &namada_receiver, + get_gaia_denom_hash(&ibc_denom_on_gaia), + 1000000, &port_id_gaia, &channel_id_gaia, None, + None, )?; wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; // Check the token on Namada - check_balance(&test, ALBERT, APFEL, 999900)?; + check_balance(&test, ALBERT, APFEL, 999999)?; - // Transfer a token from Gaia to Namada - let receiver = find_address(&test, ALBERT)?.to_string(); + // Transfer 200 samoleans from Gaia to Namada transfer_from_gaia( &test_gaia, GAIA_USER, - receiver, + &namada_receiver, GAIA_COIN, 200, &port_id_gaia, &channel_id_gaia, None, + None, )?; wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; // Check the token on Namada - let ibc_denom = format!("{port_id_namada}/{channel_id_namada}/{GAIA_COIN}"); - check_balance(&test, ALBERT, &ibc_denom, 200)?; + let ibc_denom_on_namada = + format!("{port_id_namada}/{channel_id_namada}/{GAIA_COIN}"); + check_balance(&test, ALBERT, &ibc_denom_on_namada, 200)?; - // Transfer back from Namada to Gaia - let receiver = find_gaia_address(&test_gaia, GAIA_USER)?; + // Transfer 100 samoleans back from Namada to Gaia transfer( &test, ALBERT, - &receiver, - ibc_denom, + &gaia_receiver, + &ibc_denom_on_namada, 100.0, Some(ALBERT_KEY), &port_id_namada, @@ -509,7 +202,15 @@ fn ibc_namada_gaia() -> Result<()> { // Check the received token on Gaia check_gaia_balance(&test_gaia, GAIA_USER, GAIA_COIN, 900)?; - // Shielding transfer from Gaia to Namada + // Invalid transfers + try_invalid_transfers( + &test, + &gaia_receiver, + &port_id_namada, + &channel_id_namada, + )?; + + // Shielding transfer 100 samoleans from Gaia to Namada let memo_path = gen_ibc_shielding_data( &test, AA_PAYMENT_ADDRESS, @@ -527,34 +228,128 @@ fn ibc_namada_gaia() -> Result<()> { &port_id_gaia, &channel_id_gaia, Some(memo_path), + None, )?; wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test_gaia)?; - // Check the token on Namada - let ibc_denom = format!("{port_id_namada}/{channel_id_namada}/{GAIA_COIN}"); - check_balance(&test, AA_VIEWING_KEY, &ibc_denom, 100)?; + check_balance(&test, AA_VIEWING_KEY, &ibc_denom_on_namada, 100)?; - // Shielded transfer on Namada + // Shielded transfer 50 samoleans on Namada transfer_on_chain( &test, "transfer", A_SPENDING_KEY, AB_PAYMENT_ADDRESS, - &ibc_denom, + &ibc_denom_on_namada, 50, ALBERT_KEY, )?; - check_balance(&test, AA_VIEWING_KEY, &ibc_denom, 50)?; - check_balance(&test, AB_VIEWING_KEY, &ibc_denom, 50)?; + check_balance(&test, AA_VIEWING_KEY, &ibc_denom_on_namada, 50)?; + check_balance(&test, AB_VIEWING_KEY, &ibc_denom_on_namada, 50)?; - // Unshielding transfer from Namada to Gaia + // Unshielding transfer 10 samoleans from Namada to Gaia transfer( &test, B_SPENDING_KEY, - &receiver, - &ibc_denom, + &gaia_receiver, + &ibc_denom_on_namada, + 10.0, + Some(BERTHA_KEY), + &port_id_namada, + &channel_id_namada, + None, + None, + None, + false, + )?; + wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; + check_balance(&test, AB_VIEWING_KEY, &ibc_denom_on_namada, 40)?; + check_gaia_balance(&test_gaia, GAIA_USER, GAIA_COIN, 810)?; + + // Shielding transfer back from Gaia to Namada + let memo_path = gen_ibc_shielding_data( + &test, + AA_PAYMENT_ADDRESS, + &ibc_denom_on_gaia, + 100, + &port_id_namada, + &channel_id_namada, + )?; + transfer_from_gaia( + &test_gaia, + GAIA_USER, + AA_PAYMENT_ADDRESS, + get_gaia_denom_hash(&ibc_denom_on_gaia), + 100000000, + &port_id_gaia, + &channel_id_gaia, + Some(memo_path), + None, + )?; + wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; + + // Check the token on Namada + check_balance(&test, AA_VIEWING_KEY, APFEL, 100)?; + + // Transfer to an invalid receiver address to check the refund for the + // escrowed token + transfer( + &test, + ALBERT, + "invalid_receiver", + APFEL, + 10.0, + Some(ALBERT_KEY), + &port_id_namada, + &channel_id_namada, + None, + None, + None, + false, + )?; + wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; + // The balance should not be changed + check_balance(&test, ALBERT, APFEL, 999999)?; + + // Stop Hermes for timeout test + let mut hermes = bg_hermes.foreground(); + hermes.interrupt()?; + + // Transfer will be timed out to check the refund for the burned IBC token + transfer( + &test, + ALBERT, + &gaia_receiver, + &ibc_denom_on_namada, + 10.0, + Some(ALBERT_KEY), + &port_id_namada, + &channel_id_namada, + Some(Duration::new(10, 0)), + None, + None, + false, + )?; + // wait for the timeout + sleep(10); + + // Restart relaying + let hermes = run_hermes(&test)?; + let _bg_hermes = hermes.background(); + + wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; + // The balance should not be changed + check_balance(&test, ALBERT, &ibc_denom_on_namada, 100)?; + + // Unshielding transfer to Gaia's invalid account to check the refund for + // the burned IBC token + transfer( + &test, + A_SPENDING_KEY, + "invalid_receiver", + &ibc_denom_on_namada, 10.0, - Some(BERTHA_KEY), + Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, None, @@ -563,33 +358,8 @@ fn ibc_namada_gaia() -> Result<()> { false, )?; wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; - check_balance(&test, AB_VIEWING_KEY, &ibc_denom, 40)?; - check_gaia_balance(&test_gaia, GAIA_USER, GAIA_COIN, 810)?; - - // Shielding transfer back from Gaia to Namada - let ibc_denom = format!("{port_id_gaia}/{channel_id_gaia}/{token_addr}"); - let memo_path = gen_ibc_shielding_data( - &test, - AA_PAYMENT_ADDRESS, - &ibc_denom, - 100, - &port_id_namada, - &channel_id_namada, - )?; - transfer_from_gaia( - &test_gaia, - GAIA_USER, - AA_PAYMENT_ADDRESS, - get_gaia_denom_hash(&ibc_denom), - 100000000, - &port_id_gaia, - &channel_id_gaia, - Some(memo_path), - )?; - wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; - - // Check the token on Namada - check_balance(&test, AA_VIEWING_KEY, APFEL, 100)?; + check_balance(&test, AA_VIEWING_KEY, &ibc_denom_on_namada, 40)?; + check_balance(&test, IBC_REFUND_TARGET_ALIAS, &ibc_denom_on_namada, 10)?; Ok(()) } @@ -864,74 +634,97 @@ fn ibc_upgrade_client() -> Result<()> { Ok(()) } +/// IBC rate limit test +/// 1. Test per-epoch throuput +/// - The per-epoch throughput is 1 NAM +/// - Transfer 1 NAM in an epoch will succeed +/// - Transfer 1 NAM in the same epoch will fail +/// - Transfer 1 NAM in the next epoch will succeed +/// 2. Test the mint limit +/// - The mint limit is 1 +/// - Receiving 2 samoleans from Gaia will fail #[test] fn ibc_rate_limit() -> Result<()> { // Mint limit 2 transfer/channel-0/nam, per-epoch throughput limit 1 NAM - let update_genesis = - |mut genesis: templates::All, base_dir: &_| { - genesis.parameters.parameters.epochs_per_year = - epochs_per_year_from_min_duration(50); - genesis.parameters.ibc_params.default_mint_limit = - Amount::from_u64(2_000_000); - genesis - .parameters - .ibc_params - .default_per_epoch_throughput_limit = - Amount::from_u64(1_000_000); - setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) - }; - let (ledger_a, ledger_b, test_a, test_b) = run_two_nets(update_genesis)?; - let _bg_ledger_a = ledger_a.background(); - let _bg_ledger_b = ledger_b.background(); + let mut update_genesis = |mut genesis: templates::All< + templates::Unvalidated, + >, + base_dir: &_| { + genesis.parameters.parameters.epochs_per_year = + epochs_per_year_from_min_duration(50); + genesis.parameters.ibc_params.default_mint_limit = Amount::from_u64(1); + genesis + .parameters + .ibc_params + .default_per_epoch_throughput_limit = Amount::from_u64(1_000_000); + setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) + }; + let test = setup::network(&mut update_genesis, None)?; - setup_hermes(&test_a, &test_b)?; - let port_id_a = "transfer".parse().unwrap(); - let port_id_b: PortId = "transfer".parse().unwrap(); - let (channel_id_a, channel_id_b) = - create_channel_with_hermes(&test_a, &test_b)?; + set_ethereum_bridge_mode( + &test, + &test.net.chain_id, + Who::Validator(0), + ethereum_bridge::ledger::Mode::Off, + None, + ); + + let _bg_ledger = + start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? + .background(); + + // gaia + let test_gaia = setup_gaia()?; + let gaia = run_gaia(&test_gaia)?; + sleep(5); + let _bg_gaia = gaia.background(); + + setup_hermes(&test, &test_gaia)?; + let port_id_namada = "transfer".parse().unwrap(); + let port_id_gaia: PortId = "transfer".parse().unwrap(); + let (channel_id_namada, channel_id_gaia) = + create_channel_with_hermes(&test, &test_gaia)?; // Start relaying - let hermes = run_hermes(&test_a)?; + let hermes = run_hermes(&test)?; let _bg_hermes = hermes.background(); // wait for the next epoch - std::env::set_var(ENV_VAR_CHAIN_ID, test_a.net.chain_id.to_string()); - let rpc_a = get_actor_rpc(&test_a, Who::Validator(0)); - let mut epoch = get_epoch(&test_a, &rpc_a).unwrap(); + let rpc = get_actor_rpc(&test, Who::Validator(0)); + let mut epoch = get_epoch(&test, &rpc).unwrap(); let next_epoch = epoch.next(); while epoch <= next_epoch { sleep(5); - epoch = get_epoch(&test_a, &rpc_a).unwrap(); + epoch = get_epoch(&test, &rpc).unwrap(); } - // Transfer 1 NAM from Chain A to Chain B - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - let receiver = find_address(&test_b, BERTHA)?; + // Transfer 1 NAM from Namada to Gaia + let gaia_receiver = find_gaia_address(&test_gaia, GAIA_USER)?; transfer( - &test_a, + &test, ALBERT, - receiver.to_string(), + &gaia_receiver, NAM, 1.0, Some(ALBERT_KEY), - &port_id_a, - &channel_id_a, + &port_id_namada, + &channel_id_namada, None, None, None, false, )?; - // Transfer 1 NAM from Chain A to Chain B again will fail + // Transfer 1 NAM from Namada to Gaia again will fail transfer( - &test_a, + &test, ALBERT, - receiver.to_string(), + &gaia_receiver, NAM, 1.0, Some(ALBERT_KEY), - &port_id_a, - &channel_id_a, + &port_id_namada, + &channel_id_namada, None, None, // expect an error of the throughput limit @@ -942,23 +735,23 @@ fn ibc_rate_limit() -> Result<()> { )?; // wait for the next epoch - let mut epoch = get_epoch(&test_a, &rpc_a).unwrap(); + let mut epoch = get_epoch(&test, &rpc).unwrap(); let next_epoch = epoch.next(); while epoch <= next_epoch { sleep(5); - epoch = get_epoch(&test_a, &rpc_a).unwrap(); + epoch = get_epoch(&test, &rpc).unwrap(); } - // Transfer 1 NAM from Chain A to Chain B will succeed in the new epoch + // Transfer 1 NAM from Namada to Gaia will succeed in the new epoch transfer( - &test_a, + &test, ALBERT, - receiver.to_string(), + &gaia_receiver, NAM, 1.0, Some(ALBERT_KEY), - &port_id_a, - &channel_id_a, + &port_id_namada, + &channel_id_namada, None, None, None, @@ -966,42 +759,32 @@ fn ibc_rate_limit() -> Result<()> { )?; // wait for the next epoch - let mut epoch = get_epoch(&test_a, &rpc_a).unwrap(); + let mut epoch = get_epoch(&test, &rpc).unwrap(); let next_epoch = epoch.next(); while epoch <= next_epoch { sleep(5); - epoch = get_epoch(&test_a, &rpc_a).unwrap(); + epoch = get_epoch(&test, &rpc).unwrap(); } - // Transfer 1 NAM from Chain A to Chain B will succeed, but Chain B can't + // Transfer 2 samoleans from Gaia to Namada will succeed, but Namada can't // receive due to the mint limit and the packet will be timed out - transfer( - &test_a, - ALBERT, - receiver.to_string(), - NAM, - 1.0, - Some(ALBERT_KEY), - &port_id_a, - &channel_id_a, - Some(Duration::new(20, 0)), - None, + let namada_receiver = find_address(&test, ALBERT)?.to_string(); + transfer_from_gaia( + &test_gaia, + GAIA_USER, + &namada_receiver, + GAIA_COIN, + 2, + &port_id_gaia, + &channel_id_gaia, None, - false, + Some(Duration::new(10, 0)), )?; - wait_for_packet_relay(&port_id_a, &channel_id_a, &test_a)?; + wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; - // Check the balance on Chain B - let ibc_denom = format!("{port_id_b}/{channel_id_b}/nam"); - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - let rpc_b = get_actor_rpc(&test_b, Who::Validator(0)); - let query_args = vec![ - "balance", "--owner", BERTHA, "--token", &ibc_denom, "--node", &rpc_b, - ]; - let expected = format!("{ibc_denom}: 2"); - let mut client = run!(test_b, Bin::Client, query_args, Some(40))?; - client.exp_string(&expected)?; - client.assert_success(); + // Check if Namada hasn't receive it + let ibc_denom = format!("{port_id_namada}/{channel_id_namada}/{GAIA_COIN}"); + check_balance(&test, ALBERT, &ibc_denom, 0)?; Ok(()) } @@ -1049,7 +832,6 @@ fn run_two_nets( Ok((ledger_a, ledger_b, test_a, test_b)) } -/// Set up two Namada chains to talk to each other via IBC. fn setup_two_single_node_nets( mut update_genesis: impl FnMut( templates::All, @@ -1267,482 +1049,35 @@ fn upgrade_client( "--upgrade-height", &upgrade_height.to_string(), ]; - let mut hermes = run_hermes_cmd(test, args, Some(120))?; - hermes.exp_string("upgraded-chain")?; - hermes.assert_success(); - - Ok(()) -} - -fn wait_epochs(test: &Test, duration_epochs: u64) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); - let rpc = get_actor_rpc(test, Who::Validator(0)); - let mut epoch = None; - for _ in 0..10 { - match get_epoch(test, &rpc) { - Ok(e) => { - epoch = Some(e); - break; - } - Err(_) => sleep(10), - } - } - let (mut epoch, target_epoch) = match epoch { - Some(e) => (e, e + duration_epochs), - None => return Err(eyre!("Query epoch failed")), - }; - while epoch < target_epoch { - sleep(10); - epoch = get_epoch(test, &rpc).unwrap_or_default(); - } - Ok(()) -} - -fn create_client(test_a: &Test, test_b: &Test) -> Result<(ClientId, ClientId)> { - let height = query_height(test_b)?; - let client_state = make_client_state(test_b, height); - let height = client_state.latest_height(); - let message = MsgCreateClient { - client_state: client_state.into(), - consensus_state: make_consensus_state(test_b, height)?.into(), - signer: signer(), - }; - let height_a = submit_ibc_tx( - test_a, - make_ibc_data(message.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - let height = query_height(test_a)?; - let client_state = make_client_state(test_a, height); - let height = client_state.latest_height(); - let message = MsgCreateClient { - client_state: client_state.into(), - consensus_state: make_consensus_state(test_a, height)?.into(), - signer: signer(), - }; - let height_b = submit_ibc_tx( - test_b, - make_ibc_data(message.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - let events = get_events(test_a, height_a)?; - let client_id_a = - get_client_id_from_events(&events).ok_or(eyre!(TX_FAILED))?; - let events = get_events(test_b, height_b)?; - let client_id_b = - get_client_id_from_events(&events).ok_or(eyre!(TX_FAILED))?; - - // `client_id_a` represents the ID of the B's client on Chain A - Ok((client_id_a, client_id_b)) -} - -fn make_client_state(test: &Test, height: Height) -> TmClientState { - let rpc = get_actor_rpc(test, Who::Validator(0)); - let tendermint_url = Url::from_str(&rpc).unwrap(); - let client = HttpClient::new(tendermint_url).unwrap(); - - let pos_params = - test.async_runtime().block_on(query_pos_parameters(&client)); - let pipeline_len = pos_params.pipeline_len; - - let key = param_storage::get_epoch_duration_storage_key(); - let epoch_duration = test - .async_runtime() - .block_on(query_storage_value::( - &client, &key, - )) - .unwrap(); - let unbonding_period = pipeline_len * epoch_duration.min_duration.0; - - let trusting_period = 2 * unbonding_period / 3; - let max_clock_drift = Duration::new(60, 0); - let chain_id = ChainId::from_str(test.net.chain_id.as_str()).unwrap(); - - TmClientStateType::new( - chain_id, - TrustThreshold::TWO_THIRDS, - Duration::from_secs(trusting_period), - Duration::from_secs(unbonding_period), - max_clock_drift, - height, - ibc_proof_specs::().try_into().unwrap(), - vec![], - AllowUpdate { - after_expiry: true, - after_misbehaviour: true, - }, - ) - .unwrap() - .into() -} - -fn make_consensus_state( - test: &Test, - height: Height, -) -> Result { - let header = query_header(test, height)?; - Ok(TmConsensusState::from(header)) -} - -fn update_client_with_height( - src_test: &Test, - target_test: &Test, - target_client_id: &ClientId, - target_height: Height, -) -> Result<()> { - // check the current(stale) state on the target chain - 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[..]) - .map_err(|e| eyre!("Decoding the client state failed: {}", e))?, - None => { - return Err(eyre!( - "The client state doesn't exist: client ID {}", - target_client_id - )); - } - }; - let client_state = TmClientState::try_from(cs) - .expect("the state should be a TmClientState"); - let trusted_height = client_state.latest_height(); - - update_client( - src_test, - target_test, - target_client_id, - trusted_height, - target_height, - ) -} - -fn update_client( - src_test: &Test, - target_test: &Test, - client_id: &ClientId, - trusted_height: Height, - target_height: Height, -) -> Result<()> { - 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 { - client_id: client_id.clone(), - client_message: header.into(), - signer: signer(), - }; - submit_ibc_tx( - target_test, - make_ibc_data(message.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - check_ibc_update_query( - target_test, - client_id, - BlockHeight(target_height.revision_height()), - )?; - Ok(()) -} - -fn make_light_client_io(test: &Test) -> TmLightClientIo { - let rpc = get_actor_rpc(test, Who::Validator(0)); - let rpc_addr = Url::from_str(&rpc).unwrap(); - 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( - test_a: &Test, - test_b: &Test, - client_id_a: &ClientId, - client_id_b: &ClientId, -) -> Result<(ConnectionId, ConnectionId)> { - let msg = MsgConnectionOpenInit { - client_id_on_a: client_id_a.clone(), - counterparty: ConnCounterparty::new( - client_id_b.clone(), - None, - commitment_prefix(), - ), - version: Some(ConnVersion::compatibles().first().unwrap().clone()), - delay_period: Duration::new(0, 0), - signer: signer(), - }; - // OpenInitConnection on Chain A - let height = submit_ibc_tx( - test_a, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(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 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(), - ); - #[allow(deprecated)] - let msg = MsgConnectionOpenTry { - client_id_on_b: client_id_b.clone(), - client_state_of_b_on_a: client_state.clone().into(), - counterparty, - versions_on_a: ConnVersion::compatibles(), - proofs_height_on_a: height_a, - proof_conn_end_on_a: conn_proof, - proof_client_state_of_b_on_a: client_state_proof, - proof_consensus_state_of_b_on_a: consensus_proof, - consensus_height_of_b_on_a: client_state.latest_height(), - delay_period: Duration::from_secs(0), - signer: "test".to_string().into(), - proof_consensus_state_of_b: None, - previous_connection_id: ConnectionId::zero().to_string(), - }; - // 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(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 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 { - 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::compatibles().first().unwrap().clone(), - signer: signer(), - proof_consensus_state_of_a: None, - }; - // 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - // get the proofs on Chain A - let height_a = query_height(test_a)?; - let proof = get_connection_proof(test_a, &conn_id_a, height_a)?; - let msg = MsgConnectionOpenConfirm { - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - Ok((conn_id_a, conn_id_b)) -} - -// get the proofs on the target height -fn get_connection_proof( - test: &Test, - conn_id: &ConnectionId, - target_height: Height, -) -> Result { - // we need proofs at the height of the previous block - let query_height = target_height.decrement().unwrap(); - let key = connection_key(conn_id); - let (_, tm_proof) = query_value_with_proof(test, &key, Some(query_height))?; - convert_proof(tm_proof) -} - -fn channel_handshake( - test_a: &Test, - test_b: &Test, - client_id_a: &ClientId, - client_id_b: &ClientId, - conn_id_a: &ConnectionId, - conn_id_b: &ConnectionId, -) -> Result<((PortId, ChannelId), (PortId, ChannelId))> { - // OpenInitChannel on Chain A - let port_id = PortId::transfer(); - let connection_hops_on_a = vec![conn_id_a.clone()]; - let channel_version = ChanVersion::new(ICS20_VERSION.to_string()); - let msg = MsgChannelOpenInit { - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - let events = get_events(test_a, height)?; - let channel_id_a = - get_channel_id_from_events(&events).ok_or(eyre!(TX_FAILED))?; - - // get the proofs from Chain A - let height_a = query_height(test_a)?; - 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_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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - let events = get_events(test_b, height)?; - let channel_id_b = - get_channel_id_from_events(&events).ok_or(eyre!(TX_FAILED))?; - - // get the A's proofs on Chain B - let height_b = query_height(test_b)?; - let proof_chan_end_on_b = - get_channel_proof(test_b, &port_id, &channel_id_b, height_b)?; - let msg = MsgChannelOpenAck { - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - // get the proofs on Chain A - let height_a = query_height(test_a)?; - let proof_chan_end_on_a = - get_channel_proof(test_a, &port_id, &channel_id_a, height_a)?; - let msg = MsgChannelOpenConfirm { - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; + let mut hermes = run_hermes_cmd(test, args, Some(120))?; + hermes.exp_string("upgraded-chain")?; + hermes.assert_success(); - Ok(((port_id.clone(), channel_id_a), (port_id, channel_id_b))) + Ok(()) } -fn get_channel_proof( - test: &Test, - port_id: &PortId, - channel_id: &ChannelId, - target_height: Height, -) -> Result { - // we need proofs at the height of the previous block - let query_height = target_height.decrement().unwrap(); - let key = channel_key(port_id, channel_id); - let (_, tm_proof) = query_value_with_proof(test, &key, Some(query_height))?; - convert_proof(tm_proof) +fn wait_epochs(test: &Test, duration_epochs: u64) -> Result<()> { + std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); + let rpc = get_actor_rpc(test, Who::Validator(0)); + let mut epoch = None; + for _ in 0..10 { + match get_epoch(test, &rpc) { + Ok(e) => { + epoch = Some(e); + break; + } + Err(_) => sleep(10), + } + } + let (mut epoch, target_epoch) = match epoch { + Some(e) => (e, e + duration_epochs), + None => return Err(eyre!("Query epoch failed")), + }; + while epoch < target_epoch { + sleep(10); + epoch = get_epoch(test, &rpc).unwrap_or_default(); + } + Ok(()) } // get the client state, the proof of the client state, and the proof of the @@ -1780,104 +1115,23 @@ fn get_client_states( Ok((client_state, client_state_proof, consensus_proof)) } -fn transfer_token( - test_a: &Test, - test_b: &Test, - client_id_a: &ClientId, - client_id_b: &ClientId, - port_id_a: &PortId, - channel_id_a: &ChannelId, -) -> Result<()> { - // Send a token from Chain A - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - let receiver = find_address(test_b, BERTHA)?; - let height = transfer( - test_a, - ALBERT, - receiver.to_string(), - NAM, - 100000.0, - Some(ALBERT_KEY), - port_id_a, - channel_id_a, - None, - None, - None, - false, - )?; - let events = get_events(test_a, height)?; - let packet = get_packet_from_events(&events).ok_or(eyre!(TX_FAILED))?; - check_ibc_packet_query(test_a, "send_packet", &packet)?; - - let height_a = query_height(test_a)?; - let proof_commitment_on_a = - get_commitment_proof(test_a, &packet, height_a)?; - let msg = IbcMsgRecvPacket { - packet, - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - let events = get_events(test_b, height)?; - let packet = get_packet_from_events(&events).ok_or(eyre!(TX_FAILED))?; - let ack = get_ack_from_events(&events).ok_or(eyre!(TX_FAILED))?; - check_ibc_packet_query(test_b, "write_acknowledgement", &packet)?; - - // get the proof on Chain B - let height_b = query_height(test_b)?; - let proof_acked_on_b = get_ack_proof(test_b, &packet, height_b)?; - let msg = MsgAcknowledgement { - packet, - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - Ok(()) -} - fn try_invalid_transfers( - test_a: &Test, - test_b: &Test, - port_id_a: &PortId, - channel_id_a: &ChannelId, + test: &Test, + receiver: impl AsRef, + port_id: &PortId, + channel_id: &ChannelId, ) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - let receiver = find_address(test_b, BERTHA)?; - // invalid port - std::env::set_var(ENV_VAR_CHAIN_ID, test_a.net.chain_id.to_string()); - let nam_addr = find_address(test_a, NAM)?; + let nam_addr = find_address(test, NAM)?; transfer( - test_a, + test, ALBERT, - receiver.to_string(), + receiver.as_ref(), NAM, 10.0, Some(ALBERT_KEY), &"port".parse().unwrap(), - channel_id_a, + channel_id, None, None, // the IBC denom can't be parsed when using an invalid port @@ -1887,13 +1141,13 @@ fn try_invalid_transfers( // invalid channel transfer( - test_a, + test, ALBERT, - receiver.to_string(), + receiver.as_ref(), NAM, 10.0, Some(ALBERT_KEY), - port_id_a, + port_id, &"channel-42".parse().unwrap(), None, None, @@ -1939,230 +1193,6 @@ fn transfer_on_chain( Ok(()) } -/// Give the token back after transfer_token -fn transfer_back( - test_a: &Test, - test_b: &Test, - client_id_a: &ClientId, - client_id_b: &ClientId, - port_id_b: &PortId, - channel_id_b: &ChannelId, -) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test_a.net.chain_id.to_string()); - let receiver = find_address(test_a, ALBERT)?; - - // Chain A was the source for the sent token - let ibc_denom = format!("{port_id_b}/{channel_id_b}/nam"); - // Send a token from Chain B - let height = transfer( - test_b, - BERTHA, - receiver.to_string(), - ibc_denom, - 50_000_000_000.0, - Some(BERTHA_KEY), - port_id_b, - channel_id_b, - None, - None, - None, - false, - )?; - let events = get_events(test_b, height)?; - let packet = get_packet_from_events(&events).ok_or(eyre!(TX_FAILED))?; - - let height_b = query_height(test_b)?; - let proof = get_commitment_proof(test_b, &packet, height_b)?; - let msg = IbcMsgRecvPacket { - packet, - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - let events = get_events(test_a, height)?; - let packet = get_packet_from_events(&events).ok_or(eyre!(TX_FAILED))?; - let ack = get_ack_from_events(&events).ok_or(eyre!(TX_FAILED))?; - - // get the proof on Chain A - let height_a = query_height(test_a)?; - let proof_acked_on_b = get_ack_proof(test_a, &packet, height_a)?; - let msg = MsgAcknowledgement { - packet, - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - Ok(()) -} - -fn transfer_timeout( - test_a: &Test, - test_b: &Test, - client_id_a: &ClientId, - port_id_a: &PortId, - channel_id_a: &ChannelId, -) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - let receiver = find_address(test_b, BERTHA)?; - - // Send a token from Chain A - let height = transfer( - test_a, - ALBERT, - receiver.to_string(), - NAM, - 100000.0, - Some(ALBERT_KEY), - port_id_a, - channel_id_a, - Some(Duration::new(5, 0)), - None, - None, - false, - )?; - let events = get_events(test_a, height)?; - let packet = get_packet_from_events(&events).ok_or(eyre!(TX_FAILED))?; - - // wait for the timeout - sleep(5); - - let height_b = query_height(test_b)?; - let proof_unreceived_on_b = - get_receipt_absence_proof(test_b, &packet, height_b)?; - let msg = IbcMsgTimeout { - packet, - 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, - make_ibc_data(msg.to_any()), - ensure_hot_addr(ALBERT), - ensure_hot_key(ALBERT_KEY), - false, - )?; - - Ok(()) -} - -fn get_commitment_proof( - test: &Test, - packet: &Packet, - target_height: Height, -) -> Result { - // we need proofs at the height of the previous block - let query_height = target_height.decrement().unwrap(); - let key = commitment_key( - &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))?; - convert_proof(tm_proof) -} - -fn get_ack_proof( - test: &Test, - packet: &Packet, - target_height: Height, -) -> Result { - // we need proofs at the height of the previous block - let query_height = target_height.decrement().unwrap(); - 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))?; - convert_proof(tm_proof) -} - -fn get_receipt_absence_proof( - test: &Test, - packet: &Packet, - target_height: Height, -) -> Result { - // we need proofs at the height of the previous block - let query_height = target_height.decrement().unwrap(); - let key = receipt_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))?; - convert_proof(tm_proof) -} - -fn commitment_prefix() -> CommitmentPrefix { - CommitmentPrefix::from(COMMITMENT_PREFIX.as_bytes().to_vec()) -} - -fn submit_ibc_tx( - test: &Test, - data: Vec, - owner: &str, - signer: &str, - wait_reveal_pk: bool, -) -> Result { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); - let data_path = test.test_dir.path().join("tx.data"); - std::fs::write(&data_path, data).expect("writing data failed"); - - let data_path = data_path.to_string_lossy(); - let rpc = get_actor_rpc(test, Who::Validator(0)); - let mut client = run!( - test, - Bin::Client, - apply_use_device(vec![ - "tx", - "--code-path", - TX_IBC_WASM, - "--data-path", - &data_path, - "--owner", - owner, - "--signing-keys", - signer, - "--gas-token", - NAM, - "--gas-limit", - "200000", - "--node", - &rpc - ]), - Some(40) - )?; - client.exp_string(TX_APPLIED_SUCCESS)?; - if wait_reveal_pk { - client.exp_string(TX_APPLIED_SUCCESS)?; - } - check_tx_height(test, &mut client) -} - #[allow(clippy::too_many_arguments)] fn transfer( test: &Test, @@ -2473,6 +1503,7 @@ fn transfer_from_gaia( port_id: &PortId, channel_id: &ChannelId, memo_path: Option, + timeout_sec: Option, ) -> Result<()> { let port_id = port_id.to_string(); let channel_id = channel_id.to_string(); @@ -2516,6 +1547,15 @@ fn transfer_from_gaia( args.push(&memo); } + let timeout_nanosec = timeout_sec + .as_ref() + .map(|d| d.as_nanos().to_string()) + .unwrap_or_default(); + if timeout_sec.is_some() { + args.push("--packet-timeout-timestamp"); + args.push(&timeout_nanosec); + } + let mut gaia = run_gaia_cmd(test, args, Some(40))?; gaia.assert_success(); Ok(()) @@ -2542,13 +1582,6 @@ fn check_tx_height(test: &Test, client: &mut NamadaCmd) -> Result { Ok(height) } -fn make_ibc_data(message: Any) -> Vec { - let mut tx_data = vec![]; - prost::Message::encode(&message, &mut tx_data) - .expect("encoding IBC message shouldn't fail"); - tx_data -} - fn query_height(test: &Test) -> Result { let rpc = get_actor_rpc(test, Who::Validator(0)); let tendermint_url = Url::from_str(&rpc).unwrap(); @@ -2562,65 +1595,6 @@ fn query_height(test: &Test) -> Result { Ok(Height::new(0, status.sync_info.latest_block_height.into()).unwrap()) } -fn query_header(test: &Test, height: Height) -> Result { - let rpc = get_actor_rpc(test, Who::Validator(0)); - let tendermint_url = Url::from_str(&rpc).unwrap(); - let client = HttpClient::new(tendermint_url).unwrap(); - let height = height.revision_height() as u32; - let result = test - .async_runtime() - .block_on(client.blockchain(height, height)); - match result { - Ok(mut response) => match response.block_metas.pop() { - Some(meta) => Ok(meta.header), - None => Err(eyre!("No meta exists")), - }, - Err(e) => Err(eyre!("Header query failed: {}", e)), - } -} - -fn check_ibc_update_query( - test: &Test, - client_id: &ClientId, - consensus_height: BlockHeight, -) -> Result<()> { - let rpc = get_actor_rpc(test, Who::Validator(0)); - let tendermint_url = Url::from_str(&rpc).unwrap(); - let client = HttpClient::new(tendermint_url).unwrap(); - match test.async_runtime().block_on(RPC.shell().ibc_client_update( - &client, - client_id, - &consensus_height, - )) { - Ok(Some(_)) => Ok(()), - Ok(None) => Err(eyre!("No update event for the client {}", client_id)), - Err(e) => Err(eyre!("IBC update event query failed: {}", e)), - } -} - -fn check_ibc_packet_query( - test: &Test, - event_type: &str, - packet: &Packet, -) -> Result<()> { - let rpc = get_actor_rpc(test, Who::Validator(0)); - let tendermint_url = Url::from_str(&rpc).unwrap(); - let client = HttpClient::new(tendermint_url).unwrap(); - match test.async_runtime().block_on(RPC.shell().ibc_packet( - &client, - &IbcEventType(event_type.to_owned()), - &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(_)) => Ok(()), - Ok(None) => Err(eyre!("No packet event for the packet {}", packet)), - Err(e) => Err(eyre!("IBC packet event query failed: {}", e)), - } -} - fn query_value_with_proof( test: &Test, key: &Key, @@ -2679,33 +1653,18 @@ fn check_balance( &rpc, ]; let mut client = run!(test, Bin::Client, query_args, Some(40))?; - let expected = - format!("{}: {expected_amount}", token.as_ref().to_lowercase()); + let token_alias = if expected_amount == 0 { + // the alias should be a raw address since the token hasn't received + ibc_token(token).to_string() + } else { + token.as_ref().to_lowercase() + }; + let expected = format!("{}: {expected_amount}", token_alias); client.exp_string(&expected)?; client.assert_success(); Ok(()) } -/// Check balances after IBC transfer -fn check_balances( - dest_port_id: &PortId, - dest_channel_id: &ChannelId, - test_a: &Test, - test_b: &Test, -) -> Result<()> { - // Check the balances on Chain A - let escrow = Address::Internal(InternalAddress::Ibc).to_string(); - check_balance(test_a, escrow, NAM, 100000)?; - // Check the source balance - check_balance(test_a, ALBERT, NAM, 1900000)?; - - // Check the balance on Chain B - let ibc_denom = format!("{dest_port_id}/{dest_channel_id}/nam"); - check_balance(test_b, BERTHA, ibc_denom, 100_000_000_000)?; - - Ok(()) -} - fn get_gaia_denom_hash(denom: impl AsRef) -> String { let mut hasher = Sha256::new(); hasher.update(denom.as_ref()); @@ -2739,59 +1698,6 @@ fn check_gaia_balance( Ok(()) } -/// Check balances after non IBC transfer -fn check_balances_after_non_ibc( - port_id: &PortId, - channel_id: &ChannelId, - test_b: &Test, -) -> Result<()> { - // Check the source on Chain B - let ibc_denom = format!("{port_id}/{channel_id}/nam"); - check_balance(test_b, BERTHA, &ibc_denom, 50_000_000_000)?; - - // Check the traget on Chain B - check_balance(test_b, ALBERT, &ibc_denom, 50_000_000_000)?; - - Ok(()) -} - -/// Check balances after IBC transfer back -fn check_balances_after_back( - dest_port_id: &PortId, - dest_channel_id: &ChannelId, - test_a: &Test, - test_b: &Test, -) -> Result<()> { - // Check the escrowed balance on Chain A - let escrow = Address::Internal(InternalAddress::Ibc).to_string(); - check_balance(test_a, escrow, NAM, 50000)?; - // Check the source balance on Chain A - check_balance(test_a, ALBERT, NAM, 1950000)?; - - // Check the balance on Chain B - let ibc_denom = format!("{dest_port_id}/{dest_channel_id}/nam"); - check_balance(test_b, BERTHA, ibc_denom, 0)?; - - Ok(()) -} - -/// Check balances after IBC shielded transfer -fn check_shielded_balances( - dest_port_id: &PortId, - dest_channel_id: &ChannelId, - test_a: &Test, - test_b: &Test, -) -> Result<()> { - // Check the shielded balance on Chain A - check_balance(test_a, AA_VIEWING_KEY, BTC, 90)?; - - // Check the shielded balance on Chain B - let ibc_denom = format!("{dest_port_id}/{dest_channel_id}/btc"); - check_balance(test_b, AB_VIEWING_KEY, ibc_denom, 1_000_000_000)?; - - Ok(()) -} - fn check_funded_balances( dest_port_id: &PortId, dest_channel_id: &ChannelId, @@ -2861,71 +1767,6 @@ fn check_inflated_balance(test: &Test) -> Result<()> { Ok(()) } -fn signer() -> Signer { - "signer".to_string().into() -} - -fn get_client_id_from_events(events: &[AbciEvent]) -> Option { - get_attribute_from_events::(events) -} - -fn get_connection_id_from_events(events: &[AbciEvent]) -> Option { - get_attribute_from_events::(events) -} - -fn get_channel_id_from_events(events: &[AbciEvent]) -> Option { - get_attribute_from_events::(events) -} - -fn get_ack_from_events(events: &[AbciEvent]) -> Option> { - get_attribute_from_events::(events) - .map(String::into_bytes) -} - -fn get_attribute_from_events<'value, DATA>( - events: &[AbciEvent], -) -> Option<>::Value> -where - DATA: ReadFromEventAttributes<'value>, -{ - events.iter().find_map(|event| { - DATA::read_from_event_attributes(&event.attributes).ok() - }) -} - -fn get_packet_from_events(events: &[AbciEvent]) -> Option { - events.iter().find_map(|event| { - ibc_events::packet_from_event_attributes(&event.attributes).ok() - }) -} - -fn get_events(test: &Test, height: u32) -> Result> { - let rpc = get_actor_rpc(test, Who::Validator(0)); - let tendermint_url = Url::from_str(&rpc).unwrap(); - let client = HttpClient::new(tendermint_url).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)) -} - fn shielded_sync(test: &Test, viewing_key: impl AsRef) -> Result<()> { std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let rpc = get_actor_rpc(test, Who::Validator(0)); diff --git a/crates/tests/src/e2e/ledger_tests.rs b/crates/tests/src/e2e/ledger_tests.rs index 13900958b1..2e74970642 100644 --- a/crates/tests/src/e2e/ledger_tests.rs +++ b/crates/tests/src/e2e/ledger_tests.rs @@ -77,7 +77,7 @@ fn start_namada_ledger_node( Ok(node) } -fn start_namada_ledger_node_wait_wasm( +pub fn start_namada_ledger_node_wait_wasm( test: &Test, idx: Option, timeout_sec: Option, From 57182a59c33aa8e056c653cc0204d4572c6f8036 Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 12 Aug 2024 22:59:42 +0200 Subject: [PATCH 02/11] WIP: adjust proposal params --- .github/workflows/scripts/e2e.json | 8 +- crates/tests/src/e2e/helpers.rs | 26 - crates/tests/src/e2e/ibc_tests.rs | 494 ++++++++---------- crates/tests/src/e2e/setup.rs | 12 - .../tx_proposal_ibc_token_inflation.wasm | Bin 0 -> 331114 bytes .../src/lib.rs | 2 +- 6 files changed, 218 insertions(+), 324 deletions(-) create mode 100755 wasm_for_tests/tx_proposal_ibc_token_inflation.wasm diff --git a/.github/workflows/scripts/e2e.json b/.github/workflows/scripts/e2e.json index 867edb432a..f816227fd0 100644 --- a/.github/workflows/scripts/e2e.json +++ b/.github/workflows/scripts/e2e.json @@ -1,11 +1,9 @@ { "e2e::eth_bridge_tests::everything": 4, - "e2e::ibc_tests::run_ledger_ibc": 110, - "e2e::ibc_tests::run_ledger_ibc_with_hermes": 230, - "e2e::ibc_tests::pgf_over_ibc_with_hermes": 810, - "e2e::ibc_tests::proposal_ibc_token_inflation": 1100, + "e2e::ibc_tests::ibc_transfers": 300, + "e2e::ibc_tests::pgf_over_ibc": 490, + "e2e::ibc_tests::ibc_token_inflation": 1100, "e2e::ibc_tests::ibc_rate_limit": 430, - "e2e::ibc_tests::ibc_namada_gaia": 180, "e2e::ibc_tests::ibc_upgrade_client": 550, "e2e::eth_bridge_tests::test_add_to_bridge_pool": 10, "e2e::ledger_tests::double_signing_gets_slashed": 12, diff --git a/crates/tests/src/e2e/helpers.rs b/crates/tests/src/e2e/helpers.rs index e722dc3ba8..18d9740ad6 100644 --- a/crates/tests/src/e2e/helpers.rs +++ b/crates/tests/src/e2e/helpers.rs @@ -16,8 +16,6 @@ use data_encoding::HEXLOWER; use escargot::CargoBuild; use eyre::eyre; use namada_apps_lib::cli::context::ENV_VAR_CHAIN_ID; -use namada_apps_lib::config::genesis::chain::DeriveEstablishedAddress; -use namada_apps_lib::config::genesis::templates; use namada_apps_lib::config::utils::convert_tm_addr_to_socket_addr; use namada_apps_lib::config::{Config, TendermintMode}; use namada_core::token::NATIVE_MAX_DECIMAL_PLACES; @@ -214,30 +212,6 @@ pub fn get_pregenesis_wallet>( wallet } -/// Get a pregenesis public key. -pub fn get_pregenesis_pk>( - alias: &str, - base_dir_path: P, -) -> Option { - let wallet = get_pregenesis_wallet(base_dir_path); - wallet.find_public_key(alias).ok() -} - -/// Get a pregenesis public key. -pub fn get_established_addr_from_pregenesis>( - alias: &str, - base_dir_path: P, - genesis: &templates::All, -) -> Option
{ - let pk = get_pregenesis_pk(alias, base_dir_path)?; - let established_accounts = - genesis.transactions.established_account.as_ref()?; - let acct = established_accounts.iter().find(|&acct| { - acct.public_keys.len() == 1 && acct.public_keys[0].raw == pk - })?; - Some(acct.derive_address()) -} - /// Find the address of an account by its alias from the wallet #[allow(dead_code)] pub fn find_keypair( diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index 89f766a8a0..95a80554c3 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -11,7 +11,6 @@ use core::str::FromStr; use core::time::Duration; -use std::collections::BTreeSet; use std::path::{Path, PathBuf}; use color_eyre::eyre::Result; @@ -21,7 +20,6 @@ use namada_apps_lib::client::rpc::query_storage_value_bytes; use namada_apps_lib::config::genesis::{chain, templates}; use namada_apps_lib::config::utils::set_port; use namada_apps_lib::config::{ethereum_bridge, TendermintMode}; -use namada_apps_lib::facade::tendermint::merkle::proof::ProofOps as TmProof; use namada_apps_lib::facade::tendermint_rpc::{Client, HttpClient, Url}; use namada_core::string_encoding::StringEncoded; use namada_sdk::address::{Address, MASP}; @@ -29,10 +27,7 @@ use namada_sdk::governance::cli::onchain::PgfFunding; use namada_sdk::governance::pgf::ADDRESS as PGF_ADDRESS; use namada_sdk::governance::storage::proposal::{PGFIbcTarget, PGFTarget}; use namada_sdk::ibc::clients::tendermint::client_state::ClientState as TmClientState; -use namada_sdk::ibc::core::client::context::client_state::ClientStateCommon; use namada_sdk::ibc::core::client::types::Height; -use namada_sdk::ibc::core::commitment_types::commitment::CommitmentProofBytes; -use namada_sdk::ibc::core::commitment_types::merkle::MerkleProof; use namada_sdk::ibc::core::host::types::identifiers::{ ChannelId, ClientId, PortId, }; @@ -41,7 +36,7 @@ use namada_sdk::ibc::storage::*; use namada_sdk::ibc::trace::ibc_token; use namada_sdk::masp::fs::FsShieldedUtils; use namada_sdk::masp::PaymentAddress; -use namada_sdk::storage::{BlockHeight, Epoch, Key}; +use namada_sdk::storage::Epoch; use namada_sdk::token::Amount; use namada_test_utils::TestWasms; use prost::Message; @@ -50,11 +45,10 @@ use sha2::{Digest, Sha256}; use crate::e2e::helpers::{ epochs_per_year_from_min_duration, find_address, find_gaia_address, - get_actor_rpc, get_epoch, get_established_addr_from_pregenesis, - get_validator_pk, wait_for_wasm_pre_compile, + get_actor_rpc, get_epoch, get_validator_pk, wait_for_wasm_pre_compile, }; use crate::e2e::ledger_tests::{ - prepare_proposal_data, start_namada_ledger_node_wait_wasm, write_json_file, + start_namada_ledger_node_wait_wasm, write_json_file, }; use crate::e2e::setup::{ self, apply_use_device, run_gaia_cmd, run_hermes_cmd, @@ -144,7 +138,7 @@ fn ibc_transfers() -> Result<()> { let token_addr = find_address(&test, APFEL)?; let ibc_denom_on_gaia = format!("{port_id_gaia}/{channel_id_gaia}/{token_addr}"); - check_gaia_balance(&test_gaia, GAIA_USER, &ibc_denom_on_gaia, 2000000)?; + check_gaia_balance(&test_gaia, GAIA_USER, &ibc_denom_on_gaia, 2_000_000)?; // Transfer 1 Apfel back from Gaia to Namada let namada_receiver = find_address(&test, ALBERT)?.to_string(); @@ -153,7 +147,7 @@ fn ibc_transfers() -> Result<()> { GAIA_USER, &namada_receiver, get_gaia_denom_hash(&ibc_denom_on_gaia), - 1000000, + 1_000_000, &port_id_gaia, &channel_id_gaia, None, @@ -162,7 +156,7 @@ fn ibc_transfers() -> Result<()> { wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; // Check the token on Namada - check_balance(&test, ALBERT, APFEL, 999999)?; + check_balance(&test, ALBERT, APFEL, 999_999)?; // Transfer 200 samoleans from Gaia to Namada transfer_from_gaia( @@ -211,7 +205,7 @@ fn ibc_transfers() -> Result<()> { )?; // Shielding transfer 100 samoleans from Gaia to Namada - let memo_path = gen_ibc_shielding_data( + let shielding_data_path = gen_ibc_shielding_data( &test, AA_PAYMENT_ADDRESS, GAIA_COIN, @@ -227,7 +221,7 @@ fn ibc_transfers() -> Result<()> { 100, &port_id_gaia, &channel_id_gaia, - Some(memo_path), + Some(shielding_data_path), None, )?; wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test_gaia)?; @@ -309,7 +303,7 @@ fn ibc_transfers() -> Result<()> { )?; wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; // The balance should not be changed - check_balance(&test, ALBERT, APFEL, 999999)?; + check_balance(&test, ALBERT, APFEL, 999_999)?; // Stop Hermes for timeout test let mut hermes = bg_hermes.foreground(); @@ -365,45 +359,54 @@ fn ibc_transfers() -> Result<()> { } #[test] -fn pgf_over_ibc_with_hermes() -> Result<()> { - let update_genesis = |mut genesis: templates::All< - templates::Unvalidated, - >, - base_dir: &_| { - genesis.parameters.parameters.epochs_per_year = - epochs_per_year_from_min_duration(20); - // for the trusting period of IBC client - genesis.parameters.pos_params.pipeline_len = 5; - genesis.parameters.parameters.max_proposal_bytes = Default::default(); - genesis.parameters.pgf_params.stewards = - BTreeSet::from_iter([get_established_addr_from_pregenesis( - ALBERT_KEY, base_dir, &genesis, - ) - .unwrap()]); - genesis.parameters.ibc_params.default_mint_limit = Amount::max_signed(); - genesis - .parameters - .ibc_params - .default_per_epoch_throughput_limit = Amount::max_signed(); - setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) - }; - let (ledger_a, ledger_b, test_a, test_b) = run_two_nets(update_genesis)?; - let _bg_ledger_a = ledger_a.background(); - let _bg_ledger_b = ledger_b.background(); +fn pgf_over_ibc() -> Result<()> { + const PIPELINE_LEN: u64 = 5; + let mut update_genesis = + |mut genesis: templates::All, base_dir: &_| { + genesis.parameters.parameters.epochs_per_year = + epochs_per_year_from_min_duration(20); + // for the trusting period of IBC client + genesis.parameters.pos_params.pipeline_len = PIPELINE_LEN; + genesis.parameters.gov_params.min_proposal_grace_epochs = 3; + genesis + .parameters + .ibc_params + .default_per_epoch_throughput_limit = Amount::max_signed(); + setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) + }; + let test = setup::network(&mut update_genesis, None)?; - setup_hermes(&test_a, &test_b)?; - let port_id_a = "transfer".parse().unwrap(); - let port_id_b = "transfer".parse().unwrap(); - let (channel_id_a, channel_id_b) = - create_channel_with_hermes(&test_a, &test_b)?; + set_ethereum_bridge_mode( + &test, + &test.net.chain_id, + Who::Validator(0), + ethereum_bridge::ledger::Mode::Off, + None, + ); + + let _bg_ledger = + start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? + .background(); + + // gaia + let test_gaia = setup_gaia()?; + let gaia = run_gaia(&test_gaia)?; + sleep(5); + let _bg_gaia = gaia.background(); + + setup_hermes(&test, &test_gaia)?; + let port_id_namada = "transfer".parse().unwrap(); + let port_id_gaia: PortId = "transfer".parse().unwrap(); + let (channel_id_namada, channel_id_gaia) = + create_channel_with_hermes(&test, &test_gaia)?; // Start relaying - let hermes = run_hermes(&test_a)?; + let hermes = run_hermes(&test)?; let _bg_hermes = hermes.background(); // Transfer to PGF account transfer_on_chain( - &test_a, + &test, "transparent-transfer", ALBERT, PGF_ADDRESS.to_string(), @@ -412,44 +415,60 @@ fn pgf_over_ibc_with_hermes() -> Result<()> { ALBERT_KEY, )?; - // Proposal on Chain A + // Proposal on Namada // Delegate some token - delegate_token(&test_a)?; - let rpc_a = get_actor_rpc(&test_a, Who::Validator(0)); - let mut epoch = get_epoch(&test_a, &rpc_a).unwrap(); - let delegated = epoch + 5u64; - while epoch <= delegated { + delegate_token(&test)?; + let rpc = get_actor_rpc(&test, Who::Validator(0)); + let mut epoch = get_epoch(&test, &rpc).unwrap(); + let delegated = epoch + PIPELINE_LEN; + while epoch < delegated { sleep(5); - epoch = get_epoch(&test_a, &rpc_a).unwrap(); + epoch = get_epoch(&test, &rpc).unwrap(); } // funding proposal - let start_epoch = - propose_funding(&test_a, &test_b, &port_id_a, &channel_id_a)?; - let mut epoch = get_epoch(&test_a, &rpc_a).unwrap(); + let continuous_receiver = find_gaia_address(&test_gaia, GAIA_RELAYER)?; + let retro_receiver = find_gaia_address(&test_gaia, GAIA_USER)?; + let start_epoch = propose_funding( + &test, + continuous_receiver, + retro_receiver, + &port_id_namada, + &channel_id_namada, + )?; + let mut epoch = get_epoch(&test, &rpc).unwrap(); // Vote - while epoch <= start_epoch { + while epoch < start_epoch { sleep(5); - epoch = get_epoch(&test_a, &rpc_a).unwrap(); + epoch = get_epoch(&test, &rpc).unwrap(); } - submit_votes(&test_a)?; + submit_votes(&test)?; // wait for the grace - let activation_epoch = start_epoch + 12u64 + 6u64 + 1u64; - while epoch <= activation_epoch { + let grace_epoch = start_epoch + 6u64; + while epoch < grace_epoch { sleep(5); - epoch = get_epoch(&test_a, &rpc_a).unwrap(); + epoch = get_epoch(&test, &rpc).unwrap(); } + wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; // Check balances after funding over IBC - check_funded_balances(&port_id_b, &channel_id_b, &test_b)?; + let token_addr = find_address(&test, NAM)?; + let ibc_denom = format!("{port_id_gaia}/{channel_id_gaia}/{token_addr}"); + check_gaia_balance(&test_gaia, GAIA_RELAYER, &ibc_denom, 10_000_000)?; + check_gaia_balance(&test_gaia, GAIA_USER, &ibc_denom, 5_000_000)?; Ok(()) } +/// IBC token inflation test +/// - Propose the inflation of an IBC token received from Gaia +/// - Shielding transfer of the token from Gaia +/// - Check the inflation #[test] -fn proposal_ibc_token_inflation() -> Result<()> { +fn ibc_token_inflation() -> Result<()> { + const PIPELINE_LEN: u64 = 2; const MASP_EPOCH_MULTIPLIER: u64 = 2; - let update_genesis = + let mut update_genesis = |mut genesis: templates::All, base_dir: &_| { genesis.parameters.parameters.epochs_per_year = epochs_per_year_from_min_duration(60); @@ -464,78 +483,95 @@ fn proposal_ibc_token_inflation() -> Result<()> { .default_per_epoch_throughput_limit = Amount::max_signed(); setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) }; - let (ledger_a, ledger_b, test_a, test_b) = run_two_nets(update_genesis)?; - let _bg_ledger_a = ledger_a.background(); - let _bg_ledger_b = ledger_b.background(); + let test = setup::network(&mut update_genesis, None)?; + + set_ethereum_bridge_mode( + &test, + &test.net.chain_id, + Who::Validator(0), + ethereum_bridge::ledger::Mode::Off, + None, + ); + + let _bg_ledger = + start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? + .background(); - // Proposal on the destination (Chain B) + // gaia + let test_gaia = setup_gaia()?; + let gaia = run_gaia(&test_gaia)?; + sleep(5); + let _bg_gaia = gaia.background(); + + // Proposal on Namada // Delegate some token - delegate_token(&test_b)?; - let rpc_b = get_actor_rpc(&test_b, Who::Validator(0)); - let mut epoch = get_epoch(&test_b, &rpc_b).unwrap(); - let delegated = epoch + 2u64; - while epoch <= delegated { + delegate_token(&test)?; + let rpc = get_actor_rpc(&test, Who::Validator(0)); + let mut epoch = get_epoch(&test, &rpc).unwrap(); + let delegated = epoch + PIPELINE_LEN; + while epoch < delegated { sleep(10); - epoch = get_epoch(&test_b, &rpc_b).unwrap_or_default(); + epoch = get_epoch(&test, &rpc).unwrap_or_default(); } - // inflation proposal on Chain B - let start_epoch = propose_inflation(&test_b)?; - let mut epoch = get_epoch(&test_b, &rpc_b).unwrap(); + // inflation proposal on Namada + let start_epoch = propose_inflation(&test)?; + let mut epoch = get_epoch(&test, &rpc).unwrap(); // Vote - while epoch <= start_epoch { + while epoch < start_epoch { sleep(10); - epoch = get_epoch(&test_b, &rpc_b).unwrap_or_default(); + epoch = get_epoch(&test, &rpc).unwrap_or_default(); } - submit_votes(&test_b)?; - - // wait for the next epoch of the grace - wait_epochs(&test_b, 6 + 1)?; - - setup_hermes(&test_a, &test_b)?; - let port_id_a = "transfer".parse().unwrap(); - let port_id_b = "transfer".parse().unwrap(); - let (channel_id_a, channel_id_b) = - create_channel_with_hermes(&test_a, &test_b)?; + submit_votes(&test)?; + // Create an IBC channel while waiting the grace epoch + setup_hermes(&test, &test_gaia)?; + let port_id_namada = "transfer".parse().unwrap(); + let port_id_gaia = "transfer".parse().unwrap(); + let (channel_id_namada, channel_id_gaia) = + create_channel_with_hermes(&test, &test_gaia)?; // Start relaying - let hermes = run_hermes(&test_a)?; + let hermes = run_hermes(&test)?; let _bg_hermes = hermes.background(); - // wait the next epoch not to update the epoch during the IBC transfer - wait_epochs(&test_b, 1)?; + // wait for the grace + let grace_epoch = start_epoch + 6u64; + while epoch < grace_epoch { + sleep(5); + epoch = get_epoch(&test, &rpc).unwrap(); + } - // Transfer 1 from Chain A to a z-address on Chain B - std::env::set_var(ENV_VAR_CHAIN_ID, test_a.net.chain_id.to_string()); - let token_addr = find_address(&test_a, APFEL)?.to_string(); + // Shielding transfer 1 samoleans from Gaia to Namada let shielding_data_path = gen_ibc_shielding_data( - &test_b, - AB_PAYMENT_ADDRESS, - token_addr, - 1_000_000, - &port_id_b, - &channel_id_b, + &test, + AA_PAYMENT_ADDRESS, + GAIA_COIN, + 1, + &port_id_namada, + &channel_id_namada, )?; - transfer( - &test_a, - ALBERT, - AB_PAYMENT_ADDRESS, - APFEL, - 1.0, - Some(ALBERT_KEY), - &port_id_a, - &channel_id_a, - None, + transfer_from_gaia( + &test_gaia, + GAIA_USER, + AA_PAYMENT_ADDRESS, + GAIA_COIN, + 1, + &port_id_gaia, + &channel_id_gaia, Some(shielding_data_path), None, - false, )?; - wait_for_packet_relay(&port_id_a, &channel_id_a, &test_a)?; + wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; // wait the next masp epoch to dispense the reward - wait_epochs(&test_b, MASP_EPOCH_MULTIPLIER)?; + let mut epoch = get_epoch(&test, &rpc).unwrap(); + let new_epoch = epoch + MASP_EPOCH_MULTIPLIER; + while epoch < new_epoch { + sleep(10); + epoch = get_epoch(&test, &rpc).unwrap_or_default(); + } // Check balances - check_inflated_balance(&test_b)?; + check_inflated_balance(&test, AA_VIEWING_KEY)?; Ok(()) } @@ -573,7 +609,7 @@ fn ibc_upgrade_client() -> Result<()> { let rpc_b = get_actor_rpc(&test_b, Who::Validator(0)); let mut epoch = get_epoch(&test_b, &rpc_b).unwrap(); let delegated = epoch + PIPELINE_LEN; - while epoch <= delegated { + while epoch < delegated { sleep(10); epoch = get_epoch(&test_b, &rpc_b).unwrap_or_default(); } @@ -617,15 +653,10 @@ fn ibc_upgrade_client() -> Result<()> { let upgraded_height = get_upgraded_height(&test_b, MIN_UPGRADE_HEIGHT)?; // Upgrade the IBC client of Chain B on Chain A with Hermes upgrade_client(&test_a, test_a.net.chain_id.to_string(), upgraded_height)?; - sleep(1); // Check the upgraded client - let current_height = query_height(&test_a)?; - let (upgraded_client_state, _, _) = get_client_states( - &test_a, - &"07-tendermint-0".parse().unwrap(), - current_height, - )?; + let upgraded_client_state = + get_client_states(&test_a, &"07-tendermint-0".parse().unwrap())?; assert_eq!( upgraded_client_state.inner().chain_id.as_str(), "upgraded-chain" @@ -772,7 +803,7 @@ fn ibc_rate_limit() -> Result<()> { transfer_from_gaia( &test_gaia, GAIA_USER, - &namada_receiver, + namada_receiver, GAIA_COIN, 2, &port_id_gaia, @@ -784,7 +815,7 @@ fn ibc_rate_limit() -> Result<()> { // Check if Namada hasn't receive it let ibc_denom = format!("{port_id_namada}/{channel_id_namada}/{GAIA_COIN}"); - check_balance(&test, ALBERT, &ibc_denom, 0)?; + check_balance(&test, ALBERT, ibc_denom, 0)?; Ok(()) } @@ -1056,63 +1087,34 @@ fn upgrade_client( Ok(()) } -fn wait_epochs(test: &Test, duration_epochs: u64) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); - let rpc = get_actor_rpc(test, Who::Validator(0)); - let mut epoch = None; - for _ in 0..10 { - match get_epoch(test, &rpc) { - Ok(e) => { - epoch = Some(e); - break; - } - Err(_) => sleep(10), - } - } - let (mut epoch, target_epoch) = match epoch { - Some(e) => (e, e + duration_epochs), - None => return Err(eyre!("Query epoch failed")), - }; - while epoch < target_epoch { - sleep(10); - epoch = get_epoch(test, &rpc).unwrap_or_default(); - } - Ok(()) -} - -// get the client state, the proof of the client state, and the proof of the -// consensus state +// get the client state fn get_client_states( test: &Test, client_id: &ClientId, - target_height: Height, // should have been already decremented -) -> Result<(TmClientState, CommitmentProofBytes, CommitmentProofBytes)> { - // we need proofs at the height of the previous block - let query_height = target_height.decrement().unwrap(); +) -> Result { + let rpc = get_actor_rpc(test, Who::Validator(0)); + let tendermint_url = Url::from_str(&rpc).unwrap(); + let client = HttpClient::new(tendermint_url).unwrap(); let key = client_state_key(client_id); - let (value, tm_proof) = - query_value_with_proof(test, &key, Some(query_height))?; - let cs = match value { - Some(v) => Any::decode(&v[..]) + + let result = test + .async_runtime() + .block_on(query_storage_value_bytes(&client, &key, None, false)); + let cs = match result { + (Some(v), _) => Any::decode(&v[..]) .map_err(|e| eyre!("Decoding the client state failed: {}", e))?, - None => { + _ => { return Err(eyre!( "The client state doesn't exist: client ID {}", client_id )); } }; + let client_state = TmClientState::try_from(cs) .expect("the state should be a TmClientState"); - let client_state_proof = convert_proof(tm_proof)?; - - let height = client_state.latest_height(); - 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)) + Ok(client_state) } fn try_invalid_transfers( @@ -1310,41 +1312,53 @@ fn delegate_token(test: &Test) -> Result<()> { } fn propose_funding( - test_a: &Test, - test_b: &Test, + test: &Test, + continuous_receiver: impl AsRef, + retro_receiver: impl AsRef, src_port_id: &PortId, src_channel_id: &ChannelId, ) -> Result { - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - let bertha = find_address(test_b, BERTHA)?; - let christel = find_address(test_b, CHRISTEL)?; - let pgf_funding = PgfFunding { continuous: vec![PGFTarget::Ibc(PGFIbcTarget { amount: Amount::native_whole(10), - target: bertha.to_string(), + target: continuous_receiver.as_ref().to_string(), port_id: src_port_id.clone(), channel_id: src_channel_id.clone(), })], retro: vec![PGFTarget::Ibc(PGFIbcTarget { amount: Amount::native_whole(5), - target: christel.to_string(), + target: retro_receiver.as_ref().to_string(), port_id: src_port_id.clone(), channel_id: src_channel_id.clone(), })], }; - std::env::set_var(ENV_VAR_CHAIN_ID, test_a.net.chain_id.to_string()); - let albert = find_address(test_a, ALBERT)?; - let rpc_a = get_actor_rpc(test_a, Who::Validator(0)); - let epoch = get_epoch(test_a, &rpc_a)?; - let start_epoch = (epoch.0 + 6) / 3 * 3; - let proposal_json_path = prepare_proposal_data( - test_a.test_dir.path(), - albert, - pgf_funding, - start_epoch, - ); + let albert = find_address(test, ALBERT)?; + let rpc = get_actor_rpc(test, Who::Validator(0)); + let epoch = get_epoch(test, &rpc)?; + let start_epoch = (epoch.0 + 3) / 3 * 3; + let proposal_json = serde_json::json!({ + "proposal": { + "content": { + "title": "PGF", + "authors": "test@test.com", + "discussions-to": "www.github.com/anoma/aip/1", + "created": "2022-03-10T08:54:37Z", + "license": "MIT", + "abstract": "PGF proposal", + "motivation": "PGF proposal test", + "details": "PGF proposal", + "requires": "2" + }, + "author": albert, + "voting_start_epoch": start_epoch, + "voting_end_epoch": start_epoch + 3_u64, + "activation_epoch": start_epoch + 6_u64, + }, + "data": pgf_funding, + }); + let proposal_json_path = test.test_dir.path().join("proposal.json"); + write_json_file(proposal_json_path.as_path(), proposal_json); let submit_proposal_args = apply_use_device(vec![ "init-proposal", @@ -1352,16 +1366,15 @@ fn propose_funding( "--data-path", proposal_json_path.to_str().unwrap(), "--node", - &rpc_a, + &rpc, ]); - let mut client = run!(test_a, Bin::Client, submit_proposal_args, Some(40))?; + let mut client = run!(test, Bin::Client, submit_proposal_args, Some(40))?; client.exp_string(TX_APPLIED_SUCCESS)?; client.assert_success(); Ok(start_epoch.into()) } fn propose_inflation(test: &Test) -> Result { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let albert = find_address(test, ALBERT)?; let rpc = get_actor_rpc(test, Who::Validator(0)); let epoch = get_epoch(test, &rpc)?; @@ -1369,14 +1382,14 @@ fn propose_inflation(test: &Test) -> Result { let proposal_json = serde_json::json!({ "proposal": { "content": { - "title": "TheTitle", + "title": "IBC token inflation", "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.", + "abstract": "IBC token inflation", + "motivation": "IBC token inflation", + "details": "IBC token inflation", "requires": "2" }, "author": albert, @@ -1595,48 +1608,12 @@ fn query_height(test: &Test) -> Result { Ok(Height::new(0, status.sync_info.latest_block_height.into()).unwrap()) } -fn query_value_with_proof( - test: &Test, - key: &Key, - height: Option, -) -> Result<(Option>, TmProof)> { - let rpc = get_actor_rpc(test, Who::Validator(0)); - let tendermint_url = Url::from_str(&rpc).unwrap(); - let client = HttpClient::new(tendermint_url).unwrap(); - let result = test.async_runtime().block_on(query_storage_value_bytes( - &client, - key, - height.map(|h| BlockHeight(h.revision_height())), - true, - )); - match result { - (value, Some(proof)) => Ok((value, proof)), - _ => Err(eyre!("Query failed: key {}", key)), - } -} - -fn convert_proof(tm_proof: TmProof) -> Result { - let mut proofs = Vec::new(); - for op in &tm_proof.ops { - let mut parsed = ics23::CommitmentProof { proof: None }; - prost::Message::merge(&mut parsed, op.data.as_slice()) - .expect("merging CommitmentProof failed"); - proofs.push(parsed); - } - - let merkle_proof = MerkleProof { proofs }; - CommitmentProofBytes::try_from(merkle_proof).map_err(|e| { - eyre!("Proof conversion to CommitmentProofBytes failed: {}", e) - }) -} - fn check_balance( test: &Test, owner: impl AsRef, token: impl AsRef, expected_amount: u64, ) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let rpc = get_actor_rpc(test, Who::Validator(0)); if owner.as_ref().starts_with("zvk") { @@ -1698,59 +1675,17 @@ fn check_gaia_balance( Ok(()) } -fn check_funded_balances( - dest_port_id: &PortId, - dest_channel_id: &ChannelId, - test_b: &Test, +fn check_inflated_balance( + test: &Test, + viewing_key: impl AsRef, ) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - // Check the balances on Chain B - let ibc_denom = format!("{dest_port_id}/{dest_channel_id}/nam"); - let rpc_b = get_actor_rpc(test_b, Who::Validator(0)); - let query_args = vec![ - "balance", "--owner", BERTHA, "--token", &ibc_denom, "--node", &rpc_b, - ]; - let mut client = run!(test_b, Bin::Client, query_args, Some(40))?; - let regex = format!("{ibc_denom}: .*"); - let (_, matched) = client.exp_regex(®ex)?; - let regex = regex::Regex::new(r"[0-9]+").unwrap(); - let iter = regex.find_iter(&matched); - let balance: u64 = iter.last().unwrap().as_str().parse().unwrap(); - assert!(balance >= 10); - client.assert_success(); - - let query_args = vec![ - "balance", "--owner", CHRISTEL, "--token", &ibc_denom, "--node", &rpc_b, - ]; - let mut client = run!(test_b, Bin::Client, query_args, Some(40))?; - let regex = format!("{ibc_denom}: .*"); - let (_, matched) = client.exp_regex(®ex)?; - let regex = regex::Regex::new(r"[0-9]+").unwrap(); - let iter = regex.find_iter(&matched); - let balance: u64 = iter.last().unwrap().as_str().parse().unwrap(); - assert!(balance >= 5); - client.assert_success(); + shielded_sync(test, viewing_key.as_ref())?; - Ok(()) -} - -fn check_inflated_balance(test: &Test) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let rpc = get_actor_rpc(test, Who::Validator(0)); - let tx_args = vec![ - "shielded-sync", - "--viewing-keys", - AB_VIEWING_KEY, - "--node", - &rpc, - ]; - let mut client = run!(test, Bin::Client, tx_args, Some(120))?; - client.assert_success(); - let query_args = vec![ "balance", "--owner", - AB_VIEWING_KEY, + viewing_key.as_ref(), "--token", NAM, "--node", @@ -1768,7 +1703,6 @@ fn check_inflated_balance(test: &Test) -> Result<()> { } fn shielded_sync(test: &Test, viewing_key: impl AsRef) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let rpc = get_actor_rpc(test, Who::Validator(0)); let tx_args = vec![ "shielded-sync", diff --git a/crates/tests/src/e2e/setup.rs b/crates/tests/src/e2e/setup.rs index e3fa45c778..c3bf524c2d 100644 --- a/crates/tests/src/e2e/setup.rs +++ b/crates/tests/src/e2e/setup.rs @@ -94,15 +94,6 @@ pub fn ensure_hot_key(key: &str) -> &str { } } -/// Same as ensure_hot_key but for addressees -pub fn ensure_hot_addr(key: &str) -> &str { - if is_use_device() { - constants::FRANK - } else { - key - } -} - /// Default functions for offsetting ports when /// adding multiple validators to a network pub fn default_port_offset(ix: u8) -> u16 { @@ -1429,9 +1420,6 @@ where #[allow(dead_code)] pub mod constants { - // Paths to the WASMs used for tests - pub use namada_sdk::tx::TX_IBC_WASM; - // User addresses aliases pub const ALBERT: &str = "Albert"; pub const ALBERT_KEY: &str = "Albert-key"; diff --git a/wasm_for_tests/tx_proposal_ibc_token_inflation.wasm b/wasm_for_tests/tx_proposal_ibc_token_inflation.wasm new file mode 100755 index 0000000000000000000000000000000000000000..323b361a004aaacc2a8901c1688151b0c8549c56 GIT binary patch literal 331114 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°RgK6Lnbu()#5l;6 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⪻K&2K^XvWwh;h{4xy6If9?ElGOp&@- zA_?z?Bz&p1s~K)8T7jS{{()fXL{$TZqJdx`G&_oihGDZgr>gSiZ9R0ym~^8_rhG0* z(voG*twI3>VWlc-kZxKGK2nE=Z&Y6+` z=QBGWgS5yonUcd)Dx1YHskL2x){fS&9Yn&J6-wfG4N_(-D@ODmIPYSy9Q$`sUDBk zkXy7yb=vT~CGMcFRliV?%Y`M?<0o$$X*(YTcHV@NXkrZq9m8hF(Hd{H+&uhF8XzJd zmB&uGpMld3r|FNN^Kp)OeahZF_~EgX85t6Z=nfYaP+~RLcN!NsW4)+?j+$-;-lvK~ zzv#NGs!K}XJXNdSx=x8m2d&mW#oW9zw65!G-joj)IFzRO2uJl-ch;Ih(`L!85RIui z0wXm5X0bZ2GLWxgX@PkX+m8G0Jnwr?m0o>jj%nc+ruv?2m5W!`q7QJPj zx-}NUw$32=lEYO(aW5|g&DMIsSi2Md*Oa+r-ukI#)~vK{GnF|H?&L*Dgho`I|00rA z9db-o02yz+@Dum7r=FW1Rc?OtKzk3l83=#FnTPg~UK0G;66CL4B1+VX!HZcj!QBcl zduZrmffpl0aQ!ERb|qu3Qz+LWcPB%lY!&{Q^^@_|)C}LSG#iyxLn7??mZi;c-+WBD z&nA~#e#S$&wCvgkQ+6M^nh?Iqmg0`ao_)#xqLj7lX$cn}<Ha@aly=tx)*<2@MC{;*)&`piJT@FQi*%_=;ZuC`pEa&|~q5I5eSIVg8p zDG;=g`ZoGZ$v0_Bi3oDGd{xRkP%igdO+K`aV`%CSzZMNp>{IcmwRM1LAuMO92H+mU zxXZarNfqdT#0CAKSw^Z8!*TN&Kn{VThMCknf05PXo6U~&bEy86Ei<8M2K=!gj%!#-aW4bw~gUdYGQRKXdd4L5n zQlNBxA}ad8;VYW-G2VG?7CJN_8U&27%?cYeznGBrKZtRM7hJ_Z@gt36OJNRn7w7=I z`b|Omjq*h&^+b+$MT8%*P znTJVW4q)X)$_d2m;ujl#V=~uzWnNHW97q~G8or2whM&^VjS-3=ecJIoI}a8Q1>0dU z6T1`bi`&2nrkicxL<;8;+CGmf2Rww?`l}!C&iN76t7FSJk?fZRw?#Sj+opICx zI>~4mlGvSATuSs#um)4$R;PN1 zA7zoEm+DQIGVU+*@&VNbXwzOK#avnie}Hpk=?EW`Y+9-8kp9zPPgmsUbg$ANY}{U| z)O?6yhi%89io1(rAsBe&M7pe}1mR~gGW$8w8J6pXTEnoFf%&mmi$m-8% zp&tnxOB^U>+el}RFJ1F0YnIQ*=m;|8!qV#oUMT%CP6zZp3(mMuiS0M8H|D)7NLX0@zuN#UMc@d<)Z=R)&zlu7l0|Q<7M=bL7qgO&rk!D- zMF$%hUkZ!+4}xYLvlk#OTRDZ-6BDB~^UZ%6V!L+o%0GVuq@ql=Oam>&T&%3XYb ziix)AL)8#@M9A2H>_gR65whbDGMq{@qf1B`r-N&x3}c5#86gc)9)UBZJf@OB%IsvZ zkusAL5>YSCy;gJ$Qf6|alQI~Fz^lysH?S}wOXBO$X~2KWOXL4v5&xW5#Hm4Zp=eZr z2xbRMnHCo9#S3$?q!YCST?00gnwd|Arn7zQ=R6nsfF-(RQz$;&S2r%ep!by<%`?^O zLiwtVMrI8Q9ik0~hT<-x?cxLn<%2oz1bzgOkC%42n8tzwA0J9VqqGY^H~dQ=a$oDK zZ5eO@kk(QUQJfnl#_gjuPWEsbALKvCL{(b#S_HAcc%LxiaV33cOU;1*d_goYZL=NMXv@*!l> zx8z}KT&>c^i>GI>4HuXAO%K|d&Js_j%B*)kFgbV^l!kntnPfeqU3? zH7Uk-X9au`vugH1p-pY$)EDqjlk5mpp%YPja36RQWKxgLHGq}&KivBU+1^ZrLF2_Q zR@^KCO7cP5Bh7~mY(}ApfcH_-ir=84ea8Q5cbpS%7TO|2fenJe^(fMVsre~ju>z|z zfUZ$`Bl@PLGdmdf)n!^D^L|{eJbJ*C1Ap77>(DsCSgO$E;V6?FJg#&-#`6T_4M$fW zRB0iB{u8{b(DxJF9-Y~)qz&u%EgW{znBU59`0ehgXmTpJrEys+T$}2xtXRK1u+gtr z{XeYB8tEoD_0WC7sg2=gHapP`QZB0>gXIgp^PR^ z|E)MFQr3JolO9@GvHtIN(qE|l?|RZ-sDXc)N#{)Y-8OILUYP~=N)wgRJmZGPJi8ZK zf|M&$&3SZ_dsk-1jB{D%WPR7>bySgFL2wfI zH4}b~w$vl*75X&Oli3Bsa2794BWzVNT(+T3D)tX@0e_wZ%?aeJ~dZPxSRI7Maj%7 zQ)l+fNNV6P=@myo%_Z+6I)6y#6~4#ZONc8V=Tkz+cGzf5pT-0m29Sx}PVU9(q2WW# z5A%=*YsqAG1sHAZ{Z!0|CNnvfG8Fxa9w&XOM^GciL1sq@CWAvI4r*OvBoO>ZD8z&I zGA_ zjYo@(cXXq&k2p0{B7Dh})H>g2459_1pBkQ2zzrrkZzxDf@)|m!bOP9fkUY&*iO-%R zGd6885XS9ljrFNs65H=E-=P*Wro&N#jYBHMSkSJBF||6;mns4l3Tqwb!&i9*Ziau!bwMd&gv(|zt*F-c1LdZn(*7@77K@eUp{j4zt8)L$VDt1 z;Mu1(P+lkx=TpMmkgjGrtLW1RD}hcGcWI2etA^u1a{6tmAn3uN1%8e2ORBUHX;I<0 z0F@sIgf<958VwcMH|rwI$n1Q~r&cReS{RVb+*+ zdoXsJ;j3BHL4wbKx!F@3Ea{I~w`@Biw{pZIoi8v6b}|M&lH z_{}HuwF?KQQmD2-9W zs&i+x-Rw5_#du6Z@Wrj+wowrj8{8UHrL%4q$9AYGG$~vhJH!dX3=N7+D#W9nHMEdj z+i5a2!RdzHw?}lCH7?Plk~kxj(rb`~LnllxgXSZt^(wW(T#M)@qZZ*$IZz{bQOUz4 znL%+?h*Xt**Ey808WU|FQ$Z;q*2a;79poHtTGR^c zunA71dFDxd`SA2g5?aoMrD-*ked1a1yAIpt(DtOY9#233@ z*!VtXqcRpk7wTYNnX&RIIN`Yx8Q@6*h$Zv0a7f0T#;fjZBV zfLPjvepEC$lPXNci;^Cj1UD4hwn*J)mm_%kXLNRD%=H|Z;)W5LU`r|>7*3QbQsh+X0jw7 z!D?qnAvw|2xEM1g#}(+Xgwli95I|eXl0x-R;b`Z46h%N!r8)Lqdq%rSo~OpTl|1Lf zIMW9wxd=FfAnbxOJtZbQm=U;P<5w&)#i1U4Ly`+hd&xTYl|U{+5jF}0J!0o%g-j&p zoy%I7TT?8o@In0NTk#Niibj#cW?(26#YJyBapc#f9Qlpm$WDHKR_fW^oJW4hGqaCN^?q`4p!pM86uMUtJ7va}=TW z-qf@+lqz{f*_rw4Aya9ugp<`6keEr|ht{ogFa!nFex+}6W~CD16f;GDZJ=YqdN-8;tRD{m3g8?KvmlK!i1~IQ;l#1m14p%%Eo+X z)R6J1LT9&nmWX3#cNJ{bsi@hk$y4>VV0G=Sj_Q@JTIr8QcGc7lT)Lju>sAXdjUF}H z^=c!ie=$Y18YI^09SciTssM67(u`HpE;Uc!Ed@-vhK0O? zV!j%CI)snLm@1Dv`vaQ(y9${+(ulEOnCd(eT8st~TzJ3)NoP+z4P_iZ&yu`+8OdWP zXlg|_BlkRSC}h=7SiZQB3fh?iw3PnBaxD~v2MHTz`ArZdk*^@V99vD(3XgQv@(h`h@WqnFX0lK=ND4+UFcVJp-deosZt*K*~*0Dda<~66d{93 zbvN?RZED3{>dcT7RZiz9oRnXwySQH&Y`aovwM(MAnGf(;sYvi-cR&&wOk;J2FuVI~ z?Le0*!7|xj;pLfz?x)e5DhL(g7-3Ck+mDc!+I^W$SdJcj4>9j5${eA(A5nliM#|x4 zS~^?77RWYIEt)U_lwx`99z`lndmmwEl-)(D80euX9xGCzU7k(OwMHXM1iOOlNzN-t z1baji;Ep-Bjd)(47e=amuEI!Jg1sk^Rv-)6=^WWy8fgw5t3M8TFOeNQF0y$pFGjDO za1?#+J#stRih=?_JEk7zE-g3KQt=p-q&Ju+;Z6f|lb}e#6hu1>{O@P~OOk&tC1~+Q zD06gZ4|SPm{IsoeeJUx_S5IZ(dXpscX2|j~e zr5V%70p^O3|J=814hXp5-Rj3j)58v_Xwcs3$3|1h!*sZWK_w$doxFU*Cp;5Hv6$?Q z`1ikTe-CUwEbKCH@~~En?OmX`$U187yujCjYEktrkyyPDmdJ0e>~i}D-I|S7cF{l$ z9=Og(q51)gaCpdn@PJCPZLHd#Zm?PYa?dIzCwn64A_>Nr=TA7&=&H+r6e0IgBx+Px zWh1Y_g=XkXZ;=<2kD9P}(cEWLLuBOd8|9cz67owAyzy$XA9~JxUs9OOUhXpd6QkEJ zC>rgO{~#SyhgQ4Md`9RQkDUw|*hZ0|cm^Jyc$nPeUCc^%vU^^^o5_H-G910qD3I?S zRfw~+$oTbRd2|EWl1ihmhf>rn3ng-oDKSpAr&1_-DCg`gVv~4k*hoU&O|$;x zjv>8_*8Pu&#X%Kruu;}U;N?Cm)|d_iMI|yTJ&eDrFMvPQxf_g+8a^^9?er6V+ntp2 ztzq0lCIdG&y7{PELrwo!sCHr{bK2-eMm4ZMYdGB6JD*T6)l?TaJ*cE`*f&Z}Ib)3o?SS=u;^Z`vBmM}xz4RSIUSFE2I;qN?9YLV^a_9}6949L*M-QJnUS(`ZNL2Xjm@ zcMU8t#i`HlEyvH(4x!ZOAUGwdN=^?BwZqYl>^S8dRE(46ltY|22OZ)#`8xPtHpZKc z!!cy@aOj&p1BX%l#W-veaUKq*>z$30)k$SBpJ@QgsN&Se5ev4Ozw|-+wZS!?`0Xc{ z@K+aH|IEgwuXJ>oRaTnV^BoIplFFfi690gsh^F#uZ_Kr zjlK7-W3LXr^6g*!9RloTW3+&%Z-ibl66N6$W2E|Sc?>Fx~gI|3A^(`Oc zMC4$@CGTEyPM6p}^t|sKto+s$Ynh1HBe?z-U)Xehm)Lj9_YW%X-GlqzzGEYl-z&KH z@`u*5jX??JKlHrkf_H!ak4u@Z;RSDg_wS!fb&35$&wFL?=5w#DVZuVU;HE3K{q8;T zT|1g0XBS_plPVx0T4ftVD7at|XGK$MbMxYyR+UYND#(>7W1b1r`^)7hWLy;svs=a)IotTp;`61@sm#ptpDd zy~PXYEndJw@d6%-7w}NLfQMaqp{X>*y0WxfnEHH*t7cZc@)JEuXVG3eJ6CyvPL)f9VUip0E1i zjZb%c`@Ala`JwZoGWg@qHms+n?iT#?p_|8aiQKn^a%U3>(HAQaeX#=37b_5bvEu*j z>f-JnzOoI4T^(HV$)~^n->jl)g6lrJ^)r|)wZS{Tx#Oj-#`11?@jth^_}(WseglQ= z22cLs=8efNlKG(*i=M$HPi?;L990*$U3>YJXLpHxx4ihDTV4G4(U&%v>SFy*w}0|u zU8wP)^P+q3md6F*+_-`uofz;V-8 zFE-W1B`@E-?!qpTuv=dI&#f<3Z~5)(P@_8d)J50*gnbc8jLHwaT+{^L{QD2T!bJYs z;L%stf46IGwOd~NU#c%?Ni=vlWrMpXqrdh)ry(!A&ueB(3QHvczw zx46L@&wS@T&SmczJihjgr$6N81$ORvkPbUnCM|ZZOj;P*)ui2R^P-34h3WR2W?SDg zOt;?$)$FbfUVG@151MYjS1-ADL)R`4)3}*s8#gD|#?2{t3X3||WW*P&5udk4eAx9x z|C@5WOCx^APRAa>>Qy)Vfex6OVC}Z`H+HSNO$&3D?QJ|ky^ZR0q_C)IeG1Mln-|bq zDTCf>UO;a(FQE5q9E@P43?o>)zz7yEFa)~t;ypGmU|G}!LXH*ZF1uYIisFP_ij$s7 z#Ys=4;@puMUhwi$_kD@FyE^#C_O~zT+SD`g&B~KHb-|i4dP*MgP>-WxCkEx17?fjT zP>#a}75P`}=yt^p`F0h1W$@?MAN+>tj{4iffB0Lmsn>(`J@l5dBfsVdRr?vOA!45r zRu37Ln7J_~RV>fRr}b+V(-G)4=hsZ1=@I3A1@o3zjzipLh;AVhDGJp=bvrrjcsIsE zqV`sPrq48Y{Hi{)wN;~YB}>M9vsSG)4t?BO$42M2*0Is`taWVkf0yIX8?K>4I-(g^ zP)D=_ojYfoX&Hq_Z@q6%Wuvpj9tpmQfxs?jzQ>EF1Cfa0IRi)%BSOpw?Hqt)-g?50 zH<)mBdLV<-5S&F!(VU7jD`1#Y0U@I~6*+!tvRyQCN?Kz!$$ZHG2XSg`igE;}iIX6L zXr_5~IJqz*5S)R^u+%0z;aM3bsY)QDY#N|okyv;NLUGW9q0WcYsh2&xGYgE=c8;NH zr6q9^f9_$^`^NyOmiCyDQfRHjnWUBskN(nilUk+cX~;DZ)Sg9Rd!E(C-xPnIe!p{z|V)BTp~@Q&r&1%1!r&)$UU1!ZTo zF%^gjbD*G2`asbieT(YBnIaU~^gk`h-^m|$#3Nd^^=YXWi=5IJVrYuj@D)tBZ( zkL-(Da!I~Opz>9td{vr!#m?jtlPP3ej8t;jIrc0jnNg?ru0D3n$66+8Kc?Gur$|FFf6BweMHdEJ^gb8P0w6g4KNss1 zFwK+jqC%nqX#Z)}B}Z{+8XW_ccDf~zbPkj<aic=co3g;d5fmO{c+n8ES$r|XarIiH zRlLPXR^DW$0xMo-j3{j+nCzHo(T^%acGjj&wcxyo8;cLBi%DrTzm!l`((W=*Qo*hn z)6}Rc)I$91sA}FZQ{g40=8g45(z`QZqr)LXTB<H z`#Yt)m{RR|OsO&Riur065!QE!&`5OJu9PUPvOd5FtKV;gafi7LstTE9@>^9}PWA|R zE(t5$=3bH-?K#4^U67qg4NP!`M>+lJp8K8sc;_cA1jlRwLfHH;94}CODQD(49QVvp zap|q6^_I=fMN;|RV(;;5fAQ!6^XS4E*2@I@iLV(Mx!>66N&by)D6_-d%UtRPW`-i* zw<~ZzxcUy<=wKM18Q&ykBL2vKSZ842QG{gn@`v~39QA6puF+gM#7oba|3n28uJ)Cu zo_KPDH8hc<4Qkv#h3nkDewq~J~VAdpZNoC=536E-W%lpsyz zBC703sz@c+tm9LSr)+70vZ)!3QILC80T7uIprfW@xzz|dPqeJdWRBWY6{4B8WlICu z%no+ENhB<5Y$0V?Ifnq&2+9T z3_&GHqV47kpNe^9tY8RLMoHam85k4q^6}gs6?>6^?D6lLHwAXiNSl;;7_20Uxtj=9 zhT1X|JhMhj&n0kW5-~{^V&VnEnaC*-3&o910!W-$4W??YOtNA8*5j8&EFvad@6RbE zc;yLGp$y3c1XRgCaS^PA(!6{Y>XxG|_M%msR7*+)MTWt7~W#nWjtw z4jit>F*_L5+kKw>a!t`JsdJ;UwjuU!%Gz*KAj~EZ!8WOipdq;4BsV-u3Q|&hBxzS% z3gv3Ei`dSC2S#9g*YcMtLCZ~&-lW(hvV%&~k!*3D4=di0TPsTt%E*$@HF!8OufofZ z>CsXK^3|!1vS$+4PPLJtj_O6iED})Dkl@UOKEqv92V0C9ibx@ay2drqnKarc7K)>YCRygMMgWVNRMT6vh|mZz zC*L7b(zD@LNux7k>^4>mM*Cuf!lFbQ4F?e^+D2^!>kQW#gC|NAeNp{yEq$sLeK5!} zEk^b{1k?yr+G<~EL-B^v&u%yramW^n;upDHO{<<}rU3G}(a|x&poq&PG-?5LGYl^4 zz%ue`Cqdds6qjetbB*7+O6$A6hcVx&JUSN{TGGqPi3M!GBUul(r!Ggz5Jqe9C~fCa zTT)9%9Bgt_Wf(d&ICv#ZTH{H1B@DLK`Ps$Du!1M`-VldsO;b3vz_QB>Yo42FpQeVe z>pqzTZOq!DrF5ie?n$^@AN?LLkScGI$Q!OBg0Q3os)bX8B}@2?(WD^#&{3Zed2X#V zPWG{wn<^1@x1OgIM`l%;)XHxGTJwOdGVEcOiq_6aOjG_~Le^$2rtBri7_&Q3=PZ;m zQb$qDT@ePVJu5;wn3>fwZhS9~k}-Sg1VWt{z4u=c2fi`FYu?O{@GyFT_xEh3r<$FBWg#s zpUgeO*)XN#R(_NolOgqcm<$n~V-nvv0X_R!H=HSJX2?pC%AvTV!|`1eUUrl5CIxlA zcY1-%xZ?qb_96`dvo#l;9rRl+;iV&@ov5S$R&OSy3r(R{^2A)82diJy;{tSoAi)K` zd)D%THKQV{a`j92;7$Cj<(v$pn{0Nii}0Gr-O~$f?;o>~yF~8U$l)bh4z-&|qR0zq zP$!R=SX%&5v^^GNO%+~e&dOng3|bpCBHvE`oVg*;of3^M(|aeoHb&17q?G*wg#sz1 z^x+)-i;Sr%jp@*lxZPBXU6086MPN?qtD z+Lxb!1o<+SiL*1k7)b0(theT4S!KmE^XVDVY=$wior<*4sua7Um9a;S!AGWyFtJuq z;wW-Sc1ps-C`>6i7x*5GlObwWZJB>p3fTQf4@b-XS%py@t(e!Q2bDe(5!%znNU9=HpKJ$N(#Jvt zVf$FJ{fQY#ATh%9I=hHgi*1!WuP*3!W>#B&kYt{jQ2n^+KQ&Q@CN{pYcXro(8q_bA zF3)~G=4K<+NRLy@sz!xO!S`L6$2u%GACD28jnL2m>Ugs7tO;|w7WU-+Y7|gt+p0^A zo;aeRzwH!kQLC`A2h&zv6j&-0+>Lh0+BcYPR*n2c!ALD=$7-yzIA8RR_9Bq3;Xljn z(t+J0DJHI93R)j&vq~?t-D)wAE>H(}Dp-s1Oe+t*8mQXclnpr2sxMON)8wbAPjGig z1dBU^VsKgMV10KAp&6|d!??CIqhcp0$pXh?OAJ!B6P#sN+9-m~pcEIoXbrZ47}+w3^3A3kzt>@359F z=^LJ<<_U_U+}5b>qM)9WPrXT0CZ>Wy8>2kC)T)u4A}Sf{M4zHL@EKOD7q`S}u`(hF zQaz1WY${(A%x3epVrtz3y;b6)bD-COtIdb?x19a>Rw?DIty-1JyAm)MMBhqB3RT0A z=DZ57XCFiCJoA;Z`*e6(Bh?Z15T~}urQBVQTN3g$3fYDj{q^HR*dy0&;X))tnKC+q zQ$SJ$r?`axovW;jX3tmBl0t)}%^nvXnk>Z`@nUt_UnUN4kU2;k3?I8_lDCILoCW%JbzN+o`V{;lY3PrNP5>zq^x!lQ_qZH1d*y>bXY}%Be0T*1)cCn@{L-NVJvSOkOZkMT^ z`@Lm%XHM^?Uq}mUIi}1*QzU$|8waXXtLPGHNt%#5!-axY?-;Ubg}h-RS#I#wq(pJ* z#uSB9HHqP|dDIa;at&+Inm6UsA`{876qV=Q5}S8hk*)^s`S2WfeaY;qFPZEZyBqqa zZ_O74PM$X=E4`SD<-}q-woJw}G(!J}k5+*m|pLwT>#&ULRS5o1tx zeq3W6YxL}f`^>Y=a5wto0sUTWpKlV^4IQ!iCmYwjno0Y5dfjP28g4GJ9b2xLEzHO(TWM6jk#%{^LL*k|NVYRanUi{!|((+)- zCl$nIV`(U6%C#Xlx}2!syY8SUOU%y9{m6RLJ}$(P2wpTF|2X=X{ahND6d)!3mU(01 zm&m9bDeJb}NNTrr3S+P(zL4QJ6cmEq`Ezser(SM?9LST=NH(BQ#Mxk8No8a5VvQHo zPygB_OLl3S&1Ne1pz@(wM&;E|8<(83#MkV~(y1w56m7I~n6~w}+hp~T=wl`G4ETey zINWyLRy{AKfwI5jo8FXr+%W?~yA{9Ik!Mjl|9#w_HgWeTetp;b`ubNU z?(W5}H@&Z~H}8=0M|bnJB<6DY&Ak!Q(I_BMKKD@gM1GQ;EACZp!irbc33g(6PgB)k zjlxE0w1Pw;aE3V>6ts4D@n}Ii>vX5V_K=1RRGqYO6`og+1(nQQWI5m9J(>xwq9C2k z!9sZ7VkDfFm-*5*aBMr3s(cg2RBX{8M6~vv22bu4oA?IR%BkFIr9#r+J<6$amE&gzS&B>w5hrg6 zLS+*rsb`6?iz%>UBjQ!*GAYlU4g4x&%Y+tdxJQ^QTp9RPGVrUyE{b@*mof0mVTO&( zv?!{A*B$1wzwTh*do*UlF8^LrD^#zea<)*wwT9+Nxm4_?z^_5aS1TNN@3!V^q@+P@ zOlhq3tBgt9fZxc>zdjk|Q0%3}lY32hDw_F+R#cSRltl)4u9)dvXFRcsjJsjR6J(r( zBuv)n6EulSTdPkjN|2aMGQZ`}{b2Z|JXlTWC+Mf=`_R@dq^yOnFEP#A>HneOcvu~> z$v~Q)Ab?9P!%cO~Q5w`y)7e@GdBF^#p06`POxwpKi${wX*VEf_WH#xu2RmH|ruzk1 zHdT2YhVq-=L^)fY|u z>2*t zFkCZHq7JQym8*AD3^au@?EYV68m#pH%QeD~8RGDZ0RXx+)YYTN)g@3MZjq9Pfrw#^ zE~E2`LjWp>Z_$}xnyth6S=^gX)l@onrQw?G(S}8YCT(Vu`WEuIt1MX}JdgS9@{gi1kd1^Ar2-mbllZ%k#*c{sT!H`^e3I$@V z5vgzR&SCp6YfKoULAGIW0LsK9g=!izdezhV4bOxpmtDn2Mur5-a9zd0lAr^#vAoRC z7(pP^l7?PvlZoYlxWq9`p?Xr@l#+(2P`+!!j;bLfndq#J0TN70n`xd4hq>B;mZ$Gz z7n?>W&8C4doNvca+R(4Z6{d5GwNCN(YlJVzz#I z!ffbgTZO6I)gq#Ot#fs1HK<#w`zK?CURYD=F{FXcAQl?NOmsvXhLHlh{b=v8Y^%!? z^;(Q|dgdI08k_CH`RDu*JKo|mvbdakUC^&P3;(-%p1pw*1utKXFgw$Ydg(LP7y7G9Hd zQ{VL}hYm8$x0p?Q!l|Og-IB2CV970#z^>aRQBeC3i40$Qne)}$SCwb7#Vy6UmXD&~ z+tCj!QCrEFVw4YAw%dxRH)Tu(trsaZC8*b}tHO?pV)aL>N!1^euU}l~OaEelxzJk} zxkDWK8eLP2bh5)(Bgv=m+tDs0B4f5%%+I)ZEM$$3^|(FQ}}lmV@L?T=-nXq-W|N#n%h5Cb`U(@CaC)pqdw9 zUE3w>*#e$3{nA8H@TuNCX-e7!)qaZ2@Ck=ZQ>yHDVK^m$*pJDKpUPLO>sb;=VNY1o zpTH8z1>sct329AAf>QLT-G$Zcg4-o*o5nCrm~Z)N6>d#ruOWzy2wo}J|#cE*bQ}l)gcuLYU4gMq{wI$8=PFo++5EeKpT_Ph2}+2uZ9*? z4Fd;c8LODdB)T&PSi&Esj>vi~X*gw|J*iBpTRus!khacLD})_9V3HS=>pp&;;I1xD z&^U$@`YK`6f#{d7x585I*JyyH-tWf%OE%bGI_U=oPsoj?ei^>uLrvxCAY*$y*m|r6 z(c-9c&+kX+?uQjK(C}od`PL4WK;Lm9^8SGf+lcIty4>F+`7&JU^8-yHO!&2af5}B2 z!?J&VAHD7$#M{GyQLRp~{up2ReF!Gc&sa36q_ae1c~#2`rHC~bQm+Fk3ZkV|!iaON ziUo{_{+Umx^6Sla;s+n&(4y_9DPu9a%zP6tLPb~cHu zQBY#6>E7Alp)nf0g*FWKeoQddGTW3!%F4pSHTsMMGVHBT8QQ5anS#!D89{$Uc7+{F zm1b~a>d*8vjbda1xzE>G z5@F-^Vc5^_Bj)>%RBsC@+Y3(N;zMNK2qxqujE_KxgkL2GsSadjGdjkogw3VZHN4Q^XGKIrrVDu^(*n*@1LLN!vo?mAjmFO;t z4&BrxF;>YGGIf+K%>+~KZR~EFxuL~K*$W5BRGRG2m`B%Km8y6WLY7mDI)?^o{Q+We zHO14)V}C1;dB2aDVL}NEUr6~H-k~aZ6wb+`Xw;el9uF8HmmL?}qpskvGnFQy?M(fl zdA3^bJE*pwH{1=U#|LXoIlN!SA{G8Vd88zt_Xp-{%y8VB#&7hN+RSQYswZ1Ov$?G* zr%=Mwz-AN*i=sFR1#5G!$cN;J%HHVN4zxcNWG}xjRx|@aGC-*{Z;?wQa%1RjP=ZO9 zMwvSFTc#xIclz;D`GCar;m^1jiwAlPSoBk4zcK?>eQbpimE=%d)7FPFL*3)|q7F*u zGg2qL{5spi)r;^8>H$qr*AhOyR9rLc8)@4$=D6b01lH&N9_93gWMQBNWt1o-l~kMN z-Sx@BK1Td7`c)02%$%WL@$%(Wlex? zV0s~^@!_M!&nzlbh0`7F+%ZXYp_Xr%Dux6xLcBPV9#7NB3ap^g{{qx@;&WR;n^SWhT5;iN^|I^a;tdc1T_qKq01Xd|jx zJAqOLC3oR;O51D@)iBUi)ebNz$wS0~SRhT^k6dAL=3S$%igP(Jdq}cg^rp7Kcy_30 z6@ZeMGT9w4$T5A2bqc*7G$##(eDNXamGw<}3#ss7-0y7;ETujP`y*3+efVyGEbzBD zTT>>nl|H{ptV3{=DbsseVCZENzm5D7L6zSt3fep(Ap?A++E~_p9lr`hNlQ=KT3o1A z@i#%%+FVI9*gSFeY*iQ<{jLlB0mU@ZL_oS_Y?)b1)G0==poix9La9z(`(~br=7^#r znaW$7C&~~?GMw0p{xt%P!Dm|wR4KGr%#0m0qBhHPkrd5@jk01W!hzrecuE&^ltDud zTZSlAb#ysV#yied#|N=f{2Vi7MMD~DRhzuS{OEi0Op|LnXFgbeba!hyLFA7cN^qo4 zQiF8H#9Neb%B0~L3`*E8az$dh$jvh|+^T1`d)z!TO&yyU5m?i1AfrjQ(wl@;M#1Ut z>QwHLm8d+5Bx9agB#{W|sV1O)%1n(7fg55n{Nhbq>p)F!2fY^>>(V3&HTKn=){!E* zY880R4wbBt6v`UfR1)O(%RM8_!??Wk8?_tjO<2(=b4Vo@t=suAL&CC=8y50MU2Ojq z>8!z4IX7TKcU9_U43$)DqM8Z&TdK?y?$Q(};}UW@UE;ZyZJ1FiJ8J-XH%tvc??$yo z=&`+}S>sF};SUAKCdX7g>%Kv?73>pimKzzF!4~thCU~>-DPkKANo&A+plO-yV_Ih1 z_E8+hhToWC-8d<{J!Q3VhlazMbOMoCplaqPAe)+(Kwb5oMp!j)zD=2BK3eA{`0UJi z9io92&@Sop%!u{z;Q4>j1U6|)(eDytoZVC22YDOHqc$YT*r;9wlELdZ?JK&2vVKqB zxyklkK(Y8Cmb1p!i>{iZRbdvk(HTP0U7KCTBTc2V#x+GrGf2=Db}*$l{nyScG2*R3 z7CTSaC}fsh+`~@4*C(U8Q@z9t?@#tG_3K33Kn-mQ6j8q7s#_OfGZkf3ST&U|&Z9K) z8HpqUoZ#~sYFT)K)<{$5$}Gj4QokAvmxMN<$8=V0iSbPjDjl50Y{GOZ&i^t`7Wql_ zhB}8*$en3*_IM%3HKMJ8BwI*}t~+qm?Tu>cctG|>2H7qR&y|B)|^Q)p{pd04aCx6BaJJ5_OYk(FS| zkW9cDZ3D|-<8UV;|g)tEaX zlE|1kfDS)X2TouFdu2)apYfJJpp4x$W#%+%SX~YB6A}VU@I1TBt$@$yhQ` zhbq=!sxz`-1U}Kd0gV@|r)`F?M%J?Ge$5f+kIOC)`8+NM&`W;@x8VAcxE)P<+lICC zd1NkW5I_RBnu!{eMctX@QWQipPC&t2tB15f=(O$U*M?abU=G-{)|jep`ZG82sYa~e zy{(2zju1ycC=Qad4%cu$9%u^NA51|*yT=21a*W#lcb?6h zw)g0nV39misln7+IHO&RG&9hmd2z@M#@_Qv2X8bePd%WipOFb=o>6C{JC}>FBF^-T zV}O=)kEhKSrrR^>DOZOguwvDz8`y6=W>rTt?r}r8HP$R^j17U|z|sI2A?{5mdDR!5S>O~89!W%U z6|bA&2Xtfq2?-G;;z3)v4ZMh!T`H9Axw)HUHyx0Pcvt;J3~ zMm^E;RAnx+xZu@c_foeXYR7mOwkldxwicK1By%0J#PmD*b+S*G$LiDGqK%~4O~$h4 z1PNBY$!?+gY+ylJ*maHpMx0tBN4cxg`zqs~0Hm;ty0U3D2T6tjrb7f2^Q6;T?O%txiZ zHO*;vDLcDui@n9FFk0vddyCOwZq3wFV`?$K)x>|h;)iCr??zd93%f#8N&E|{bgX^( zY4lhrW$re?-J{?{@Lf^HWaoL4on)8nz<3pkJ<84lCjQO;Dm%N4pV;>}{wGZQPj-o4 zZC%fs;U#mYW%S;?Ny7G|c+@#}`rr6|rK@iS zWHUA)Oi(cid4RzQ(>VJ#0ll+hK)cG3^u-5GLBCpRS)B~}yE;6bhEv`Aim-4DOd8U)0!P zb)bG4Q&3TorlAC9OhXAP$uyKubDAjXp zYVR8}baK1WF$VcS?1{=4xJC)vt^oq4Vhg7<%Y@jZRZBcox&F~gzO6`_+Qjr(VmF83 z;YGojQ4&%vyEC}kOl&ktzc>y4nP76}9XuEEwF)nxln_brsf+k+Eh>aGGu*XF^j$lVmp0QVR_Y z%(QU%k6F_5p6X;%uTx8?eGt{iC3S6SeH_g^GowqRcThdi0`EHKt3n`-Fwk4`4 zwaROzG8S{SZju}IZ%Bva-d2rd*s3{ih8EETG21^^d}w@TCp+rAiq#Vj5os~L5$fFK z=Dw3_;b~i@NQ9$__+%bV*fXX|x66@RJIvO(+N?I|dbpX5>6^9=Ey~CHk7-ruxFtq> z0~yg`YG>!uQO)z>X-U<1#9P5Soge(WU;OgC}&8drs19Ui^G zP7s~o8t!6+X(D^qa?6*YVs&5k^KR$*#>V2_WG0m+a0*d5afAwrnQYQeJ$MqXrm5#= zebC=*L{)HTz-p(CAK$O~X`}x7de(s9?9tC|xAM{~A8i~4!HV03v3r5hS$P+ajSEBR zaI-J(GI^59kdS05xTxa+M+M0&-BxNzw2~MmnypWiX!Z*WzAd7eG;(9lZd1x6R1ICy z!+CXKdTg^p^s|)MZP;dh%livkgAgT|ZS7z6iG3IGA1B2g5 zU+=ifTyP%SN%)tZS142aS;``F0WXuYO!qvmR3Y?bELCbHwlm?-O+Ayru%|9rX%a@>ThA@|IOMQ0SA*qlm~gPceG*)ay|1ck~oPr(9iL zJLVOugB+4Tcl9a=7vl!PA!zoxFz*p&+?y1eL`IpHP^4qp(h;f>FS(7c$}?)ud2KZG zX^wXx9umBo`m&RFN`^AdM`F97K$v>%zaef12l=sc3K?;{Pr_?1-leRqUuoGoiN+5!$3L$bAOU@Ew98@ot7|C}Tidw^iY(1r?9DpkIsVKE` zg?Fa3yh8!7yK<0id52O2jd&3|+|u>}gw94LkYnjD8YWrncg>Y7t0drKlDq2UjaEb={3684aD5t_Xp6l_G`gf;8WTdpoQ3Is$> za<(j9bi}LqPJM7`B9HTIfu`7zDG#0~|X7>%(e1oLl*4mC*{w?!f(yGYv3L?Hi>q=^z?{!1lI3^0;rLRW9AtLz(^?JQ{_yCnOt zAPI|95|J}XNhD|Fx2v3$mL&|LC>fKY&JIW-GyMB{LpMq*K( zHeW1TiF6?$UhWgpzn!-q?|Qqs>+PlHHv5BzJ=dXmx5>%g^)P+K4m*!HP8_gC!r31j z02VKp)7sQ}&akG%i(BRnYipf5thMQ^)6Q(3JG8Z}+Q~V+@lyj5fc2=wFb>+`eiHY3 zHid5j+{xfzpx;wKlRv+ubxBiu`+}vX`|Yhw3)=k!OO`EeUedg@y{Uac%Tm9!xqU_J z(&l-7(^9{=wY8LgESC74g<@8fDE|v_=OXfTsd>#KWf(Z{q4xf2Yh2rkA06_dPdXId5d9@;g5e->jKNp zGn)OmXEe`U)V5-Y4=3lfwk#W366RCh|95IhJAFlan`DwrES=NH=WC!Zi0=Q!?`}KX59I#t zB{}C*+^@o)?mOJ8Y)0>I3HcY@KgNBplJ~#lzOLl{1@5a#?vH>!J-Gj{^1rO5wY_Q1 z;$}mGc+QlCPZ6KW=(fwceEt;3!i{|z1mgZlAMxuG?y=WfY zZ{WSkOmzPc_o8`pFCK{I(fx0^7tKGc{Fc%be{nBS1>3_<#AOG>67Vme}_*t!= z>hbeL_w6Ts@u{b#r6^DrZXdG!LicCCyV-l?iFo{#8)`P(``Fr>fBsjgO^2GMdC9VN zzrDp@*s@@$zhEi9=C&+e+&tIRHfJqpKf_<#ywpF?U(vSUW6cvLd?YyGKdk^dD^FX| z5dVNw&gl6&`7OFf_n+f;8Tbf@>SNVKrT3G#*R!h$;|Sa%f$CEIo(cAthjY(pZCTnf zq;cq|p(BSI6=5sqVau9Y+e|TW9wlzo1*$)CAi5tL%2{+jd58N}?njsSZ{c2cM&$pC z-1jTFmmI4;jGLN~A6%#dr}uirYOk4PIrBE2#B+G<)=#R_PZZ~5JnzeQ@ygD3JAVHK zKa3;y9{hCg^pg-X!>csRV`m*)%(L{Hc>Uq=4Y8ZwzF>)EowF*FGj)9h$=ru{qx(AU zWzR+T{ka$IWpn6Sur8!Q2@ShE_d4@E#C(A~?t(XZReZifSi7RL{QukMB{Y|PqAQ9c zp-Q~uik_Fs)PxBio1lC~dB29N$X<%>uiWAO@*VDFGZsqx%Vw0mj=sNPhx>Iq+~2gr z_g~xL{_ElWfTlK#0HdPjH!Z-{n&2;OKD)hbS@T>}Rbw$e)v2lh1fH zk1pYq=#|p)|9-=acY{DB*MFLxL?pa~_2KCQqsL7Y>I#|rlNoaWXRV1D3d*>fkT{2rr^B&xn@_irf72fGf+E=tU&!ab> zeeS&Wxoz!B=CvLKf_ zW2zwbK+^XiMBOrfep_?VPN z8Qp)Bd$sM(ueJ92dHj}n5RH8P=k6X=)ss3p{?p1j8nxY{I{UDWjyq{9UXgAgP+jRu?KbdNlO17)#ImjbnHP*K3nncQEfiYak)IM7+0Jt z!Ik7naizI3TxDEYu5zvlu1cd#frHGpd%*FIbgT!Xmw<=T&HFxL>Spn!gU1K zkz6ymj^a9+>lm(CT*q=9$8|i{30x;~oy2uA*C|{dr{DLP?7Tl3tOrSsaNfuK1pE4Xtu^v;>S!w*56 z=7p_bV~;;dJR0|qt*bWkf~CtCkXleojv1HY`Tl)!rhj{Bi@&U;t!)8A48E)!Mlk33 zs{d&}v}6A=;%S071^*4D;Vo@x_nVittT_D)jgI;&mM&PnVuv8s@QwOuY#N|Sd((oY zZG?Ab)8Ym57U~TN=Dm?W$MpopwIRT`}8m3zaD=+-+u`75Bs0(;OPwFnN2)*Vz;VoAv-M% zWSbua_B{TUrETp)S{BTs3w-?0(WVEysdcWj$fLx43UO%sa2Sa0_Yd!noIVAvE>?O? zKS}gnIz?leA4=L7XqI4}(J$wmOdK15#>GK#uUod|`bE{Jr6)gcr7b_T08?n80*=TNM5Z$0wFao%Jc0LST(&l%Y};DFA~f!T|j=ePTQ z>w?qIXrJxd?%6V*(B`*KU}B(oK7o%X@U2EK4#U-$TobPB`mSH?2uZ{)Bf#ZRHu0PoK&n+8VcD{dpLqpl%UDAE&iX{lpON6O{CJW$p6JID^mslS&m-nfz&GXX6bP-lJ-R=Z`vUhn zk)>_%g1NLso0l*croz?V^8I4`s;wQ}f03W!ozeN|!KPMf0*%A_kzm<3(%&XX>09LM zbcPov5vKIl(YQ*3^(mcfLs-Rg$w~CyesABInA-d%XNpW6|MNN(S>Pk8061uX>RjXC7D{wpGUXC zf~9tDPFJtx^|s#2Tc6k%T?G)JWO=rRGcNrKXI^e{`Kp zbK#?Nm?2{NDkWD9>a-l>pLGTbPCQd3KYR9518n{NM_hgXGOpzAZCvR}L+VhdQGybI zCSzIn#_*yOZ=$dHS~5G@7R+n*{RYd=LE`Ofr}w~|>95)cSN%92!Bu^IEG}I;#du0g zC~MK#&x_x$!oOrYO4rV1wsU^fUHDab*BGZ{dMCdaQ*&G9H4j^cfVx2M<3tEuRn=#%c}*1HSi zi@dML?(pvM9`}CgJz4&X%rCuPdB1kICZ6^F7=O`w)!!C>%lk*{ZMS@%i3c8WCW$7dPg#q8FRpa$G!2yPvbqR$BaGh_zS;!+tv|HPGFh*wm0 z-)qqDQ4^*fGX1b4j-1zg%D28<*E^Li%l7CsX8eSWH*a|=Gxq9hHm1rZ9you&Ro8ZJ zIqe6pzIM`_H{aQQ%&gCTZs@Rm8jk(^y7gb)aMQ+HzkAOE$!vMgJ`)a_den_KJ^GV% zshZltfCCTu<14RifAFEW-+#cshLPhYOgn7G%wvu{?u3(0Id%5j=J|`-&OZOb%Qk%V z>$h)u;;&U6Q_=k%}r+-s}lKGUBaC-E`E4oSiCHiNlo(iiI-=_#3m$aQ}OcD z%;{rCR*XyyO_!}4c=X}>rT49>9oV}^ugnodFr}g9^9Wez|YvOMhHBvYXo{Ss72ST=R+e zqC`b3lgeE?`_N4L{vCfUYfCTddC13ll=mntBrdrC-v(-A>pokV&9AY(DAoHGvZ}&@8a%LW*pG*!~K(P{Mba@C~sxu;P|}q zMXs{ETRaz|yCYNO_KH`#HL==Mo!i^%SLMg{ ziw(&RbsJ;Dy%FwB-p$@u<6lev!+SgNPw(B>_ROtkpL6*YUur!5gv-}l-TSwd-437e z_B%s|9dyb^PkV0F6<1z!?ag<5_j?aM^vI8X_xuanowyO`u@fd9F#WKPuDX(!cYXJJ z5B=z|$De<}DT@0<$@{7Enpa)(xz9iH*y9!52Thnbb^7rqpK|JH^O~=?=4L*5@R4Vp ze_>li_o-OE9jorV=iVRu;#b>Vzxa~NH{5vd4<3B@@n8RD+V$W6$wQAlKK+Ozk3aF$ z(>`(KRd;;r+dsJPp@)Cfy{gyAr~LJA?{4o{vix_?RQ6li(!0-T=U;H!*Dw6uJypH> z_B-UzBaW2(UvS|!AAIr`Pj7quFRg7?wXgWpz@fu#`uewj@bKfmdgil}K7D=TRsDYU zEQ|WHGeTKdI+R~P>2OKnc>ebgAbNY(Sk38|yEl>UN-R+KlTH&H+;ulRx z*Ts|FSKdRvXp+g_<-Q?YpOvP>);OU2Z4RUS{o zvPrkHXX1!dUF!Ihm+VzOGk$Pv2sS-N=+iaXo~zd;h9xE%ikqvP&$$Bz?b)e~c7$#LmJ(&fqaY~R>P@e?y07gzT#tIEuXcU+eI+J^F8@!{*^ zD}OzZbM+D(H|AFUCFT12CV6{ByyMg5-{-*0x|yup5BqH*@9 zp6j-berv<*vE?_e8{7Botz(^cw;udYw`od8DnHFFdv;oV#ro-AtIQuhth(v&i8W0p zHuiq@#5ejjeY9~@zG>USra4EpJUeIG*VoVe{5|XEIgd9rpZ?Qlo1I@b&3Cr0KmE4n z@(W&mKELRR7uPR(`;BK8xz5tX+uR>4-p5V4S+_rC&7p3bzi~P;S-$JV-HhkDZ>Ju2 z6YlUKykG|=*B$I;lVw>K|7AUMZgbi#bK`kl_N_ZPJ0Z)rZgus3vB56FlO8l-tinqp z38^x#!tLfxaO3f`+rz6Rj`7raarKzGeL2T2tNVmYtUbIcYQzbO48JL+!S{6!;0(JF z)RKf3OCXJU+Q;}oDSJJ<-rji6hTO-U<|50TWvaow?%WX4Nm z-TI6>KTgImg=)NbEEi|ba4$&;Ph|?N6YJyk<=-UFO{Lk+B*sTW5+m7gy5OD}i+dS2 z8T*ar5x<*Ks9ri*=DGX0>3+lGjV_+~-@tZ!KG}0)AOSqr*YWJ#e2c~PXLt~AQ*Ymn#QA|$C1}t~e z@G+a-YZh5Z2{mo=Jl9pla5bt2OC#iVO{bT|w zW?whsu!K4hZ-~X+uXq@K-ptq`+2QeX-7(z;LEp02aN<{}W$uVrJxhZQWV^jl8LA%l zv>4ID0nh!s8%y_upD}kpDweoEE#mcZXCV`K^InZ7`CI25o0k8DqCRh$V+c;d$+(^) zv2m{^o;a)Y8j>C|lu3HAp)lA{;@zXGyp%}%u_OV*Vb`6eC|n1b8U8uATRh+*l}m5*UO1za$c%$d@Y+S#Yd#wO1CQEb|dueCgg-_*>#nUdqAAQ+|-gZ zf8D;bJGRk|zzANq_ts=bZ$DktZ(aIZ^_w!zV1MsPH_qO>@oQUqIB(DHmEZ1HJMs0^ zl=+&D@@MPTRX^K%($c0r&Xeo=-1y69`#8_6EHrLy8sNN?AK3VM)4ZS)7X+_-hHw{iB6zHiSS>b&cZ`NH*TQY2 zD(xPHzAaDBLEmQIhqm2W*JfO-4R^)A)U=J#vq|vLZ_FZepecXeK`f*r^cH9>cdsSpZD>@9?F?Gc1zW1Q@Qtko&R^!10x5}+7 z(Rxsof+do>-pg?JU+ccV!1)hA`?*&8q5I-TQH+enqe#UQ>GZ$Sdh^_MDWmh^=)9C; z^xYmSp;8E}j z_zCzEcnrJ>9tW?1Cje^K`6+lE{0#gV{2aUio&;}#Ux2@WUxL4aE#NKi6!<&%HTVbk z4R{+o4c-C21^)!U1MdQLZcu+vQJ_`;lHw$QrjetPoHWRQGLQx3K>Z1tdaCK3IiP9B zdx5=y=Hc`NRiGEB1~s4-n7P%seL!E(5BMMt3P5wM>%jmp5bOgQz#yjg zZQ(Qm2L(F% z2si>931$Lh%{dwz17?9^!ExYtZ~{0HoCHn=r+|+FtTpE}FdH<1IbbfB2b#fra5^{x zEC34uhOe_2ECEYF3s?r0gI3T6+QABNCO8Y64Yos>b8tTf&IRXz^T7pRB{;@oei-h> zU=_FoTnaP?=i|7m!6(3R++T)!JnrSVYrvJ@x8N#pBG0eJJsI~J+-t#gU^e$_ap&TG z3Kw1Gd>Z!*-0N{a12iYRh5OIrw&H#fcLnY`-1Xo~;LBhG_zJiYbnyNr+>PL7a549{ z;NA*u1FO0JI_~Y@4saRwcj8`-`wiT?z&F9Sz_-D*Jii);LW=g@r<_b=eD;FI8Q;0NF>@OSVJ@HTh{ z{1dzjwgU&6U_UyvtQ@Q&Ck_%I2{au&4Kkn%WI;Ko0F|H{$bs%)FR(Z00eXTe&d4M|^91J>mJ_Yv^U@BMx4grUPX<#}y3>*$-fR6yJUpW#i z!!}zET0t8)6PyJu1aE*#!7X4lxD|W?+y*WKUk7Wzqu@&L6L1xH3|s^50M~*$!FAvp z0E^za3w#oM6MPDM3w#=U8(a_W2A=`n0iOlm1)l@o12=$sz~{mD!56^2;EUh~U>(>5 z)`R=Nm%;sD19$*@1w06D1P_6mz{6l8*bHt4kASa&AAzrdAA`riufP`Y6!Y>Dz<+_4!7JcT;8pM%coQi9e*;;2tWZ$2K~XopdL&C1He=;5F7&b0f&MH zFbxa>)4{&rFt8su91I3Cz!2~eFccgChJho&Y|sSefVp5EXa@7a>EH~o04xNHz+$ij zECnrK8CVWlK^tfXE5MoHEO0hB2Yd{i3(f=QgA2fgpaZM~mx0T{8gK=;5?lqY2G@XV z!F6CQ_$2rg_%yg4ddJ`Uho632|Nz&13v`!g9pHa;34oZ z*bE*4KLS4nkAk0o$G{Wdr{HJc=io{33-C+uE3gGT1%3^F1D*!I1-}E&fUV$J@ErI( zcpkg}{s8_6UIZ_J{{k;jg1>>cz~8|?z}w&*@K5kA z*bbZoWgB=P2I3$Ak{|`rAOp%k7SP&vDnKRZ26CV~*bD3pdVrpw3iJZipa#@}I?x;R z0ewL~;DbCUfc~H!3;+YcKA-^%0{epfz+f;031q2B{&*f1dah0 zgIQn|I2K$2jsuqh^z-;2e&uw_i_8+-izB8_XoKBa5v%l zxcA}aaes(gz`Y;0Kkfs#^|%k>4#0gFcOTrJ;10oEw>NzM8uY_mj{7CtR@^V+w&8BT zZO8oz?h4!+anHoP3HL1Ajkssy-i&+B|7q{O1EVPO299S0R1^_A_EqVS9zqg|gd~ta z8YxsI+3Ze|C7a!_n}vj41*G>5q4$n-M68Gn5D^4>@9p$F&(rt&o7qW*1@HBRyZ>J9 zKK}NZzOz%Fd7jDh5H}D96E_lv5H}Hr5;qfv5w{SB6Sopa5VsLW61Nja5qA(r6L%8F z5O)#B5}zQBBkm?XM%+UjPuxqKK-@>1NZe0+oOpmZiFlAWnRtjeh4>_KD)BIJ8u2OO zbm9@>4C2$onZ##^vxv_UXA_?z&LKWeoJ)LxIFERgIG^|;aRKodaUt;~;v(Y9#Kpu{ zh)amC5|#7~I3 ziJubp5I-aCC4NraNBn}gpZF#50P!p0LE_iML&R^0PZGZ+9wvTA`~~0RANT>k;z#@w zf5UJ13ID?Md)Q|jyEBLNiL;2W6K4}o5$6!!AkHP8Ce9SOI%2N zi@1n*j<}e3p16egHgPHO9pW z@l)bD;%CJ5#LtNvh+hyl62ByFB7Q~OO#GU-h4>9|EAd<6HsW{0?ZoeiJBU9JcM^Xj z?jrt;_yqAM;%?&4#685n6ZaB-A?_pogSemgEAbHVU&JSgzY`A={~*c>VG6E7E!0LG zT#ajRE$ZSrT#tIV0rhbs8sH|}j9YLkZo}=k0}XK}?!w);2lwJW+z$&Lz=L=QjnEiP z&=k$k94*iitq_b5gdz;#h(IKw&>GQbgBZjj4sFp6?a=`bqa)(c2?`+mNA{4`c{wRSHrEtNG zG7NwRUX;U!ff$4eRAMlOU?_%RI7VP3MqxC@U@XSrF^tCqOvK}ugvpqKshEc8n1Pv? zh1r;crFfUatBSZBE3gu)uo`Qy7VEGc8?X_Zuo+vh72B{KJFpYG@C0^a5B6do_TvB! z;t-z1VLXK+cpA^(Sv-g5@dA$GMI6IRcp0zYRlJ7dIDwOR9jEXHPUB6S!CAb8b2yK; z@eba_dw3ro;6r?bkMRjU#b@{&U*Jo8g|G1qzQuR=9zWnm{0%?hXZ#(%;2-!E|HN0`nVc5;uQ^X()u?R;TBG49*Xoo1YM{9IIG#*A9B%>oz5Rb0t zglcp1;&436V0PT(yJ#5oMY zXLt{v<9&RA!T1tG@D)DBFQ~vjP>EkL6#v99{DvRVyca-kN)5>ADd#E*#)#B}7N z3|0(40X(q53p>i8!iPc(L=gs|7!`1!68$k4B^UxHhN2Y1;KFdYF#=;S7P}j53gfCPT>IFz(JhGA-stvaR!HR7Ej?V9Kks}jq`X0Z{u0KgXi!rp2vH50q^4| zKER9k5XbNlUc$$C8K2-4e2Q1`8D7KZkQZ0OpdcJqAp*4!iQ0%l9kj;Ph{iQ&gKH6k zx`@Sfh{N@0i+X5>8_*v0(E&H&VKhKT+=O`Cj83=(3Ah!BxD83T9i4Fpx}YJFaVJu6 z7rNqZbi+MJ#l1+weMras$bbczcmUn;AhPffve5`RXpCGmK@T)VPc%a>G)Hf=Kp(V3 zU$nv_2*#rbK|h2d5Bad7040=f+la&N<#?7zx`ul#+x{Uvv>>V za2{{t9lVS8@IF4khxig-;cI+@AMhhOuHn2uCnO*dN$89&NJa{}q8n0?hIC{g6Wx)8 zY~&ypJMZw7mwgk^g|x5_ z#N(KR$(Vwvn1<f>1;t z5>aT4XtY5LViAY7XovRbfQQi$@#usEBq9l&(FMs!L05D`D$?rvPUB6S!CCx-pYgyS96xvvo$wG6 z&d- zoeVjslodOrBKhKP!FY0*P~Du zrBL6aP#>jG=c7<3rBLsqP%ouW_oGlZrBMH)P(P(m2c%F(rBDx~P*0^$7o<>ErBENF zP+z4`C!|ncrBE-VP-mr3H>6N+rBFYlPZSENvnrBGj_P?x1p zXQWV{rBH9AP^YC(ccf6SrBHvQP`9N}hon%yrBIKgP{*ZEm!wcfrcj@xP~W9cr=(El zrBJV=Q17Ksx1><_rBJ`5P$!}U&BFl9hX)Jb#X^*05qwyTfmnh;Sc(cPLnW#(7|Ssf zD=`eKFdVBf0&6f5YcUGzFdFMI1{*LI8!--aZ9rX!60{lPu>}*b6%(-yk7GL~V<)Cy z7pCF~Ov7$W#~#eUUd+Tk%*FxC!9k3y$8U#GID*l58e{Mb#^PCw!*h5H&tp7Zzyut{ zM7)T{aSW625+>tiOu;LdidQiWuVFflV+KxOCQf1&UdL>l!W_JTxj2n^coXw+1`BW& z3-J~f;T#s@JeJ^XEX6xmhIdhg_pluAV+B6IN_>b__z0`u?n7@gg?h7&hW1Y{JXfj90J)uVO1+!!{hpcAUTtoWxGNj$Jr~C-4S#<23f*P3*-P z?88~?$6Gjnb2y0eIE1(HB;LVcyo-)5B`6>9u%Z(RkN_JJVMh{FbVeb%pa{t*MhYD0 zivH+^5~RY3G?XG8E@Z%sOq8KJ1|SO_WW$Rblp_~D^uR#$#31xS1$v_reJ~h(F$9lb zC?3Ty^uuuEVFctQvIn8yAzXzN6fCR|DZB_NVHog1mpd}5b{kEDHZ1d|KTHNp3Yl4=hj$AWm+%-Y>{#H9V zV((Q!D=T{6axAS@&>`1tZJY5DV)Lhz{1u#u{@~SUOPveag2-a| zoiZ{~lj74;(sPo!BxQ9<$+2YTWTm8c$wY9|0V@XL&O3z8@oRXB4 zl@y9RF~?Z)s(@iU6MT6X5aTADSp>3?V6nkcVM8Gq}}pB0zV`vDzgNLwNvpEQw?$u!bdKyTvp#Dom?Mz5UU z?98MDzH5S|FXd#6lfQQlTwZ2YN)L8`OcGS(UryjOIo6_PVHM&l+0WF?qhSymGgBn%+#K_3V&GqW}T(_aU8Tw0pwe<=g14 z!&0JF(lP;mX3gK3)6htwy+IJg>89z*d7wvk}0Mg1qNYFN>Z_4yGPh}bH9q1iXSS;Fpe1zfRQS|f6Bg%J{ zzfYHal@D{;>K|55)!SY#AZvSbbjA&d!KC&Nx}G{0;j@e3mo*y6aNiHm&i7xa+?2k2inM ze5Ns{jqhE%@Y3J=uY9+T{&@qxTN&$W2-z( zG^c_#Y%lXx@_8_1-XV~A&HHgE>0ub|A8ssj1nH3&g)WePvj0Y748|ha>MgctZ3tLw z)-tQjQC?ZySaQ1}y^owLZuh5{l@xf~gIu&p6i&PRTBAht#p7=?C!h7?vn@T)4959U z-2jwD+6ti=DlSSinGE%57fOrEj!)~|G3Jk5UN}~&QY1xMcg&Ju4)>szTF*&{T zQ;vD=Vf<}GPAC3R4ntb5JMvHVk#uVEd*9#xxN6m*>^f(b*S+>kY-IAVCC#(fe(n98 zaWc(S$+d!h-7~h=PZbiDmwI2@FrwnwPn7{w#(Yt$KIX8jkNwySp^b)LGh2 zOQ~*MMfEr5B$s&eawjrB4T<@zPW|F<9w+yX6fQdEVUNo&+QBJwxE$rGzD2T6%+pL_ z8X9i0SzT@#8{|oKA)Q{k4g; zEtC69b&FQ~>A9VoyuP*!SCQOL&D%YVW%Q6Hs-(55YLCnkFu1j)T~DFurI_ z`;+&Ru4$#p=r+KsItxRJRcWlsB0UGx%u_(wS=~#{W8+}ar#6;m0GFQE z?X+{~6qd{JV`<5kkVVlPO+tKTd_qbNnG0hXWJC3~i!SQwK$f93qopmRLwkKG#(ekq z=QGl&q;J3E_t0A~qMbWiNuFviQu7@43L43h%UCL#nBmEi-4YikiDryzZfW1aBGa(F z=I_z!;#ssg1LvvUW}4xu`JP++`|jf3#-$Fb*;kj`M^^v5SA1V7xOAUTw2>gKUIn=p z>iv{iISC}sIvv+S&chin-xFt&HXrY^NcYL9NU>-5%4s3dEBDDuY%jN(P_26~y7lsg zmRh}K!L3zWgc@NFvqs0*!V9AcLu2eQkpqmIP`X$ zi(L)0_8a2Zh9<^#q)0=J-aOe3W4v5f+rUVt@mbCVBQ5#5>iM&?%Vq~IExXzWE*C%-x^YSG> zBg@yfPyZomwwH85p0+=#$EO9P)Ah8mKi06UP#Ed80qJ!C={clhOw-Q|NY5uN`4D4y zOZi;il&<2ldH<~-ZJvH5>2PS-ZHCsf1hNWtlyaabw11Qr|(ZIcPLkpdHRnSXa0Vl1f)L;NPj_EzJDJZ z2U$*qEGo}fR~ydBmW(sfF{I7=ssrh(P2)33%Xj%NoP%-+E6*#h)LK!AmqZSqYwk`w zc>5cnls59pWsE!+({~-izZ#(DT_q1L`{v5K*{bQt%Ntry?onyT&swHk&y4%+udL@` z80q`jHzBg_i~HES((4mnRL)XXZ)6VjAzCI+_3HWXYl)AtetAy3^S`ql=If+1rbi~k z#Rb<|DtBVG&gkETmi@}LCOxOKO-YwMV> zsDeVPO)U(Mjty7C+eF$Tqob`+Z3+up7g%GWtWi;g5z%(Ly^R`Uk1cEyYj0f;6=5&r zz?W-xJ;=RjHssnP*BiTIAZ0l`^%PWE2GhmF`EtE|J4XH0eG%Ep(1WDBW0=InN^b0spj_R=X5jrAglq3AA|IN!wcezokasq4GD+a=kZivs_oq>5imj zSjRz^?ys+L@8HIz!Hw-Xjg#XVr^PkSZX6O@*fK0EE-Xwdj^l*XpA4m3tt_H-bV<0S zrsOQnGLPjpX8C_QadiP&oaI@jZS<(RR_0adA$r@?OMra$b;38-~?Wl2JW z&LG``H~_RJfLWS@cAY6fk#EKO0(_@jzRNOVEYZRjYe-CR`<#@daLVbc<2*l&`06r!+)s zx*i;5dKqs_FL?(GX}NCs%Y81oViiiGo-Xa{%U;v&?!T}cc@C&GSU={B<+WpZvRyU1 zo3ls%+LWnlEuL5JLN+ZZnfWCjYs{a({8Hvtv;X|JO^aL}<>yP`z>l*`U_Og!z9i9sJ&%(~-PC|pLUTO5&VZV&?!@mg5k;6muG6TuW-wq?aIUv0wAiXCbeJ~&` zd1>?VULk!mjO8B*7=I!leL5h0J|O);K>E{w^j87t?*r2RB5mHDpZ(+gzr_VRS}#m8 z#u&Tb?vNvb&cLi3qtdFsv_Qz2@9>m!QM`;FMZYNJRacsLymEpT`%0~@Um+8|cd&(}j=PhUYz-fArX<? zCutYjyd5hqSS}}A_5Q!`yU2ZfI*hW4RRQT4q-EHt;SGXT6W2hFe|dh*#Cpi}T=v-p zn73hLKw9?OU;nMW#SYa;F(H*}C8|p+!SIrKu~G^}eHo{tWMMD*r%g;|yyFNxUnb|K zJjWXOF{7?eia`gG8yu+S6;TRVMpx_f)IjE!f?FBjBukm+a1}bW93#zt=XumYRu9E$ zT*kDKPPeUutFjQl@}ZH)nmnSO-_RxXmWf@9$Sv5x#$A!w;DxVmz{lE5P?rF_}c z&znBhJY$i6Sg4n!pQHR*^5hv@8KuKg=_8_)!gGgG_^1tk=kwY~`~#y^XXC z8_7J97uk*-F!CkZsi9^5FT76eWEze?`U}>Nj#fNB$fIbUewQH+BfS#vw9ie$OHp7( zVV2cZq^3|bp!Zfo^^o3ohyN&`_mAviE+@oPx2vd=)!vzYPORm5c~YZMQOr$9t~~#R z{bwq>(Dz^JSbhJk=C|(7_cYS-ez81jTy7bXx7@B>k{#}veh81VF1b$ah3F8SM`$;D=TpG;sssn<`wt~AO+-u}#6*R-smq~%<7`0Guzf<*06!x+MQ>nua=3YA37Hs&z0y2N^t0YTawlQ8w8$26G%6PZ)a2SRX?vqVf8?mICIm z6;tmMXYp4YT1>~GzwaYXFG_RdfsY%6woyfS7pBWf0tOfhyJ$@*iCUexlrK%-nq>ax zKLag#2RIj9i9;-sPb_qJyye>OU@7HPlp?1v>9L7}wuY8o6H z9vvBGD+rHO!y@ewF@>Q8t>u4F+G)ZB+5^9KQX1FMVAk^xjC3}~XnWGe9?nwjU3~@p zeFdgcj5NlZ??-=jPf#wg;s3WnNXi+?ooaAINYn*|PON|Z1iilA&NW1i(VF}#$CH+I zk*ILoaQ^}O{(_e$oG`>Bxo$rW!Zb>nKDO?5hh!$ZPjL&EecQ)w9&aH-|WVLS3! z&vHbA-5g{LlY4`Fhbz7=XkEL6Qiregg2NK^fBt@DwT|{Wi#aa8R_wSe$bSj#OEfabPAv4m^7xBvKuLHFsJ3ZYNX{J zBKd!FTCV-gnwL84)R*%-7}SFI>tq|w@H?av)ob+pP0=TH`;XgFbinhYt6khr8LLNR z)$cyJxXz-DXUE)s=PU2^z2aTuEw)OjX>3TW{`f$$b+mR0207WL-fWB96K_F|r&6-r z*;1~cWf7{&0*xGF&3l4mPF!+%ar z9!iww-+7#ra)00(%IjHjy)KkDUnn~-m11PFh*VKIR67@C7quTUz@rw*D|8nOp=PVt z&85}!K88yzA4G|$d5~!qD|dDZh-8KSp{m^|KH!eQ3XGIYVjalWm4|#|p?2PY;k7TG z6fI?rGWmgI^Q}(VL%dvBK@FO>rUGD)RwSUELE6$dHz}av>9Uf7B5O^mda$-5v^Pm) zfx&KMh3@PezEaaTr`ug76L6!@Rw8>$yXjk+sUbxn7H?%K zm7gURnXWmNe!RG1d?{IqrI_*(r)u02^!^L0pO%clQl26`B~ne{D<4FihpN@!P)uuV zm-f4J4=#~hK3x;?Nh>6gb(pqxfX_|IjGj4B?b-%Z*UnIqruTSN;PY0h6{^jrzs#pi zCBy9O8@VdkJYF0WfRHM^)h4QJ>OIZ1PC-kD0*&r#Emn(5>9Gn6&?hpBcc%t&$N>ZKZt zh&N74|8f#JD?4dtWhN(OynZ$&X(wY(IR&*+3z;v`IR8?-HJ_^oGKE%@k;U!nMbeNHDU z%=VukHEZZDr$&;NZCC9wSRU`Bq$kUNUUcFVNUA<9WC|IQ=szhEx=YXt&GayAuFZAO+x29LontWH1yHI;BP16qc3^~|y&4+o- z8RYfZY#hRcJ}2!KaNOL4n<1Zt+zTZw_W*g8k-88$&UyUMK1*7j{big?D|v?)+=)9N z)5^VGN_}K`GEBzF^s-FJOUOAQ&x0~drnw!mTv>;Fmg(fPEdMj^OTVD*6#6McOSDBg z@==N*n2yC*i-S0U_wWsrsnnq$4;7e(MOcL`coJ{m8~ld4)3_I+F*+h0{ZNjHn2inC zgQp?iN4|&bOW8L<_MxPW{UPJ!JIQ{L?`K3AZ~O+bKjixx`&*VP`%>l;#{QM@vV0jY z^GI6ODf`Qq*4T#>e`)KR&-J1T+i(QO@h-l{RWr!H;0`oJ1ll15*~o_z!!Qj?uoH)I z3@338pWu63JCpaJVL=4qkc=GIFc70K84Iuq>p{;K`ae45P~?Ie@Xr`@71uoe>HiIw z=HDd$+VsXsF0r70GwKpk|KA5)aei0J`8jOCR*%P8slWf;M$7r?4+UE0w)%;ei-g6? z<;Lh`lloH`q|M9Ud+<(nK3_rpPF;?%E8aG$ zuG^;VuS>oc6)L%Ysd!j5Pv18KSXngdySRK>dj+=ojotso_Q-3@@|0kdSI^^jl554q z+amAn8t*T+Z%@%?&Fjp;mT+VKt^WCq^v*wBp4Vdw;YLNNC`+?@%k_jYUntLZa?LT) zTggz#^Q4j98Ib;#bfdq#-P*VIzl+Vro0j`stv~zz=J${-#;efP+w-=+e&FK$#&-;O z-&^JPmVG>WG4~Rp^l1=AyyA0%jFq>TvWp0RNekU=>OFX0?vZ0WAyQ!Kpf_0Qkelr^ z-cfGO_mF!|%_C!>!|9~AQ#X$rdVxaF%hVCbJzC28jro4!v)sqbX?gZfgWQAoDgSL9 z$>n~V>ath)BOSUL=E>47U#Z=q23j3t9gaD<-~H7(o;XW3wSV##jM`f(Zl3sh@ZN^M zqL{)!>ixJDNI&#Ji&;lD%f7^Kd|_RO{u`P5WC%5-SMXWRU2@AjX*>M|+wy>%qV??Te*)9{sAak))Ne^1<#NA4^>Lt= zwdtn_%S&Xratuma{tpDCLriJuTfq{LZb|w-v^`!5FtiJnWW`BHPTZ_cQmD?J$E^VjPcS&dk@kVU(2K{pGzO53%n80q>1*J z%%4kei8JO6<~qp#tCuBhdN;r1vfPD*JU3b%Xiu3ri}EM+rPa(Y<*Mf8tt2hw>he38 zuNCu2&xO@^DaaxhEL92tw8~S84fu;z-u{%g!}RCnn#X--_lpZt)< zyPdys(U;$mKfRJ7wtSxVd`|xA#pfF2v6eM!o-aizY+inn$CIyDsRZq3ddZ*jlW2ec zalrps(g(q$lnPL8Y8rls&sxO^CAy)UX!%uoxv7K5B|C`AA7yUNV7ccE^^YS5$5orx z?HM-RKP)UHEWEseKmXvJ1~2b3I0|ff#eK~S4W?Wn?{Y9-3+5N{8-+*EpFJxvhDR_= z&MPA=*C%sYo;hUujB*U^G9{&W@-l$`wLb0bEA6dX>ZVmsP^0Ayw0r@Fpmg!>;u7NZ zmB~98>|v>H^;qqW3Mn^}*XelQf$8O0Q?jV~`@{MKl-FG_??|SzFrEGeueL6E`Aeqp zzoMsAZ&|{EV`WkPsyU{Rf+_tSWLdk6(^t&0cojf9mgTqO5~4kL$oKvK=f3~UbDuoR u3dvhYOyxbhekj98$g{GLycf56ZNE#Dv^@7J)H`2~+i)KmBN$O=kN*Kz2E%gz literal 0 HcmV?d00001 diff --git a/wasm_for_tests/tx_proposal_ibc_token_inflation/src/lib.rs b/wasm_for_tests/tx_proposal_ibc_token_inflation/src/lib.rs index 568901835c..d07031339e 100644 --- a/wasm_for_tests/tx_proposal_ibc_token_inflation/src/lib.rs +++ b/wasm_for_tests/tx_proposal_ibc_token_inflation/src/lib.rs @@ -6,7 +6,7 @@ use namada_tx_prelude::*; // Denom of tokens over IBC is always zero const IBC_TOKEN_DENOM: u8 = 0; const CHANNEL_ID: &str = "channel-0"; -const BASE_TOKEN: &str = "tnam1qyvfwdkz8zgs9n3qn9xhp8scyf8crrxwuq26r6gy"; +const BASE_TOKEN: &str = "samoleans"; #[transaction] fn apply_tx(ctx: &mut Ctx, _tx_data: BatchedTx) -> TxResult { From 1779850724acd777bf91c4896ea38024351aab23 Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 12 Aug 2024 23:50:02 +0200 Subject: [PATCH 03/11] WIP: run_namada_gaia --- crates/tests/src/e2e/ibc_tests.rs | 169 ++++++++++++------------------ 1 file changed, 67 insertions(+), 102 deletions(-) diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index 95a80554c3..bbc75ff950 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -64,7 +64,8 @@ const IBC_REFUND_TARGET_ALIAS: &str = "ibc-refund-target"; /// 1. Transparent transfers /// - Namada -> Gaia -> Namada /// - Gaia -> Namada -> Gaia -/// 2. Shielding transfers +/// 2. Invalid transfers +/// 3. Shielding/Unshielding transfers /// - Gaia -> Namada -> (shielded transfer) -> Namada -> Gaia /// 3. Shielding transfer the received token back to a shielded account on /// Namada @@ -74,7 +75,7 @@ const IBC_REFUND_TARGET_ALIAS: &str = "ibc-refund-target"; /// - when unshielding transfer failure #[test] fn ibc_transfers() -> Result<()> { - let mut update_genesis = + let update_genesis = |mut genesis: templates::All, base_dir: &_| { genesis.parameters.parameters.epochs_per_year = epochs_per_year_from_min_duration(1800); @@ -86,24 +87,8 @@ fn ibc_transfers() -> Result<()> { .default_per_epoch_throughput_limit = Amount::max_signed(); setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) }; - let test = setup::network(&mut update_genesis, None)?; - - set_ethereum_bridge_mode( - &test, - &test.net.chain_id, - Who::Validator(0), - ethereum_bridge::ledger::Mode::Off, - None, - ); - - let _bg_ledger = - start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? - .background(); - - // gaia - let test_gaia = setup_gaia()?; - let gaia = run_gaia(&test_gaia)?; - sleep(5); + let (ledger, gaia, test, test_gaia) = run_namada_gaia(update_genesis)?; + let _bg_ledger = ledger.background(); let _bg_gaia = gaia.background(); setup_hermes(&test, &test_gaia)?; @@ -123,7 +108,7 @@ fn ibc_transfers() -> Result<()> { ALBERT, &gaia_receiver, APFEL, - 2.0, + 2, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -134,7 +119,7 @@ fn ibc_transfers() -> Result<()> { )?; wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; - // Check the received token on Gaia + check_balance(&test, ALBERT, APFEL, 999_998)?; let token_addr = find_address(&test, APFEL)?; let ibc_denom_on_gaia = format!("{port_id_gaia}/{channel_id_gaia}/{token_addr}"); @@ -155,8 +140,9 @@ fn ibc_transfers() -> Result<()> { )?; wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; - // Check the token on Namada + // Check the balances check_balance(&test, ALBERT, APFEL, 999_999)?; + check_gaia_balance(&test_gaia, GAIA_USER, &ibc_denom_on_gaia, 1_000_000)?; // Transfer 200 samoleans from Gaia to Namada transfer_from_gaia( @@ -176,6 +162,7 @@ fn ibc_transfers() -> Result<()> { let ibc_denom_on_namada = format!("{port_id_namada}/{channel_id_namada}/{GAIA_COIN}"); check_balance(&test, ALBERT, &ibc_denom_on_namada, 200)?; + check_gaia_balance(&test_gaia, GAIA_USER, GAIA_COIN, 800)?; // Transfer 100 samoleans back from Namada to Gaia transfer( @@ -183,7 +170,7 @@ fn ibc_transfers() -> Result<()> { ALBERT, &gaia_receiver, &ibc_denom_on_namada, - 100.0, + 100, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -193,7 +180,9 @@ fn ibc_transfers() -> Result<()> { false, )?; wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; - // Check the received token on Gaia + + // Check the balances + check_balance(&test, ALBERT, &ibc_denom_on_namada, 100)?; check_gaia_balance(&test_gaia, GAIA_USER, GAIA_COIN, 900)?; // Invalid transfers @@ -227,6 +216,7 @@ fn ibc_transfers() -> Result<()> { wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test_gaia)?; // Check the token on Namada check_balance(&test, AA_VIEWING_KEY, &ibc_denom_on_namada, 100)?; + check_gaia_balance(&test_gaia, GAIA_USER, GAIA_COIN, 800)?; // Shielded transfer 50 samoleans on Namada transfer_on_chain( @@ -247,7 +237,7 @@ fn ibc_transfers() -> Result<()> { B_SPENDING_KEY, &gaia_receiver, &ibc_denom_on_namada, - 10.0, + 10, Some(BERTHA_KEY), &port_id_namada, &channel_id_namada, @@ -292,7 +282,7 @@ fn ibc_transfers() -> Result<()> { ALBERT, "invalid_receiver", APFEL, - 10.0, + 10, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -315,7 +305,7 @@ fn ibc_transfers() -> Result<()> { ALBERT, &gaia_receiver, &ibc_denom_on_namada, - 10.0, + 10, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -342,7 +332,7 @@ fn ibc_transfers() -> Result<()> { A_SPENDING_KEY, "invalid_receiver", &ibc_denom_on_namada, - 10.0, + 10, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -361,7 +351,7 @@ fn ibc_transfers() -> Result<()> { #[test] fn pgf_over_ibc() -> Result<()> { const PIPELINE_LEN: u64 = 5; - let mut update_genesis = + let update_genesis = |mut genesis: templates::All, base_dir: &_| { genesis.parameters.parameters.epochs_per_year = epochs_per_year_from_min_duration(20); @@ -374,24 +364,8 @@ fn pgf_over_ibc() -> Result<()> { .default_per_epoch_throughput_limit = Amount::max_signed(); setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) }; - let test = setup::network(&mut update_genesis, None)?; - - set_ethereum_bridge_mode( - &test, - &test.net.chain_id, - Who::Validator(0), - ethereum_bridge::ledger::Mode::Off, - None, - ); - - let _bg_ledger = - start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? - .background(); - - // gaia - let test_gaia = setup_gaia()?; - let gaia = run_gaia(&test_gaia)?; - sleep(5); + let (ledger, gaia, test, test_gaia) = run_namada_gaia(update_genesis)?; + let _bg_ledger = ledger.background(); let _bg_gaia = gaia.background(); setup_hermes(&test, &test_gaia)?; @@ -468,7 +442,7 @@ fn pgf_over_ibc() -> Result<()> { fn ibc_token_inflation() -> Result<()> { const PIPELINE_LEN: u64 = 2; const MASP_EPOCH_MULTIPLIER: u64 = 2; - let mut update_genesis = + let update_genesis = |mut genesis: templates::All, base_dir: &_| { genesis.parameters.parameters.epochs_per_year = epochs_per_year_from_min_duration(60); @@ -483,24 +457,8 @@ fn ibc_token_inflation() -> Result<()> { .default_per_epoch_throughput_limit = Amount::max_signed(); setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) }; - let test = setup::network(&mut update_genesis, None)?; - - set_ethereum_bridge_mode( - &test, - &test.net.chain_id, - Who::Validator(0), - ethereum_bridge::ledger::Mode::Off, - None, - ); - - let _bg_ledger = - start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? - .background(); - - // gaia - let test_gaia = setup_gaia()?; - let gaia = run_gaia(&test_gaia)?; - sleep(5); + let (ledger, gaia, test, test_gaia) = run_namada_gaia(update_genesis)?; + let _bg_ledger = ledger.background(); let _bg_gaia = gaia.background(); // Proposal on Namada @@ -677,10 +635,10 @@ fn ibc_upgrade_client() -> Result<()> { #[test] fn ibc_rate_limit() -> Result<()> { // Mint limit 2 transfer/channel-0/nam, per-epoch throughput limit 1 NAM - let mut update_genesis = |mut genesis: templates::All< + let update_genesis = |mut genesis: templates::All< templates::Unvalidated, >, - base_dir: &_| { + base_dir: &_| { genesis.parameters.parameters.epochs_per_year = epochs_per_year_from_min_duration(50); genesis.parameters.ibc_params.default_mint_limit = Amount::from_u64(1); @@ -690,24 +648,8 @@ fn ibc_rate_limit() -> Result<()> { .default_per_epoch_throughput_limit = Amount::from_u64(1_000_000); setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) }; - let test = setup::network(&mut update_genesis, None)?; - - set_ethereum_bridge_mode( - &test, - &test.net.chain_id, - Who::Validator(0), - ethereum_bridge::ledger::Mode::Off, - None, - ); - - let _bg_ledger = - start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))? - .background(); - - // gaia - let test_gaia = setup_gaia()?; - let gaia = run_gaia(&test_gaia)?; - sleep(5); + let (ledger, gaia, test, test_gaia) = run_namada_gaia(update_genesis)?; + let _bg_ledger = ledger.background(); let _bg_gaia = gaia.background(); setup_hermes(&test, &test_gaia)?; @@ -736,7 +678,7 @@ fn ibc_rate_limit() -> Result<()> { ALBERT, &gaia_receiver, NAM, - 1.0, + 1, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -752,7 +694,7 @@ fn ibc_rate_limit() -> Result<()> { ALBERT, &gaia_receiver, NAM, - 1.0, + 1, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -779,7 +721,7 @@ fn ibc_rate_limit() -> Result<()> { ALBERT, &gaia_receiver, NAM, - 1.0, + 1, Some(ALBERT_KEY), &port_id_namada, &channel_id_namada, @@ -815,11 +757,40 @@ fn ibc_rate_limit() -> Result<()> { // Check if Namada hasn't receive it let ibc_denom = format!("{port_id_namada}/{channel_id_namada}/{GAIA_COIN}"); - check_balance(&test, ALBERT, ibc_denom, 0)?; + // Need the raw address to check the balance because the token shouldn't be + // received + let token_addr = ibc_token(ibc_denom).to_string(); + check_balance(&test, ALBERT, token_addr, 0)?; Ok(()) } +fn run_namada_gaia( + mut update_genesis: impl FnMut( + templates::All, + &Path, + ) -> templates::All, +) -> Result<(NamadaCmd, NamadaCmd, Test, Test)> { + let test = setup::network(&mut update_genesis, None)?; + + set_ethereum_bridge_mode( + &test, + &test.net.chain_id, + Who::Validator(0), + ethereum_bridge::ledger::Mode::Off, + None, + ); + + let ledger = start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))?; + + // gaia + let test_gaia = setup_gaia()?; + let gaia = run_gaia(&test_gaia)?; + sleep(5); + + Ok((ledger, gaia, test, test_gaia)) +} + fn run_two_nets( update_genesis: impl FnMut( templates::All, @@ -1087,7 +1058,6 @@ fn upgrade_client( Ok(()) } -// get the client state fn get_client_states( test: &Test, client_id: &ClientId, @@ -1130,7 +1100,7 @@ fn try_invalid_transfers( ALBERT, receiver.as_ref(), NAM, - 10.0, + 10, Some(ALBERT_KEY), &"port".parse().unwrap(), channel_id, @@ -1147,7 +1117,7 @@ fn try_invalid_transfers( ALBERT, receiver.as_ref(), NAM, - 10.0, + 10, Some(ALBERT_KEY), port_id, &"channel-42".parse().unwrap(), @@ -1201,7 +1171,7 @@ fn transfer( sender: impl AsRef, receiver: impl AsRef, token: impl AsRef, - amount: f64, + amount: u64, signer: Option<&str>, port_id: &PortId, channel_id: &ChannelId, @@ -1630,13 +1600,8 @@ fn check_balance( &rpc, ]; let mut client = run!(test, Bin::Client, query_args, Some(40))?; - let token_alias = if expected_amount == 0 { - // the alias should be a raw address since the token hasn't received - ibc_token(token).to_string() - } else { - token.as_ref().to_lowercase() - }; - let expected = format!("{}: {expected_amount}", token_alias); + let expected = + format!("{}: {expected_amount}", token.as_ref().to_lowercase()); client.exp_string(&expected)?; client.assert_success(); Ok(()) From 2e55658492450e5a52f893f609e6b9695fdccbca Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 19 Aug 2024 11:23:03 +0200 Subject: [PATCH 04/11] fix tests --- crates/tests/src/e2e/ibc_tests.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index bbc75ff950..30e41d1af0 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -67,9 +67,9 @@ const IBC_REFUND_TARGET_ALIAS: &str = "ibc-refund-target"; /// 2. Invalid transfers /// 3. Shielding/Unshielding transfers /// - Gaia -> Namada -> (shielded transfer) -> Namada -> Gaia -/// 3. Shielding transfer the received token back to a shielded account on +/// 4. Shielding transfer the received token back to a shielded account on /// Namada -/// 4. Refunding when transfer failure +/// 5. Refunding when transfer failure /// - Ack with an error (invalid receiver) /// - Timeout /// - when unshielding transfer failure @@ -101,6 +101,8 @@ fn ibc_transfers() -> Result<()> { let hermes = run_hermes(&test)?; let bg_hermes = hermes.background(); + // 1. Transparent transfers + // Transfer 2 APFEL from Namada to Gaia let gaia_receiver = find_gaia_address(&test_gaia, GAIA_USER)?; transfer( @@ -125,7 +127,7 @@ fn ibc_transfers() -> Result<()> { format!("{port_id_gaia}/{channel_id_gaia}/{token_addr}"); check_gaia_balance(&test_gaia, GAIA_USER, &ibc_denom_on_gaia, 2_000_000)?; - // Transfer 1 Apfel back from Gaia to Namada + // Transfer 1 APFEL back from Gaia to Namada let namada_receiver = find_address(&test, ALBERT)?.to_string(); transfer_from_gaia( &test_gaia, @@ -185,7 +187,7 @@ fn ibc_transfers() -> Result<()> { check_balance(&test, ALBERT, &ibc_denom_on_namada, 100)?; check_gaia_balance(&test_gaia, GAIA_USER, GAIA_COIN, 900)?; - // Invalid transfers + // 2. Invalid transfers try_invalid_transfers( &test, &gaia_receiver, @@ -193,6 +195,8 @@ fn ibc_transfers() -> Result<()> { &channel_id_namada, )?; + // 3. Shielding/Unshielding transfers + // Shielding transfer 100 samoleans from Gaia to Namada let shielding_data_path = gen_ibc_shielding_data( &test, @@ -250,12 +254,13 @@ fn ibc_transfers() -> Result<()> { check_balance(&test, AB_VIEWING_KEY, &ibc_denom_on_namada, 40)?; check_gaia_balance(&test_gaia, GAIA_USER, GAIA_COIN, 810)?; - // Shielding transfer back from Gaia to Namada + // 4. Shielding transfer the received token back to a shielded account on + // Namada let memo_path = gen_ibc_shielding_data( &test, AA_PAYMENT_ADDRESS, &ibc_denom_on_gaia, - 100, + 1, &port_id_namada, &channel_id_namada, )?; @@ -264,16 +269,17 @@ fn ibc_transfers() -> Result<()> { GAIA_USER, AA_PAYMENT_ADDRESS, get_gaia_denom_hash(&ibc_denom_on_gaia), - 100000000, + 1_000_000, &port_id_gaia, &channel_id_gaia, Some(memo_path), None, )?; wait_for_packet_relay(&port_id_gaia, &channel_id_gaia, &test)?; - // Check the token on Namada - check_balance(&test, AA_VIEWING_KEY, APFEL, 100)?; + check_balance(&test, AA_VIEWING_KEY, APFEL, 1)?; + + // 5. Refunding when transfer failure // Transfer to an invalid receiver address to check the refund for the // escrowed token From 75384b560946368b3cb8915ae3dae933337ab7bd Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 19 Aug 2024 11:43:07 +0200 Subject: [PATCH 05/11] add a test to unescrow for the refund --- crates/tests/src/e2e/ibc_tests.rs | 39 +++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index 30e41d1af0..6e9fa825ca 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -72,7 +72,9 @@ const IBC_REFUND_TARGET_ALIAS: &str = "ibc-refund-target"; /// 5. Refunding when transfer failure /// - Ack with an error (invalid receiver) /// - Timeout -/// - when unshielding transfer failure +/// - When unshielding transfer failure, +/// - Mint the IBC token for the refund +/// - Unescrow the token for the refund #[test] fn ibc_transfers() -> Result<()> { let update_genesis = @@ -325,7 +327,7 @@ fn ibc_transfers() -> Result<()> { // Restart relaying let hermes = run_hermes(&test)?; - let _bg_hermes = hermes.background(); + let bg_hermes = hermes.background(); wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; // The balance should not be changed @@ -348,9 +350,42 @@ fn ibc_transfers() -> Result<()> { false, )?; wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; + // Check the token has been refunded to the refund target check_balance(&test, AA_VIEWING_KEY, &ibc_denom_on_namada, 40)?; check_balance(&test, IBC_REFUND_TARGET_ALIAS, &ibc_denom_on_namada, 10)?; + // Stop Hermes for timeout test + let mut hermes = bg_hermes.foreground(); + hermes.interrupt()?; + + // Unshielding transfer will be timed out to check the refund for the + // escrowed IBC token + transfer( + &test, + A_SPENDING_KEY, + &gaia_receiver, + APFEL, + 1, + Some(ALBERT_KEY), + &port_id_namada, + &channel_id_namada, + Some(Duration::new(10, 0)), + None, + None, + false, + )?; + // wait for the timeout + sleep(10); + + // Restart relaying + let hermes = run_hermes(&test)?; + let _bg_hermes = hermes.background(); + + wait_for_packet_relay(&port_id_namada, &channel_id_namada, &test)?; + // Check the token has been refunded to the refund target + check_balance(&test, AA_VIEWING_KEY, APFEL, 0)?; + check_balance(&test, IBC_REFUND_TARGET_ALIAS, APFEL, 1)?; + Ok(()) } From b8708df2b465f68fed44e313c0663a3b13cb60f6 Mon Sep 17 00:00:00 2001 From: yito88 Date: Tue, 20 Aug 2024 12:16:21 +0200 Subject: [PATCH 06/11] for gaia 18 or later --- crates/tests/src/e2e/helpers.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/crates/tests/src/e2e/helpers.rs b/crates/tests/src/e2e/helpers.rs index 18d9740ad6..aae77a5e98 100644 --- a/crates/tests/src/e2e/helpers.rs +++ b/crates/tests/src/e2e/helpers.rs @@ -634,6 +634,7 @@ fn make_hermes_chain_config_for_gaia(test: &Test) -> Value { Value::String(key_dir.to_string_lossy().to_string()), ); chain.insert("store_prefix".to_owned(), Value::String("ibc".to_owned())); + chain.insert("gas_multiplier".to_owned(), Value::Float(1.3)); let mut table = toml::map::Map::new(); table.insert("price".to_owned(), Value::Float(0.001)); table.insert("denom".to_owned(), Value::String("stake".to_string())); @@ -681,6 +682,31 @@ pub fn update_gaia_config(test: &Test) -> Result<()> { file.write_all(values.to_string().as_bytes()) .map_err(|e| eyre!(format!("Writing a Gaia app.toml failed: {}", e)))?; + let genesis_path = test.test_dir.as_ref().join("gaia/config/genesis.json"); + let s = std::fs::read_to_string(&genesis_path) + .expect("Reading Gaia genesis.json failed"); + let mut genesis: serde_json::Value = + serde_json::from_str(&s).expect("Decoding Gaia genesis.json failed"); + if let Some(min_base_gas_price) = + genesis.pointer_mut("/app_state/feemarket/params/min_base_gas_price") + { + *min_base_gas_price = + serde_json::Value::String("0.000000000000000001".to_string()); + } + if let Some(base_gas_price) = + genesis.pointer_mut("/app_state/feemarket/state/base_gas_price") + { + *base_gas_price = + serde_json::Value::String("0.000000000000000001".to_string()); + } + let file = OpenOptions::new() + .write(true) + .truncate(true) + .open(&genesis_path)?; + let writer = std::io::BufWriter::new(file); + serde_json::to_writer_pretty(writer, &genesis) + .expect("Writing Gaia genesis.toml failed"); + Ok(()) } From fa0064715bf1b8f09c13b6dea2ca41c4483658f6 Mon Sep 17 00:00:00 2001 From: yito88 Date: Fri, 23 Aug 2024 08:24:24 +0200 Subject: [PATCH 07/11] IBC client upgrade test with Gaia --- crates/tests/src/e2e/helpers.rs | 43 ++-- crates/tests/src/e2e/ibc_tests.rs | 387 ++++++++++-------------------- crates/tests/src/e2e/setup.rs | 15 +- 3 files changed, 157 insertions(+), 288 deletions(-) diff --git a/crates/tests/src/e2e/helpers.rs b/crates/tests/src/e2e/helpers.rs index aae77a5e98..07170d6382 100644 --- a/crates/tests/src/e2e/helpers.rs +++ b/crates/tests/src/e2e/helpers.rs @@ -177,28 +177,6 @@ pub fn get_actor_rpc(test: &Test, who: Who) -> String { format!("http://{}:{}", socket_addr.ip(), socket_addr.port()) } -/// Get some nodes's wallet. -pub fn get_node_wallet(test: &Test, who: Who) -> Wallet { - let wallet_store_dir = - test.get_base_dir(who).join(test.net.chain_id.as_str()); - let mut wallet = FsWalletUtils::new(wallet_store_dir); - wallet.load().expect("Failed to load wallet"); - wallet -} - -/// Get the public key of the validator -pub fn get_validator_pk(test: &Test, who: Who) -> Option { - let index = match who { - Who::NonValidator => return None, - Who::Validator(i) => i, - }; - let mut wallet = get_node_wallet(test, who); - let sk = wallet - .find_secret_key(format!("validator-{index}-balance-key"), None) - .ok()?; - Some(sk.ref_to()) -} - /// Get a pregenesis wallet. pub fn get_pregenesis_wallet>( base_dir_path: P, @@ -687,6 +665,7 @@ pub fn update_gaia_config(test: &Test) -> Result<()> { .expect("Reading Gaia genesis.json failed"); let mut genesis: serde_json::Value = serde_json::from_str(&s).expect("Decoding Gaia genesis.json failed"); + // gas if let Some(min_base_gas_price) = genesis.pointer_mut("/app_state/feemarket/params/min_base_gas_price") { @@ -699,6 +678,18 @@ pub fn update_gaia_config(test: &Test) -> Result<()> { *base_gas_price = serde_json::Value::String("0.000000000000000001".to_string()); } + // gov + if let Some(max_deposit_period) = + genesis.pointer_mut("/app_state/gov/params/max_deposit_period") + { + *max_deposit_period = serde_json::Value::String("10s".to_string()); + } + if let Some(voting_period) = + genesis.pointer_mut("/app_state/gov/params/voting_period") + { + *voting_period = serde_json::Value::String("10s".to_string()); + } + let file = OpenOptions::new() .write(true) .truncate(true) @@ -727,3 +718,11 @@ pub fn find_gaia_address( Ok(matched.trim().to_string()) } + +pub fn get_gaia_gov_address(test: &Test) -> Result { + let args = ["query", "auth", "module-account", "gov"]; + let mut gaia = run_gaia_cmd(test, args, Some(40))?; + let (_, matched) = gaia.exp_regex("cosmos[a-z0-9]+")?; + + Ok(matched.trim().to_string()) +} diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index 6e9fa825ca..d52990eda3 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -15,14 +15,11 @@ use std::path::{Path, PathBuf}; use color_eyre::eyre::Result; use eyre::eyre; -use namada_apps_lib::cli::context::ENV_VAR_CHAIN_ID; use namada_apps_lib::client::rpc::query_storage_value_bytes; -use namada_apps_lib::config::genesis::{chain, templates}; -use namada_apps_lib::config::utils::set_port; -use namada_apps_lib::config::{ethereum_bridge, TendermintMode}; +use namada_apps_lib::config::ethereum_bridge; +use namada_apps_lib::config::genesis::templates; use namada_apps_lib::facade::tendermint_rpc::{Client, HttpClient, Url}; -use namada_core::string_encoding::StringEncoded; -use namada_sdk::address::{Address, MASP}; +use namada_sdk::address::MASP; use namada_sdk::governance::cli::onchain::PgfFunding; use namada_sdk::governance::pgf::ADDRESS as PGF_ADDRESS; use namada_sdk::governance::storage::proposal::{PGFIbcTarget, PGFTarget}; @@ -34,7 +31,6 @@ use namada_sdk::ibc::core::host::types::identifiers::{ use namada_sdk::ibc::primitives::proto::Any; use namada_sdk::ibc::storage::*; use namada_sdk::ibc::trace::ibc_token; -use namada_sdk::masp::fs::FsShieldedUtils; use namada_sdk::masp::PaymentAddress; use namada_sdk::storage::Epoch; use namada_sdk::token::Amount; @@ -45,7 +41,7 @@ use sha2::{Digest, Sha256}; use crate::e2e::helpers::{ epochs_per_year_from_min_duration, find_address, find_gaia_address, - get_actor_rpc, get_epoch, get_validator_pk, wait_for_wasm_pre_compile, + get_actor_rpc, get_epoch, get_gaia_gov_address, }; use crate::e2e::ledger_tests::{ start_namada_ledger_node_wait_wasm, write_json_file, @@ -55,10 +51,12 @@ use crate::e2e::setup::{ set_ethereum_bridge_mode, setup_gaia, setup_hermes, sleep, Bin, NamadaCmd, Test, Who, }; -use crate::strings::{LEDGER_STARTED, TX_APPLIED_SUCCESS, VALIDATOR_NODE}; +use crate::strings::TX_APPLIED_SUCCESS; use crate::{run, run_as}; const IBC_REFUND_TARGET_ALIAS: &str = "ibc-refund-target"; +const IBC_CLINET_ID: &str = "07-tendermint-0"; +const UPGRADED_CHAIN_ID: &str = "upgraded-chain"; /// IBC transfer tests: /// 1. Transparent transfers @@ -577,88 +575,47 @@ fn ibc_token_inflation() -> Result<()> { #[test] fn ibc_upgrade_client() -> Result<()> { - // To avoid the client expiration, stop updating the client near the - // first height of the grace epoch. It is set 340 because the grace epoch in - // this test will be Epoch 18 and the number of blocks per epoch is 20. - const MIN_UPGRADE_HEIGHT: u64 = 340; - const PIPELINE_LEN: u64 = 8; + const UPGRADE_HEIGHT_OFFSET: u64 = 20; let update_genesis = |mut genesis: templates::All, base_dir: &_| { genesis.parameters.parameters.epochs_per_year = - epochs_per_year_from_min_duration(20); - // for the trusting period of IBC client - genesis.parameters.pos_params.pipeline_len = PIPELINE_LEN; - genesis.parameters.gov_params.min_proposal_grace_epochs = 3; - genesis.parameters.ibc_params.default_mint_limit = - Amount::max_signed(); - genesis - .parameters - .ibc_params - .default_per_epoch_throughput_limit = Amount::max_signed(); + epochs_per_year_from_min_duration(1800); setup::set_validators(1, genesis, base_dir, |_| 0, vec![]) }; - let (ledger_a, ledger_b, test_a, test_b) = run_two_nets(update_genesis)?; - let _bg_ledger_a = ledger_a.background(); - let _bg_ledger_b = ledger_b.background(); + let (ledger, gaia, test, test_gaia) = run_namada_gaia(update_genesis)?; + let _bg_ledger = ledger.background(); + let _bg_gaia = gaia.background(); - // Proposal on Chain B - // Delegate some token - delegate_token(&test_b)?; - let rpc_b = get_actor_rpc(&test_b, Who::Validator(0)); - let mut epoch = get_epoch(&test_b, &rpc_b).unwrap(); - let delegated = epoch + PIPELINE_LEN; - while epoch < delegated { - sleep(10); - epoch = get_epoch(&test_b, &rpc_b).unwrap_or_default(); - } - // Upgrade proposal on Chain B - // The transaction will store the upgraded client state and consensus state - // as if Chain B will be upgraded - let start_epoch = propose_upgrade_client(&test_b)?; - let mut epoch = get_epoch(&test_b, &rpc_b).unwrap(); - // Vote - while epoch < start_epoch { - sleep(10); - epoch = get_epoch(&test_b, &rpc_b).unwrap_or_default(); - } - submit_votes(&test_b)?; + setup_hermes(&test, &test_gaia)?; + create_channel_with_hermes(&test, &test_gaia)?; - // creating IBC channel while waiting the grace epoch - setup_hermes(&test_a, &test_b)?; - create_channel_with_hermes(&test_a, &test_b)?; - // Start relaying to update clients - let hermes = run_hermes(&test_a)?; - let bg_hermes = hermes.background(); + let height = query_height(&test_gaia)?; + let upgrade_height = height.revision_height() + UPGRADE_HEIGHT_OFFSET; - let mut height = query_height(&test_b)?; - while height.revision_height() < MIN_UPGRADE_HEIGHT { - sleep(10); - height = query_height(&test_b)?; - } - // Stop Hermes not to update a client after the upgrade height - let mut hermes = bg_hermes.foreground(); - hermes.interrupt()?; + // upgrade proposal + propose_upgrade_client(&test, &test_gaia, upgrade_height)?; - // wait for the grace epoch - let grace_epoch = start_epoch + 6u64; - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - while epoch < grace_epoch { - sleep(10); - epoch = get_epoch(&test_b, &rpc_b).unwrap_or_default(); + // vote + vote_on_gaia(&test_gaia)?; + wait_for_pass(&test_gaia)?; + + // wait for the halt height + let mut height = query_height(&test_gaia)?; + while height.revision_height() < upgrade_height { + sleep(5); + height = query_height(&test_gaia)?; } - // Check the upgraded height - let upgraded_height = get_upgraded_height(&test_b, MIN_UPGRADE_HEIGHT)?; - // Upgrade the IBC client of Chain B on Chain A with Hermes - upgrade_client(&test_a, test_a.net.chain_id.to_string(), upgraded_height)?; + // Upgrade the IBC client of Gaia on Namada with Hermes + upgrade_client(&test, test.net.chain_id.to_string(), upgrade_height)?; // Check the upgraded client let upgraded_client_state = - get_client_states(&test_a, &"07-tendermint-0".parse().unwrap())?; + get_client_state(&test, &IBC_CLINET_ID.parse().unwrap())?; assert_eq!( upgraded_client_state.inner().chain_id.as_str(), - "upgraded-chain" + UPGRADED_CHAIN_ID ); Ok(()) @@ -832,125 +789,6 @@ fn run_namada_gaia( Ok((ledger, gaia, test, test_gaia)) } -fn run_two_nets( - update_genesis: impl FnMut( - templates::All, - &Path, - ) -> templates::All, -) -> Result<(NamadaCmd, NamadaCmd, Test, Test)> { - let (test_a, test_b) = setup_two_single_node_nets(update_genesis)?; - set_ethereum_bridge_mode( - &test_a, - &test_a.net.chain_id, - Who::Validator(0), - ethereum_bridge::ledger::Mode::Off, - None, - ); - set_ethereum_bridge_mode( - &test_b, - &test_b.net.chain_id, - Who::Validator(0), - ethereum_bridge::ledger::Mode::Off, - None, - ); - - // Run Chain A - std::env::set_var(ENV_VAR_CHAIN_ID, test_a.net.chain_id.to_string()); - let mut ledger_a = - run_as!(test_a, Who::Validator(0), Bin::Node, &["ledger"], Some(40))?; - ledger_a.exp_string(LEDGER_STARTED)?; - ledger_a.exp_string(VALIDATOR_NODE)?; - // Run Chain B - std::env::set_var(ENV_VAR_CHAIN_ID, test_b.net.chain_id.to_string()); - let mut ledger_b = - run_as!(test_b, Who::Validator(0), Bin::Node, &["ledger"], Some(40))?; - ledger_b.exp_string(LEDGER_STARTED)?; - ledger_b.exp_string(VALIDATOR_NODE)?; - - wait_for_wasm_pre_compile(&mut ledger_a)?; - wait_for_wasm_pre_compile(&mut ledger_b)?; - - sleep(5); - - Ok((ledger_a, ledger_b, test_a, test_b)) -} - -fn setup_two_single_node_nets( - mut update_genesis: impl FnMut( - templates::All, - &Path, - ) -> templates::All, -) -> Result<(Test, Test)> { - const ANOTHER_PROXY_APP: u16 = 27659u16; - const ANOTHER_RPC: u16 = 27660u16; - const ANOTHER_P2P: u16 = 26655u16; - // Download the shielded pool parameters before starting node - let _ = FsShieldedUtils::new(PathBuf::new()); - - let test_a = setup::network(&mut update_genesis, None)?; - let test_b = setup::network(update_genesis, None)?; - let genesis_b_dir = test_b - .test_dir - .path() - .join(namada_apps_lib::client::utils::NET_ACCOUNTS_DIR) - .join("validator-0"); - let mut genesis_b = chain::Finalized::read_toml_files( - &genesis_b_dir.join(test_b.net.chain_id.as_str()), - ) - .map_err(|_| eyre!("Could not read genesis files from test b"))?; - // chain b's validator needs to listen on a different port than chain a's - // validator - let validator_pk = get_validator_pk(&test_b, Who::Validator(0)).unwrap(); - let validator_addr = genesis_b - .transactions - .established_account - .as_ref() - .unwrap() - .iter() - .find_map(|acct| { - acct.tx - .public_keys - .contains(&StringEncoded::new(validator_pk.clone())) - .then(|| acct.address.clone()) - }) - .unwrap(); - let validator_tx = genesis_b - .transactions - .validator_account - .as_mut() - .unwrap() - .iter_mut() - .find(|val| { - Address::Established(val.tx.data.address.raw.clone()) - == validator_addr - }) - .unwrap(); - let new_port = validator_tx.tx.data.net_address.port() - + setup::ANOTHER_CHAIN_PORT_OFFSET; - validator_tx.tx.data.net_address.set_port(new_port); - genesis_b - .write_toml_files(&genesis_b_dir.join(test_b.net.chain_id.as_str())) - .map_err(|_| eyre!("Could not write genesis toml files for test_b"))?; - // modify chain b to use different ports for cometbft - let mut config = namada_apps_lib::config::Config::load( - &genesis_b_dir, - &test_b.net.chain_id, - Some(TendermintMode::Validator), - ); - let proxy_app = &mut config.ledger.cometbft.proxy_app; - set_port(proxy_app, ANOTHER_PROXY_APP); - let rpc_addr = &mut config.ledger.cometbft.rpc.laddr; - set_port(rpc_addr, ANOTHER_RPC); - let p2p_addr = &mut config.ledger.cometbft.p2p.laddr; - set_port(p2p_addr, ANOTHER_P2P); - config - .write(&genesis_b_dir, &test_b.net.chain_id, true) - .map_err(|e| { - eyre!("Unable to modify chain b's config file due to {}", e) - })?; - Ok((test_a, test_b)) -} - fn create_channel_with_hermes( test_a: &Test, test_b: &Test, @@ -1050,33 +888,6 @@ fn wait_for_packet_relay( Err(eyre!("Pending packet is still left")) } -fn get_upgraded_height(test: &Test, min_upgrade_height: u64) -> Result { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); - // Search the storage for the upgraded client state - let rpc = get_actor_rpc(test, Who::Validator(0)); - let max_height = min_upgrade_height + 100; - let mut height = min_upgrade_height; - while height < max_height { - height += 1; - let key = upgraded_client_state_key(Height::new(0, height).unwrap()); - let query_args = [ - "query-bytes", - "--storage-key", - &key.to_string(), - "--node", - &rpc, - ]; - let mut client = run!(test, Bin::Client, query_args, Some(10))?; - if client.exp_string("No data found").is_ok() { - sleep(1); - continue; - } else { - return Ok(height); - } - } - panic!("No upgraded client state on the chain"); -} - fn upgrade_client( test: &Test, host_chain_id: impl AsRef, @@ -1099,7 +910,7 @@ fn upgrade_client( Ok(()) } -fn get_client_states( +fn get_client_state( test: &Test, client_id: &ClientId, ) -> Result { @@ -1181,7 +992,6 @@ fn transfer_on_chain( amount: u64, signer: impl AsRef, ) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let rpc = get_actor_rpc(test, Who::Validator(0)); let amount = amount.to_string(); let tx_args = apply_use_device(vec![ @@ -1221,7 +1031,6 @@ fn transfer( expected_err: Option<&str>, wait_reveal_pk: bool, ) -> Result { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let rpc = get_actor_rpc(test, Who::Validator(0)); let channel_id = channel_id.to_string(); @@ -1303,7 +1112,6 @@ fn transfer( } fn delegate_token(test: &Test) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let rpc = get_actor_rpc(test, Who::Validator(0)); let tx_args = apply_use_device(vec![ "bond", @@ -1429,52 +1237,114 @@ fn propose_inflation(test: &Test) -> Result { Ok(start_epoch.into()) } -fn propose_upgrade_client(test: &Test) -> Result { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); - let albert = find_address(test, ALBERT)?; - let rpc = get_actor_rpc(test, Who::Validator(0)); - let epoch = get_epoch(test, &rpc)?; - let start_epoch = (epoch.0 + 3) / 3 * 3; +fn propose_upgrade_client( + test_namada: &Test, + test_gaia: &Test, + upgrade_height: u64, +) -> Result<()> { + let client_state = + get_client_state(test_namada, &IBC_CLINET_ID.parse().unwrap())?; + let mut client_state = client_state.inner().clone(); + client_state.chain_id = UPGRADED_CHAIN_ID.parse().unwrap(); + client_state.latest_height = Height::new(0, upgrade_height + 1).unwrap(); + client_state.zero_custom_fields(); + let any_client_state = Any::from(client_state.clone()); + + let proposer = get_gaia_gov_address(test_gaia)?; + let proposal_json = serde_json::json!({ - "proposal": { - "content": { - "title": "TheTitle", - "authors": "test@test.com", - "discussions-to": "www.github.com/anoma/aip/1", - "created": "2022-03-10T08:54:37Z", - "license": "MIT", - "abstract": "upgrade chain", - "motivation": "upgrade chain", - "details": "upgrade chain", - "requires": "2" - }, - "author": albert, - "voting_start_epoch": start_epoch, - "voting_end_epoch": start_epoch + 3_u64, - "activation_epoch": start_epoch + 6_u64, - }, - "data": TestWasms::TxProposalIbcClientUpgrade.read_bytes() + "messages": [ + { + "@type": "/ibc.core.client.v1.MsgIBCSoftwareUpgrade", + "plan": { + "name": "Upgrade", + "height": upgrade_height, + "info": "" + }, + "upgraded_client_state": { + "@type": any_client_state.type_url, + "chain_id": client_state.chain_id().to_string(), + "unbonding_period": format!("{}s", client_state.unbonding_period.as_secs()), + "latest_height": client_state.latest_height, + "proof_specs": client_state.proof_specs, + "upgrade_path": client_state.upgrade_path, + }, + "signer": proposer + } + ], + "metadata": "ipfs://CID", + "deposit": "10000000stake", + "title": "Upgrade", + "summary": "Upgrade Gaia chain", + "expedited": false }); - let proposal_json_path = test.test_dir.path().join("proposal.json"); + let proposal_json_path = test_gaia.test_dir.path().join("proposal.json"); write_json_file(proposal_json_path.as_path(), proposal_json); + let rpc = format!("tcp://{GAIA_RPC}"); let submit_proposal_args = vec![ - "init-proposal", - "--data-path", + "tx", + "gov", + "submit-proposal", proposal_json_path.to_str().unwrap(), - "--gas-limit", - "4000000", + "--from", + GAIA_USER, + "--gas", + "250000", + "--gas-prices", + "0.001stake", + "--node", + &rpc, + "--keyring-backend", + "test", + "--chain-id", + GAIA_CHAIN_ID, + "--yes", + ]; + let mut gaia = run_gaia_cmd(test_gaia, submit_proposal_args, Some(40))?; + gaia.assert_success(); + Ok(()) +} + +fn wait_for_pass(test: &Test) -> Result<()> { + let args = ["query", "gov", "proposal", "1"]; + for _ in 0..10 { + sleep(5); + let mut gaia = run_gaia_cmd(test, args, Some(40))?; + let (_, matched) = gaia.exp_regex("status: .*")?; + if matched.split(' ').last().unwrap() == "PROPOSAL_STATUS_PASSED" { + break; + } + } + Ok(()) +} + +fn vote_on_gaia(test: &Test) -> Result<()> { + let rpc = format!("tcp://{GAIA_RPC}"); + let args = vec![ + "tx", + "gov", + "vote", + "1", + "yes", + "--from", + GAIA_VALIDATOR, + "--gas-prices", + "0.001stake", "--node", &rpc, + "--keyring-backend", + "test", + "--chain-id", + GAIA_CHAIN_ID, + "--yes", ]; - let mut client = run!(test, Bin::Client, submit_proposal_args, Some(40))?; - client.exp_string(TX_APPLIED_SUCCESS)?; - client.assert_success(); - Ok(start_epoch.into()) + let mut gaia = run_gaia_cmd(test, args, Some(40))?; + gaia.assert_success(); + Ok(()) } fn submit_votes(test: &Test) -> Result<()> { - std::env::set_var(ENV_VAR_CHAIN_ID, test.net.chain_id.to_string()); let rpc = get_actor_rpc(test, Who::Validator(0)); let submit_proposal_vote = vec![ @@ -1732,7 +1602,6 @@ fn gen_ibc_shielding_data( port_id: &PortId, channel_id: &ChannelId, ) -> Result { - std::env::set_var(ENV_VAR_CHAIN_ID, dst_test.net.chain_id.to_string()); let rpc = get_actor_rpc(dst_test, Who::Validator(0)); let output_folder = dst_test.test_dir.path().to_string_lossy(); diff --git a/crates/tests/src/e2e/setup.rs b/crates/tests/src/e2e/setup.rs index c3bf524c2d..b2651d6a0d 100644 --- a/crates/tests/src/e2e/setup.rs +++ b/crates/tests/src/e2e/setup.rs @@ -71,9 +71,6 @@ pub struct Network { pub chain_id: ChainId, } -/// Offset the ports used in the network configuration to avoid shared resources -pub const ANOTHER_CHAIN_PORT_OFFSET: u16 = 1000; - /// Apply the --use-device flag depending on the environment variables pub fn apply_use_device(mut tx_args: Vec<&str>) -> Vec<&str> { if is_use_device() { @@ -1316,7 +1313,7 @@ pub fn setup_gaia() -> Result { "genesis", "add-genesis-account", &account, - "10000stake,1000samoleans", + "100000000stake,1000samoleans", ]; let mut gaia = run_gaia_cmd(&test, args, Some(10))?; gaia.assert_success(); @@ -1329,8 +1326,12 @@ pub fn setup_gaia() -> Result { // Add the stake token to the validator let validator = find_gaia_address(&test, constants::GAIA_VALIDATOR)?; - let stake = "100000000000stake"; - let args = ["genesis", "add-genesis-account", &validator, stake]; + let args = [ + "genesis", + "add-genesis-account", + &validator, + "200000000000stake", + ]; let mut gaia = run_gaia_cmd(&test, args, Some(10))?; gaia.assert_success(); @@ -1339,7 +1340,7 @@ pub fn setup_gaia() -> Result { "genesis", "gentx", constants::GAIA_VALIDATOR, - stake, + "100000000000stake", "--keyring-backend", "test", "--chain-id", From ca97a8488215c299e51647c171094816405991b1 Mon Sep 17 00:00:00 2001 From: yito88 Date: Fri, 23 Aug 2024 10:36:05 +0200 Subject: [PATCH 08/11] delete tx_proposal_ibc_client_upgrade --- wasm_for_tests/Cargo.lock | 10 ------ wasm_for_tests/Cargo.toml | 1 - wasm_for_tests/Makefile | 1 - .../tx_proposal_ibc_client_upgrade/Cargo.toml | 18 ----------- .../tx_proposal_ibc_client_upgrade/src/lib.rs | 30 ------------------ .../tx_proposal_ibc_token_inflation.wasm | Bin 331114 -> 0 bytes 6 files changed, 60 deletions(-) delete mode 100644 wasm_for_tests/tx_proposal_ibc_client_upgrade/Cargo.toml delete mode 100644 wasm_for_tests/tx_proposal_ibc_client_upgrade/src/lib.rs delete mode 100755 wasm_for_tests/tx_proposal_ibc_token_inflation.wasm diff --git a/wasm_for_tests/Cargo.lock b/wasm_for_tests/Cargo.lock index 801d966a76..93b4828579 100644 --- a/wasm_for_tests/Cargo.lock +++ b/wasm_for_tests/Cargo.lock @@ -3583,16 +3583,6 @@ dependencies = [ "rlsf", ] -[[package]] -name = "tx_proposal_ibc_client_upgrade" -version = "0.41.0" -dependencies = [ - "getrandom", - "namada_test_utils", - "namada_tx_prelude", - "rlsf", -] - [[package]] name = "tx_proposal_ibc_token_inflation" version = "0.41.0" diff --git a/wasm_for_tests/Cargo.toml b/wasm_for_tests/Cargo.toml index fc782df086..34b65d16a5 100644 --- a/wasm_for_tests/Cargo.toml +++ b/wasm_for_tests/Cargo.toml @@ -9,7 +9,6 @@ members = [ "tx_memory_limit", "tx_no_op", "tx_proposal_code", - "tx_proposal_ibc_client_upgrade", "tx_proposal_ibc_token_inflation", "tx_proposal_masp_reward", "tx_read_storage_key", diff --git a/wasm_for_tests/Makefile b/wasm_for_tests/Makefile index 91c1785d28..93ba19f33b 100644 --- a/wasm_for_tests/Makefile +++ b/wasm_for_tests/Makefile @@ -12,7 +12,6 @@ wasms += tx_invalid_data wasms += tx_memory_limit wasms += tx_no_op wasms += tx_proposal_code -wasms += tx_proposal_ibc_client_upgrade wasms += tx_proposal_ibc_token_inflation wasms += tx_proposal_masp_reward wasms += tx_read_storage_key diff --git a/wasm_for_tests/tx_proposal_ibc_client_upgrade/Cargo.toml b/wasm_for_tests/tx_proposal_ibc_client_upgrade/Cargo.toml deleted file mode 100644 index 25fb0ada75..0000000000 --- a/wasm_for_tests/tx_proposal_ibc_client_upgrade/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "tx_proposal_ibc_client_upgrade" -description = "Wasm transaction used for testing." -authors.workspace = true -edition.workspace = true -license.workspace = true -version.workspace = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -namada_test_utils.workspace = true -namada_tx_prelude.workspace = true -rlsf.workspace = true -getrandom.workspace = true - -[lib] -crate-type = ["cdylib"] diff --git a/wasm_for_tests/tx_proposal_ibc_client_upgrade/src/lib.rs b/wasm_for_tests/tx_proposal_ibc_client_upgrade/src/lib.rs deleted file mode 100644 index 82db4e42b2..0000000000 --- a/wasm_for_tests/tx_proposal_ibc_client_upgrade/src/lib.rs +++ /dev/null @@ -1,30 +0,0 @@ -use namada_test_utils::ibc::{ - make_new_client_state_bytes, make_new_consensus_state_bytes, -}; -use namada_tx_prelude::*; - -#[transaction] -fn apply_tx(ctx: &mut Ctx, _tx_data: BatchedTx) -> TxResult { - // This transaction will just store the IBC client state and the consensus - // state as if the chain was upgraded - let current_height = ctx.get_block_height()?.0; - // Make the states based on the last committed height - let last_committed_height = current_height - 1; - // Need to read the upgrade state with the next height - let upgrade_height = current_height + 1; - // The height of the new client state is the next after the upgrade - let height_after_upgrade = upgrade_height + 1; - let client_state = make_new_client_state_bytes(height_after_upgrade); - - let header = ctx.get_block_header(last_committed_height.into())?.unwrap(); - let consensus_state = make_new_consensus_state_bytes(header); - - let height = format!("0-{upgrade_height}").parse().unwrap(); - let upgraded_client_state_key = ibc::upgraded_client_state_key(height); - ctx.write_bytes(&upgraded_client_state_key, client_state)?; - let upgraded_consensus_state_key = - ibc::upgraded_consensus_state_key(height); - ctx.write_bytes(&upgraded_consensus_state_key, consensus_state)?; - - Ok(()) -} diff --git a/wasm_for_tests/tx_proposal_ibc_token_inflation.wasm b/wasm_for_tests/tx_proposal_ibc_token_inflation.wasm deleted file mode 100755 index 323b361a004aaacc2a8901c1688151b0c8549c56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331114 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°RgK6Lnbu()#5l;6 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⪻K&2K^XvWwh;h{4xy6If9?ElGOp&@- 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 From d5d5d6b9d48876835e033c60c0af994fdd03ca47 Mon Sep 17 00:00:00 2001 From: yito88 Date: Fri, 23 Aug 2024 11:37:15 +0200 Subject: [PATCH 09/11] add changelog --- .changelog/unreleased/testing/3601-clean-ibc-e2e.md | 2 ++ .github/workflows/scripts/e2e.json | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 .changelog/unreleased/testing/3601-clean-ibc-e2e.md diff --git a/.changelog/unreleased/testing/3601-clean-ibc-e2e.md b/.changelog/unreleased/testing/3601-clean-ibc-e2e.md new file mode 100644 index 0000000000..f6cc86a015 --- /dev/null +++ b/.changelog/unreleased/testing/3601-clean-ibc-e2e.md @@ -0,0 +1,2 @@ +- Clean IBC E2E tests and refine IBC client upgrade test with Gaia + ([\#3601](https://github.com/anoma/namada/issues/3601)) \ No newline at end of file diff --git a/.github/workflows/scripts/e2e.json b/.github/workflows/scripts/e2e.json index f816227fd0..163a87fa99 100644 --- a/.github/workflows/scripts/e2e.json +++ b/.github/workflows/scripts/e2e.json @@ -1,10 +1,10 @@ { "e2e::eth_bridge_tests::everything": 4, - "e2e::ibc_tests::ibc_transfers": 300, - "e2e::ibc_tests::pgf_over_ibc": 490, - "e2e::ibc_tests::ibc_token_inflation": 1100, - "e2e::ibc_tests::ibc_rate_limit": 430, - "e2e::ibc_tests::ibc_upgrade_client": 550, + "e2e::ibc_tests::ibc_transfers": 414, + "e2e::ibc_tests::pgf_over_ibc": 415, + "e2e::ibc_tests::ibc_token_inflation": 840, + "e2e::ibc_tests::ibc_rate_limit": 485, + "e2e::ibc_tests::ibc_upgrade_client": 280, "e2e::eth_bridge_tests::test_add_to_bridge_pool": 10, "e2e::ledger_tests::double_signing_gets_slashed": 12, "e2e::ledger_tests::ledger_many_txs_in_a_block": 55, @@ -30,4 +30,4 @@ "e2e::wallet_tests::wallet_encrypted_key_cmds_env_var": 1, "e2e::wallet_tests::wallet_unencrypted_key_cmds": 1, "e2e::ledger_tests::masp_txs_and_queries": 82 -} \ No newline at end of file +} From 63bb35519f212b6dd0910d31d041dffb07b9bda0 Mon Sep 17 00:00:00 2001 From: yito88 Date: Fri, 23 Aug 2024 12:14:34 +0200 Subject: [PATCH 10/11] fix test --- crates/test_utils/src/lib.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/crates/test_utils/src/lib.rs b/crates/test_utils/src/lib.rs index 8da61eeb9b..e519a8dd41 100644 --- a/crates/test_utils/src/lib.rs +++ b/crates/test_utils/src/lib.rs @@ -27,7 +27,6 @@ pub enum TestWasms { TxProposalCode, TxProposalMaspRewards, TxProposalIbcTokenInflation, - TxProposalIbcClientUpgrade, TxReadStorageKey, TxWriteStorageKey, VpAlwaysFalse, @@ -55,9 +54,6 @@ impl TestWasms { TestWasms::TxProposalIbcTokenInflation => { "tx_proposal_ibc_token_inflation.wasm" } - TestWasms::TxProposalIbcClientUpgrade => { - "tx_proposal_ibc_client_upgrade.wasm" - } TestWasms::TxReadStorageKey => "tx_read_storage_key.wasm", TestWasms::TxWriteStorageKey => "tx_write.wasm", TestWasms::VpAlwaysFalse => "vp_always_false.wasm", From cc86709ab6383b6252b85688c521bddbf7f747c1 Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 26 Aug 2024 07:38:15 +0200 Subject: [PATCH 11/11] add check before inflation --- crates/tests/src/e2e/ibc_tests.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index d52990eda3..8e18586e9f 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -537,6 +537,8 @@ fn ibc_token_inflation() -> Result<()> { epoch = get_epoch(&test, &rpc).unwrap(); } + // Check the target balance is zero before the inflation + check_balance(&test, AA_VIEWING_KEY, NAM, 0)?; // Shielding transfer 1 samoleans from Gaia to Namada let shielding_data_path = gen_ibc_shielding_data( &test,