From dc9e4fd1ddfa00d1b88b40fd1885033645fee9ef Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 26 Jul 2023 12:15:21 +0200 Subject: [PATCH 001/175] [feat]: Allow eth-oracle to be activated / deactivated via config updates sent from ledger --- .../lib/node/ledger/ethereum_oracle/mod.rs | 114 ++++++++++++++++++ .../lib/node/ledger/shell/finalize_block.rs | 6 +- apps/src/lib/node/ledger/shell/init_chain.rs | 2 +- apps/src/lib/node/ledger/shell/mod.rs | 37 ++++-- ethereum_bridge/src/oracle/config.rs | 3 + .../src/storage/eth_bridge_queries.rs | 24 +++- 6 files changed, 172 insertions(+), 14 deletions(-) diff --git a/apps/src/lib/node/ledger/ethereum_oracle/mod.rs b/apps/src/lib/node/ledger/ethereum_oracle/mod.rs index 1e967b12b4..4c1638eaf6 100644 --- a/apps/src/lib/node/ledger/ethereum_oracle/mod.rs +++ b/apps/src/lib/node/ledger/ethereum_oracle/mod.rs @@ -243,6 +243,18 @@ impl Oracle { _ => None, } } + + /// If the bridge has been deactivated, block here until a new + /// config is passed that reactivates the bridge + async fn wait_on_reactivation(&mut self) -> Config { + loop { + if let Some(Command::UpdateConfig(c)) = self.control.recv().await { + if c.active { + return c; + } + } + } + } } /// Block until an initial configuration is received via the command channel. @@ -394,6 +406,9 @@ async fn run_oracle_aux(mut oracle: Oracle) { if let Some(new_config) = oracle.update_config() { config = new_config; } + if !config.active { + config = oracle.wait_on_reactivation().await; + } next_block_to_process += 1.into(); } } @@ -981,6 +996,105 @@ mod test_oracle { oracle.await.expect("Test failed"); } + /// Test that Ethereum oracle can be deactivate and reactivated + /// via config updates. + /// NOTE: This test can flake due to async channel race + /// conditions. + #[tokio::test] + async fn test_oracle_reactivation() { + let TestPackage { + oracle, + eth_recv, + controller, + mut blocks_processed_recv, + mut control_sender, + } = setup(); + let config = Config::default(); + let oracle = start_with_default_config( + oracle, + &mut control_sender, + config.clone(), + ) + .await; + + // set the height of the chain such that there are some blocks deep + // enough to be considered confirmed by the oracle + let confirmed_block_height = 9; // all blocks up to and including this block will have enough confirmations + let min_confirmations = u64::from(config.min_confirmations); + controller.apply_cmd(TestCmd::NewHeight(Uint256::from( + min_confirmations + confirmed_block_height - 3, + ))); + + // check that the oracle indeed processes the expected blocks + for height in 0u64..(confirmed_block_height - 4) { + let block_processed = timeout( + std::time::Duration::from_secs(3), + blocks_processed_recv.recv(), + ) + .await + .expect("Timed out waiting for block to be checked") + .unwrap(); + assert_eq!(block_processed, Uint256::from(height)); + } + + // Deactivate the bridge before all confirmed events are confirmed and + // processed There is a very fine needle to thread here. A block + // must be processed **after** this config is sent in order for + // the updated config to be received. However, this test can + // flake due to channel race conditions. + control_sender + .try_send(Command::UpdateConfig(Config { + active: false, + ..Default::default() + })) + .expect("Test failed"); + std::thread::sleep(Duration::from_secs(1)); + controller.apply_cmd(TestCmd::NewHeight(Uint256::from( + min_confirmations + confirmed_block_height - 4, + ))); + + let block_processed = timeout( + std::time::Duration::from_secs(3), + blocks_processed_recv.recv(), + ) + .await + .expect("Timed out waiting for block to be checked") + .unwrap(); + assert_eq!(block_processed, Uint256::from(confirmed_block_height - 4)); + + // check that the oracle hasn't yet checked any further blocks + // TODO: check this in a deterministic way rather than just waiting a + // bit + let res = timeout( + std::time::Duration::from_secs(3), + blocks_processed_recv.recv(), + ) + .await; + assert!(res.is_err()); + + // reactivate the bridge and check that the oracle + // processed the rest of the confirmed blocks + control_sender + .try_send(Command::UpdateConfig(Default::default())) + .expect("Test failed"); + + controller.apply_cmd(TestCmd::NewHeight(Uint256::from( + min_confirmations + confirmed_block_height, + ))); + for height in (confirmed_block_height - 3)..=confirmed_block_height { + let block_processed = timeout( + std::time::Duration::from_secs(3), + blocks_processed_recv.recv(), + ) + .await + .expect("Timed out waiting for block to be checked") + .unwrap(); + assert_eq!(block_processed, Uint256::from(height)); + } + drop(eth_recv); + oracle.await.expect("Test failed"); + } + /// Test that if the Ethereum RPC endpoint returns a latest block that is /// more than one block later than the previous latest block we received, we /// still check all the blocks in between diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 2f178eb47e..a756f39c25 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -136,6 +136,7 @@ where // Tracks the accepted transactions self.wl_storage.storage.block.results = BlockResults::default(); + let mut changed_keys = BTreeSet::new(); for (tx_index, processed_tx) in req.txs.iter().enumerate() { let tx = if let Ok(tx) = Tx::try_from(processed_tx.tx.as_ref()) { tx @@ -421,7 +422,7 @@ where ) .map_err(Error::TxApply) { - Ok(result) => { + Ok(ref mut result) => { if result.is_accepted() { tracing::trace!( "all VPs accepted transaction {} storage \ @@ -429,6 +430,7 @@ where tx_event["hash"], result ); + changed_keys.append(&mut result.changed_keys); stats.increment_successful_txs(); self.wl_storage.commit_tx(); if !tx_event.contains_key("code") { @@ -531,7 +533,7 @@ where self.update_epoch(&mut response); // send the latest oracle configs. These may have changed due to // governance. - self.update_eth_oracle(); + self.update_eth_oracle(&changed_keys); } if !req.proposer_address.is_empty() { diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index ef08373789..b88f44c939 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -204,7 +204,7 @@ where if let Some(config) = genesis.ethereum_bridge_params { tracing::debug!("Initializing Ethereum bridge storage."); config.init_storage(&mut self.wl_storage); - self.update_eth_oracle(); + self.update_eth_oracle(&Default::default()); } else { self.wl_storage .write_bytes( diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 2b7a0b7ac7..d2b7cc8390 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -548,7 +548,7 @@ where // TODO: config event log params event_log: EventLog::default(), }; - shell.update_eth_oracle(); + shell.update_eth_oracle(&Default::default()); shell } @@ -928,14 +928,18 @@ where } /// If a handle to an Ethereum oracle was provided to the [`Shell`], attempt - /// to send it an updated configuration, using an initial configuration + /// to send it an updated configuration, using a configuration /// based on Ethereum bridge parameters in blockchain storage. /// /// This method must be safe to call even before ABCI `InitChain` has been /// called (i.e. when storage is empty), as we may want to do this check /// every time the shell starts up (including the first time ever at which /// time storage will be empty). - fn update_eth_oracle(&mut self) { + /// + /// This method is also called during `FinalizeBlock` to update the oracle + /// if relevant storage changes have occurred. This includes deactivating + /// and reactivating the bridge. + fn update_eth_oracle(&mut self, changed_keys: &BTreeSet) { if let ShellMode::Validator { eth_oracle: Some(EthereumOracleChannels { control_sender, .. }), .. @@ -961,18 +965,32 @@ where ); return; } - if !self.wl_storage.ethbridge_queries().is_bridge_active() { - tracing::info!( - "Not starting oracle as the Ethereum bridge is disabled" - ); - return; - } let Some(config) = EthereumBridgeConfig::read(&self.wl_storage) else { tracing::info!( "Not starting oracle as the Ethereum bridge config couldn't be found in storage" ); return; }; + let active = + if !self.wl_storage.ethbridge_queries().is_bridge_active() { + if !changed_keys + .contains(ð_bridge::storage::active_key()) + { + tracing::info!( + "Not starting oracle as the Ethereum bridge is \ + disabled" + ); + return; + } else { + tracing::info!( + "Disabling oracle as the bridge has been disabled" + ); + false + } + } else { + true + }; + let start_block = self .wl_storage .storage @@ -998,6 +1016,7 @@ where bridge_contract: config.contracts.bridge.address, governance_contract: config.contracts.governance.address, start_block, + active, }; tracing::info!( ?config, diff --git a/ethereum_bridge/src/oracle/config.rs b/ethereum_bridge/src/oracle/config.rs index 4ddb3ede1d..45c7325897 100644 --- a/ethereum_bridge/src/oracle/config.rs +++ b/ethereum_bridge/src/oracle/config.rs @@ -16,6 +16,8 @@ pub struct Config { pub governance_contract: EthAddress, /// The earliest Ethereum block from which events may be processed. pub start_block: ethereum_structs::BlockHeight, + /// The status of the Ethereum bridge (active / inactive) + pub active: bool, } // TODO: this production Default implementation is temporary, there should be no @@ -29,6 +31,7 @@ impl std::default::Default for Config { bridge_contract: EthAddress([0; 20]), governance_contract: EthAddress([1; 20]), start_block: 0.into(), + active: true, } } } diff --git a/ethereum_bridge/src/storage/eth_bridge_queries.rs b/ethereum_bridge/src/storage/eth_bridge_queries.rs index 827745def0..cafe6815db 100644 --- a/ethereum_bridge/src/storage/eth_bridge_queries.rs +++ b/ethereum_bridge/src/storage/eth_bridge_queries.rs @@ -37,14 +37,34 @@ pub enum SendValsetUpd { AtPrevHeight, } -#[derive(Debug, Clone, BorshDeserialize, BorshSerialize)] +#[derive( + Debug, + Clone, + BorshDeserialize, + BorshSerialize, + PartialEq, + Eq, + Hash, + Ord, + PartialOrd, +)] /// An enum indicating if the Ethereum bridge is enabled. pub enum EthBridgeStatus { Disabled, Enabled(EthBridgeEnabled), } -#[derive(Debug, Clone, BorshDeserialize, BorshSerialize)] +#[derive( + Debug, + Clone, + BorshDeserialize, + BorshSerialize, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, +)] /// Enum indicating if the bridge was initialized at genesis /// or a later epoch. pub enum EthBridgeEnabled { From 0c7aff512992bfe592934c5cb964717cf54a7518 Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 26 Jul 2023 16:52:20 +0200 Subject: [PATCH 002/175] [fix]: Fixed block height typo in test --- apps/src/lib/node/ledger/ethereum_oracle/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/node/ledger/ethereum_oracle/mod.rs b/apps/src/lib/node/ledger/ethereum_oracle/mod.rs index 4c1638eaf6..c2a0f22147 100644 --- a/apps/src/lib/node/ledger/ethereum_oracle/mod.rs +++ b/apps/src/lib/node/ledger/ethereum_oracle/mod.rs @@ -1022,7 +1022,7 @@ mod test_oracle { let confirmed_block_height = 9; // all blocks up to and including this block will have enough confirmations let min_confirmations = u64::from(config.min_confirmations); controller.apply_cmd(TestCmd::NewHeight(Uint256::from( - min_confirmations + confirmed_block_height - 3, + min_confirmations + confirmed_block_height - 5, ))); // check that the oracle indeed processes the expected blocks From ecb89e2db45a2660eb0a7893ec695386b39bd34e Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 17 Aug 2023 15:50:35 +0200 Subject: [PATCH 003/175] [chore]: Add changelog --- .../unreleased/improvements/1764-halt-oracle-from-ledger.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changelog/unreleased/improvements/1764-halt-oracle-from-ledger.md diff --git a/.changelog/unreleased/improvements/1764-halt-oracle-from-ledger.md b/.changelog/unreleased/improvements/1764-halt-oracle-from-ledger.md new file mode 100644 index 0000000000..8921ac4529 --- /dev/null +++ b/.changelog/unreleased/improvements/1764-halt-oracle-from-ledger.md @@ -0,0 +1,5 @@ +Allow the ethereum oracle to be activated / deactivated via config +updates sent from ledger. This allows governance to shut down the +ledger without restarts. Otherwise, disconnecting from Ethereum will +result in the ledger crashing. +([\#1764](https://github.com/anoma/namada/pull/1764)) From 06372330d08e6eb7143f9596c0853b7c3b50d412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 17 Oct 2023 07:34:19 +0200 Subject: [PATCH 004/175] core/storage: change the default start height of first epoch to 1 --- core/src/types/storage.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/types/storage.rs b/core/src/types/storage.rs index ad0c14f499..019323930c 100644 --- a/core/src/types/storage.rs +++ b/core/src/types/storage.rs @@ -1161,13 +1161,12 @@ pub struct Epochs { /// Invariant: the values must be sorted in ascending order. pub first_block_heights: Vec, } - impl Default for Epochs { - /// Initialize predecessor epochs, assuming starting on the epoch 0 and - /// block height 0. + /// Initialize predecessor epochs, assuming start of the first epoch at + /// block height 1. fn default() -> Self { Self { - first_block_heights: vec![BlockHeight::default()], + first_block_heights: vec![BlockHeight(1)], } } } @@ -1618,7 +1617,7 @@ mod tests { println!("epochs {:#?}", epochs); assert_eq!( epochs.get_start_height_of_epoch(Epoch(0)), - Some(BlockHeight(0)) + Some(BlockHeight(1)) ); assert_eq!(epochs.get_epoch(BlockHeight(0)), Some(Epoch(0))); From da2358b0a95042d843d975ca77b93e1346aed8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 17 Oct 2023 07:34:50 +0200 Subject: [PATCH 005/175] core/storage: set the initial height from genesis --- core/src/ledger/storage/mod.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index 81be7e48a6..66903fa2cd 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -963,6 +963,11 @@ where } = parameters.epoch_duration; self.next_epoch_min_start_height = initial_height + min_num_of_blocks; self.next_epoch_min_start_time = genesis_time + min_duration; + // The default start height in `Epochs` is set to 1, we override it + // here in case it differs at genesis + self.block.pred_epochs = Epochs { + first_block_heights: vec![initial_height], + }; self.update_epoch_in_merkle_tree() } From 686328cd3b427c5eef1e5c4b694929711c9b9d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 17 Oct 2023 09:19:06 +0200 Subject: [PATCH 006/175] core/storage: add `BlockHeight::first` and `sentinel` --- core/src/ledger/storage/mod.rs | 4 ++-- core/src/types/storage.rs | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index 66903fa2cd..ef8ba38f33 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -142,8 +142,8 @@ pub struct BlockStorage { pub hash: BlockHash, /// From the start of `FinalizeBlock` until the end of `Commit`, this is /// height of the block that is going to be committed. Otherwise, it is the - /// height of the most recently committed block, or `BlockHeight(0)` if no - /// block has been committed yet. + /// height of the most recently committed block, or `BlockHeight::sentinel` + /// (0) if no block has been committed yet. pub height: BlockHeight, /// From the start of `FinalizeBlock` until the end of `Commit`, this is /// height of the block that is going to be committed. Otherwise it is the diff --git a/core/src/types/storage.rs b/core/src/types/storage.rs index 019323930c..42629f6a0b 100644 --- a/core/src/types/storage.rs +++ b/core/src/types/storage.rs @@ -155,9 +155,9 @@ impl BlockResults { } } -/// Height of a block, i.e. the level. +/// Height of a block, i.e. the level. The `default` is the +/// [`BlockHeight::sentinel`] value, which doesn't correspond to any block. #[derive( - Default, Clone, Copy, BorshSerialize, @@ -174,6 +174,12 @@ impl BlockResults { )] pub struct BlockHeight(pub u64); +impl Default for BlockHeight { + fn default() -> Self { + Self::sentinel() + } +} + impl Display for BlockHeight { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) @@ -267,6 +273,17 @@ impl TryFrom for BlockHeight { } } impl BlockHeight { + /// The first block height 1. + pub const fn first() -> Self { + Self(1) + } + + /// A sentinel value block height 0 may be used before any block is + /// committed or in queries to read from the latest committed block. + pub const fn sentinel() -> Self { + Self(0) + } + /// Get the height of the next block pub fn next_height(&self) -> BlockHeight { BlockHeight(self.0 + 1) From 8d0d4588b406724e6b5ee957870a36db8706cd94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 18 Oct 2023 11:29:03 +0200 Subject: [PATCH 007/175] core/storage/epochs: Change pred `Epochs` default to be empty --- core/src/ledger/storage/mod.rs | 8 ++++++-- core/src/types/storage.rs | 14 ++++---------- ethereum_bridge/src/test_utils.rs | 6 ++++++ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index ef8ba38f33..658ab81e70 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -963,8 +963,6 @@ where } = parameters.epoch_duration; self.next_epoch_min_start_height = initial_height + min_num_of_blocks; self.next_epoch_min_start_time = genesis_time + min_duration; - // The default start height in `Epochs` is set to 1, we override it - // here in case it differs at genesis self.block.pred_epochs = Epochs { first_block_heights: vec![initial_height], }; @@ -1302,6 +1300,12 @@ mod tests { minimum_gas_price: BTreeMap::default(), }; parameters.init_storage(&mut wl_storage).unwrap(); + // Initialize pred_epochs to the current height + wl_storage + .storage + .block + .pred_epochs + .new_epoch(wl_storage.storage.block.height); let epoch_before = wl_storage.storage.last_epoch; assert_eq!(epoch_before, wl_storage.storage.block.epoch); diff --git a/core/src/types/storage.rs b/core/src/types/storage.rs index 42629f6a0b..861ca88f18 100644 --- a/core/src/types/storage.rs +++ b/core/src/types/storage.rs @@ -1165,6 +1165,7 @@ impl Mul for Epoch { #[derive( Clone, Debug, + Default, PartialEq, Eq, PartialOrd, @@ -1178,15 +1179,6 @@ pub struct Epochs { /// Invariant: the values must be sorted in ascending order. pub first_block_heights: Vec, } -impl Default for Epochs { - /// Initialize predecessor epochs, assuming start of the first epoch at - /// block height 1. - fn default() -> Self { - Self { - first_block_heights: vec![BlockHeight(1)], - } - } -} impl Epochs { /// Record start of a new epoch at the given block height @@ -1630,7 +1622,9 @@ mod tests { #[test] fn test_predecessor_epochs_and_heights() { - let mut epochs = Epochs::default(); + let mut epochs = Epochs { + first_block_heights: vec![BlockHeight::first()], + }; println!("epochs {:#?}", epochs); assert_eq!( epochs.get_start_height_of_epoch(Epoch(0)), diff --git a/ethereum_bridge/src/test_utils.rs b/ethereum_bridge/src/test_utils.rs index 9c24e9edfa..b8c580f137 100644 --- a/ethereum_bridge/src/test_utils.rs +++ b/ethereum_bridge/src/test_utils.rs @@ -227,6 +227,12 @@ pub fn init_storage_with_validators( .write(&protocol_pk_key(validator), protocol_key) .expect("Test failed"); } + // Initialize pred_epochs to the current height + wl_storage + .storage + .block + .pred_epochs + .new_epoch(wl_storage.storage.block.height); wl_storage.commit_block().expect("Test failed"); all_keys From 8ca7666502490706190086c324222984f74ec09f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 18 Oct 2023 11:29:59 +0200 Subject: [PATCH 008/175] apps/shell/finalize_block: remove first epoch workaround --- apps/src/lib/node/ledger/shell/finalize_block.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 53252065f1..ffb722112f 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -702,11 +702,8 @@ where .pred_epochs .first_block_heights[last_epoch.0 as usize] .0; - let num_blocks_in_last_epoch = if first_block_of_last_epoch == 0 { - self.wl_storage.storage.block.height.0 - 1 - } else { - self.wl_storage.storage.block.height.0 - first_block_of_last_epoch - }; + let num_blocks_in_last_epoch = + self.wl_storage.storage.block.height.0 - first_block_of_last_epoch; // Read the rewards accumulator and calculate the new rewards products // for the previous epoch From f1de1df5bf459474c42148e9e1e38e23cb2a1b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 17 Oct 2023 08:01:38 +0200 Subject: [PATCH 009/175] test/app/ledger: fix merkle tree pruning test --- apps/src/lib/node/ledger/storage/mod.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/src/lib/node/ledger/storage/mod.rs b/apps/src/lib/node/ledger/storage/mod.rs index 659f561cce..537d4e9ad4 100644 --- a/apps/src/lib/node/ledger/storage/mod.rs +++ b/apps/src/lib/node/ledger/storage/mod.rs @@ -498,8 +498,9 @@ mod tests { None, Some(5), ); + let new_epoch_start = BlockHeight(1); storage - .begin_block(BlockHash::default(), BlockHeight(1)) + .begin_block(BlockHash::default(), new_epoch_start) .expect("begin_block failed"); let key = Key::parse("key").expect("cannot parse the key string"); @@ -509,12 +510,13 @@ mod tests { .expect("write failed"); storage.block.epoch = storage.block.epoch.next(); - storage.block.pred_epochs.new_epoch(BlockHeight(1)); + storage.block.pred_epochs.new_epoch(new_epoch_start); let batch = PersistentStorage::batch(); storage.commit_block(batch).expect("commit failed"); + let new_epoch_start = BlockHeight(6); storage - .begin_block(BlockHash::default(), BlockHeight(6)) + .begin_block(BlockHash::default(), new_epoch_start) .expect("begin_block failed"); let key = Key::parse("key2").expect("cannot parse the key string"); @@ -524,18 +526,19 @@ mod tests { .expect("write failed"); storage.block.epoch = storage.block.epoch.next(); - storage.block.pred_epochs.new_epoch(BlockHeight(6)); + storage.block.pred_epochs.new_epoch(new_epoch_start); let batch = PersistentStorage::batch(); storage.commit_block(batch).expect("commit failed"); let result = storage.get_merkle_tree(1.into()); assert!(result.is_ok(), "The tree at Height 1 should be restored"); + let new_epoch_start = BlockHeight(11); storage - .begin_block(BlockHash::default(), BlockHeight(11)) + .begin_block(BlockHash::default(), new_epoch_start) .expect("begin_block failed"); storage.block.epoch = storage.block.epoch.next(); - storage.block.pred_epochs.new_epoch(BlockHeight(11)); + storage.block.pred_epochs.new_epoch(new_epoch_start); let batch = PersistentStorage::batch(); storage.commit_block(batch).expect("commit failed"); From 742978e0390b21c3cc920b8093f835c1427779fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 17 Oct 2023 08:27:50 +0200 Subject: [PATCH 010/175] test/core/storage: fix pred epochs & heights test --- core/src/types/storage.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/types/storage.rs b/core/src/types/storage.rs index 861ca88f18..8a56d16d4a 100644 --- a/core/src/types/storage.rs +++ b/core/src/types/storage.rs @@ -1640,14 +1640,15 @@ mod tests { Some(BlockHeight(10)) ); assert_eq!(epochs.get_epoch(BlockHeight(0)), Some(Epoch(0))); + assert_eq!(epochs.get_epoch_start_height(BlockHeight(0)), None); assert_eq!( - epochs.get_epoch_start_height(BlockHeight(0)), - Some(BlockHeight(0)) + epochs.get_epoch_start_height(BlockHeight(1)), + Some(BlockHeight(1)) ); assert_eq!(epochs.get_epoch(BlockHeight(9)), Some(Epoch(0))); assert_eq!( epochs.get_epoch_start_height(BlockHeight(9)), - Some(BlockHeight(0)) + Some(BlockHeight(1)) ); assert_eq!(epochs.get_epoch(BlockHeight(10)), Some(Epoch(1))); assert_eq!( From 3ea8305ee392bd6098beb15496a0f976a7217473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 17 Oct 2023 08:29:21 +0200 Subject: [PATCH 011/175] changelog: add #1993 --- .changelog/unreleased/bug-fixes/1993-fst-epoch-start-height.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/bug-fixes/1993-fst-epoch-start-height.md diff --git a/.changelog/unreleased/bug-fixes/1993-fst-epoch-start-height.md b/.changelog/unreleased/bug-fixes/1993-fst-epoch-start-height.md new file mode 100644 index 0000000000..856a1508ce --- /dev/null +++ b/.changelog/unreleased/bug-fixes/1993-fst-epoch-start-height.md @@ -0,0 +1,2 @@ +- Fix the start block height of the first epoch. + ([\#1993](https://github.com/anoma/namada/pull/1993)) \ No newline at end of file From ed9138d2a3a94000301c7246b816a3862fe1e4b7 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 19 Oct 2023 15:01:26 +0100 Subject: [PATCH 012/175] Relocate eth event nonce validation --- .../lib/node/ledger/shell/vote_extensions.rs | 6 +- .../shell/vote_extensions/eth_events.rs | 132 +++++++----------- .../src/storage/eth_bridge_queries.rs | 49 ++++++- 3 files changed, 98 insertions(+), 89 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/vote_extensions.rs b/apps/src/lib/node/ledger/shell/vote_extensions.rs index 658c35a121..55bdb3c855 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions.rs @@ -35,10 +35,8 @@ pub enum VoteExtensionError { ValsetUpdProofAvailable, #[error("The length of the transfers and their validity map differ")] TransfersLenMismatch, - #[error("The bridge pool nonce in the vote extension is invalid")] - InvalidBpNonce, - #[error("The transfer to Namada nonce in the vote extension is invalid")] - InvalidNamNonce, + #[error("The nonce in the Ethereum event is invalid")] + InvalidEthEventNonce, #[error("The vote extension was issued for an unexpected block height")] UnexpectedBlockHeight, #[error("The vote extension was issued for an unexpected epoch")] diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs index 0dd85bfd70..55e3be8ff6 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs @@ -144,11 +144,8 @@ where /// an [`ethereum_events::Vext`]. /// /// The supplied Ethereum events must be ordered in - /// ascending ordering, and must not contain any dupes. - /// - /// A detailed description of the validation applied - /// to each event kind can be found in the docstring - /// of [`Shell::validate_eth_event`]. + /// ascending ordering, must not contain any dupes + /// and must have valid nonces. fn validate_eth_events( &self, ext: ðereum_events::Vext, @@ -170,79 +167,17 @@ where ); return Err(VoteExtensionError::HaveDupesOrNonSorted); } - ext.ethereum_events - .iter() - .try_for_each(|event| self.validate_eth_event(event)) - } - - /// Valdidate an [`EthereumEvent`] against the current state - /// of the ledger. - /// - /// # Event kinds - /// - /// In this section, we shall describe the checks perform for - /// each kind of relevant Ethereum event. - /// - /// ## Transfers to Ethereum - /// - /// We need to check if the nonce in the event corresponds to - /// the most recent bridge pool nonce. Unless the nonces match, - /// no state updates derived from the event should be applied. - /// In case the nonces are different, we reject the event, and - /// thus the inclusion of its container Ethereum events vote - /// extension. - /// - /// ## Transfers to Namada - /// - /// For a transfers to Namada event to be considered valid, - /// the nonce of this kind of event must not be lower than - /// the one stored in Namada. - fn validate_eth_event( - &self, - event: &EthereumEvent, - ) -> std::result::Result<(), VoteExtensionError> { - // TODO: on the transfer events, maybe perform additional checks: - // - some token asset is not whitelisted - // - do we have enough balance for the transfer - // in practice, some events may have a variable degree of garbage - // data in them; we can simply rely on quorum decisions to filter - // out such events, which will time out in storage - match event { - EthereumEvent::TransfersToEthereum { - nonce: ext_nonce, .. - } => { - let current_bp_nonce = - self.wl_storage.ethbridge_queries().get_bridge_pool_nonce(); - if ¤t_bp_nonce != ext_nonce { - tracing::debug!( - %current_bp_nonce, - %ext_nonce, - "The Ethereum events vote extension's BP nonce is \ - invalid" - ); - return Err(VoteExtensionError::InvalidBpNonce); - } - } - EthereumEvent::TransfersToNamada { - nonce: ext_nonce, .. - } => { - let next_nam_transfers_nonce = self - .wl_storage - .ethbridge_queries() - .get_next_nam_transfers_nonce(); - if &next_nam_transfers_nonce > ext_nonce { - tracing::debug!( - ?event, - %next_nam_transfers_nonce, - "Attempt to replay a transfer to Namada event" - ); - return Err(VoteExtensionError::InvalidNamNonce); - } + ext.ethereum_events.iter().try_for_each(|event| { + if self + .wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(event) + { + Ok(()) + } else { + Err(VoteExtensionError::InvalidEthEventNonce) } - // consider other ethereum event kinds valid - _ => {} - } - Ok(()) + }) } /// Checks the channel from the Ethereum oracle monitoring @@ -416,6 +351,7 @@ mod test_vote_extensions { NestedSubKey, SubKey, }; use namada::eth_bridge::storage::bridge_pool; + use namada::ledger::eth_bridge::EthBridgeQueries; use namada::ledger::pos::PosQueries; use namada::proof_of_stake::types::WeightedValidator; use namada::proof_of_stake::{ @@ -474,55 +410,83 @@ mod test_vote_extensions { // eth transfers with the same nonce as the bp nonce in storage are // valid shell - .validate_eth_event(&EthereumEvent::TransfersToEthereum { + .wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(&EthereumEvent::TransfersToEthereum { nonce, transfers: vec![], relayer: gen_established_address(), }) + .then_some(()) + .ok_or(()) .expect("Test failed"); // eth transfers with different nonces are invalid shell - .validate_eth_event(&EthereumEvent::TransfersToEthereum { + .wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(&EthereumEvent::TransfersToEthereum { nonce: nonce + 1, transfers: vec![], relayer: gen_established_address(), }) + .then_some(()) + .ok_or(()) .expect_err("Test failed"); shell - .validate_eth_event(&EthereumEvent::TransfersToEthereum { + .wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(&EthereumEvent::TransfersToEthereum { nonce: nonce - 1, transfers: vec![], relayer: gen_established_address(), }) + .then_some(()) + .ok_or(()) .expect_err("Test failed"); // nam transfers with nonces >= the nonce in storage are valid shell - .validate_eth_event(&EthereumEvent::TransfersToNamada { + .wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(&EthereumEvent::TransfersToNamada { nonce, transfers: vec![], }) + .then_some(()) + .ok_or(()) .expect("Test failed"); shell - .validate_eth_event(&EthereumEvent::TransfersToNamada { + .wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(&EthereumEvent::TransfersToNamada { nonce: nonce + 5, transfers: vec![], }) + .then_some(()) + .ok_or(()) .expect("Test failed"); // nam transfers with lower nonces are invalid shell - .validate_eth_event(&EthereumEvent::TransfersToNamada { + .wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(&EthereumEvent::TransfersToNamada { nonce: nonce - 1, transfers: vec![], }) + .then_some(()) + .ok_or(()) .expect_err("Test failed"); shell - .validate_eth_event(&EthereumEvent::TransfersToNamada { + .wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(&EthereumEvent::TransfersToNamada { nonce: nonce - 2, transfers: vec![], }) + .then_some(()) + .ok_or(()) .expect_err("Test failed"); } diff --git a/ethereum_bridge/src/storage/eth_bridge_queries.rs b/ethereum_bridge/src/storage/eth_bridge_queries.rs index 5e2f7b6399..58b4ce4cdb 100644 --- a/ethereum_bridge/src/storage/eth_bridge_queries.rs +++ b/ethereum_bridge/src/storage/eth_bridge_queries.rs @@ -10,7 +10,7 @@ use namada_core::types::address::Address; use namada_core::types::eth_abi::Encode; use namada_core::types::eth_bridge_pool::PendingTransfer; use namada_core::types::ethereum_events::{ - EthAddress, GetEventNonce, TransferToEthereum, Uint, + EthAddress, EthereumEvent, GetEventNonce, TransferToEthereum, Uint, }; use namada_core::types::keccak::KeccakHash; use namada_core::types::storage::{BlockHeight, Epoch, Key as StorageKey}; @@ -534,6 +534,53 @@ where .expect("Reading from storage should not fail") .zip(Some(pending_key)) } + + /// Valdidate an [`EthereumEvent`]'s nonce against the current + /// state of the ledger. + /// + /// # Event kinds + /// + /// In this section, we shall describe the checks perform for + /// each kind of relevant Ethereum event. + /// + /// ## Transfers to Ethereum + /// + /// We need to check if the nonce in the event corresponds to + /// the most recent bridge pool nonce. Unless the nonces match, + /// no state updates derived from the event should be applied. + /// In case the nonces are different, we reject the event, and + /// thus the inclusion of its container Ethereum events vote + /// extension. + /// + /// ## Transfers to Namada + /// + /// For a transfers to Namada event to be considered valid, + /// the nonce of this kind of event must not be lower than + /// the one stored in Namada. + pub fn validate_eth_event_nonce(&self, event: &EthereumEvent) -> bool { + match event { + EthereumEvent::TransfersToEthereum { + nonce: ext_nonce, .. + } => { + let current_bp_nonce = self.get_bridge_pool_nonce(); + if ¤t_bp_nonce != ext_nonce { + return false; + } + } + EthereumEvent::TransfersToNamada { + nonce: ext_nonce, .. + } => { + let next_nam_transfers_nonce = + self.get_next_nam_transfers_nonce(); + if &next_nam_transfers_nonce > ext_nonce { + return false; + } + } + // consider other ethereum event kinds valid + _ => {} + } + true + } } /// Number of tokens to mint after receiving a "transfer From 0dba83bcc6264cc596dd2fb080cbc98b4aef26a2 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 19 Oct 2023 15:01:58 +0100 Subject: [PATCH 013/175] Discard eth events from oracle with invalid nonces --- apps/src/lib/node/ledger/shell/mod.rs | 30 ++++++++++++++----- .../shell/vote_extensions/eth_events.rs | 5 +++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index a1c17fe450..f32633935b 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -256,18 +256,32 @@ impl EthereumReceiver { } } - /// Pull messages from the channel and add to queue - /// Since vote extensions require ordering of ethereum - /// events, we do that here. We also de-duplicate events - pub fn fill_queue(&mut self) { + /// Pull Ethereum events from the oracle and queue them to + /// be voted on. + /// + /// Since vote extensions require ordering of Ethereum + /// events, we do that here. We also de-duplicate events. + /// Events may be filtered out of the queue with a provided + /// predicate. + pub fn fill_queue(&mut self, mut keep_event: F) + where + F: FnMut(&EthereumEvent) -> bool, + { let mut new_events = 0; + let mut filtered_events = 0; while let Ok(eth_event) = self.channel.try_recv() { - if self.queue.insert(eth_event) { + if keep_event(ð_event) && self.queue.insert(eth_event) { new_events += 1; - }; + } else { + filtered_events += 1; + } } - if new_events > 0 { - tracing::info!(n = new_events, "received Ethereum events"); + if new_events + filtered_events > 0 { + tracing::info!( + new_events, + filtered_events, + "received Ethereum events" + ); } } diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs index 55e3be8ff6..0116076cd7 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs @@ -183,6 +183,7 @@ where /// Checks the channel from the Ethereum oracle monitoring /// the fullnode and retrieves all seen Ethereum events. pub fn new_ethereum_events(&mut self) -> Vec { + let queries = self.wl_storage.ethbridge_queries(); match &mut self.mode { ShellMode::Validator { eth_oracle: @@ -191,7 +192,9 @@ where }), .. } => { - ethereum_receiver.fill_queue(); + ethereum_receiver.fill_queue(|event| { + queries.validate_eth_event_nonce(event) + }); ethereum_receiver.get_events() } _ => vec![], From 8a4cf40a76eaa155c6ea299634be13d765a8fb42 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 20 Oct 2023 14:33:50 +0100 Subject: [PATCH 014/175] Disregard state updates from eth events with outdated nonces --- .../src/protocol/transactions/ethereum_events/mod.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs b/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs index 8b71bb26c4..3c5090bb7f 100644 --- a/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs +++ b/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs @@ -23,6 +23,7 @@ use super::ChangedKeys; use crate::protocol::transactions::utils; use crate::protocol::transactions::votes::update::NewVotes; use crate::protocol::transactions::votes::{self, calculate_new}; +use crate::storage::eth_bridge_queries::EthBridgeQueries; use crate::storage::vote_tallies::{self, Keys}; impl utils::GetVoters for &HashSet { @@ -63,7 +64,16 @@ where protocol transaction" ); - let updates = events.into_iter().map(Into::::into).collect(); + let updates = events + .into_iter() + .filter_map(|multisigned| { + // NB: discard events with outdated nonces + wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(&multisigned.event) + .then(|| EthMsgUpdate::from(multisigned)) + }) + .collect(); let voting_powers = utils::get_voting_powers(wl_storage, &updates)?; From f44d5ff57d58a507531758ba8198d962d7e3b415 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 20 Oct 2023 14:47:15 +0100 Subject: [PATCH 015/175] Only propose eth events with up to date nonces --- .../lib/node/ledger/shell/vote_extensions.rs | 16 ++++++++++++++-- .../ledger/shell/vote_extensions/eth_events.rs | 18 +++++++++--------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/vote_extensions.rs b/apps/src/lib/node/ledger/shell/vote_extensions.rs index 55bdb3c855..8a4511f4fd 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions.rs @@ -426,8 +426,20 @@ where } }; match (&tx).try_into().ok()? { - EthereumTxData::EthEventsVext(_) - | EthereumTxData::BridgePoolVext(_) => Some(tx_bytes.clone()), + EthereumTxData::BridgePoolVext(_) => Some(tx_bytes.clone()), + EthereumTxData::EthEventsVext(ext) => { + // NB: only propose events with at least + // one valid nonce + ext.data + .ethereum_events + .iter() + .any(|event| { + self.wl_storage + .ethbridge_queries() + .validate_eth_event_nonce(event) + }) + .then(|| tx_bytes.clone()) + } EthereumTxData::ValSetUpdateVext(ext) => { // only include non-stale validator set updates // in block proposals. it might be sitting long diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs index 0116076cd7..e1206e3a56 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs @@ -167,17 +167,17 @@ where ); return Err(VoteExtensionError::HaveDupesOrNonSorted); } - ext.ethereum_events.iter().try_for_each(|event| { - if self - .wl_storage + // for the proposal to be valid, at least one of the + // event's nonces must be valid + if ext.ethereum_events.iter().any(|event| { + self.wl_storage .ethbridge_queries() .validate_eth_event_nonce(event) - { - Ok(()) - } else { - Err(VoteExtensionError::InvalidEthEventNonce) - } - }) + }) { + Ok(()) + } else { + Err(VoteExtensionError::InvalidEthEventNonce) + } } /// Checks the channel from the Ethereum oracle monitoring From 80781cbe35fab45e8b2b45e282c5f9b653f6ec04 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 20 Oct 2023 15:00:19 +0100 Subject: [PATCH 016/175] Fix unit tests --- .../src/lib/node/ledger/shell/finalize_block.rs | 2 +- .../ledger/shell/vote_extensions/eth_events.rs | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 53252065f1..c25b867756 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -1760,7 +1760,7 @@ mod test_finalize_block { transfer }; let ethereum_event = EthereumEvent::TransfersToEthereum { - nonce: 0u64.into(), + nonce: 1u64.into(), transfers: vec![transfer], relayer: bertha, }; diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs index e1206e3a56..0ec5c50e71 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs @@ -526,7 +526,12 @@ mod test_vote_extensions { nonce: 0.into(), transfers: vec![], }; + let event_4 = EthereumEvent::TransfersToNamada { + nonce: 1.into(), + transfers: vec![], + }; + // send valid events tokio_test::block_on(oracle.send(event_1.clone())) .expect("Test failed"); tokio_test::block_on(oracle.send(event_3.clone())) @@ -542,16 +547,22 @@ mod test_vote_extensions { .collect(); assert_eq!(expected_events, got_events); + // we cannot get two transfer to ethereum events within + // the same block height on ethereum. this is because we + // require a confirmation eth event on namada to increment + // the bridge pool nonce. this event should get ignored + tokio_test::block_on(oracle.send(event_2)).expect("Test failed"); + // check that we queue and de-duplicate events - tokio_test::block_on(oracle.send(event_2.clone())) - .expect("Test failed"); tokio_test::block_on(oracle.send(event_3.clone())) .expect("Test failed"); + tokio_test::block_on(oracle.send(event_4.clone())) + .expect("Test failed"); let got_events: [EthereumEvent; 3] = shell.new_ethereum_events().try_into().expect("Test failed"); let expected_events: Vec<_> = - std::collections::BTreeSet::from([event_1, event_2, event_3]) + std::collections::BTreeSet::from([event_1, event_3, event_4]) .into_iter() .collect(); assert_eq!(expected_events, got_events); From 0c0c80194b7b1bc4a42cc71c92c99f1b9e0de3f5 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 23 Oct 2023 11:18:07 +0100 Subject: [PATCH 017/175] Test replaying eth events with outdated nonces --- .../transactions/ethereum_events/mod.rs | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs b/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs index 3c5090bb7f..e9ff768fa0 100644 --- a/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs +++ b/ethereum_bridge/src/protocol/transactions/ethereum_events/mod.rs @@ -872,4 +872,89 @@ mod tests { (_, Some(_)) => {} }); } + + /// Test that [`MultiSignedEthEvent`]s with outdated nonces do + /// not result in votes in storage. + #[test] + fn test_apply_derived_tx_outdated_nonce() -> Result<()> { + let (mut wl_storage, _) = test_utils::setup_default_storage(); + + let new_multisigned = |nonce: u64| { + let (validator, _) = test_utils::default_validator(); + let event = EthereumEvent::TransfersToNamada { + nonce: nonce.into(), + transfers: vec![TransferToNamada { + amount: Amount::from(100), + asset: DAI_ERC20_ETH_ADDRESS, + receiver: validator.clone(), + }], + }; + let signers = BTreeSet::from([(validator, BlockHeight(100))]); + ( + MultiSignedEthEvent { + event: event.clone(), + signers, + }, + event, + ) + }; + macro_rules! nonce_ok { + ($nonce:expr) => { + let (multisigned, event) = new_multisigned($nonce); + let tx_result = + apply_derived_tx(&mut wl_storage, vec![multisigned])?; + + let eth_msg_keys = vote_tallies::Keys::from(&event); + assert!( + tx_result.changed_keys.contains(ð_msg_keys.seen()), + "The Ethereum event should have been seen", + ); + assert_eq!( + wl_storage + .ethbridge_queries() + .get_next_nam_transfers_nonce(), + ($nonce + 1).into(), + "The transfers to Namada nonce should have been \ + incremented", + ); + }; + } + macro_rules! nonce_err { + ($nonce:expr) => { + let (multisigned, event) = new_multisigned($nonce); + let tx_result = + apply_derived_tx(&mut wl_storage, vec![multisigned])?; + + let eth_msg_keys = vote_tallies::Keys::from(&event); + assert!( + !tx_result.changed_keys.contains(ð_msg_keys.seen()), + "The Ethereum event should have been ignored", + ); + assert_eq!( + wl_storage + .ethbridge_queries() + .get_next_nam_transfers_nonce(), + NEXT_NONCE_TO_PROCESS.into(), + "The transfers to Namada nonce should not have changed", + ); + }; + } + + // update storage with valid events + const NEXT_NONCE_TO_PROCESS: u64 = 3; + for nonce in 0..NEXT_NONCE_TO_PROCESS { + nonce_ok!(nonce); + } + + // attempts to replay events with older nonces should + // result in the events getting ignored + for nonce in 0..NEXT_NONCE_TO_PROCESS { + nonce_err!(nonce); + } + + // process new valid event + nonce_ok!(NEXT_NONCE_TO_PROCESS); + + Ok(()) + } } From dd487fa40dd1f57c85642c63132f1270280529dc Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 23 Oct 2023 14:16:34 +0100 Subject: [PATCH 018/175] Test eth events with outdated nonces during CheckTx --- apps/src/lib/node/ledger/shell/mod.rs | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index f32633935b..0dee860735 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -2201,6 +2201,75 @@ mod abciplus_mempool_tests { ); } + /// Test that Ethereum events with outdated nonces are + /// not validated by `CheckTx`. + #[test] + fn test_outdated_nonce_mempool_validate() { + use namada::types::storage::InnerEthEventsQueue; + + const LAST_HEIGHT: BlockHeight = BlockHeight(3); + + let (mut shell, _recv, _, _) = test_utils::setup_at_height(LAST_HEIGHT); + shell + .wl_storage + .storage + .eth_events_queue + // sent transfers to namada nonce to 5 + .transfers_to_namada = InnerEthEventsQueue::new_at(5.into()); + + let (protocol_key, _, _) = wallet::defaults::validator_keys(); + + // only bad events + { + let ethereum_event = EthereumEvent::TransfersToNamada { + nonce: 3u64.into(), + transfers: vec![], + }; + let ext = { + let ext = ethereum_events::Vext { + validator_addr: wallet::defaults::validator_address(), + block_height: LAST_HEIGHT, + ethereum_events: vec![ethereum_event], + } + .sign(&protocol_key); + assert!(ext.verify(&protocol_key.ref_to()).is_ok()); + ext + }; + let tx = EthereumTxData::EthEventsVext(ext) + .sign(&protocol_key, shell.chain_id.clone()) + .to_bytes(); + let rsp = shell.mempool_validate(&tx, Default::default()); + assert!(rsp.code != 0, "Validation should have failed"); + } + + // at least one good event + { + let e1 = EthereumEvent::TransfersToNamada { + nonce: 3u64.into(), + transfers: vec![], + }; + let e2 = EthereumEvent::TransfersToNamada { + nonce: 5u64.into(), + transfers: vec![], + }; + let ext = { + let ext = ethereum_events::Vext { + validator_addr: wallet::defaults::validator_address(), + block_height: LAST_HEIGHT, + ethereum_events: vec![e1, e2], + } + .sign(&protocol_key); + assert!(ext.verify(&protocol_key.ref_to()).is_ok()); + ext + }; + let tx = EthereumTxData::EthEventsVext(ext) + .sign(&protocol_key, shell.chain_id.clone()) + .to_bytes(); + let rsp = shell.mempool_validate(&tx, Default::default()); + assert!(rsp.code == 0, "Validation should have passed"); + } + } + /// Test that we do not include protocol txs in the mempool, /// voting on ethereum events or signing bridge pool roots /// and nonces if the bridge is inactive. From adac29f81278fd5031ec491a2250b05e21ac8049 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 23 Oct 2023 14:16:42 +0100 Subject: [PATCH 019/175] Test eth events with outdated nonces during PrepareProposal --- .../lib/node/ledger/shell/prepare_proposal.rs | 117 +++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/prepare_proposal.rs b/apps/src/lib/node/ledger/shell/prepare_proposal.rs index 3687a6d39b..9e7ba6b373 100644 --- a/apps/src/lib/node/ledger/shell/prepare_proposal.rs +++ b/apps/src/lib/node/ledger/shell/prepare_proposal.rs @@ -514,10 +514,12 @@ mod test_prepare_proposal { #[cfg(feature = "abcipp")] use namada::types::key::common; use namada::types::key::RefTo; - use namada::types::storage::BlockHeight; + use namada::types::storage::{BlockHeight, InnerEthEventsQueue}; use namada::types::token; use namada::types::token::Amount; - use namada::types::transaction::protocol::EthereumTxData; + use namada::types::transaction::protocol::{ + ethereum_tx_data_variants, EthereumTxData, + }; use namada::types::transaction::{Fee, TxType, WrapperTx}; #[cfg(feature = "abcipp")] use namada::types::vote_extensions::bridge_pool_roots; @@ -1652,4 +1654,115 @@ mod test_prepare_proposal { eprintln!("Proposal: {:?}", result.txs); assert!(result.txs.is_empty()); } + + /// Test that Ethereum events with outdated nonces are + /// not proposed during `PrepareProposal`. + #[test] + fn test_outdated_nonce_proposal() { + const LAST_HEIGHT: BlockHeight = BlockHeight(3); + + let (mut shell, _recv, _, _) = test_utils::setup_at_height(LAST_HEIGHT); + shell + .wl_storage + .storage + .eth_events_queue + // sent transfers to namada nonce to 5 + .transfers_to_namada = InnerEthEventsQueue::new_at(5.into()); + + let (protocol_key, _, _) = wallet::defaults::validator_keys(); + let validator_addr = wallet::defaults::validator_address(); + + // test an extension containing solely events with + // bad nonces + { + let ethereum_event = EthereumEvent::TransfersToNamada { + // outdated nonce (3 < 5) + nonce: 3u64.into(), + transfers: vec![], + }; + let ext = { + let ext = ethereum_events::Vext { + validator_addr: validator_addr.clone(), + block_height: LAST_HEIGHT, + ethereum_events: vec![ethereum_event], + } + .sign(&protocol_key); + assert!(ext.verify(&protocol_key.ref_to()).is_ok()); + ext + }; + let tx = EthereumTxData::EthEventsVext(ext) + .sign(&protocol_key, shell.chain_id.clone()) + .to_bytes(); + let req = RequestPrepareProposal { + txs: vec![tx], + ..Default::default() + }; + let proposed_txs = + shell.prepare_proposal(req).txs.into_iter().map(|tx_bytes| { + Tx::try_from(tx_bytes.as_slice()).expect("Test failed") + }); + // since no events with valid nonces are contained in the vote + // extension, we drop it from the proposal + for tx in proposed_txs { + if ethereum_tx_data_variants::EthEventsVext::try_from(&tx) + .is_ok() + { + panic!( + "No ethereum events should have been found in the \ + proposal" + ); + } + } + } + + // test an extension containing at least one event + // with a good nonce + { + let event1 = EthereumEvent::TransfersToNamada { + // outdated nonce (3 < 5) + nonce: 3u64.into(), + transfers: vec![], + }; + let event2 = EthereumEvent::TransfersToNamada { + // outdated nonce (10 >= 5) + nonce: 10u64.into(), + transfers: vec![], + }; + let ext = { + let ext = ethereum_events::Vext { + validator_addr, + block_height: LAST_HEIGHT, + ethereum_events: vec![event1, event2.clone()], + } + .sign(&protocol_key); + assert!(ext.verify(&protocol_key.ref_to()).is_ok()); + ext + }; + let tx = EthereumTxData::EthEventsVext(ext) + .sign(&protocol_key, shell.chain_id.clone()) + .to_bytes(); + let req = RequestPrepareProposal { + txs: vec![tx], + ..Default::default() + }; + let proposed_txs = + shell.prepare_proposal(req).txs.into_iter().map(|tx_bytes| { + Tx::try_from(tx_bytes.as_slice()).expect("Test failed") + }); + // find the event with the good nonce + let mut ext = 'ext: { + for tx in proposed_txs { + if let Ok(ext) = + ethereum_tx_data_variants::EthEventsVext::try_from(&tx) + { + break 'ext ext; + } + } + panic!("No ethereum events found in proposal"); + }; + assert_eq!(ext.data.ethereum_events.len(), 2); + let found_event = ext.data.ethereum_events.remove(1); + assert_eq!(found_event, event2); + } + } } From df9c8ce3c3c1489da15e3f894914ebe54b38251b Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 23 Oct 2023 14:21:09 +0100 Subject: [PATCH 020/175] Test eth events with outdated nonces during ProcessProposal --- .../lib/node/ledger/shell/process_proposal.rs | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/apps/src/lib/node/ledger/shell/process_proposal.rs b/apps/src/lib/node/ledger/shell/process_proposal.rs index ab544de3f8..f81445aab8 100644 --- a/apps/src/lib/node/ledger/shell/process_proposal.rs +++ b/apps/src/lib/node/ledger/shell/process_proposal.rs @@ -2912,4 +2912,76 @@ mod test_process_proposal { ); } } + + /// Test that Ethereum events with outdated nonces are + /// not validated by `ProcessProposal`. + #[test] + fn test_outdated_nonce_process_proposal() { + use namada::types::storage::InnerEthEventsQueue; + + const LAST_HEIGHT: BlockHeight = BlockHeight(3); + + let (mut shell, _recv, _, _) = test_utils::setup_at_height(LAST_HEIGHT); + shell + .wl_storage + .storage + .eth_events_queue + // sent transfers to namada nonce to 5 + .transfers_to_namada = InnerEthEventsQueue::new_at(5.into()); + + let (protocol_key, _, _) = wallet::defaults::validator_keys(); + + // only bad events + { + let ethereum_event = EthereumEvent::TransfersToNamada { + // outdated nonce (3 < 5) + nonce: 3u64.into(), + transfers: vec![], + }; + let ext = { + let ext = ethereum_events::Vext { + validator_addr: wallet::defaults::validator_address(), + block_height: LAST_HEIGHT, + ethereum_events: vec![ethereum_event], + } + .sign(&protocol_key); + assert!(ext.verify(&protocol_key.ref_to()).is_ok()); + ext + }; + let tx = EthereumTxData::EthEventsVext(ext) + .sign(&protocol_key, shell.chain_id.clone()) + .to_bytes(); + let req = ProcessProposal { txs: vec![tx] }; + let rsp = shell.process_proposal(req); + assert!(rsp.is_err()); + } + + // at least one good event + { + let e1 = EthereumEvent::TransfersToNamada { + nonce: 3u64.into(), + transfers: vec![], + }; + let e2 = EthereumEvent::TransfersToNamada { + nonce: 5u64.into(), + transfers: vec![], + }; + let ext = { + let ext = ethereum_events::Vext { + validator_addr: wallet::defaults::validator_address(), + block_height: LAST_HEIGHT, + ethereum_events: vec![e1, e2], + } + .sign(&protocol_key); + assert!(ext.verify(&protocol_key.ref_to()).is_ok()); + ext + }; + let tx = EthereumTxData::EthEventsVext(ext) + .sign(&protocol_key, shell.chain_id.clone()) + .to_bytes(); + let req = ProcessProposal { txs: vec![tx] }; + let rsp = shell.process_proposal(req); + assert!(rsp.is_ok()); + } + } } From 4dbc621a0ee63c5b1dd37a78123915866b56a2b7 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 23 Oct 2023 14:30:52 +0100 Subject: [PATCH 021/175] Changelog for #2035 --- .changelog/unreleased/bug-fixes/2035-outdated-eth-nonces.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/bug-fixes/2035-outdated-eth-nonces.md diff --git a/.changelog/unreleased/bug-fixes/2035-outdated-eth-nonces.md b/.changelog/unreleased/bug-fixes/2035-outdated-eth-nonces.md new file mode 100644 index 0000000000..b0d728eaaf --- /dev/null +++ b/.changelog/unreleased/bug-fixes/2035-outdated-eth-nonces.md @@ -0,0 +1,2 @@ +- Fix Ethereum event validation/state updates when more than one validator is + running the chain ([\#2035](https://github.com/anoma/namada/pull/2035)) \ No newline at end of file From b3a240d9b64abea6af2fbdddb6c19af1a0582d55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 21 Nov 2023 10:02:14 +0100 Subject: [PATCH 022/175] wasm: add validator support to vp_user --- wasm/wasm_source/src/vp_user.rs | 304 ++++++++++++++++++++++++++++++-- 1 file changed, 286 insertions(+), 18 deletions(-) diff --git a/wasm/wasm_source/src/vp_user.rs b/wasm/wasm_source/src/vp_user.rs index 28bfcbdc9f..c6b7d6920e 100644 --- a/wasm/wasm_source/src/vp_user.rs +++ b/wasm/wasm_source/src/vp_user.rs @@ -1,16 +1,20 @@ -//! A basic user VP. +//! A basic user VP supports both non-validator and validator accounts. //! //! This VP currently provides a signature verification against a public key for //! sending tokens (receiving tokens is permissive). //! //! It allows to bond, unbond and withdraw tokens to and from PoS system with a -//! valid signature. +//! valid signature(s). +//! +//! For validator a tx to change a validator's commission rate or metadata +//! requires a valid signature(s) only from the validator. //! //! Any other storage key changes are allowed only with a valid signature. use namada_vp_prelude::storage::KeySeg; use namada_vp_prelude::*; use once_cell::unsync::Lazy; +use proof_of_stake::types::ValidatorState; enum KeyType<'a> { Token { owner: &'a Address }, @@ -104,14 +108,14 @@ fn validate_tx( } } KeyType::PoS => { - // Allow the account to be used in PoS + // Bond or unbond let bond_id = proof_of_stake::storage::is_bond_key(key) .map(|(bond_id, _)| bond_id) .or_else(|| { proof_of_stake::storage::is_unbond_key(key) .map(|(bond_id, _, _)| bond_id) }); - let valid = match bond_id { + let valid_bond_or_unbond_change = match bond_id { Some(bond_id) => { // Bonds and unbonds changes for this address // must be signed @@ -122,12 +126,81 @@ fn validate_tx( true } }; - debug_log!( - "PoS key {} {}", - key, - if valid { "accepted" } else { "rejected" } - ); - valid + // Commission rate changes must be signed by the validator + let comm = + proof_of_stake::storage::is_validator_commission_rate_key( + key, + ); + let valid_commission_rate_change = match comm { + Some((validator, _epoch)) => { + *validator == addr && *valid_sig + } + None => true, + }; + // Metadata changes must be signed by the validator whose + // metadata is manipulated + let metadata = + proof_of_stake::storage::is_validator_metadata_key(key); + let valid_metadata_change = match metadata { + Some(address) => *address == addr && *valid_sig, + None => true, + }; + + // Changes due to unjailing, deactivating, and reactivating are + // marked by changes in validator state + let state_change = + proof_of_stake::storage::is_validator_state_key(key); + let valid_state_change = match state_change { + Some((address, epoch)) => { + let params_pre = + proof_of_stake::read_pos_params(&ctx.pre())?; + let state_pre = + proof_of_stake::validator_state_handle(address) + .get(&ctx.pre(), epoch, ¶ms_pre)?; + + let params_post = + proof_of_stake::read_pos_params(&ctx.post())?; + let state_post = + proof_of_stake::validator_state_handle(address) + .get(&ctx.post(), epoch, ¶ms_post)?; + + match (state_pre, state_post) { + (Some(pre), Some(post)) => { + if + // Deactivation case + (matches!( + pre, + ValidatorState::Consensus + | ValidatorState::BelowCapacity + | ValidatorState::BelowThreshold + ) && post == ValidatorState::Inactive) + // Reactivation case + || pre == ValidatorState::Inactive + && post != ValidatorState::Inactive + // Unjail case + || pre == ValidatorState::Jailed + && matches!( + post, + ValidatorState::Consensus + | ValidatorState::BelowCapacity + | ValidatorState::BelowThreshold + ) + { + *address == addr && *valid_sig + } else { + true + } + } + _ => true, + } + } + None => true, + }; + + valid_bond_or_unbond_change + && valid_commission_rate_change + && valid_state_change + && valid_metadata_change } KeyType::GovernanceVote(voter) => { if voter == &addr { @@ -398,10 +471,10 @@ mod tests { ); } - /// Test that a PoS action that must be authorized is rejected without a - /// valid signature. + /// Test that a non-validator PoS action that must be authorized is rejected + /// without a valid signature. #[test] - fn test_unsigned_pos_action_rejected() { + fn test_unsigned_non_validator_pos_action_rejected() { // Init PoS genesis let pos_params = PosParams::default(); let validator = address::testing::established_address_3(); @@ -454,7 +527,7 @@ mod tests { // be able to transfer from it tx_env.credit_tokens(&vp_owner, &token, amount); - // Initialize VP environment from a transaction + // Initialize VP environment from non-validator PoS actions vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { // Bond the tokens, then unbond some of them tx::ctx() @@ -478,10 +551,100 @@ mod tests { ); } - /// Test that a PoS action that must be authorized is accepted with a valid - /// signature. + /// Test that a validator PoS action that must be authorized is rejected + /// without a valid signature. + #[test] + fn test_unsigned_validator_pos_action_rejected() { + // Init PoS genesis + let pos_params = PosParams::default(); + let validator = address::testing::established_address_3(); + let initial_stake = token::Amount::from_uint(10_098_123, 0).unwrap(); + let consensus_key = key::testing::keypair_2().ref_to(); + let protocol_key = key::testing::keypair_1().ref_to(); + let eth_cold_key = key::testing::keypair_3().ref_to(); + let eth_hot_key = key::testing::keypair_4().ref_to(); + let commission_rate = Dec::new(5, 2).unwrap(); + let max_commission_rate_change = Dec::new(1, 2).unwrap(); + + let genesis_validators = [GenesisValidator { + address: validator.clone(), + tokens: initial_stake, + consensus_key, + protocol_key, + commission_rate, + max_commission_rate_change, + eth_hot_key, + eth_cold_key, + metadata: Default::default(), + }]; + + init_pos(&genesis_validators[..], &pos_params, Epoch(0)); + + // Initialize a tx environment + let mut tx_env = tx_host_env::take(); + + let secret_key = key::testing::keypair_1(); + let public_key = secret_key.ref_to(); + let target = address::testing::established_address_3(); + let token = address::nam(); + let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); + let bond_amount = token::Amount::from_uint(5_098_123, 0).unwrap(); + let unbond_amount = token::Amount::from_uint(3_098_123, 0).unwrap(); + + // Spawn the accounts to be able to modify their storage + tx_env.spawn_accounts([&target, &token]); + tx_env.init_account_storage(&validator, vec![public_key], 1); + // write the denomination of NAM into storage + storage_api::token::write_denom( + &mut tx_env.wl_storage, + &token, + token::NATIVE_MAX_DECIMAL_PLACES.into(), + ) + .unwrap(); + + // Credit the tokens to the validator before running the transaction to + // be able to transfer from it + tx_env.credit_tokens(&validator, &token, amount); + + // Validator PoS actions + vp_host_env::init_from_tx(validator.clone(), tx_env, |_address| { + // Bond the tokens, then unbond some of them + tx::ctx() + .bond_tokens(Some(&validator), &validator, bond_amount) + .unwrap(); + tx::ctx() + .unbond_tokens(Some(&validator), &validator, unbond_amount) + .unwrap(); + tx::ctx().deactivate_validator(&validator).unwrap(); + tx::ctx() + .change_validator_metadata( + &validator, + Some("email".to_owned()), + Some("desc".to_owned()), + Some("website".to_owned()), + Some("discord".to_owned()), + Some(Dec::new(6, 2).unwrap()), + ) + .unwrap(); + }); + + let vp_env = vp_host_env::take(); + let mut tx_data = Tx::from_type(TxType::Raw); + tx_data.set_data(Data::new(vec![])); + let keys_changed: BTreeSet = + vp_env.all_touched_storage_keys(); + let verifiers: BTreeSet
= BTreeSet::default(); + vp_host_env::set(vp_env); + assert!( + !validate_tx(&CTX, tx_data, validator, keys_changed, verifiers) + .unwrap() + ); + } + + /// Test that a non-validator PoS action that must be authorized is accepted + /// with a valid signature. #[test] - fn test_signed_pos_action_accepted() { + fn test_signed_non_validator_pos_action_accepted() { // Init PoS genesis let pos_params = PosParams::default(); let validator = address::testing::established_address_3(); @@ -539,7 +702,7 @@ mod tests { // be able to transfer from it tx_env.credit_tokens(&vp_owner, &token, amount); - // Initialize VP environment from a transaction + // Initialize VP environment from non-validator PoS actions vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { // Bond the tokens, then unbond some of them tx::ctx() @@ -573,6 +736,111 @@ mod tests { ); } + /// Test that a validator PoS action that must be authorized is accepted + /// with a valid signature. + #[test] + fn test_signed_validator_pos_action_accepted() { + // Init PoS genesis + let pos_params = PosParams::default(); + let validator = address::testing::established_address_3(); + let initial_stake = token::Amount::from_uint(10_098_123, 0).unwrap(); + let consensus_key = key::testing::keypair_2().ref_to(); + let protocol_key = key::testing::keypair_1().ref_to(); + let commission_rate = Dec::new(5, 2).unwrap(); + let max_commission_rate_change = Dec::new(1, 2).unwrap(); + + let genesis_validators = [GenesisValidator { + address: validator.clone(), + tokens: initial_stake, + consensus_key, + protocol_key, + commission_rate, + max_commission_rate_change, + eth_hot_key: key::common::PublicKey::Secp256k1( + key::testing::gen_keypair::() + .ref_to(), + ), + eth_cold_key: key::common::PublicKey::Secp256k1( + key::testing::gen_keypair::() + .ref_to(), + ), + metadata: Default::default(), + }]; + + init_pos(&genesis_validators[..], &pos_params, Epoch(0)); + + // Initialize a tx environment + let mut tx_env = tx_host_env::take(); + + let secret_key = key::testing::keypair_1(); + let public_key = secret_key.ref_to(); + let target = address::testing::established_address_3(); + let token = address::nam(); + let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); + let bond_amount = token::Amount::from_uint(5_098_123, 0).unwrap(); + let unbond_amount = token::Amount::from_uint(3_098_123, 0).unwrap(); + + // Spawn the accounts to be able to modify their storage + tx_env.spawn_accounts([&target, &token]); + tx_env.init_account_storage(&validator, vec![public_key.clone()], 1); + + // write the denomination of NAM into storage + storage_api::token::write_denom( + &mut tx_env.wl_storage, + &token, + token::NATIVE_MAX_DECIMAL_PLACES.into(), + ) + .unwrap(); + + // Credit the tokens to the VP owner before running the transaction to + // be able to transfer from it + tx_env.credit_tokens(&validator, &token, amount); + + // Validator PoS actions + vp_host_env::init_from_tx(validator.clone(), tx_env, |_address| { + // Bond the tokens, then unbond some of them + tx::ctx() + .bond_tokens(Some(&validator), &validator, bond_amount) + .unwrap(); + tx::ctx() + .unbond_tokens(Some(&validator), &validator, unbond_amount) + .unwrap(); + tx::ctx().deactivate_validator(&validator).unwrap(); + tx::ctx() + .change_validator_metadata( + &validator, + Some("email".to_owned()), + Some("desc".to_owned()), + Some("website".to_owned()), + Some("discord".to_owned()), + Some(Dec::new(6, 2).unwrap()), + ) + .unwrap(); + }); + + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + + let mut vp_env = vp_host_env::take(); + let mut tx = vp_env.tx.clone(); + tx.set_data(Data::new(vec![])); + tx.set_code(Code::new(vec![], None)); + tx.add_section(Section::Signature(Signature::new( + vec![tx.raw_header_hash()], + pks_map.index_secret_keys(vec![secret_key]), + None, + ))); + let signed_tx = tx.clone(); + vp_env.tx = signed_tx.clone(); + let keys_changed: BTreeSet = + vp_env.all_touched_storage_keys(); + let verifiers: BTreeSet
= BTreeSet::default(); + vp_host_env::set(vp_env); + assert!( + validate_tx(&CTX, signed_tx, validator, keys_changed, verifiers) + .unwrap() + ); + } + /// Test that a transfer on with accounts other than self is accepted. #[test] fn test_transfer_between_other_parties_accepted() { From 0cd12bb685aab39891ffa8ab84c8aedfd29691de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 21 Nov 2023 10:11:48 +0100 Subject: [PATCH 023/175] remove vp_validator and replace usage with vp_user --- apps/src/lib/bench_utils.rs | 2 +- apps/src/lib/config/genesis.rs | 2 +- apps/src/lib/config/genesis/transactions.rs | 2 +- benches/host_env.rs | 4 +- benches/txs.rs | 14 +- benches/vps.rs | 10 +- genesis/README.md | 2 +- genesis/localnet/validity-predicates.toml | 4 - genesis/starter/validity-predicates.toml | 4 - sdk/src/lib.rs | 11 +- sdk/src/signing.rs | 7 - sdk/src/tx.rs | 2 - wasm/wasm_source/Cargo.toml | 1 - wasm/wasm_source/Makefile | 1 - wasm/wasm_source/src/lib.rs | 2 - wasm/wasm_source/src/vp_validator.rs | 1135 ------------------- 16 files changed, 23 insertions(+), 1180 deletions(-) delete mode 100644 wasm/wasm_source/src/vp_validator.rs diff --git a/apps/src/lib/bench_utils.rs b/apps/src/lib/bench_utils.rs index 551bf49abd..a718cacbed 100644 --- a/apps/src/lib/bench_utils.rs +++ b/apps/src/lib/bench_utils.rs @@ -90,7 +90,7 @@ pub use namada_sdk::tx::{ TX_RESIGN_STEWARD, TX_REVEAL_PK as TX_REVEAL_PK_WASM, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL as TX_VOTE_PROPOSAL_WASM, - TX_WITHDRAW_WASM, VP_USER_WASM, VP_VALIDATOR_WASM, + TX_WITHDRAW_WASM, VP_USER_WASM, }; use namada_sdk::wallet::Wallet; use namada_sdk::NamadaImpl; diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index b1fac85e81..32d2fcf3ae 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -380,7 +380,7 @@ pub fn make_dev_genesis( address, tx: transactions::ValidatorAccountTx { alias: alias.clone(), - vp: "vp_validator".to_string(), + vp: "vp_user".to_string(), commission_rate: Dec::new(5, 2).expect("This can't fail"), max_commission_rate_change: Dec::new(1, 2) .expect("This can't fail"), diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index d457ef87f5..b617b5a3bf 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -153,7 +153,7 @@ pub fn init_validator( validator_wallet.eth_cold_key.ref_to(), ), // No custom validator VPs yet - vp: "vp_validator".to_string(), + vp: "vp_user".to_string(), commission_rate, max_commission_rate_change, email, diff --git a/benches/host_env.rs b/benches/host_env.rs index 3b096f11ec..289b0eb564 100644 --- a/benches/host_env.rs +++ b/benches/host_env.rs @@ -9,7 +9,7 @@ use namada::proto::Signature; use namada::vm::wasm::TxCache; use namada_apps::bench_utils::{ BenchShell, TX_INIT_PROPOSAL_WASM, TX_REVEAL_PK_WASM, TX_TRANSFER_WASM, - TX_UPDATE_ACCOUNT_WASM, VP_VALIDATOR_WASM, WASM_DIR, + TX_UPDATE_ACCOUNT_WASM, VP_USER_WASM, WASM_DIR, }; use namada_apps::wallet::defaults; use namada_apps::wasm_loader; @@ -68,7 +68,7 @@ fn compile_wasm(c: &mut Criterion) { TX_INIT_PROPOSAL_WASM, TX_REVEAL_PK_WASM, TX_UPDATE_ACCOUNT_WASM, - VP_VALIDATOR_WASM, + VP_USER_WASM, ] { let wasm_code = wasm_loader::read_wasm_or_exit(WASM_DIR, tx); txs.insert(tx, wasm_code); diff --git a/benches/txs.rs b/benches/txs.rs index 02d6c9c22d..98f4d45a9d 100644 --- a/benches/txs.rs +++ b/benches/txs.rs @@ -51,7 +51,7 @@ use namada_apps::bench_utils::{ TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, TX_RESIGN_STEWARD, TX_REVEAL_PK_WASM, TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, - TX_VOTE_PROPOSAL_WASM, TX_WITHDRAW_WASM, VP_VALIDATOR_WASM, + TX_VOTE_PROPOSAL_WASM, TX_WITHDRAW_WASM, VP_USER_WASM, }; use namada_apps::wallet::defaults; use sha2::Digest; @@ -369,11 +369,11 @@ fn reveal_pk(c: &mut Criterion) { fn update_account(c: &mut Criterion) { let shell = BenchShell::default(); let vp_code_hash: Hash = shell - .read_storage_key(&Key::wasm_hash(VP_VALIDATOR_WASM)) + .read_storage_key(&Key::wasm_hash(VP_USER_WASM)) .unwrap(); let extra_section = Section::ExtraData(Code::from_hash( vp_code_hash, - Some(VP_VALIDATOR_WASM.to_string()), + Some(VP_USER_WASM.to_string()), )); let data = UpdateAccount { addr: defaults::albert_address(), @@ -412,11 +412,11 @@ fn init_account(c: &mut Criterion) { let shell = BenchShell::default(); let vp_code_hash: Hash = shell - .read_storage_key(&Key::wasm_hash(VP_VALIDATOR_WASM)) + .read_storage_key(&Key::wasm_hash(VP_USER_WASM)) .unwrap(); let extra_section = Section::ExtraData(Code::from_hash( vp_code_hash, - Some(VP_VALIDATOR_WASM.to_string()), + Some(VP_USER_WASM.to_string()), )); let extra_hash = Hash( extra_section @@ -613,11 +613,11 @@ fn init_validator(c: &mut Criterion) { let shell = BenchShell::default(); let validator_vp_code_hash: Hash = shell - .read_storage_key(&Key::wasm_hash(VP_VALIDATOR_WASM)) + .read_storage_key(&Key::wasm_hash(VP_USER_WASM)) .unwrap(); let extra_section = Section::ExtraData(Code::from_hash( validator_vp_code_hash, - Some(VP_VALIDATOR_WASM.to_string()), + Some(VP_USER_WASM.to_string()), )); let extra_hash = Hash( extra_section diff --git a/benches/vps.rs b/benches/vps.rs index d101b2a4a9..366887d1fa 100644 --- a/benches/vps.rs +++ b/benches/vps.rs @@ -22,7 +22,7 @@ use namada_apps::bench_utils::{ generate_foreign_key_tx, BenchShell, TX_BOND_WASM, TX_CHANGE_VALIDATOR_COMMISSION_WASM, TX_REVEAL_PK_WASM, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL_WASM, - VP_USER_WASM, VP_VALIDATOR_WASM, + VP_USER_WASM, }; use namada_apps::wallet::defaults; use sha2::Digest; @@ -70,11 +70,11 @@ fn vp_user(c: &mut Criterion) { ); let vp_validator_hash = shell - .read_storage_key(&Key::wasm_hash(VP_VALIDATOR_WASM)) + .read_storage_key(&Key::wasm_hash(VP_USER_WASM)) .unwrap(); let extra_section = Section::ExtraData(Code::from_hash( vp_validator_hash, - Some(VP_VALIDATOR_WASM.to_string()), + Some(VP_USER_WASM.to_string()), )); let data = UpdateAccount { addr: defaults::albert_address(), @@ -322,7 +322,7 @@ fn vp_implicit(c: &mut Criterion) { fn vp_validator(c: &mut Criterion) { let shell = BenchShell::default(); let vp_code_hash: Hash = shell - .read_storage_key(&Key::wasm_hash(VP_VALIDATOR_WASM)) + .read_storage_key(&Key::wasm_hash(VP_USER_WASM)) .unwrap(); let mut group = c.benchmark_group("vp_validator"); @@ -361,7 +361,7 @@ fn vp_validator(c: &mut Criterion) { let extra_section = Section::ExtraData(Code::from_hash( vp_code_hash, - Some(VP_VALIDATOR_WASM.to_string()), + Some(VP_USER_WASM.to_string()), )); let data = UpdateAccount { addr: defaults::validator_address(), diff --git a/genesis/README.md b/genesis/README.md index 894e3d602c..1aec869104 100644 --- a/genesis/README.md +++ b/genesis/README.md @@ -56,7 +56,7 @@ An unsigned `validator_account` tx example: ```toml [[validator_account]] alias = "validator-0" -vp = "vp_validator" +vp = "vp_user" commission_rate = "0.05" max_commission_rate_change = "0.01" net_address = "127.0.0.1:27656" diff --git a/genesis/localnet/validity-predicates.toml b/genesis/localnet/validity-predicates.toml index 907e7c522b..0216abe982 100644 --- a/genesis/localnet/validity-predicates.toml +++ b/genesis/localnet/validity-predicates.toml @@ -8,7 +8,3 @@ filename = "vp_implicit.wasm" [wasm.vp_user] filename = "vp_user.wasm" -# Default validator VP -[wasm.vp_validator] -filename = "vp_validator.wasm" - diff --git a/genesis/starter/validity-predicates.toml b/genesis/starter/validity-predicates.toml index 9c9e76fc83..242cc1c5c5 100644 --- a/genesis/starter/validity-predicates.toml +++ b/genesis/starter/validity-predicates.toml @@ -8,10 +8,6 @@ filename = "vp_implicit.wasm" [wasm.vp_user] filename = "vp_user.wasm" -# Default validator VP -[wasm.vp_validator] -filename = "vp_validator.wasm" - # Token VP [wasm.vp_token] filename = "vp_token.wasm" diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index f5c0ae37fa..b7b549f5d6 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -3,7 +3,6 @@ extern crate alloc; pub use namada_core::{ibc, ibc_proto, proto, tendermint, tendermint_proto}; #[cfg(feature = "tendermint-rpc")] pub use tendermint_rpc; -use tx::{TX_INIT_ACCOUNT_WASM, VP_VALIDATOR_WASM}; pub use { bip39, borsh, masp_primitives, masp_proofs, namada_core as core, namada_proof_of_stake as proof_of_stake, zeroize, @@ -55,10 +54,10 @@ use crate::tx::{ ProcessTxResponse, TX_BOND_WASM, TX_BRIDGE_POOL_WASM, TX_CHANGE_COMMISSION_WASM, TX_CHANGE_CONSENSUS_KEY_WASM, TX_CHANGE_METADATA_WASM, TX_CLAIM_REWARDS_WASM, - TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_PROPOSAL, - TX_INIT_VALIDATOR_WASM, TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, - TX_RESIGN_STEWARD, TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, - TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, + TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, + TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, TX_REACTIVATE_VALIDATOR_WASM, + TX_REDELEGATE_WASM, TX_RESIGN_STEWARD, TX_REVEAL_PK, TX_TRANSFER_WASM, + TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, VP_USER_WASM, }; @@ -366,7 +365,7 @@ pub trait Namada<'a>: Sized { eth_cold_key: None, eth_hot_key: None, protocol_key: None, - validator_vp_code_path: PathBuf::from(VP_VALIDATOR_WASM), + validator_vp_code_path: PathBuf::from(VP_USER_WASM), unsafe_dont_encrypt: false, tx_code_path: PathBuf::from(TX_INIT_VALIDATOR_WASM), tx: self.tx_builder(), diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index 6784be92ba..c6262d9dd0 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -54,7 +54,6 @@ use crate::tx::{ TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, TX_REACTIVATE_VALIDATOR_WASM, TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, VP_USER_WASM, - VP_VALIDATOR_WASM, }; pub use crate::wallet::store::AddressVpType; use crate::wallet::{Wallet, WalletIo}; @@ -1067,8 +1066,6 @@ pub async fn to_ledger_vector<'a>( })?; let vp_code = if extra.tag == Some(VP_USER_WASM.to_string()) { "User".to_string() - } else if extra.tag == Some(VP_VALIDATOR_WASM.to_string()) { - "Validator".to_string() } else { HEXLOWER.encode(&extra.code.hash().0) }; @@ -1113,8 +1110,6 @@ pub async fn to_ledger_vector<'a>( })?; let vp_code = if extra.tag == Some(VP_USER_WASM.to_string()) { "User".to_string() - } else if extra.tag == Some(VP_VALIDATOR_WASM.to_string()) { - "Validator".to_string() } else { HEXLOWER.encode(&extra.code.hash().0) }; @@ -1314,8 +1309,6 @@ pub async fn to_ledger_vector<'a>( })?; let vp_code = if extra.tag == Some(VP_USER_WASM.to_string()) { "User".to_string() - } else if extra.tag == Some(VP_VALIDATOR_WASM.to_string()) { - "Validator".to_string() } else { HEXLOWER.encode(&extra.code.hash().0) }; diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index 9378615890..e26bbff4e2 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -92,8 +92,6 @@ pub const TX_TRANSFER_WASM: &str = "tx_transfer.wasm"; pub const TX_IBC_WASM: &str = "tx_ibc.wasm"; /// User validity predicate WASM path pub const VP_USER_WASM: &str = "vp_user.wasm"; -/// Validator validity predicate WASM path -pub const VP_VALIDATOR_WASM: &str = "vp_validator.wasm"; /// Bond WASM path pub const TX_BOND_WASM: &str = "tx_bond.wasm"; /// Unbond WASM path diff --git a/wasm/wasm_source/Cargo.toml b/wasm/wasm_source/Cargo.toml index 8e8e3efe4e..c4025c1207 100644 --- a/wasm/wasm_source/Cargo.toml +++ b/wasm/wasm_source/Cargo.toml @@ -38,7 +38,6 @@ tx_resign_steward = ["namada_tx_prelude"] vp_implicit = ["namada_vp_prelude", "once_cell"] vp_token = ["namada_vp_prelude"] vp_user = ["namada_vp_prelude", "once_cell"] -vp_validator = ["namada_vp_prelude", "once_cell"] [dependencies] namada_tx_prelude = {path = "../../tx_prelude", optional = true} diff --git a/wasm/wasm_source/Makefile b/wasm/wasm_source/Makefile index 6772a2e739..2da935ba7c 100644 --- a/wasm/wasm_source/Makefile +++ b/wasm/wasm_source/Makefile @@ -29,7 +29,6 @@ wasms += tx_update_steward_commission wasms += tx_resign_steward wasms += vp_implicit wasms += vp_user -wasms += vp_validator # Build all wasms in release mode all: $(wasms) diff --git a/wasm/wasm_source/src/lib.rs b/wasm/wasm_source/src/lib.rs index ae3d121f2c..e44ac1564e 100644 --- a/wasm/wasm_source/src/lib.rs +++ b/wasm/wasm_source/src/lib.rs @@ -47,5 +47,3 @@ pub mod tx_withdraw; pub mod vp_implicit; #[cfg(feature = "vp_user")] pub mod vp_user; -#[cfg(feature = "vp_validator")] -pub mod vp_validator; diff --git a/wasm/wasm_source/src/vp_validator.rs b/wasm/wasm_source/src/vp_validator.rs deleted file mode 100644 index 2c104c13d8..0000000000 --- a/wasm/wasm_source/src/vp_validator.rs +++ /dev/null @@ -1,1135 +0,0 @@ -//! A basic validator VP. -//! -//! Like the user VP, this VP currently provides a signature verification -//! against a public key for sending tokens (receiving tokens is permissive). -//! -//! It allows to bond, unbond and withdraw tokens to and from PoS system with a -//! valid signature. -//! -//! Currently, the only difference with respect to the user VP is for a tx to -//! change a validator's commission rate: we require a valid signature only from -//! the validator whose commission rate is being changed. -//! -//! Any other storage key changes are allowed only with a valid signature. - -use namada_vp_prelude::storage::KeySeg; -use namada_vp_prelude::*; -use once_cell::unsync::Lazy; -use proof_of_stake::types::ValidatorState; - -enum KeyType<'a> { - Token { owner: &'a Address }, - PoS, - Vp(&'a Address), - PgfStward(&'a Address), - GovernanceVote(&'a Address), - Unknown, -} - -impl<'a> From<&'a storage::Key> for KeyType<'a> { - fn from(key: &'a storage::Key) -> KeyType<'a> { - if let Some([_, owner]) = token::is_any_token_balance_key(key) { - Self::Token { owner } - } else if proof_of_stake::storage::is_pos_key(key) { - Self::PoS - } else if gov_storage::keys::is_vote_key(key) { - let voter_address = gov_storage::keys::get_voter_address(key); - if let Some(address) = voter_address { - Self::GovernanceVote(address) - } else { - Self::Unknown - } - } else if let Some(address) = pgf_storage::keys::is_stewards_key(key) { - Self::PgfStward(address) - } else if let Some(address) = key.is_validity_predicate() { - Self::Vp(address) - } else { - Self::Unknown - } - } -} - -#[validity_predicate(gas = 134761)] -fn validate_tx( - ctx: &Ctx, - tx_data: Tx, - addr: Address, - keys_changed: BTreeSet, - verifiers: BTreeSet
, -) -> VpResult { - debug_log!( - "vp_validator called with user addr: {}, key_changed: {:?}, \ - verifiers: {:?}", - addr, - keys_changed, - verifiers - ); - - let valid_sig = Lazy::new(|| { - matches!(verify_signatures(ctx, &tx_data, &addr), Ok(true)) - }); - - if !is_valid_tx(ctx, &tx_data)? { - return reject(); - } - - for key in keys_changed.iter() { - let key_type: KeyType = key.into(); - let is_valid = match key_type { - KeyType::Token { owner, .. } => { - if owner == &addr { - let pre: token::Amount = - ctx.read_pre(key)?.unwrap_or_default(); - let post: token::Amount = - ctx.read_post(key)?.unwrap_or_default(); - let change = post.change() - pre.change(); - // debit has to signed, credit doesn't - let valid = change.non_negative() || *valid_sig; - debug_log!( - "token key: {}, change: {:?}, valid_sig: {}, valid \ - modification: {}", - key, - change, - *valid_sig, - valid - ); - valid - } else { - debug_log!( - "This address ({}) is not of owner ({}) of token key: \ - {}", - addr, - owner, - key - ); - // If this is not the owner, allow any change - true - } - } - KeyType::PoS => { - // Bond or unbond - let bond_id = proof_of_stake::storage::is_bond_key(key) - .map(|(bond_id, _)| bond_id) - .or_else(|| { - proof_of_stake::storage::is_unbond_key(key) - .map(|(bond_id, _, _)| bond_id) - }); - let valid_bond_or_unbond_change = match bond_id { - Some(bond_id) => { - // Bonds and unbonds changes for this address - // must be signed - bond_id.source != addr || *valid_sig - } - None => { - // Any other PoS changes are allowed without signature - true - } - }; - // Commission rate changes must be signed by the validator - let comm = - proof_of_stake::storage::is_validator_commission_rate_key( - key, - ); - let valid_commission_rate_change = match comm { - Some((validator, _epoch)) => { - *validator == addr && *valid_sig - } - None => true, - }; - // Metadata changes must be signed by the validator whose - // metadata is manipulated - let metadata = - proof_of_stake::storage::is_validator_metadata_key(key); - let valid_metadata_change = match metadata { - Some(address) => *address == addr && *valid_sig, - None => true, - }; - - // Changes due to unjailing, deactivating, and reactivating are - // marked by changes in validator state - let state_change = - proof_of_stake::storage::is_validator_state_key(key); - let valid_state_change = match state_change { - Some((address, epoch)) => { - let params_pre = - proof_of_stake::read_pos_params(&ctx.pre())?; - let state_pre = - proof_of_stake::validator_state_handle(address) - .get(&ctx.pre(), epoch, ¶ms_pre)?; - - let params_post = - proof_of_stake::read_pos_params(&ctx.post())?; - let state_post = - proof_of_stake::validator_state_handle(address) - .get(&ctx.post(), epoch, ¶ms_post)?; - - match (state_pre, state_post) { - (Some(pre), Some(post)) => { - if - // Deactivation case - (matches!( - pre, - ValidatorState::Consensus - | ValidatorState::BelowCapacity - | ValidatorState::BelowThreshold - ) && post == ValidatorState::Inactive) - // Reactivation case - || pre == ValidatorState::Inactive - && post != ValidatorState::Inactive - // Unjail case - || pre == ValidatorState::Jailed - && matches!( - post, - ValidatorState::Consensus - | ValidatorState::BelowCapacity - | ValidatorState::BelowThreshold - ) - { - *address == addr && *valid_sig - } else { - true - } - } - _ => true, - } - } - None => true, - }; - - let valid = valid_bond_or_unbond_change - && valid_commission_rate_change - && valid_state_change - && valid_metadata_change; - debug_log!( - "PoS key {} {}", - key, - if valid { "accepted" } else { "rejected" } - ); - valid - } - KeyType::GovernanceVote(voter) => { - if voter == &addr { - *valid_sig - } else { - true - } - } - KeyType::PgfStward(address) => { - if address == &addr { - *valid_sig - } else { - true - } - } - KeyType::Vp(owner) => { - let has_post: bool = ctx.has_key_post(key)?; - if owner == &addr { - if has_post { - let vp_hash: Vec = - ctx.read_bytes_post(key)?.unwrap(); - *valid_sig && is_vp_whitelisted(ctx, &vp_hash)? - } else { - false - } - } else { - let vp_hash: Vec = ctx.read_bytes_post(key)?.unwrap(); - is_vp_whitelisted(ctx, &vp_hash)? - } - } - KeyType::Unknown => { - if key.segments.get(0) == Some(&addr.to_db_key()) { - // Unknown changes to this address space require a valid - // signature - *valid_sig - } else { - // Unknown changes anywhere else are permitted - true - } - } - }; - if !is_valid { - debug_log!("key {} modification failed vp", key); - return reject(); - } - } - - accept() -} - -#[cfg(test)] -mod tests { - use address::testing::arb_non_internal_address; - use namada::ledger::pos::{GenesisValidator, OwnedPosParams}; - use namada::proto::{Code, Data, Signature}; - use namada::types::dec::Dec; - use namada::types::storage::Epoch; - use namada::types::transaction::TxType; - use namada_test_utils::TestWasms; - // Use this as `#[test]` annotation to enable logging - use namada_tests::log::test; - use namada_tests::native_vp::pos::init_pos; - use namada_tests::tx::{self, tx_host_env, TestTxEnv}; - use namada_tests::vp::vp_host_env::storage::Key; - use namada_tests::vp::*; - use namada_tx_prelude::{StorageWrite, TxEnv}; - use namada_vp_prelude::account::AccountPublicKeysMap; - use namada_vp_prelude::key::RefTo; - use proptest::prelude::*; - use storage::testing::arb_account_storage_key_no_vp; - - use super::*; - - /// Test that no-op transaction (i.e. no storage modifications) accepted. - #[test] - fn test_no_op_transaction() { - let mut tx_data = Tx::from_type(TxType::Raw); - tx_data.set_data(Data::new(vec![])); - let addr: Address = address::testing::established_address_1(); - let keys_changed: BTreeSet = BTreeSet::default(); - let verifiers: BTreeSet
= BTreeSet::default(); - - // The VP env must be initialized before calling `validate_tx` - vp_host_env::init(); - - assert!( - validate_tx(&CTX, tx_data, addr, keys_changed, verifiers).unwrap() - ); - } - - /// Test that a credit transfer is accepted. - #[test] - fn test_credit_transfer_accepted() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let vp_owner = address::testing::established_address_1(); - let source = address::testing::established_address_2(); - let token = address::nam(); - let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner, &source, &token]); - - // Credit the tokens to the source before running the transaction to be - // able to transfer from it - tx_env.credit_tokens(&source, &token, amount); - // write the denomination of NAM into storage - storage_api::token::write_denom( - &mut tx_env.wl_storage, - &token, - token::NATIVE_MAX_DECIMAL_PLACES.into(), - ) - .unwrap(); - - let amount = token::DenominatedAmount { - amount, - denom: token::NATIVE_MAX_DECIMAL_PLACES.into(), - }; - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Apply transfer in a transaction - tx_host_env::token::transfer( - tx::ctx(), - &source, - address, - &token, - amount, - ) - .unwrap(); - }); - - let vp_env = vp_host_env::take(); - let mut tx_data = Tx::from_type(TxType::Raw); - tx_data.set_data(Data::new(vec![])); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - validate_tx(&CTX, tx_data, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a debit transfer without a valid signature is rejected. - #[test] - fn test_unsigned_debit_transfer_rejected() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let vp_owner = address::testing::established_address_1(); - let target = address::testing::established_address_2(); - let token = address::nam(); - let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner, &target, &token]); - - // Credit the tokens to the VP owner before running the transaction to - // be able to transfer from it - tx_env.credit_tokens(&vp_owner, &token, amount); - let amount = token::DenominatedAmount { - amount, - denom: token::NATIVE_MAX_DECIMAL_PLACES.into(), - }; - // write the denomination of NAM into storage - storage_api::token::write_denom( - &mut tx_env.wl_storage, - &token, - token::NATIVE_MAX_DECIMAL_PLACES.into(), - ) - .unwrap(); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Apply transfer in a transaction - tx_host_env::token::transfer( - tx::ctx(), - address, - &target, - &token, - amount, - ) - .unwrap(); - }); - - let vp_env = vp_host_env::take(); - let mut tx_data = Tx::from_type(TxType::Raw); - tx_data.set_data(Data::new(vec![])); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - !validate_tx(&CTX, tx_data, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a debit transfer with a valid signature is accepted. - #[test] - fn test_signed_debit_transfer_accepted() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let vp_owner = address::testing::established_address_1(); - let keypair = key::testing::keypair_1(); - let public_key = keypair.ref_to(); - let target = address::testing::established_address_2(); - let token = address::nam(); - let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner, &target, &token]); - tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); - - // Credit the tokens to the VP owner before running the transaction to - // be able to transfer from it - tx_env.credit_tokens(&vp_owner, &token, amount); - // write the denomination of NAM into storage - storage_api::token::write_denom( - &mut tx_env.wl_storage, - &token, - token::NATIVE_MAX_DECIMAL_PLACES.into(), - ) - .unwrap(); - - let amount = token::DenominatedAmount { - amount, - denom: token::NATIVE_MAX_DECIMAL_PLACES.into(), - }; - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Apply transfer in a transaction - tx_host_env::token::transfer( - tx::ctx(), - address, - &target, - &token, - amount, - ) - .unwrap(); - }); - - let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); - - let mut vp_env = vp_host_env::take(); - let mut tx = vp_env.tx.clone(); - tx.set_data(Data::new(vec![])); - tx.set_code(Code::new(vec![], None)); - tx.add_section(Section::Signature(Signature::new( - vec![tx.raw_header_hash()], - pks_map.index_secret_keys(vec![keypair]), - None, - ))); - let signed_tx = tx.clone(); - vp_env.tx = signed_tx.clone(); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a PoS action that must be authorized is rejected without a - /// valid signature. - #[test] - fn test_unsigned_pos_action_rejected() { - // Init PoS genesis - let pos_params = OwnedPosParams::default(); - let validator = address::testing::established_address_3(); - let initial_stake = token::Amount::from_uint(10_098_123, 0).unwrap(); - let consensus_key = key::testing::keypair_2().ref_to(); - let protocol_key = key::testing::keypair_1().ref_to(); - let eth_cold_key = key::testing::keypair_3().ref_to(); - let eth_hot_key = key::testing::keypair_4().ref_to(); - let commission_rate = Dec::new(5, 2).unwrap(); - let max_commission_rate_change = Dec::new(1, 2).unwrap(); - - let genesis_validators = [GenesisValidator { - address: validator.clone(), - tokens: initial_stake, - consensus_key, - protocol_key, - commission_rate, - max_commission_rate_change, - eth_hot_key, - eth_cold_key, - metadata: Default::default(), - }]; - - init_pos(&genesis_validators[..], &pos_params, Epoch(0)); - - // Initialize a tx environment - let mut tx_env = tx_host_env::take(); - - let secret_key = key::testing::keypair_1(); - let public_key = secret_key.ref_to(); - let vp_owner: Address = address::testing::established_address_2(); - let target = address::testing::established_address_3(); - let token = address::nam(); - let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); - let bond_amount = token::Amount::from_uint(5_098_123, 0).unwrap(); - let unbond_amount = token::Amount::from_uint(3_098_123, 0).unwrap(); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&target, &token]); - tx_env.init_account_storage(&vp_owner, vec![public_key], 1); - - // Credit the tokens to the VP owner before running the transaction to - // be able to transfer from it - tx_env.credit_tokens(&vp_owner, &token, amount); - // write the denomination of NAM into storage - storage_api::token::write_denom( - &mut tx_env.wl_storage, - &token, - token::NATIVE_MAX_DECIMAL_PLACES.into(), - ) - .unwrap(); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { - // Bond the tokens, then unbond some of them - tx::ctx() - .bond_tokens(Some(&vp_owner), &validator, bond_amount) - .unwrap(); - tx::ctx() - .unbond_tokens(Some(&vp_owner), &validator, unbond_amount) - .unwrap(); - tx::ctx() - .change_validator_commission_rate( - &validator, - &Dec::new(6, 2).unwrap(), - ) - .unwrap(); - }); - - let vp_env = vp_host_env::take(); - let mut tx_data = Tx::from_type(TxType::Raw); - tx_data.set_data(Data::new(vec![])); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - !validate_tx(&CTX, tx_data, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a PoS action that must be authorized is accepted with a valid - /// signature. - #[test] - fn test_signed_pos_action_accepted() { - // Init PoS genesis - let pos_params = OwnedPosParams::default(); - let validator = address::testing::established_address_3(); - let initial_stake = token::Amount::from_uint(10_098_123, 0).unwrap(); - let consensus_key = key::testing::keypair_2().ref_to(); - let protocol_key = key::testing::keypair_1().ref_to(); - let commission_rate = Dec::new(5, 2).unwrap(); - let max_commission_rate_change = Dec::new(1, 2).unwrap(); - - let genesis_validators = [GenesisValidator { - address: validator.clone(), - tokens: initial_stake, - consensus_key, - protocol_key, - commission_rate, - max_commission_rate_change, - eth_hot_key: key::common::PublicKey::Secp256k1( - key::testing::gen_keypair::() - .ref_to(), - ), - eth_cold_key: key::common::PublicKey::Secp256k1( - key::testing::gen_keypair::() - .ref_to(), - ), - metadata: Default::default(), - }]; - - init_pos(&genesis_validators[..], &pos_params, Epoch(0)); - - // Initialize a tx environment - let mut tx_env = tx_host_env::take(); - - let secret_key = key::testing::keypair_1(); - let public_key = secret_key.ref_to(); - let target = address::testing::established_address_3(); - let token = address::nam(); - let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); - let bond_amount = token::Amount::from_uint(5_098_123, 0).unwrap(); - let unbond_amount = token::Amount::from_uint(3_098_123, 0).unwrap(); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&validator, &target, &token]); - tx_env.init_account_storage(&validator, vec![public_key.clone()], 1); - - // Credit the tokens to the VP owner before running the transaction to - // be able to transfer from it - tx_env.credit_tokens(&validator, &token, amount); - // write the denomination of NAM into storage - storage_api::token::write_denom( - &mut tx_env.wl_storage, - &token, - token::NATIVE_MAX_DECIMAL_PLACES.into(), - ) - .unwrap(); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(validator.clone(), tx_env, |_address| { - // Bond the tokens, then unbond some of them - tx::ctx() - .bond_tokens(Some(&validator), &validator, bond_amount) - .unwrap(); - tx::ctx() - .unbond_tokens(Some(&validator), &validator, unbond_amount) - .unwrap(); - tx::ctx().deactivate_validator(&validator).unwrap(); - tx::ctx() - .change_validator_metadata( - &validator, - Some("email".to_owned()), - Some("desc".to_owned()), - Some("website".to_owned()), - Some("discord".to_owned()), - Some(Dec::new(6, 2).unwrap()), - ) - .unwrap(); - }); - - let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); - - let mut vp_env = vp_host_env::take(); - let mut tx = vp_env.tx.clone(); - tx.set_data(Data::new(vec![])); - tx.set_code(Code::new(vec![], None)); - tx.add_section(Section::Signature(Signature::new( - vec![tx.raw_header_hash()], - pks_map.index_secret_keys(vec![secret_key]), - None, - ))); - let signed_tx = tx.clone(); - vp_env.tx = signed_tx.clone(); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - validate_tx(&CTX, signed_tx, validator, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a transfer on with accounts other than self is accepted. - #[test] - fn test_transfer_between_other_parties_accepted() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let vp_owner = address::testing::established_address_1(); - let source = address::testing::established_address_2(); - let target = address::testing::established_address_3(); - let token = address::nam(); - let amount = token::Amount::from_uint(10_098_123, 0).unwrap(); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner, &source, &target, &token]); - - // Credit the tokens to the VP owner before running the transaction to - // be able to transfer from it - tx_env.credit_tokens(&source, &token, amount); - let amount = token::DenominatedAmount { - amount, - denom: token::NATIVE_MAX_DECIMAL_PLACES.into(), - }; - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - tx::ctx().insert_verifier(address).unwrap(); - // Apply transfer in a transaction - tx_host_env::token::transfer( - tx::ctx(), - &source, - &target, - &token, - amount, - ) - .unwrap(); - }); - - let vp_env = vp_host_env::take(); - let mut tx_data = Tx::from_type(TxType::Raw); - tx_data.set_data(Data::new(vec![])); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - validate_tx(&CTX, tx_data, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - prop_compose! { - /// Generates an account address and a storage key inside its storage. - fn arb_account_storage_subspace_key() - // Generate an address - (address in arb_non_internal_address()) - // Generate a storage key other than its VP key (VP cannot be - // modified directly via `write`, it has to be modified via - // `tx::update_validity_predicate`. - (storage_key in arb_account_storage_key_no_vp(address.clone()), - // Use the generated address too - address in Just(address)) - -> (Address, Key) { - (address, storage_key) - } - } - - proptest! { - /// Test that an unsigned tx that performs arbitrary storage writes or - /// deletes to the account is rejected. - #[test] - fn test_unsigned_arb_storage_write_rejected( - (vp_owner, storage_key) in arb_account_storage_subspace_key(), - // Generate bytes to write. If `None`, delete from the key instead - storage_value in any::>>(), - ) { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - // Spawn all the accounts in the storage key to be able to modify - // their storage - let storage_key_addresses = storage_key.find_addresses(); - tx_env.spawn_accounts(storage_key_addresses); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { - // Write or delete some data in the transaction - if let Some(value) = &storage_value { - tx::ctx().write(&storage_key, value).unwrap(); - } else { - tx::ctx().delete(&storage_key).unwrap(); - } - }); - - let vp_env = vp_host_env::take(); - let mut tx_data = Tx::from_type(TxType::Raw); - tx_data.set_data(Data::new(vec![])); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!(!validate_tx(&CTX, tx_data, vp_owner, keys_changed, verifiers).unwrap()); - } - } - - proptest! { - /// Test that a signed tx that performs arbitrary storage writes or - /// deletes to the account is accepted. - #[test] - fn test_signed_arb_storage_write( - (vp_owner, storage_key) in arb_account_storage_subspace_key(), - // Generate bytes to write. If `None`, delete from the key instead - storage_value in any::>>(), - ) { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let keypair = key::testing::keypair_1(); - let public_key = keypair.ref_to(); - - // Spawn all the accounts in the storage key to be able to modify - // their storage - let storage_key_addresses = storage_key.find_addresses(); - tx_env.spawn_accounts(storage_key_addresses); - - tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |_address| { - // Write or delete some data in the transaction - if let Some(value) = &storage_value { - tx::ctx().write(&storage_key, value).unwrap(); - } else { - tx::ctx().delete(&storage_key).unwrap(); - } - }); - - let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); - - let mut vp_env = vp_host_env::take(); - let mut tx = vp_env.tx.clone(); - tx.set_data(Data::new(vec![])); - tx.set_code(Code::new(vec![], None)); - tx.add_section(Section::Signature(Signature::new( - vec![tx.raw_header_hash()], - pks_map.index_secret_keys(vec![keypair]), - None, - ))); - let signed_tx = tx.clone(); - vp_env.tx = signed_tx.clone(); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!(validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers).unwrap()); - } - } - - /// Test that a validity predicate update without a valid signature is - /// rejected. - #[test] - fn test_unsigned_vp_update_rejected() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let vp_owner = address::testing::established_address_1(); - let vp_code = TestWasms::VpAlwaysTrue.read_bytes(); - let vp_hash = sha256(&vp_code); - // for the update - tx_env.store_wasm_code(vp_code); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner]); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Update VP in a transaction - tx::ctx() - .update_validity_predicate(address, vp_hash, &None) - .unwrap(); - }); - - let vp_env = vp_host_env::take(); - let mut tx_data = Tx::from_type(TxType::Raw); - tx_data.set_data(Data::new(vec![])); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - !validate_tx(&CTX, tx_data, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a validity predicate update with a valid signature is - /// accepted. - #[test] - fn test_signed_vp_update_accepted() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - tx_env.init_parameters(None, None, None, None); - - let vp_owner = address::testing::established_address_1(); - let keypair = key::testing::keypair_1(); - let public_key = keypair.ref_to(); - let vp_code = TestWasms::VpAlwaysTrue.read_bytes(); - let vp_hash = sha256(&vp_code); - // for the update - tx_env.store_wasm_code(vp_code); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner]); - tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Update VP in a transaction - tx::ctx() - .update_validity_predicate(address, vp_hash, &None) - .unwrap(); - }); - - let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); - - let mut vp_env = vp_host_env::take(); - let mut tx = vp_env.tx.clone(); - tx.set_data(Data::new(vec![])); - tx.set_code(Code::new(vec![], None)); - tx.add_section(Section::Signature(Signature::new( - vec![tx.raw_header_hash()], - pks_map.index_secret_keys(vec![keypair]), - None, - ))); - let signed_tx = tx.clone(); - vp_env.tx = signed_tx.clone(); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a validity predicate update is rejected if not whitelisted - #[test] - fn test_signed_vp_update_not_whitelisted_rejected() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - tx_env.init_parameters( - None, - Some(vec!["some_hash".to_string()]), - None, - None, - ); - - let vp_owner = address::testing::established_address_1(); - let keypair = key::testing::keypair_1(); - let public_key = keypair.ref_to(); - let vp_code = TestWasms::VpAlwaysTrue.read_bytes(); - let vp_hash = sha256(&vp_code); - // for the update - tx_env.store_wasm_code(vp_code); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner]); - tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Update VP in a transaction - tx::ctx() - .update_validity_predicate(address, vp_hash, &None) - .unwrap(); - }); - - let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); - - let mut vp_env = vp_host_env::take(); - let mut tx = vp_env.tx.clone(); - tx.set_data(Data::new(vec![])); - tx.set_code(Code::new(vec![], None)); - tx.add_section(Section::Signature(Signature::new( - vec![tx.raw_header_hash()], - pks_map.index_secret_keys(vec![keypair]), - None, - ))); - let signed_tx = tx.clone(); - vp_env.tx = signed_tx.clone(); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - !validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a validity predicate update is accepted if whitelisted - #[test] - fn test_signed_vp_update_whitelisted_accepted() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let vp_owner = address::testing::established_address_1(); - let keypair = key::testing::keypair_1(); - let public_key = keypair.ref_to(); - let vp_code = TestWasms::VpAlwaysTrue.read_bytes(); - let vp_hash = sha256(&vp_code); - // for the update - tx_env.store_wasm_code(vp_code); - - tx_env.init_parameters( - None, - Some(vec![vp_hash.to_string()]), - None, - None, - ); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner]); - tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Update VP in a transaction - tx::ctx() - .update_validity_predicate(address, vp_hash, &None) - .unwrap(); - }); - - let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); - - let mut vp_env = vp_host_env::take(); - let mut tx = vp_env.tx.clone(); - tx.set_data(Data::new(vec![])); - tx.set_code(Code::new(vec![], None)); - tx.add_section(Section::Signature(Signature::new( - vec![tx.raw_header_hash()], - pks_map.index_secret_keys(vec![keypair]), - None, - ))); - let signed_tx = tx.clone(); - vp_env.tx = signed_tx.clone(); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - /// Test that a tx is rejected if not whitelisted - #[test] - fn test_tx_not_whitelisted_rejected() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let vp_owner = address::testing::established_address_1(); - let keypair = key::testing::keypair_1(); - let public_key = keypair.ref_to(); - let vp_code = TestWasms::VpAlwaysTrue.read_bytes(); - let vp_hash = sha256(&vp_code); - // for the update - tx_env.store_wasm_code(vp_code); - - tx_env.init_parameters( - None, - Some(vec![vp_hash.to_string()]), - Some(vec!["some_hash".to_string()]), - None, - ); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner]); - tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Update VP in a transaction - tx::ctx() - .update_validity_predicate(address, vp_hash, &None) - .unwrap(); - }); - - let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); - - let mut vp_env = vp_host_env::take(); - let mut tx = vp_env.tx.clone(); - tx.set_data(Data::new(vec![])); - tx.set_code(Code::new(vec![], None)); - tx.add_section(Section::Signature(Signature::new( - vec![tx.raw_header_hash()], - pks_map.index_secret_keys(vec![keypair]), - None, - ))); - let signed_tx = tx.clone(); - vp_env.tx = signed_tx.clone(); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - !validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } - - #[test] - fn test_tx_whitelisted_accepted() { - // Initialize a tx environment - let mut tx_env = TestTxEnv::default(); - - let vp_owner = address::testing::established_address_1(); - let keypair = key::testing::keypair_1(); - let public_key = keypair.ref_to(); - let vp_code = TestWasms::VpAlwaysTrue.read_bytes(); - let vp_hash = sha256(&vp_code); - // for the update - tx_env.store_wasm_code(vp_code); - - // hardcoded hash of VP_ALWAYS_TRUE_WASM - tx_env.init_parameters( - None, - Some(vec![vp_hash.to_string()]), - None, - None, - ); - - // Spawn the accounts to be able to modify their storage - tx_env.spawn_accounts([&vp_owner]); - tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); - - // Initialize VP environment from a transaction - vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { - // Update VP in a transaction - tx::ctx() - .update_validity_predicate(address, vp_hash, &None) - .unwrap(); - }); - - let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); - - let mut vp_env = vp_host_env::take(); - let mut tx = vp_env.tx.clone(); - tx.set_code(Code::new(vec![], None)); - tx.set_data(Data::new(vec![])); - tx.add_section(Section::Signature(Signature::new( - vec![tx.raw_header_hash()], - pks_map.index_secret_keys(vec![keypair]), - None, - ))); - let signed_tx = tx.clone(); - vp_env.tx = signed_tx.clone(); - let keys_changed: BTreeSet = - vp_env.all_touched_storage_keys(); - let verifiers: BTreeSet
= BTreeSet::default(); - vp_host_env::set(vp_env); - assert!( - validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers) - .unwrap() - ); - } -} From 352c9fc1349720dd0e8ee58c98f8557d9f5ada5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 21 Nov 2023 10:27:39 +0100 Subject: [PATCH 024/175] genesis/localnet: regen validator --- .../pre-genesis/validator-0/transactions.toml | 28 +++++++++--------- .../validator-0/validator-wallet.toml | 12 ++++---- genesis/localnet/transactions.toml | 29 ++++++++++--------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/genesis/localnet/src/pre-genesis/validator-0/transactions.toml b/genesis/localnet/src/pre-genesis/validator-0/transactions.toml index bd03907dae..85c174edc2 100644 --- a/genesis/localnet/src/pre-genesis/validator-0/transactions.toml +++ b/genesis/localnet/src/pre-genesis/validator-0/transactions.toml @@ -1,34 +1,34 @@ [[validator_account]] alias = "validator-0" -vp = "vp_validator" +vp = "vp_user" commission_rate = "0.05" max_commission_rate_change = "0.01" email = "null@null.net" net_address = "127.0.0.1:27656" [validator_account.account_key] -pk = "tpknam1qzuaykg8nrmzuaefut39aaxl0gl66y62285cnwe37gq0a96qaf4qgp5yqtw" -authorization = "signam1qpcvzjdqkvhud9lez3exq3vy7dnp4kyjgsk92yx5cslwzjs0q9czx8ajxztx5pftx9hsf9w2shh6rt0uv6xeyu30ljqkrqj6hnrwn5gqfd9pwf" +pk = "tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj" +authorization = "signam1qzyc89wynvm4n7eq7jglv4d8upaxu38mkkktykjjtgqygmk4sq97ffxermz5wpur4rqr8gk6fze5uvc4u7q4qzqsr285gungdyhv2acgna2ltq" [validator_account.consensus_key] -pk = "tpknam1qpudpptwfh9u5mhvksrguyqk6wvyhus0kf2cs9qr0xuq9k4fepldgqv3ztq" -authorization = "signam1qpuhmvgl330cr3acugaddhn6q9xdw3577h3mv9yszau2smxmn7yvmn2yplfym4sk30r2hz943989sd68umu70e4wsk5q6j2gzzjfg4q0qjvz6f" +pk = "tpknam1qr9u5py97pdmcvnrxhzuuv79ydv5rw7r9z402sucwt6h0lvmmmwqy2wrweg" +authorization = "signam1qzt7ww0q00punp93jrvtkq62n4rk8y5d90tllmlkzr0z7urwfdkn7z8ttne92utwskl6ves4qp66r60tg2xqr568ranwfhcm0665wncqq4t5gx" [validator_account.protocol_key] -pk = "tpknam1qzxs6kchkustgjxld3xz0u3c8gfnkvda042vp06auk6zfrru5hhxqqvyxq6" -authorization = "signam1qztaxmfgncmv5jn9tak0au2ryzxwxrlhn2qyfx4fgewuv5p7jelpfpqe9mlp7y73vsw7r8hu509swj8mumgryswu38m7mvxn9asqn0cq7aqvjp" +pk = "tpknam1qrenhfdphzpszlr7fzand6qgmppge430g3a2lquqzhz64fkve5mq2hdfjaa" +authorization = "signam1qqeaqzj9fu0xsu7pvrkwla5asxde2wak7fslst0p79vxxydt40tzdj54js7dmjvqs2quygqqwup8z2cfffvm86ff8cud6gzel9g40ycw25wp5d" [validator_account.tendermint_node_key] -pk = "tpknam1qzckzn2rc4pr26e0clxajgcllasr6tke4yqrsu7wskw89uka29zykram505" -authorization = "signam1qrgvyj39ljlequl20hx2mz9wpuyjl8lj826c0upy9agt4txuyyusuqkhdmm2aajglupssqcsx8nv62etua6vn0duzrucut4m74nmhscwy3knc3" +pk = "tpknam1qpgcgptcjl22hl2te2uqnp33aqjmvfaud3a3f3sgtxezg7uu5rsv6d2flr3" +authorization = "signam1qrq7x5e7svuddy8dyr3xpcdt6a07u6sky0n5qnv5z757g33t5zm3jnnh9uhh073g05n8jx8rmdu5r2djhwh6few6u329u9cld4c7ynsw2592h8" [validator_account.eth_hot_key] -pk = "tpknam1qyp8znkp023autwqh2cy6c6vhnz8vsm4p6w9ngpnnamqk6dj5w6ktxqjnd0qj" -authorization = "signam1q9fd4nkz8df5ajh6jrsn6mrt0apvn4266walr8pnczl0xtn847u6usdemslvusseerhrd6hftse8zfch5tlpmqp4y9xz3563mu0d26hnqq942mt2" +pk = "tpknam1qypnh98mexms8edj8rcwu0cayx0459p39dwzsffxrr394mf4cse707qcctyrx" +authorization = "signam1qyrvwveg76nrz2ppnsl0em82gcl4p90cqw8eadyzcvk59e2dx0jqja8ln9l9j79sxzhhh5gdggduz78vtthzj5nzs0xvpwhjuh3hymapqq07qxzm" [validator_account.eth_cold_key] -pk = "tpknam1qyp4aw7a07f4ltuq3f0c4sgyq3kzgh6z40w8jt40wl7uhfj7e3m3u9qr792xg" -authorization = "signam1qyqcc7wstsnuadu75jnwg8hxz34nglxj9h9yqyx2c4qqdpxw50ff60hu0swfj7xdkz34tgl9e50jlmzphkgtpw3gg0hsgp35lhsl6rmeqqq28kph" +pk = "tpknam1qypz8zr0w8lsz3s98vh4p974xuxeedpecj9s2l3326r3kdz4tc0snrcpnc8yv" +authorization = "signam1q992kq4ymfl6v8arc2s2tn0w7c4f48wx6fxry9qxv2qk8zvjan8q7j9rxg73cx0f5l56fy53x2jgwv7vy8jtxzucckdzgnxc5tpzajs4qq8r02r2" [[transfer]] token = "nam" @@ -41,4 +41,4 @@ signature = "signam1qz8ch7n6jp7g7hvnzkhmprhqc5umd0gatarlttm7gpcdx6g8hmgqffdq67fn source = "validator-0" validator = "validator-0" amount = "100000" -signature = "signam1qrd7wg2sdla73z7626r2ep8895d9ed4ljq37nz6kmy2rcm36yqjugw6vle7kl70l0d585t382s9vd28k2duwz0lu7ux0vua6aaarjssgdf46n2" +signature = "signam1qqukrz3js2pgzrne90u5f7y4mstrzvmzcq7eelml9m3lzrh9zwpf0vhgjq0rsw4ufj4ffdx8ew74uxkk4df649pg6qq5fgwyqa9mpfcyvskk67" diff --git a/genesis/localnet/src/pre-genesis/validator-0/validator-wallet.toml b/genesis/localnet/src/pre-genesis/validator-0/validator-wallet.toml index 4f3db8b8b0..2e0107b173 100644 --- a/genesis/localnet/src/pre-genesis/validator-0/validator-wallet.toml +++ b/genesis/localnet/src/pre-genesis/validator-0/validator-wallet.toml @@ -1,8 +1,8 @@ -account_key = "unencrypted:00eaa8829ff8932ffad86c4b0ad1ed2f2870c12ca49f03b50e4b34d360daa24268" -consensus_key = "unencrypted:00aabd79879fce99cb528f92d8ea4593241dd49507ff456be52ca2aee98c728338" -eth_cold_key = "unencrypted:0181901af21f92e997c78c61337475d1975c8d29591601e36ace3952d7094d9447" -tendermint_node_key = "unencrypted:00afc7747d1e6d76293553864bbf482d061f1932f83b978b24ba4957dcfcda987c" +account_key = "unencrypted:0024204e13c51b26ed9b42c05647bc46b3821bb453e53d194962ede57ce5ec66ac" +consensus_key = "unencrypted:0037a44681b64d42497e2229516479f83e5344a7a30e8316bde45881a1ec745359" +eth_cold_key = "unencrypted:010d34fcb42383f0babe7c86203f07bf4134f0756a630eb07923f21c90cc068602" +tendermint_node_key = "unencrypted:002f2e94bb5834e18433343345baf47b2b5d4e1ef4d46ba0f876d3d2c89d831419" [validator_keys] -protocol_keypair = "ED25519_SK_PREFIX00b0da066a528a0e1221e6453f9d10143b07a675a250c66603e8a7e98bdbb8cf19" -eth_bridge_keypair = "SECP256K1_SK_PREFIX0133deb418af6af5c62aecbde3dc3a0ff62ea20c0c8e33cf703d0f5e35248e5ab1" +protocol_keypair = "ED25519_SK_PREFIX00610677d4c52ab8ca5e8abe7dfb40246a271a03069fded6099763cbc41e04df02" +eth_bridge_keypair = "SECP256K1_SK_PREFIX01a81af251a711382d6b649a44b36ac5d4f41106f356e1f2fb33c001e91ffaa169" diff --git a/genesis/localnet/transactions.toml b/genesis/localnet/transactions.toml index cafe123854..0662c5147b 100644 --- a/genesis/localnet/transactions.toml +++ b/genesis/localnet/transactions.toml @@ -7,35 +7,35 @@ [[validator_account]] alias = "validator-0" -vp = "vp_validator" +vp = "vp_user" commission_rate = "0.05" max_commission_rate_change = "0.01" email = "null@null.net" net_address = "127.0.0.1:27656" [validator_account.account_key] -pk = "tpknam1qzuaykg8nrmzuaefut39aaxl0gl66y62285cnwe37gq0a96qaf4qgp5yqtw" -authorization = "signam1qpcvzjdqkvhud9lez3exq3vy7dnp4kyjgsk92yx5cslwzjs0q9czx8ajxztx5pftx9hsf9w2shh6rt0uv6xeyu30ljqkrqj6hnrwn5gqfd9pwf" +pk = "tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj" +authorization = "signam1qzyc89wynvm4n7eq7jglv4d8upaxu38mkkktykjjtgqygmk4sq97ffxermz5wpur4rqr8gk6fze5uvc4u7q4qzqsr285gungdyhv2acgna2ltq" [validator_account.consensus_key] -pk = "tpknam1qpudpptwfh9u5mhvksrguyqk6wvyhus0kf2cs9qr0xuq9k4fepldgqv3ztq" -authorization = "signam1qpuhmvgl330cr3acugaddhn6q9xdw3577h3mv9yszau2smxmn7yvmn2yplfym4sk30r2hz943989sd68umu70e4wsk5q6j2gzzjfg4q0qjvz6f" +pk = "tpknam1qr9u5py97pdmcvnrxhzuuv79ydv5rw7r9z402sucwt6h0lvmmmwqy2wrweg" +authorization = "signam1qzt7ww0q00punp93jrvtkq62n4rk8y5d90tllmlkzr0z7urwfdkn7z8ttne92utwskl6ves4qp66r60tg2xqr568ranwfhcm0665wncqq4t5gx" [validator_account.protocol_key] -pk = "tpknam1qzxs6kchkustgjxld3xz0u3c8gfnkvda042vp06auk6zfrru5hhxqqvyxq6" -authorization = "signam1qztaxmfgncmv5jn9tak0au2ryzxwxrlhn2qyfx4fgewuv5p7jelpfpqe9mlp7y73vsw7r8hu509swj8mumgryswu38m7mvxn9asqn0cq7aqvjp" +pk = "tpknam1qrenhfdphzpszlr7fzand6qgmppge430g3a2lquqzhz64fkve5mq2hdfjaa" +authorization = "signam1qqeaqzj9fu0xsu7pvrkwla5asxde2wak7fslst0p79vxxydt40tzdj54js7dmjvqs2quygqqwup8z2cfffvm86ff8cud6gzel9g40ycw25wp5d" [validator_account.tendermint_node_key] -pk = "tpknam1qzckzn2rc4pr26e0clxajgcllasr6tke4yqrsu7wskw89uka29zykram505" -authorization = "signam1qrgvyj39ljlequl20hx2mz9wpuyjl8lj826c0upy9agt4txuyyusuqkhdmm2aajglupssqcsx8nv62etua6vn0duzrucut4m74nmhscwy3knc3" +pk = "tpknam1qpgcgptcjl22hl2te2uqnp33aqjmvfaud3a3f3sgtxezg7uu5rsv6d2flr3" +authorization = "signam1qrq7x5e7svuddy8dyr3xpcdt6a07u6sky0n5qnv5z757g33t5zm3jnnh9uhh073g05n8jx8rmdu5r2djhwh6few6u329u9cld4c7ynsw2592h8" [validator_account.eth_hot_key] -pk = "tpknam1qyp8znkp023autwqh2cy6c6vhnz8vsm4p6w9ngpnnamqk6dj5w6ktxqjnd0qj" -authorization = "signam1q9fd4nkz8df5ajh6jrsn6mrt0apvn4266walr8pnczl0xtn847u6usdemslvusseerhrd6hftse8zfch5tlpmqp4y9xz3563mu0d26hnqq942mt2" +pk = "tpknam1qypnh98mexms8edj8rcwu0cayx0459p39dwzsffxrr394mf4cse707qcctyrx" +authorization = "signam1qyrvwveg76nrz2ppnsl0em82gcl4p90cqw8eadyzcvk59e2dx0jqja8ln9l9j79sxzhhh5gdggduz78vtthzj5nzs0xvpwhjuh3hymapqq07qxzm" [validator_account.eth_cold_key] -pk = "tpknam1qyp4aw7a07f4ltuq3f0c4sgyq3kzgh6z40w8jt40wl7uhfj7e3m3u9qr792xg" -authorization = "signam1qyqcc7wstsnuadu75jnwg8hxz34nglxj9h9yqyx2c4qqdpxw50ff60hu0swfj7xdkz34tgl9e50jlmzphkgtpw3gg0hsgp35lhsl6rmeqqq28kph" +pk = "tpknam1qypz8zr0w8lsz3s98vh4p974xuxeedpecj9s2l3326r3kdz4tc0snrcpnc8yv" +authorization = "signam1q992kq4ymfl6v8arc2s2tn0w7c4f48wx6fxry9qxv2qk8zvjan8q7j9rxg73cx0f5l56fy53x2jgwv7vy8jtxzucckdzgnxc5tpzajs4qq8r02r2" [[transfer]] token = "nam" @@ -48,7 +48,8 @@ signature = "signam1qz8ch7n6jp7g7hvnzkhmprhqc5umd0gatarlttm7gpcdx6g8hmgqffdq67fn source = "validator-0" validator = "validator-0" amount = "100000" -signature = "signam1qrd7wg2sdla73z7626r2ep8895d9ed4ljq37nz6kmy2rcm36yqjugw6vle7kl70l0d585t382s9vd28k2duwz0lu7ux0vua6aaarjssgdf46n2" +signature = "signam1qqukrz3js2pgzrne90u5f7y4mstrzvmzcq7eelml9m3lzrh9zwpf0vhgjq0rsw4ufj4ffdx8ew74uxkk4df649pg6qq5fgwyqa9mpfcyvskk67" + # 2. From 7de64272819719887bdc1e2087e25f7d25884886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 21 Nov 2023 12:05:28 +0100 Subject: [PATCH 025/175] changelog: add #2202 --- .../unreleased/improvements/2202-combine-user-validator-vp.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/2202-combine-user-validator-vp.md diff --git a/.changelog/unreleased/improvements/2202-combine-user-validator-vp.md b/.changelog/unreleased/improvements/2202-combine-user-validator-vp.md new file mode 100644 index 0000000000..030af2ca17 --- /dev/null +++ b/.changelog/unreleased/improvements/2202-combine-user-validator-vp.md @@ -0,0 +1,2 @@ +- Combined the user and the validator VP into one. + ([\#2202](https://github.com/anoma/namada/pull/2202)) \ No newline at end of file From 50bb9379ab44b8e881f7eca0f2142109ec2405b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 21 Nov 2023 12:10:42 +0100 Subject: [PATCH 026/175] deliberately empty From affe06519b7587358332423966179a2f055ba185 Mon Sep 17 00:00:00 2001 From: yito88 Date: Tue, 21 Nov 2023 10:22:35 +0100 Subject: [PATCH 027/175] prune merkle trees of bridge pool --- apps/src/lib/node/ledger/storage/mod.rs | 9 +++ core/src/ledger/storage/mod.rs | 97 ++++++++++++++++++++----- 2 files changed, 86 insertions(+), 20 deletions(-) diff --git a/apps/src/lib/node/ledger/storage/mod.rs b/apps/src/lib/node/ledger/storage/mod.rs index 52c10d4a17..e6208fc800 100644 --- a/apps/src/lib/node/ledger/storage/mod.rs +++ b/apps/src/lib/node/ledger/storage/mod.rs @@ -55,6 +55,7 @@ mod tests { use itertools::Itertools; use namada::core::ledger::masp_conversions::update_allowed_conversions; + use namada::ledger::eth_bridge::storage::bridge_pool; use namada::ledger::gas::STORAGE_ACCESS_GAS_PER_BYTE; use namada::ledger::ibc::storage::ibc_key; use namada::ledger::parameters::{EpochDuration, Parameters}; @@ -62,6 +63,7 @@ mod tests { use namada::ledger::storage::{types, StoreType, WlStorage}; use namada::ledger::storage_api::{self, StorageWrite}; use namada::types::chain::ChainId; + use namada::types::ethereum_events::Uint; use namada::types::hash::Hash; use namada::types::storage::{BlockHash, BlockHeight, Key}; use namada::types::time::DurationSecs; @@ -487,6 +489,9 @@ mod tests { let value_bytes = types::encode(&storage.block.height); storage.write(&key, value_bytes)?; } + let key = bridge_pool::get_nonce_key(); + let bytes = types::encode(&Uint::default()); + storage.write(&key, bytes)?; // Update and commit let hash = BlockHash::default(); @@ -581,6 +586,10 @@ mod tests { None, Some(5), ); + let key = bridge_pool::get_nonce_key(); + let bytes = types::encode(&Uint::default()); + storage.write(&key, bytes).unwrap(); + storage .begin_block(BlockHash::default(), BlockHeight(1)) .expect("begin_block failed"); diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index b338b3518b..f888482fd6 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -25,7 +25,9 @@ pub use wl_storage::{ }; use super::gas::MEMORY_ACCESS_GAS_PER_BYTE; -use crate::ledger::eth_bridge::storage::bridge_pool::is_pending_transfer_key; +use crate::ledger::eth_bridge::storage::bridge_pool::{ + self, is_pending_transfer_key, +}; use crate::ledger::gas::{ STORAGE_ACCESS_GAS_PER_BYTE, STORAGE_WRITE_GAS_PER_BYTE, }; @@ -39,6 +41,7 @@ use crate::ledger::storage::merkle_tree::{ use crate::tendermint::merkle::proof::ProofOps; use crate::types::address::{Address, EstablishedAddressGen, InternalAddress}; use crate::types::chain::{ChainId, CHAIN_ID_LENGTH}; +use crate::types::ethereum_events::Uint; use crate::types::ethereum_structs; use crate::types::hash::{Error as HashError, Hash}; use crate::types::internal::{ExpiredTxsQueue, TxQueue}; @@ -1144,25 +1147,7 @@ where if self.block.epoch.0 == 0 { return Ok(()); } - if let Some(limit) = self.storage_read_past_height_limit { - if self.get_last_block_height().0 <= limit { - return Ok(()); - } - - let min_height = (self.get_last_block_height().0 - limit).into(); - if let Some(epoch) = self.block.pred_epochs.get_epoch(min_height) { - if epoch.0 == 0 { - return Ok(()); - } - // Remove stores at the previous epoch because the Merkle tree - // stores at the starting height of the epoch would be used to - // restore stores at a height (> min_height) in the epoch - for st in StoreType::iter_provable() { - self.db.prune_merkle_tree_store(batch, st, epoch.prev())?; - } - } - } - // remove non-provable stores at the previous epoch + // Prune non-provable stores at the previous epoch for st in StoreType::iter_non_provable() { self.db.prune_merkle_tree_store( batch, @@ -1170,6 +1155,32 @@ where self.block.epoch.prev(), )?; } + // Prune provable stores + let oldest_epoch = self.get_oldest_epoch(); + if oldest_epoch.0 > 0 { + // Remove stores at the previous epoch because the Merkle tree + // stores at the starting height of the epoch would be used to + // restore stores at a height (> oldest_height) in the epoch + for st in StoreType::iter_provable() { + self.db.prune_merkle_tree_store( + batch, + st, + oldest_epoch.prev(), + )?; + } + + // Prune the BridgePool subtree stores with invalid nonce + let mut epoch = self.get_oldest_epoch_with_valid_nonce()?; + while oldest_epoch < epoch { + epoch = epoch.prev(); + self.db.prune_merkle_tree_store( + batch, + &StoreType::BridgePool, + epoch, + )?; + } + } + Ok(()) } @@ -1182,6 +1193,52 @@ where .unwrap_or_default() } + /// Get the oldest epoch where we can read a value + pub fn get_oldest_epoch(&self) -> Epoch { + let oldest_height = match self.storage_read_past_height_limit { + Some(limit) if limit < self.get_last_block_height().0 => { + (self.get_last_block_height().0 - limit).into() + } + _ => BlockHeight(1), + }; + self.block + .pred_epochs + .get_epoch(oldest_height) + .unwrap_or_default() + } + + /// Get oldest epoch which has the valid signed nonce of the bridge pool + pub fn get_oldest_epoch_with_valid_nonce(&self) -> Result { + let nonce_key = bridge_pool::get_nonce_key(); + let (bytes, _) = self.read(&nonce_key)?; + let bytes = bytes.expect("Bridge pool nonce should exits"); + let current_nonce = + Uint::try_from_slice(&bytes).map_err(Error::BorshCodingError)?; + let (mut epoch, _) = self.get_last_epoch(); + // We don't need to check the older epochs because their Merkle tree + // snapshots have been already removed + let oldest_epoch = self.get_oldest_epoch(); + // Look up the last valid epoch which has the previous nonce of the + // current one. It has the previous nonce, but it was + // incremented during the epoch. + while 0 < epoch.0 && oldest_epoch <= epoch { + epoch = epoch.prev(); + let height = + match self.block.pred_epochs.get_start_height_of_epoch(epoch) { + Some(h) => h, + None => continue, + }; + let (bytes, _) = self.read_with_height(&nonce_key, height)?; + let bytes = bytes.expect("Bridge pool nonce should exits"); + let nonce = Uint::try_from_slice(&bytes) + .map_err(Error::BorshCodingError)?; + if nonce < current_nonce { + break; + } + } + Ok(epoch) + } + /// Check it the given transaction's hash is already present in storage pub fn has_replay_protection_entry(&self, hash: &Hash) -> Result { self.db.has_replay_protection_entry(hash) From 5388f93b9bf1bdbabd1cb71ad0c704645a46f8d1 Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Tue, 21 Nov 2023 19:53:17 +0100 Subject: [PATCH 028/175] Charges wrapper gas for network usage --- core/src/ledger/gas.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/ledger/gas.rs b/core/src/ledger/gas.rs index 092c0ba3b2..fc09636766 100644 --- a/core/src/ledger/gas.rs +++ b/core/src/ledger/gas.rs @@ -35,6 +35,8 @@ const STORAGE_OCCUPATION_GAS_PER_BYTE: u64 = // codebase. For these two reasons we just set an arbitrary value (based on // actual SSDs latency) per byte here const PHYSICAL_STORAGE_LATENCY_PER_BYTE: u64 = 75; +// This is based on the global avarage bandwidth +const NETWORK_TRANSMISSION_GAS_PER_BYTE: u64 = 13; /// The cost of accessing data from memory (both read and write mode), per byte pub const MEMORY_ACCESS_GAS_PER_BYTE: u64 = 2; @@ -273,13 +275,18 @@ impl TxGasMeter { /// Add the gas required by a wrapper transaction which is comprised of: /// - cost of validating the wrapper tx /// - space that the transaction requires in the block + /// - cost of downloading (as part of the block) the transaction bytes over + /// the network pub fn add_wrapper_gas(&mut self, tx_bytes: &[u8]) -> Result<()> { self.consume(WRAPPER_TX_VALIDATION_GAS)?; let bytes_len = tx_bytes.len() as u64; self.consume( bytes_len - .checked_mul(STORAGE_OCCUPATION_GAS_PER_BYTE) + .checked_mul( + STORAGE_OCCUPATION_GAS_PER_BYTE + + NETWORK_TRANSMISSION_GAS_PER_BYTE, + ) .ok_or(Error::GasOverflow)?, ) } From cb85b5cb6e4f7c32ccec693e80cd48c127b8db3e Mon Sep 17 00:00:00 2001 From: yito88 Date: Tue, 21 Nov 2023 21:29:14 +0100 Subject: [PATCH 029/175] add test and changelog --- .../improvements/2110-prune-bp-merkle-tree.md | 2 + apps/src/lib/node/ledger/storage/mod.rs | 44 +++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 .changelog/unreleased/improvements/2110-prune-bp-merkle-tree.md diff --git a/.changelog/unreleased/improvements/2110-prune-bp-merkle-tree.md b/.changelog/unreleased/improvements/2110-prune-bp-merkle-tree.md new file mode 100644 index 0000000000..4abce31ec0 --- /dev/null +++ b/.changelog/unreleased/improvements/2110-prune-bp-merkle-tree.md @@ -0,0 +1,2 @@ +- Prune merkle tree of bridge pool + ([\#2110](https://github.com/anoma/namada/issues/2110)) \ No newline at end of file diff --git a/apps/src/lib/node/ledger/storage/mod.rs b/apps/src/lib/node/ledger/storage/mod.rs index e6208fc800..2fd1fc5aa8 100644 --- a/apps/src/lib/node/ledger/storage/mod.rs +++ b/apps/src/lib/node/ledger/storage/mod.rs @@ -586,9 +586,10 @@ mod tests { None, Some(5), ); - let key = bridge_pool::get_nonce_key(); - let bytes = types::encode(&Uint::default()); - storage.write(&key, bytes).unwrap(); + let bp_nonce_key = bridge_pool::get_nonce_key(); + let nonce = Uint::default(); + let bytes = types::encode(&nonce); + storage.write(&bp_nonce_key, bytes).unwrap(); storage .begin_block(BlockHash::default(), BlockHeight(1)) @@ -615,6 +616,13 @@ mod tests { .write(&key, types::encode(&value)) .expect("write failed"); + let nonce = nonce + 1; + let bytes = types::encode(&nonce); + storage.write(&bp_nonce_key, bytes).unwrap(); + + let bytes = types::encode(&Uint::default()); + storage.write(&bp_nonce_key, bytes).unwrap(); + storage.block.epoch = storage.block.epoch.next(); storage.block.pred_epochs.new_epoch(BlockHeight(6)); let batch = PersistentStorage::batch(); @@ -626,6 +634,11 @@ mod tests { storage .begin_block(BlockHash::default(), BlockHeight(11)) .expect("begin_block failed"); + + let nonce = nonce + 1; + let bytes = types::encode(&nonce); + storage.write(&bp_nonce_key, bytes).unwrap(); + storage.block.epoch = storage.block.epoch.next(); storage.block.pred_epochs.new_epoch(BlockHeight(11)); let batch = PersistentStorage::batch(); @@ -639,7 +652,30 @@ mod tests { "The tree at Height 5 shouldn't be able to be restored" ); let result = storage.get_merkle_tree(6.into(), Some(StoreType::Ibc)); - assert!(result.is_ok(), "The tree should be restored"); + assert!(result.is_ok(), "The ibc tree should be restored"); + let result = + storage.get_merkle_tree(6.into(), Some(StoreType::BridgePool)); + assert!(result.is_ok(), "The bridge pool tree should be restored"); + + storage + .begin_block(BlockHash::default(), BlockHeight(12)) + .expect("begin_block failed"); + + let nonce = nonce + 1; + let bytes = types::encode(&nonce); + storage.write(&bp_nonce_key, bytes).unwrap(); + storage.block.epoch = storage.block.epoch.next(); + storage.block.pred_epochs.new_epoch(BlockHeight(12)); + let batch = PersistentStorage::batch(); + storage.commit_block(batch).expect("commit failed"); + + // ibc tree should be able to be restored + let result = storage.get_merkle_tree(6.into(), Some(StoreType::Ibc)); + assert!(result.is_ok(), "The ibc tree should be restored"); + // bridge pool tree should be pruned because of the nonce + let result = + storage.get_merkle_tree(6.into(), Some(StoreType::BridgePool)); + assert!(result.is_err(), "The bridge pool tree should be pruned"); } /// Test the prefix iterator with RocksDB. From 13ce9672280d1585213a9360b53a5bd80dda02ca Mon Sep 17 00:00:00 2001 From: Marco Granelli Date: Wed, 22 Nov 2023 10:44:55 +0100 Subject: [PATCH 030/175] Changelog #2205 --- .changelog/unreleased/improvements/2205-network-gas.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/2205-network-gas.md diff --git a/.changelog/unreleased/improvements/2205-network-gas.md b/.changelog/unreleased/improvements/2205-network-gas.md new file mode 100644 index 0000000000..77891ac403 --- /dev/null +++ b/.changelog/unreleased/improvements/2205-network-gas.md @@ -0,0 +1,2 @@ +- Charge gas for network usage. + ([\#2205](https://github.com/anoma/namada/pull/2205)) \ No newline at end of file From a76f0db8a57162f5719db3e176eafd8ccd35d084 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Wed, 22 Nov 2023 16:05:12 +0200 Subject: [PATCH 031/175] Make the CLI take public keys instead of secret keys so that hardware wallet signing is not precluded. --- apps/src/lib/cli.rs | 10 ++++------ apps/src/lib/client/tx.rs | 16 ++++++++++++++-- sdk/src/args.rs | 8 ++++---- sdk/src/signing.rs | 23 +++-------------------- 4 files changed, 25 insertions(+), 32 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 3bb7f5c7ad..23a3ec8d4b 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2935,7 +2935,7 @@ pub mod args { arg_opt("gas-spending-key"); pub const FEE_AMOUNT_OPT: ArgOpt = arg_opt("gas-price"); - pub const FEE_PAYER_OPT: ArgOpt = arg_opt("gas-payer"); + pub const FEE_PAYER_OPT: ArgOpt = arg_opt("gas-payer"); pub const FORCE: ArgFlag = flag("force"); pub const GAS_LIMIT: ArgDefault = arg_default("gas-limit", DefaultFn(|| GasLimit::from(25_000))); @@ -3020,9 +3020,7 @@ pub mod args { arg("self-bond-amount"); pub const SENDER: Arg = arg("sender"); pub const SIGNER: ArgOpt = arg_opt("signer"); - pub const SIGNING_KEY_OPT: ArgOpt = SIGNING_KEY.opt(); - pub const SIGNING_KEY: Arg = arg("signing-key"); - pub const SIGNING_KEYS: ArgMulti = arg_multi("signing-keys"); + pub const SIGNING_KEYS: ArgMulti = arg_multi("signing-keys"); pub const SIGNATURES: ArgMulti = arg_multi("signatures"); pub const SOURCE: Arg = arg("source"); pub const SOURCE_OPT: ArgOpt = SOURCE.opt(); @@ -5665,7 +5663,7 @@ pub mod args { signing_keys: self .signing_keys .iter() - .map(|key| ctx.get_cached(key)) + .map(|key| ctx.get(key)) .collect(), signatures: self .signatures @@ -5684,7 +5682,7 @@ pub mod args { .or_else(|| Some(ctx.config.ledger.chain_id.clone())), wrapper_fee_payer: self .wrapper_fee_payer - .map(|x| ctx.get_cached(&x)), + .map(|x| ctx.get(&x)), use_device: self.use_device, } } diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 0317ec43f3..6c693036e6 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -965,8 +965,14 @@ where ) .await?; + let mut wallet = namada.wallet_mut().await; let signed_offline_proposal = proposal.sign( - args.tx.signing_keys, + args.tx + .signing_keys + .iter() + .map(|pk| wallet.find_key_by_pk(pk, None)) + .collect::>() + .expect("secret keys corresponding to public keys not found"), &signing_data.account_public_keys_map.unwrap(), ); let output_file_path = signed_offline_proposal @@ -1112,8 +1118,14 @@ where delegations, ); + let mut wallet = namada.wallet_mut().await; let offline_signed_vote = offline_vote.sign( - args.tx.signing_keys, + args.tx + .signing_keys + .iter() + .map(|pk| wallet.find_key_by_pk(pk, None)) + .collect::>() + .expect("secret keys corresponding to public keys not found"), &signing_data.account_public_keys_map.unwrap(), ); let output_file_path = offline_signed_vote diff --git a/sdk/src/args.rs b/sdk/src/args.rs index 3359c08ec4..f49824c658 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -1817,7 +1817,7 @@ pub struct Tx { /// The amount being payed (for gas unit) to include the transaction pub fee_amount: Option, /// The fee payer signing key - pub wrapper_fee_payer: Option, + pub wrapper_fee_payer: Option, /// The token in which the fee is being paid pub fee_token: C::Address, /// The optional spending key for fee unshielding @@ -1832,7 +1832,7 @@ pub struct Tx { /// The chain id for which the transaction is intended pub chain_id: Option, /// Sign the tx with the key for the given alias from your wallet - pub signing_keys: Vec, + pub signing_keys: Vec, /// List of signatures to attach to the transaction pub signatures: Vec, /// Path to the TX WASM code file to reveal PK @@ -1918,7 +1918,7 @@ pub trait TxBuilder: Sized { }) } /// The fee payer signing key - fn wrapper_fee_payer(self, wrapper_fee_payer: C::Keypair) -> Self { + fn wrapper_fee_payer(self, wrapper_fee_payer: C::PublicKey) -> Self { self.tx(|x| Tx { wrapper_fee_payer: Some(wrapper_fee_payer), ..x @@ -1962,7 +1962,7 @@ pub trait TxBuilder: Sized { }) } /// Sign the tx with the key for the given alias from your wallet - fn signing_keys(self, signing_keys: Vec) -> Self { + fn signing_keys(self, signing_keys: Vec) -> Self { self.tx(|x| Tx { signing_keys, ..x }) } /// List of signatures to attach to the transaction diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index 6784be92ba..8b6649fc62 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -135,21 +135,6 @@ pub fn find_key_by_pk( // We already know the secret key corresponding to the MASP sentinal key Ok(masp_tx_key()) } else { - // Try to get the signer from the signing-keys argument - for signing_key in &args.signing_keys { - if signing_key.ref_to() == *public_key { - return Ok(signing_key.clone()); - } - } - // Try to get the signer from the wrapper-fee-payer argument - match &args.wrapper_fee_payer { - Some(wrapper_fee_payer) - if &wrapper_fee_payer.ref_to() == public_key => - { - return Ok(wrapper_fee_payer.clone()); - } - _ => {} - } // Otherwise we need to search the wallet for the secret key wallet .find_key_by_pk(public_key, args.password.clone()) @@ -173,9 +158,7 @@ pub async fn tx_signers<'a>( default: Option
, ) -> Result, Error> { let signer = if !&args.signing_keys.is_empty() { - let public_keys = - args.signing_keys.iter().map(|key| key.ref_to()).collect(); - return Ok(public_keys); + return Ok(args.signing_keys.clone()); } else if let Some(verification_key) = &args.verification_key { return Ok(vec![verification_key.clone()]); } else { @@ -368,7 +351,7 @@ pub async fn aux_signing_data<'a>( .to_public() } else { match &args.wrapper_fee_payer { - Some(keypair) => keypair.to_public(), + Some(keypair) => keypair.clone(), None => public_keys.get(0).ok_or(TxError::InvalidFeePayer)?.clone(), } }; @@ -413,7 +396,7 @@ pub async fn init_validator_signing_data<'a>( .to_public() } else { match &args.wrapper_fee_payer { - Some(keypair) => keypair.to_public(), + Some(keypair) => keypair.clone(), None => public_keys.get(0).ok_or(TxError::InvalidFeePayer)?.clone(), } }; From 966afb5cf44e5a13ef1e2f121d66dcae0009feae Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Wed, 22 Nov 2023 16:58:19 +0200 Subject: [PATCH 032/175] The flags for TxInitValidator and ConsensusKeyChange are now public keys. --- apps/src/lib/cli.rs | 27 ++++++++++---------------- apps/src/lib/client/tx.rs | 40 ++++++++++++++++++++------------------- sdk/src/args.rs | 8 ++++---- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 23a3ec8d4b..f4475b72ce 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -3020,7 +3020,8 @@ pub mod args { arg("self-bond-amount"); pub const SENDER: Arg = arg("sender"); pub const SIGNER: ArgOpt = arg_opt("signer"); - pub const SIGNING_KEYS: ArgMulti = arg_multi("signing-keys"); + pub const SIGNING_KEYS: ArgMulti = + arg_multi("signing-keys"); pub const SIGNATURES: ArgMulti = arg_multi("signatures"); pub const SOURCE: Arg = arg("source"); pub const SOURCE_OPT: ArgOpt = SOURCE.opt(); @@ -3049,13 +3050,13 @@ pub mod args { arg_opt("account-key"); pub const VALIDATOR_ACCOUNT_KEYS: ArgMulti = arg_multi("account-keys"); - pub const VALIDATOR_CONSENSUS_KEY: ArgOpt = + pub const VALIDATOR_CONSENSUS_KEY: ArgOpt = arg_opt("consensus-key"); pub const VALIDATOR_CODE_PATH: ArgOpt = arg_opt("validator-code-path"); - pub const VALIDATOR_ETH_COLD_KEY: ArgOpt = + pub const VALIDATOR_ETH_COLD_KEY: ArgOpt = arg_opt("eth-cold-key"); - pub const VALIDATOR_ETH_HOT_KEY: ArgOpt = + pub const VALIDATOR_ETH_HOT_KEY: ArgOpt = arg_opt("eth-hot-key"); pub const VALUE: ArgOpt = arg_opt("value"); pub const VERIFICATION_KEY: ArgOpt = @@ -4030,13 +4031,9 @@ pub mod args { .map(|x| chain_ctx.get(x)) .collect(), threshold: self.threshold, - consensus_key: self - .consensus_key - .map(|x| chain_ctx.get_cached(&x)), - eth_cold_key: self - .eth_cold_key - .map(|x| chain_ctx.get_cached(&x)), - eth_hot_key: self.eth_hot_key.map(|x| chain_ctx.get_cached(&x)), + consensus_key: self.consensus_key.map(|x| chain_ctx.get(&x)), + eth_cold_key: self.eth_cold_key.map(|x| chain_ctx.get(&x)), + eth_hot_key: self.eth_hot_key.map(|x| chain_ctx.get(&x)), protocol_key: self.protocol_key.map(|x| chain_ctx.get(&x)), commission_rate: self.commission_rate, max_commission_rate_change: self.max_commission_rate_change, @@ -5170,9 +5167,7 @@ pub mod args { ConsensusKeyChange:: { tx, validator: chain_ctx.get(&self.validator), - consensus_key: self - .consensus_key - .map(|x| chain_ctx.get_cached(&x)), + consensus_key: self.consensus_key.map(|x| chain_ctx.get(&x)), tx_code_path: self.tx_code_path.to_path_buf(), } } @@ -5680,9 +5675,7 @@ pub mod args { chain_id: self .chain_id .or_else(|| Some(ctx.config.ledger.chain_id.clone())), - wrapper_fee_payer: self - .wrapper_fee_payer - .map(|x| ctx.get(&x)), + wrapper_fee_payer: self.wrapper_fee_payer.map(|x| ctx.get(&x)), use_device: self.use_device, } } diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 6c693036e6..71950de60f 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -380,8 +380,8 @@ pub async fn submit_change_consensus_key<'a>( let mut wallet = namada.wallet_mut().await; let consensus_key = consensus_key .map(|key| match key { - common::SecretKey::Ed25519(_) => key, - common::SecretKey::Secp256k1(_) => { + common::PublicKey::Ed25519(_) => key, + common::PublicKey::Secp256k1(_) => { edisplay_line!( namada.io(), "Consensus key can only be ed25519" @@ -403,6 +403,7 @@ pub async fn submit_change_consensus_key<'a>( ) .expect("Key generation should not fail.") .1 + .ref_to() }); // To avoid wallet deadlocks in following operations drop(wallet); @@ -410,7 +411,7 @@ pub async fn submit_change_consensus_key<'a>( // Check that the new consensus key is unique let consensus_keys = rpc::query_consensus_keys(namada.client()).await; - let new_ck = consensus_key.ref_to(); + let new_ck = consensus_key; if consensus_keys.contains(&new_ck) { edisplay_line!(namada.io(), "Consensus key can only be ed25519"); safe_exit(1) @@ -538,8 +539,8 @@ pub async fn submit_init_validator<'a>( let mut wallet = namada.wallet_mut().await; let consensus_key = consensus_key .map(|key| match key { - common::SecretKey::Ed25519(_) => key, - common::SecretKey::Secp256k1(_) => { + common::PublicKey::Ed25519(_) => key, + common::PublicKey::Secp256k1(_) => { edisplay_line!( namada.io(), "Consensus key can only be ed25519" @@ -562,12 +563,13 @@ pub async fn submit_init_validator<'a>( ) .expect("Key generation should not fail.") .1 + .ref_to() }); let eth_cold_pk = eth_cold_key .map(|key| match key { - common::SecretKey::Secp256k1(_) => key.ref_to(), - common::SecretKey::Ed25519(_) => { + common::PublicKey::Secp256k1(_) => key, + common::PublicKey::Ed25519(_) => { edisplay_line!( namada.io(), "Eth cold key can only be secp256k1" @@ -595,8 +597,8 @@ pub async fn submit_init_validator<'a>( let eth_hot_pk = eth_hot_key .map(|key| match key { - common::SecretKey::Secp256k1(_) => key.ref_to(), - common::SecretKey::Ed25519(_) => { + common::PublicKey::Secp256k1(_) => key, + common::PublicKey::Ed25519(_) => { edisplay_line!( namada.io(), "Eth hot key can only be secp256k1" @@ -709,7 +711,7 @@ pub async fn submit_init_validator<'a>( let data = InitValidator { account_keys, threshold, - consensus_key: consensus_key.ref_to(), + consensus_key: consensus_key.clone(), eth_cold_key: key::secp256k1::PublicKey::try_from_pk(ð_cold_pk) .unwrap(), eth_hot_key: key::secp256k1::PublicKey::try_from_pk(ð_hot_pk) @@ -726,7 +728,7 @@ pub async fn submit_init_validator<'a>( // Put together all the PKs that we have to sign with to verify ownership let mut all_pks = data.account_keys.clone(); - all_pks.push(consensus_key.to_public()); + all_pks.push(consensus_key.clone()); all_pks.push(eth_cold_pk); all_pks.push(eth_hot_pk); all_pks.push(data.protocol_key.clone()); @@ -786,21 +788,21 @@ pub async fn submit_init_validator<'a>( } }; // add validator address and keys to the wallet - namada - .wallet_mut() - .await - .add_validator_data(validator_address, validator_keys); - namada - .wallet_mut() - .await + let mut wallet = namada.wallet_mut().await; + wallet.add_validator_data(validator_address, validator_keys); + wallet .save() .unwrap_or_else(|err| edisplay_line!(namada.io(), "{}", err)); let tendermint_home = config.ledger.cometbft_dir(); tendermint_node::write_validator_key( &tendermint_home, - &consensus_key, + &wallet + .find_key_by_pk(&consensus_key, None) + .expect("unable to find consensus key pair in the wallet"), ); + // To avoid wallet deadlocks in following operations + drop(wallet); tendermint_node::write_validator_state(tendermint_home); // Write Namada config stuff or figure out how to do the above diff --git a/sdk/src/args.rs b/sdk/src/args.rs index f49824c658..44994795e3 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -735,11 +735,11 @@ pub struct TxInitValidator { /// The account multisignature threshold pub threshold: Option, /// Consensus key - pub consensus_key: Option, + pub consensus_key: Option, /// Ethereum cold key - pub eth_cold_key: Option, + pub eth_cold_key: Option, /// Ethereum hot key - pub eth_hot_key: Option, + pub eth_hot_key: Option, /// Protocol key pub protocol_key: Option, /// Commission rate @@ -1362,7 +1362,7 @@ pub struct ConsensusKeyChange { /// Validator address (should be self) pub validator: C::Address, /// New consensus key - pub consensus_key: Option, + pub consensus_key: Option, /// Path to the TX WASM code file pub tx_code_path: PathBuf, } From 12b61d3d35e2a4ae1ba930948010358a192a4d07 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Wed, 22 Nov 2023 17:15:06 +0200 Subject: [PATCH 033/175] Removed the verification key flag since it has been made redundant by the signing keys argument. --- apps/src/lib/cli.rs | 27 ++------------------------- sdk/src/args.rs | 9 --------- sdk/src/lib.rs | 2 -- sdk/src/signing.rs | 2 -- 4 files changed, 2 insertions(+), 38 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index f4475b72ce..645392fe93 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -3059,8 +3059,6 @@ pub mod args { pub const VALIDATOR_ETH_HOT_KEY: ArgOpt = arg_opt("eth-hot-key"); pub const VALUE: ArgOpt = arg_opt("value"); - pub const VERIFICATION_KEY: ArgOpt = - arg_opt("verification-key"); pub const VIEWING_KEY: Arg = arg("key"); pub const WALLET_ALIAS_FORCE: ArgFlag = flag("wallet-alias-force"); pub const WASM_CHECKSUMS_PATH: Arg = arg("wasm-checksums-path"); @@ -5665,9 +5663,6 @@ pub mod args { .iter() .map(|path| std::fs::read(path).unwrap()) .collect(), - verification_key: self - .verification_key - .map(|public_key| ctx.get(&public_key)), disposable_signing_key: self.disposable_signing_key, tx_reveal_code_path: self.tx_reveal_code_path, password: self.password, @@ -5759,10 +5754,7 @@ pub mod args { public key, public key hash or alias from your \ wallet.", ) - .conflicts_with_all([ - SIGNATURES.name, - VERIFICATION_KEY.name, - ]), + .conflicts_with_all([SIGNATURES.name]), ) .arg( SIGNATURES @@ -5772,25 +5764,12 @@ pub mod args { to be attached to a transaction. Requires to provide \ a gas payer.", ) - .conflicts_with_all([ - SIGNING_KEYS.name, - VERIFICATION_KEY.name, - ]) + .conflicts_with_all([SIGNING_KEYS.name]) .requires(FEE_PAYER_OPT.name), ) .arg(OUTPUT_FOLDER_PATH.def().help( "The output folder path where the artifact will be stored.", )) - .arg( - VERIFICATION_KEY - .def() - .help( - "Sign the transaction with the key for the given \ - public key, public key hash or alias from your \ - wallet.", - ) - .conflicts_with_all([SIGNING_KEYS.name, SIGNATURES.name]), - ) .arg(CHAIN_ID_OPT.def().help("The chain ID.")) .arg( FEE_PAYER_OPT @@ -5827,7 +5806,6 @@ pub mod args { let disposable_signing_key = DISPOSABLE_SIGNING_KEY.parse(matches); let signing_keys = SIGNING_KEYS.parse(matches); let signatures = SIGNATURES.parse(matches); - let verification_key = VERIFICATION_KEY.parse(matches); let tx_reveal_code_path = PathBuf::from(TX_REVEAL_PK); let chain_id = CHAIN_ID_OPT.parse(matches); let password = None; @@ -5851,7 +5829,6 @@ pub mod args { disposable_signing_key, signing_keys, signatures, - verification_key, tx_reveal_code_path, password, chain_id, diff --git a/sdk/src/args.rs b/sdk/src/args.rs index 44994795e3..784d1bb900 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -1837,8 +1837,6 @@ pub struct Tx { pub signatures: Vec, /// Path to the TX WASM code file to reveal PK pub tx_reveal_code_path: PathBuf, - /// Sign the tx with the public key for the given alias from your wallet - pub verification_key: Option, /// Password to decrypt key pub password: Option>, /// Use device to sign the transaction @@ -1976,13 +1974,6 @@ pub trait TxBuilder: Sized { ..x }) } - /// Sign the tx with the public key for the given alias from your wallet - fn verification_key(self, verification_key: C::PublicKey) -> Self { - self.tx(|x| Tx { - verification_key: Some(verification_key), - ..x - }) - } /// Password to decrypt key fn password(self, password: Zeroizing) -> Self { self.tx(|x| Tx { diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index f5c0ae37fa..e6613e27de 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -129,7 +129,6 @@ pub trait Namada<'a>: Sized { signing_keys: vec![], signatures: vec![], tx_reveal_code_path: PathBuf::from(TX_REVEAL_PK), - verification_key: None, password: None, use_device: false, } @@ -600,7 +599,6 @@ where signing_keys: vec![], signatures: vec![], tx_reveal_code_path: PathBuf::from(TX_REVEAL_PK), - verification_key: None, password: None, use_device: false, }, diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index 8b6649fc62..ba03e4f75c 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -159,8 +159,6 @@ pub async fn tx_signers<'a>( ) -> Result, Error> { let signer = if !&args.signing_keys.is_empty() { return Ok(args.signing_keys.clone()); - } else if let Some(verification_key) = &args.verification_key { - return Ok(vec![verification_key.clone()]); } else { // Otherwise use the signer determined by the caller default From 8228ec4619c50a031bbb9d9bac40d57d3506a6b1 Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 22 Nov 2023 18:35:50 -0700 Subject: [PATCH 034/175] add a `checked_add` --- proof_of_stake/src/rewards.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/proof_of_stake/src/rewards.rs b/proof_of_stake/src/rewards.rs index a42d40b67c..449c8a9867 100644 --- a/proof_of_stake/src/rewards.rs +++ b/proof_of_stake/src/rewards.rs @@ -94,7 +94,8 @@ impl PosRewardsCalculator { .total_stake .checked_mul(2.into()) .expect("Amount overflow while computing minimum required votes") - + (3u64 - 1u64)) + .checked_add((3u64 - 1u64).into()) + .expect("Amount overflow while computing minimum required votes")) / 3u64 } } From 4a55f693f8f4aff4f32c8754425ff0d4174936c6 Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 22 Nov 2023 18:36:41 -0700 Subject: [PATCH 035/175] init_chain: compute consensus stake for `current_epoch` and not `default` --- apps/src/lib/node/ledger/shell/init_chain.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index aad1fcc362..b7e411ffde 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -159,7 +159,7 @@ where pos::namada_proof_of_stake::compute_and_store_total_consensus_stake( &mut self.wl_storage, - Default::default(), + current_epoch, ) .expect("Could not compute total consensus stake at genesis"); // This has to be done after `apply_genesis_txs_validator_account` From 7915337fcd4490b6fb4a356b0feac571ee7e299a Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 22 Nov 2023 18:37:09 -0700 Subject: [PATCH 036/175] fix typo --- apps/src/lib/cli.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 3bb7f5c7ad..6c58aafd88 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -3041,7 +3041,7 @@ pub mod args { pub const TRANSFER_SOURCE: Arg = arg("source"); pub const TRANSFER_TARGET: Arg = arg("target"); pub const TX_HASH: Arg = arg("tx-hash"); - pub const THRESOLD: ArgOpt = arg_opt("threshold"); + pub const THRESHOLD: ArgOpt = arg_opt("threshold"); pub const UNSAFE_DONT_ENCRYPT: ArgFlag = flag("unsafe-dont-encrypt"); pub const UNSAFE_SHOW_SECRET: ArgFlag = flag("unsafe-show-secret"); pub const USE_DEVICE: ArgFlag = flag("use-device"); @@ -3990,7 +3990,7 @@ pub mod args { .unwrap_or_else(|| PathBuf::from(VP_USER_WASM)); let tx_code_path = PathBuf::from(TX_INIT_ACCOUNT_WASM); let public_keys = PUBLIC_KEYS.parse(matches); - let threshold = THRESOLD.parse(matches); + let threshold = THRESHOLD.parse(matches); Self { tx, vp_code_path, @@ -4011,7 +4011,7 @@ pub mod args { "A list public keys to be associated with the new account \ in hexadecimal encoding.", )) - .arg(THRESOLD.def().help( + .arg(THRESHOLD.def().help( "The minimum number of signature to be provided for \ authorization. Must be less then the maximum number of \ public keys provided.", @@ -4076,7 +4076,7 @@ pub mod args { .unwrap_or_else(|| PathBuf::from(VP_USER_WASM)); let unsafe_dont_encrypt = UNSAFE_DONT_ENCRYPT.parse(matches); let tx_code_path = PathBuf::from(TX_INIT_VALIDATOR_WASM); - let threshold = THRESOLD.parse(matches); + let threshold = THRESHOLD.parse(matches); Self { tx, scheme, @@ -4166,7 +4166,7 @@ pub mod args { "UNSAFE: Do not encrypt the generated keypairs. Do not \ use this for keys used in a live network.", )) - .arg(THRESOLD.def().help( + .arg(THRESHOLD.def().help( "The minimum number of signature to be provided for \ authorization. Must be less then the maximum number of \ public keys provided.", @@ -4200,7 +4200,7 @@ pub mod args { let addr = ADDRESS.parse(matches); let tx_code_path = PathBuf::from(TX_UPDATE_ACCOUNT_WASM); let public_keys = PUBLIC_KEYS.parse(matches); - let threshold = THRESOLD.parse(matches); + let threshold = THRESHOLD.parse(matches); Self { tx, vp_code_path, @@ -4226,7 +4226,7 @@ pub mod args { "A list public keys to be associated with the new account \ in hexadecimal encoding.", )) - .arg(THRESOLD.def().help( + .arg(THRESHOLD.def().help( "The minimum number of signature to be provided for \ authorization. Must be less then the maximum number of \ public keys provided.", From 21870d4c72ae4d2e6f7996256f5d520bb10912b8 Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 22 Nov 2023 18:37:29 -0700 Subject: [PATCH 037/175] clean comments --- proof_of_stake/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 5aa6fb6f07..e87b4caec4 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -316,7 +316,7 @@ where } /// Copies the validator sets into all epochs up through the pipeline epoch at -/// genesis. Also computes the total +/// genesis. pub fn copy_genesis_validator_sets( storage: &mut S, params: &OwnedPosParams, @@ -335,7 +335,6 @@ where current_epoch, epoch, )?; - // compute_and_store_total_consensus_stake(storage, epoch)?; } Ok(()) } From cec5c44e42b10f3db48f93b2cdffa40d322400ac Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 22 Nov 2023 18:37:55 -0700 Subject: [PATCH 038/175] edits to localnet README --- genesis/localnet/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genesis/localnet/README.md b/genesis/localnet/README.md index e14cfdfb61..f8c874956c 100644 --- a/genesis/localnet/README.md +++ b/genesis/localnet/README.md @@ -1,6 +1,6 @@ # Localnet genesis templates -This directory contains genesis templates for a local network with a single validator. The `src` directory contains generated pre-genesis wallet pre-loaded with unencrypted keys and a single validator `"validator-0" wallet that are being used in the templates. +This directory contains genesis templates for a local network with a single validator. The `src` directory contains generated pre-genesis wallet pre-loaded with unencrypted keys and a single validator `validator-0` wallet that are being used in the templates. If you're modifying any of the files here, you can run this to ensure that the changes are valid: @@ -10,7 +10,7 @@ cargo watch -x "test test_validate_localnet_genesis_templates" ## balances.toml -The pre-genesis balances wallet is located at [pre-genesis/wallet.toml](pre-genesis/wallet.toml) was used to setup the [balances.toml](balances.toml) and can be re-generated from the repo's root dir with: +The pre-genesis balances wallet is located at [pre-genesis/wallet.toml](pre-genesis/wallet.toml) and is used to setup the [balances.toml](balances.toml) and can be re-generated from the repo's root dir with: ```shell cargo run --bin namadaw -- --base-dir "genesis/localnet/src" key gen \ From 20943a796034913e62430492072162f89a67ec3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 21 Nov 2023 18:20:21 +0100 Subject: [PATCH 039/175] replace tx_init_validator with tx_become_validator --- apps/src/lib/bench_utils.rs | 8 +- apps/src/lib/cli.rs | 188 ++++++++++++++++++-- apps/src/lib/cli/client.rs | 24 +++ apps/src/lib/client/tx.rs | 177 ++++++++++-------- benches/txs.rs | 24 +-- core/src/types/transaction/pos.rs | 15 +- encoding_spec/src/main.rs | 2 +- sdk/src/args.rs | 39 +++- sdk/src/lib.rs | 42 ++++- sdk/src/signing.rs | 47 +---- sdk/src/tx.rs | 4 +- tx_prelude/src/proof_of_stake.rs | 34 ++-- wasm/wasm_source/Cargo.toml | 2 +- wasm/wasm_source/Makefile | 2 +- wasm/wasm_source/src/lib.rs | 4 +- wasm/wasm_source/src/tx_become_validator.rs | 44 +++++ wasm/wasm_source/src/tx_init_validator.rs | 64 ------- 17 files changed, 471 insertions(+), 249 deletions(-) create mode 100644 wasm/wasm_source/src/tx_become_validator.rs delete mode 100644 wasm/wasm_source/src/tx_init_validator.rs diff --git a/apps/src/lib/bench_utils.rs b/apps/src/lib/bench_utils.rs index a718cacbed..e0df703dd3 100644 --- a/apps/src/lib/bench_utils.rs +++ b/apps/src/lib/bench_utils.rs @@ -80,15 +80,15 @@ use namada_sdk::masp::{ self, ShieldedContext, ShieldedTransfer, ShieldedUtils, }; pub use namada_sdk::tx::{ - TX_BOND_WASM, TX_BRIDGE_POOL_WASM, + TX_BECOME_VALIDATOR_WASM, TX_BOND_WASM, TX_BRIDGE_POOL_WASM, TX_CHANGE_COMMISSION_WASM as TX_CHANGE_VALIDATOR_COMMISSION_WASM, TX_CHANGE_CONSENSUS_KEY_WASM, TX_CHANGE_METADATA_WASM as TX_CHANGE_VALIDATOR_METADATA_WASM, TX_CLAIM_REWARDS_WASM, TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, TX_INIT_PROPOSAL as TX_INIT_PROPOSAL_WASM, - TX_INIT_VALIDATOR_WASM, TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, - TX_RESIGN_STEWARD, TX_REVEAL_PK as TX_REVEAL_PK_WASM, TX_TRANSFER_WASM, - TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, + TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, TX_RESIGN_STEWARD, + TX_REVEAL_PK as TX_REVEAL_PK_WASM, TX_TRANSFER_WASM, TX_UNBOND_WASM, + TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL as TX_VOTE_PROPOSAL_WASM, TX_WITHDRAW_WASM, VP_USER_WASM, }; diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 3bb7f5c7ad..f6ac24a6fd 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -223,6 +223,7 @@ pub mod cmds { .subcommand(TxInitProposal::def().display_order(1)) .subcommand(TxVoteProposal::def().display_order(1)) // PoS transactions + .subcommand(TxBecomeValidator::def().display_order(2)) .subcommand(TxInitValidator::def().display_order(2)) .subcommand(TxUnjailValidator::def().display_order(2)) .subcommand(TxDeactivateValidator::def().display_order(2)) @@ -276,6 +277,8 @@ pub mod cmds { let tx_update_account = Self::parse_with_ctx(matches, TxUpdateAccount); let tx_init_account = Self::parse_with_ctx(matches, TxInitAccount); + let tx_become_validator = + Self::parse_with_ctx(matches, TxBecomeValidator); let tx_init_validator = Self::parse_with_ctx(matches, TxInitValidator); let tx_unjail_validator = @@ -346,6 +349,7 @@ pub mod cmds { .or(tx_reveal_pk) .or(tx_init_proposal) .or(tx_vote_proposal) + .or(tx_become_validator) .or(tx_init_validator) .or(tx_commission_rate_change) .or(tx_change_consensus_key) @@ -426,6 +430,7 @@ pub mod cmds { QueryResult(QueryResult), TxUpdateAccount(TxUpdateAccount), TxInitAccount(TxInitAccount), + TxBecomeValidator(TxBecomeValidator), TxInitValidator(TxInitValidator), TxCommissionRateChange(TxCommissionRateChange), TxChangeConsensusKey(TxChangeConsensusKey), @@ -1395,6 +1400,25 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct TxBecomeValidator(pub args::TxBecomeValidator); + + impl SubCmd for TxBecomeValidator { + const CMD: &'static str = "become-validator"; + + fn parse(matches: &ArgMatches) -> Option { + matches.subcommand_matches(Self::CMD).map(|matches| { + TxBecomeValidator(args::TxBecomeValidator::parse(matches)) + }) + } + + fn def() -> App { + App::new(Self::CMD) + .about("Send a signed transaction to become a validator.") + .add_args::>() + } + } + #[derive(Clone, Debug)] pub struct TxInitValidator(pub args::TxInitValidator); @@ -1410,8 +1434,8 @@ pub mod cmds { fn def() -> App { App::new(Self::CMD) .about( - "Send a signed transaction to create a new validator \ - account.", + "Send a signed transaction to create a established \ + account and then become a validator.", ) .add_args::>() } @@ -2833,12 +2857,12 @@ pub mod args { use namada::types::transaction::GasLimit; pub use namada_sdk::args::*; pub use namada_sdk::tx::{ - TX_BOND_WASM, TX_BRIDGE_POOL_WASM, TX_CHANGE_COMMISSION_WASM, - TX_CHANGE_CONSENSUS_KEY_WASM, TX_CHANGE_METADATA_WASM, - TX_CLAIM_REWARDS_WASM, TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, - TX_INIT_ACCOUNT_WASM, TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, - TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, TX_RESIGN_STEWARD, - TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, + TX_BECOME_VALIDATOR_WASM, TX_BOND_WASM, TX_BRIDGE_POOL_WASM, + TX_CHANGE_COMMISSION_WASM, TX_CHANGE_CONSENSUS_KEY_WASM, + TX_CHANGE_METADATA_WASM, TX_CLAIM_REWARDS_WASM, + TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, + TX_INIT_PROPOSAL, TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, + TX_RESIGN_STEWARD, TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, VP_USER_WASM, @@ -4019,6 +4043,140 @@ pub mod args { } } + impl CliToSdk> for TxBecomeValidator { + fn to_sdk(self, ctx: &mut Context) -> TxBecomeValidator { + let tx = self.tx.to_sdk(ctx); + let chain_ctx = ctx.borrow_mut_chain_or_exit(); + TxBecomeValidator:: { + tx, + scheme: self.scheme, + address: chain_ctx.get(&self.address), + consensus_key: self + .consensus_key + .map(|x| chain_ctx.get_cached(&x)), + eth_cold_key: self + .eth_cold_key + .map(|x| chain_ctx.get_cached(&x)), + eth_hot_key: self.eth_hot_key.map(|x| chain_ctx.get_cached(&x)), + protocol_key: self.protocol_key.map(|x| chain_ctx.get(&x)), + commission_rate: self.commission_rate, + max_commission_rate_change: self.max_commission_rate_change, + email: self.email, + description: self.description, + website: self.website, + discord_handle: self.discord_handle, + unsafe_dont_encrypt: self.unsafe_dont_encrypt, + tx_code_path: self.tx_code_path.to_path_buf(), + } + } + } + + impl Args for TxBecomeValidator { + fn parse(matches: &ArgMatches) -> Self { + let tx = Tx::parse(matches); + let address = ADDRESS.parse(matches); + let scheme = SCHEME.parse(matches); + let consensus_key = VALIDATOR_CONSENSUS_KEY.parse(matches); + let eth_cold_key = VALIDATOR_ETH_COLD_KEY.parse(matches); + let eth_hot_key = VALIDATOR_ETH_HOT_KEY.parse(matches); + let protocol_key = PROTOCOL_KEY.parse(matches); + let commission_rate = COMMISSION_RATE.parse(matches); + let max_commission_rate_change = + MAX_COMMISSION_RATE_CHANGE.parse(matches); + let email = EMAIL.parse(matches); + let description = DESCRIPTION_OPT.parse(matches); + let website = WEBSITE_OPT.parse(matches); + let discord_handle = DISCORD_OPT.parse(matches); + let unsafe_dont_encrypt = UNSAFE_DONT_ENCRYPT.parse(matches); + let tx_code_path = PathBuf::from(TX_BECOME_VALIDATOR_WASM); + Self { + tx, + address, + scheme, + consensus_key, + eth_cold_key, + eth_hot_key, + protocol_key, + commission_rate, + max_commission_rate_change, + email, + description, + website, + discord_handle, + unsafe_dont_encrypt, + tx_code_path, + } + } + + fn def(app: App) -> App { + app.add_args::>() + .arg(ADDRESS.def().help( + "Address of an account that will become a validator.", + )) + .arg(SCHEME.def().help( + "The key scheme/type used for the validator keys. \ + Currently supports ed25519 and secp256k1.", + )) + .arg(VALIDATOR_CONSENSUS_KEY.def().help( + "A consensus key for the validator account. A new one \ + will be generated if none given. Note that this must be \ + ed25519.", + )) + .arg(VALIDATOR_ETH_COLD_KEY.def().help( + "An Eth cold key for the validator account. A new one \ + will be generated if none given. Note that this must be \ + secp256k1.", + )) + .arg(VALIDATOR_ETH_HOT_KEY.def().help( + "An Eth hot key for the validator account. A new one will \ + be generated if none given. Note that this must be \ + secp256k1.", + )) + .arg(PROTOCOL_KEY.def().help( + "A public key for signing protocol transactions. A new \ + one will be generated if none given.", + )) + .arg(COMMISSION_RATE.def().help( + "The commission rate charged by the validator for \ + delegation rewards. Expressed as a decimal between 0 and \ + 1. This is a required parameter.", + )) + .arg(MAX_COMMISSION_RATE_CHANGE.def().help( + "The maximum change per epoch in the commission rate \ + charged by the validator for delegation rewards. \ + Expressed as a decimal between 0 and 1. This is a \ + required parameter.", + )) + .arg(EMAIL_OPT.def().help( + "The desired new validator email. To remove the existing \ + email, pass an empty string to this argument.", + )) + .arg(DESCRIPTION_OPT.def().help( + "The desired new validator description. To remove the \ + existing description, pass an empty string to this \ + argument.", + )) + .arg(WEBSITE_OPT.def().help( + "The desired new validator website. To remove the \ + existing website, pass an empty string to this argument.", + )) + .arg(DISCORD_OPT.def().help( + "The desired new validator discord handle. To remove the \ + existing discord handle, pass an empty string to this \ + argument.", + )) + .arg(VALIDATOR_CODE_PATH.def().help( + "The path to the validity predicate WASM code to be used \ + for the validator account. Uses the default validator VP \ + if none specified.", + )) + .arg(UNSAFE_DONT_ENCRYPT.def().help( + "UNSAFE: Do not encrypt the generated keypairs. Do not \ + use this for keys used in a live network.", + )) + } + } + impl CliToSdk> for TxInitValidator { fn to_sdk(self, ctx: &mut Context) -> TxInitValidator { let tx = self.tx.to_sdk(ctx); @@ -4050,7 +4208,12 @@ pub mod args { .validator_vp_code_path .to_path_buf(), unsafe_dont_encrypt: self.unsafe_dont_encrypt, - tx_code_path: self.tx_code_path.to_path_buf(), + tx_init_account_code_path: self + .tx_init_account_code_path + .to_path_buf(), + tx_become_validator_code_path: self + .tx_become_validator_code_path + .to_path_buf(), } } } @@ -4075,7 +4238,9 @@ pub mod args { .parse(matches) .unwrap_or_else(|| PathBuf::from(VP_USER_WASM)); let unsafe_dont_encrypt = UNSAFE_DONT_ENCRYPT.parse(matches); - let tx_code_path = PathBuf::from(TX_INIT_VALIDATOR_WASM); + let tx_init_account_code_path = PathBuf::from(TX_INIT_ACCOUNT_WASM); + let tx_become_validator_code_path = + PathBuf::from(TX_BECOME_VALIDATOR_WASM); let threshold = THRESOLD.parse(matches); Self { tx, @@ -4094,7 +4259,8 @@ pub mod args { discord_handle, validator_vp_code_path, unsafe_dont_encrypt, - tx_code_path, + tx_init_account_code_path, + tx_become_validator_code_path, } } diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index d4f81483fb..4d56c1e9c1 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -106,6 +106,30 @@ impl CliApi { ) } } + Sub::TxBecomeValidator(TxBecomeValidator(mut args)) => { + let client = client.unwrap_or_else(|| { + C::from_tendermint_address( + &mut args.tx.ledger_address, + ) + }); + client.wait_until_node_is_synced(io).await?; + let args = args.to_sdk(&mut ctx); + let cli::context::ChainContext { + mut wallet, + mut config, + mut shielded, + native_token, + } = ctx.take_chain_or_exit(); + let namada = NamadaImpl::native_new( + &client, + &mut wallet, + &mut shielded, + io, + native_token, + ); + tx::submit_become_validator(&namada, &mut config, args) + .await?; + } Sub::TxInitValidator(TxInitValidator(mut args)) => { let client = client.unwrap_or_else(|| { C::from_tendermint_address( diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 0317ec43f3..c88d231a99 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -19,7 +19,7 @@ use namada::types::address::{Address, ImplicitAddress}; use namada::types::dec::Dec; use namada::types::io::Io; use namada::types::key::{self, *}; -use namada::types::transaction::pos::{ConsensusKeyChange, InitValidator}; +use namada::types::transaction::pos::{BecomeValidator, ConsensusKeyChange}; use namada_sdk::rpc::{TxBroadcastData, TxResponse}; use namada_sdk::wallet::alias::validator_consensus_key; use namada_sdk::{display_line, edisplay_line, error, signing, tx, Namada}; @@ -316,7 +316,7 @@ where pub async fn submit_init_account<'a, N: Namada<'a>>( namada: &N, args: args::TxInitAccount, -) -> Result<(), error::Error> +) -> Result, error::Error> where ::Error: std::fmt::Display, { @@ -332,10 +332,13 @@ where signing::generate_test_vector(namada, &tx).await?; - namada.submit(tx, &args.tx).await?; + let result = namada.submit(tx, &args.tx).await?; + if let ProcessTxResponse::Applied(response) = result { + return Ok(response.initialized_accounts.first().cloned()); + } } - Ok(()) + Ok(None) } pub async fn submit_change_consensus_key<'a>( @@ -482,14 +485,13 @@ pub async fn submit_change_consensus_key<'a>( Ok(()) } -pub async fn submit_init_validator<'a>( +pub async fn submit_become_validator<'a>( namada: &impl Namada<'a>, config: &mut crate::config::Config, - args::TxInitValidator { + args::TxBecomeValidator { tx: tx_args, + address, scheme, - account_keys, - threshold, consensus_key, eth_cold_key, eth_hot_key, @@ -500,10 +502,9 @@ pub async fn submit_init_validator<'a>( website, description, discord_handle, - validator_vp_code_path, unsafe_dont_encrypt, - tx_code_path: _, - }: args::TxInitValidator, + tx_code_path, + }: args::TxBecomeValidator, ) -> Result<(), error::Error> { let tx_args = args::Tx { chain_id: tx_args @@ -521,17 +522,6 @@ pub async fn submit_init_validator<'a>( let validator_key_alias = format!("{}-key", alias); let consensus_key_alias = validator_consensus_key(&alias.clone().into()); let protocol_key_alias = format!("{}-protocol-key", alias); - - let threshold = match threshold { - Some(threshold) => threshold, - None => { - if account_keys.len() == 1 { - 1u8 - } else { - safe_exit(1) - } - } - }; let eth_hot_key_alias = format!("{}-eth-hot-key", alias); let eth_cold_key_alias = format!("{}-eth-cold-key", alias); @@ -655,11 +645,6 @@ pub async fn submit_init_validator<'a>( ) .map_err(|err| error::Error::Other(err.to_string()))?; - let validator_vp_code_hash = - query_wasm_code_hash(namada, validator_vp_code_path.to_str().unwrap()) - .await - .unwrap(); - // Validate the commission rate data if commission_rate > Dec::one() || commission_rate < Dec::zero() { edisplay_line!( @@ -695,20 +680,14 @@ pub async fn submit_init_validator<'a>( } let tx_code_hash = - query_wasm_code_hash(namada, args::TX_INIT_VALIDATOR_WASM) + query_wasm_code_hash(namada, tx_code_path.to_string_lossy()) .await .unwrap(); let chain_id = tx_args.chain_id.clone().unwrap(); let mut tx = Tx::new(chain_id, tx_args.expiration); - let extra_section_hash = tx.add_extra_section_from_hash( - validator_vp_code_hash, - Some(validator_vp_code_path.to_string_lossy().into_owned()), - ); - - let data = InitValidator { - account_keys, - threshold, + let data = BecomeValidator { + address: address.clone(), consensus_key: consensus_key.ref_to(), eth_cold_key: key::secp256k1::PublicKey::try_from_pk(ð_cold_pk) .unwrap(), @@ -721,11 +700,20 @@ pub async fn submit_init_validator<'a>( description, website, discord_handle, - validator_vp_code_hash: extra_section_hash, }; // Put together all the PKs that we have to sign with to verify ownership - let mut all_pks = data.account_keys.clone(); + let account = namada_sdk::rpc::get_account_info(namada.client(), &address) + .await? + .unwrap_or_else(|| { + edisplay_line!( + namada.io(), + "Unable to query account keys for address {address}." + ); + safe_exit(1) + }); + let mut all_pks: Vec<_> = + account.public_keys_map.pk_to_idx.into_keys().collect(); all_pks.push(consensus_key.to_public()); all_pks.push(eth_cold_pk); all_pks.push(eth_hot_pk); @@ -733,7 +721,7 @@ pub async fn submit_init_validator<'a>( tx.add_code_from_hash( tx_code_hash, - Some(args::TX_INIT_VALIDATOR_WASM.to_string()), + Some(args::TX_BECOME_VALIDATOR_WASM.to_string()), ) .add_data(data); @@ -758,38 +746,14 @@ pub async fn submit_init_validator<'a>( signing::generate_test_vector(namada, &tx).await?; - let result = namada.submit(tx, &tx_args).await?.initialized_accounts(); + namada.submit(tx, &tx_args).await?.initialized_accounts(); if !tx_args.dry_run { - let (validator_address_alias, validator_address) = match &result[..] - { - // There should be 1 account for the validator itself - [validator_address] => { - if let Some(alias) = - namada.wallet().await.find_alias(validator_address) - { - (alias.clone(), validator_address.clone()) - } else { - edisplay_line!( - namada.io(), - "Expected one account to be created" - ); - safe_exit(1) - } - } - _ => { - edisplay_line!( - namada.io(), - "Expected one account to be created" - ); - safe_exit(1) - } - }; // add validator address and keys to the wallet namada .wallet_mut() .await - .add_validator_data(validator_address, validator_keys); + .add_validator_data(address.clone(), validator_keys); namada .wallet_mut() .await @@ -819,12 +783,7 @@ pub async fn submit_init_validator<'a>( display_line!(namada.io(), ""); display_line!( namada.io(), - "The validator's addresses and keys were stored in the wallet:" - ); - display_line!( - namada.io(), - " Validator address \"{}\"", - validator_address_alias + "The keys for validator \"{alias}\" were stored in the wallet:" ); display_line!( namada.io(), @@ -857,6 +816,82 @@ pub async fn submit_init_validator<'a>( Ok(()) } +pub async fn submit_init_validator<'a>( + namada: &impl Namada<'a>, + config: &mut crate::config::Config, + args::TxInitValidator { + tx: tx_args, + scheme, + account_keys, + threshold, + consensus_key, + eth_cold_key, + eth_hot_key, + protocol_key, + commission_rate, + max_commission_rate_change, + email, + website, + description, + discord_handle, + validator_vp_code_path, + unsafe_dont_encrypt, + tx_init_account_code_path, + tx_become_validator_code_path, + }: args::TxInitValidator, +) -> Result<(), error::Error> { + let address = submit_init_account( + namada, + args::TxInitAccount { + tx: tx_args.clone(), + vp_code_path: validator_vp_code_path, + tx_code_path: tx_init_account_code_path, + public_keys: account_keys, + threshold, + }, + ) + .await?; + + if tx_args.dry_run { + eprintln!( + "Cannot proceed to become validator in dry-run as no account has \ + been created" + ); + safe_exit(1); + } + let address = address.unwrap_or_else(|| { + eprintln!( + "Something went wrong with transaction to initialize an account \ + as no address has been created. Cannot proceed to become \ + validator." + ); + safe_exit(1); + }); + + submit_become_validator( + namada, + config, + args::TxBecomeValidator { + tx: tx_args, + address, + scheme, + consensus_key, + eth_cold_key, + eth_hot_key, + protocol_key, + commission_rate, + max_commission_rate_change, + email, + description, + website, + discord_handle, + tx_code_path: tx_become_validator_code_path, + unsafe_dont_encrypt, + }, + ) + .await +} + pub async fn submit_transfer<'a>( namada: &impl Namada<'a>, args: args::TxTransfer, diff --git a/benches/txs.rs b/benches/txs.rs index 98f4d45a9d..97a4e16945 100644 --- a/benches/txs.rs +++ b/benches/txs.rs @@ -12,7 +12,7 @@ use namada::core::types::key::{ }; use namada::core::types::token::Amount; use namada::core::types::transaction::account::{InitAccount, UpdateAccount}; -use namada::core::types::transaction::pos::{InitValidator, MetaDataChange}; +use namada::core::types::transaction::pos::{BecomeValidator, MetaDataChange}; use namada::ibc::core::ics02_client::client_type::ClientType; use namada::ibc::core::ics03_connection::connection::Counterparty; use namada::ibc::core::ics03_connection::msgs::conn_open_init::MsgConnectionOpenInit; @@ -43,15 +43,15 @@ use namada::types::transaction::pos::{ }; use namada_apps::bench_utils::{ BenchShell, BenchShieldedCtx, ALBERT_PAYMENT_ADDRESS, ALBERT_SPENDING_KEY, - BERTHA_PAYMENT_ADDRESS, TX_BOND_WASM, TX_BRIDGE_POOL_WASM, - TX_CHANGE_CONSENSUS_KEY_WASM, TX_CHANGE_VALIDATOR_COMMISSION_WASM, - TX_CHANGE_VALIDATOR_METADATA_WASM, TX_CLAIM_REWARDS_WASM, - TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, - TX_INIT_PROPOSAL_WASM, TX_INIT_VALIDATOR_WASM, - TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, TX_RESIGN_STEWARD, - TX_REVEAL_PK_WASM, TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, - TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, - TX_VOTE_PROPOSAL_WASM, TX_WITHDRAW_WASM, VP_USER_WASM, + BERTHA_PAYMENT_ADDRESS, TX_BECOME_VALIDATOR_WASM, TX_BOND_WASM, + TX_BRIDGE_POOL_WASM, TX_CHANGE_CONSENSUS_KEY_WASM, + TX_CHANGE_VALIDATOR_COMMISSION_WASM, TX_CHANGE_VALIDATOR_METADATA_WASM, + TX_CLAIM_REWARDS_WASM, TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, + TX_INIT_ACCOUNT_WASM, TX_INIT_PROPOSAL_WASM, TX_REACTIVATE_VALIDATOR_WASM, + TX_REDELEGATE_WASM, TX_RESIGN_STEWARD, TX_REVEAL_PK_WASM, TX_UNBOND_WASM, + TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, + TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL_WASM, TX_WITHDRAW_WASM, + VP_USER_WASM, }; use namada_apps::wallet::defaults; use sha2::Digest; @@ -625,7 +625,7 @@ fn init_validator(c: &mut Criterion) { .finalize_reset() .into(), ); - let data = InitValidator { + let data = BecomeValidator { account_keys: vec![defaults::albert_keypair().to_public()], threshold: 1, consensus_key, @@ -641,7 +641,7 @@ fn init_validator(c: &mut Criterion) { validator_vp_code_hash: extra_hash, }; let tx = shell.generate_tx( - TX_INIT_VALIDATOR_WASM, + TX_BECOME_VALIDATOR_WASM, data, None, Some(vec![extra_section]), diff --git a/core/src/types/transaction/pos.rs b/core/src/types/transaction/pos.rs index bec1a066e8..f44be68d85 100644 --- a/core/src/types/transaction/pos.rs +++ b/core/src/types/transaction/pos.rs @@ -5,11 +5,10 @@ use serde::{Deserialize, Serialize}; use crate::types::address::Address; use crate::types::dec::Dec; -use crate::types::hash::Hash; use crate::types::key::{common, secp256k1}; use crate::types::token; -/// A tx data type to initialize a new validator account. +/// A tx data type to become a validator account. #[derive( Debug, Clone, @@ -20,13 +19,9 @@ use crate::types::token; Serialize, Deserialize, )] -pub struct InitValidator { - /// Public key to be written into the account's storage. This can be used - /// for signature verification of transactions for the newly created - /// account. - pub account_keys: Vec, - /// The minimum number of signatures needed - pub threshold: u8, +pub struct BecomeValidator { + /// Address of an account that will become a validator. + pub address: Address, /// A key to be used for signing blocks and votes on blocks. pub consensus_key: common::PublicKey, /// An Eth bridge governance public key @@ -49,8 +44,6 @@ pub struct InitValidator { pub website: Option, /// The validator's discord handle pub discord_handle: Option, - /// The VP code for validator account - pub validator_vp_code_hash: Hash, } /// A bond is a validator's self-bond or a delegation from non-validator to a diff --git a/encoding_spec/src/main.rs b/encoding_spec/src/main.rs index 4365fd4a01..be9efdc113 100644 --- a/encoding_spec/src/main.rs +++ b/encoding_spec/src/main.rs @@ -82,7 +82,7 @@ fn main() -> Result<(), Box> { let init_account_schema = schema_container_of::(); let init_validator_schema = - schema_container_of::(); + schema_container_of::(); let token_transfer_schema = schema_container_of::(); let update_account = schema_container_of::(); diff --git a/sdk/src/args.rs b/sdk/src/args.rs index 3359c08ec4..23f1643233 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -723,6 +723,41 @@ impl TxInitAccount { } } +/// Transaction to initialize a new account +#[derive(Clone, Debug)] +pub struct TxBecomeValidator { + /// Common tx arguments + pub tx: Tx, + /// Address of an account that will become a validator. + pub address: C::Address, + /// Signature scheme + pub scheme: SchemeType, + /// Consensus key + pub consensus_key: Option, + /// Ethereum cold key + pub eth_cold_key: Option, + /// Ethereum hot key + pub eth_hot_key: Option, + /// Protocol key + pub protocol_key: Option, + /// Commission rate + pub commission_rate: Dec, + /// Maximum commission rate change + pub max_commission_rate_change: Dec, + /// The validator email + pub email: String, + /// The validator description + pub description: Option, + /// The validator website + pub website: Option, + /// The validator's discord handle + pub discord_handle: Option, + /// Path to the TX WASM code file + pub tx_code_path: PathBuf, + /// Don't encrypt the keypair + pub unsafe_dont_encrypt: bool, +} + /// Transaction to initialize a new account #[derive(Clone, Debug)] pub struct TxInitValidator { @@ -757,7 +792,9 @@ pub struct TxInitValidator { /// Path to the VP WASM code file pub validator_vp_code_path: PathBuf, /// Path to the TX WASM code file - pub tx_code_path: PathBuf, + pub tx_init_account_code_path: PathBuf, + /// Path to the TX WASM code file + pub tx_become_validator_code_path: PathBuf, /// Don't encrypt the keypair pub unsafe_dont_encrypt: bool, } diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index b7b549f5d6..04a2c63943 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -51,11 +51,11 @@ use crate::rpc::{ use crate::signing::SigningTxData; use crate::token::DenominatedAmount; use crate::tx::{ - ProcessTxResponse, TX_BOND_WASM, TX_BRIDGE_POOL_WASM, - TX_CHANGE_COMMISSION_WASM, TX_CHANGE_CONSENSUS_KEY_WASM, - TX_CHANGE_METADATA_WASM, TX_CLAIM_REWARDS_WASM, - TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, - TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, TX_REACTIVATE_VALIDATOR_WASM, + ProcessTxResponse, TX_BECOME_VALIDATOR_WASM, TX_BOND_WASM, + TX_BRIDGE_POOL_WASM, TX_CHANGE_COMMISSION_WASM, + TX_CHANGE_CONSENSUS_KEY_WASM, TX_CHANGE_METADATA_WASM, + TX_CLAIM_REWARDS_WASM, TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, + TX_INIT_ACCOUNT_WASM, TX_INIT_PROPOSAL, TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM, TX_RESIGN_STEWARD, TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, @@ -348,6 +348,33 @@ pub trait Namada<'a>: Sized { } } + /// Make a TxBecomeValidator builder from the given minimum set of arguments + fn new_become_validator( + &self, + address: Address, + commission_rate: Dec, + max_commission_rate_change: Dec, + email: String, + ) -> args::TxBecomeValidator { + args::TxBecomeValidator { + address, + commission_rate, + max_commission_rate_change, + scheme: SchemeType::Ed25519, + consensus_key: None, + eth_cold_key: None, + eth_hot_key: None, + protocol_key: None, + unsafe_dont_encrypt: false, + tx_code_path: PathBuf::from(TX_BECOME_VALIDATOR_WASM), + tx: self.tx_builder(), + email, + description: None, + website: None, + discord_handle: None, + } + } + /// Make a TxInitValidator builder from the given minimum set of arguments fn new_init_validator( &self, @@ -367,7 +394,10 @@ pub trait Namada<'a>: Sized { protocol_key: None, validator_vp_code_path: PathBuf::from(VP_USER_WASM), unsafe_dont_encrypt: false, - tx_code_path: PathBuf::from(TX_INIT_VALIDATOR_WASM), + tx_init_account_code_path: PathBuf::from(TX_INIT_ACCOUNT_WASM), + tx_become_validator_code_path: PathBuf::from( + TX_BECOME_VALIDATOR_WASM, + ), tx: self.tx_builder(), email, description: None, diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index c6262d9dd0..dd75e942f0 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -27,7 +27,7 @@ use namada_core::types::transaction::account::{InitAccount, UpdateAccount}; use namada_core::types::transaction::governance::{ InitProposalData, VoteProposalData, }; -use namada_core::types::transaction::pos::InitValidator; +use namada_core::types::transaction::pos::BecomeValidator; use namada_core::types::transaction::{pos, Fee}; use prost::Message; use rand::rngs::OsRng; @@ -48,10 +48,10 @@ use crate::masp::make_asset_type; use crate::proto::{MaspBuilder, Section, Tx}; use crate::rpc::validate_amount; use crate::tx::{ - TX_BOND_WASM, TX_CHANGE_COMMISSION_WASM, TX_CHANGE_CONSENSUS_KEY_WASM, - TX_CHANGE_METADATA_WASM, TX_CLAIM_REWARDS_WASM, - TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM, - TX_INIT_PROPOSAL, TX_INIT_VALIDATOR_WASM, TX_REACTIVATE_VALIDATOR_WASM, + TX_BECOME_VALIDATOR_WASM, TX_BOND_WASM, TX_CHANGE_COMMISSION_WASM, + TX_CHANGE_CONSENSUS_KEY_WASM, TX_CHANGE_METADATA_WASM, + TX_CLAIM_REWARDS_WASM, TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, + TX_INIT_ACCOUNT_WASM, TX_INIT_PROPOSAL, TX_REACTIVATE_VALIDATOR_WASM, TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM, VP_USER_WASM, }; @@ -1091,8 +1091,8 @@ pub async fn to_ledger_vector<'a>( format!("Threshold : {}", init_account.threshold), format!("VP type : {}", HEXLOWER.encode(&extra.code.hash().0)), ]); - } else if code_sec.tag == Some(TX_INIT_VALIDATOR_WASM.to_string()) { - let init_validator = InitValidator::try_from_slice( + } else if code_sec.tag == Some(TX_BECOME_VALIDATOR_WASM.to_string()) { + let init_validator = BecomeValidator::try_from_slice( &tx.data() .ok_or_else(|| Error::Other("Invalid Data".to_string()))?, ) @@ -1102,27 +1102,9 @@ pub async fn to_ledger_vector<'a>( tv.name = "Init_Validator_0".to_string(); - let extra = tx - .get_section(&init_validator.validator_vp_code_hash) - .and_then(|x| Section::extra_data_sec(x.as_ref())) - .ok_or_else(|| { - Error::Other("unable to load vp code".to_string()) - })?; - let vp_code = if extra.tag == Some(VP_USER_WASM.to_string()) { - "User".to_string() - } else { - HEXLOWER.encode(&extra.code.hash().0) - }; - tv.output.extend(vec!["Type : Init Validator".to_string()]); - tv.output.extend( - init_validator - .account_keys - .iter() - .map(|k| format!("Account key : {}", k)), - ); tv.output.extend(vec![ - format!("Threshold : {}", init_validator.threshold), + format!("Address : {}", init_validator.address), format!("Consensus key : {}", init_validator.consensus_key), format!("Ethereum cold key : {}", init_validator.eth_cold_key), format!("Ethereum hot key : {}", init_validator.eth_hot_key), @@ -1144,16 +1126,9 @@ pub async fn to_ledger_vector<'a>( tv.output .push(format!("Discord handle : {}", discord_handle)); } - tv.output.push(format!("Validator VP type : {}", vp_code)); - tv.output_expert.extend( - init_validator - .account_keys - .iter() - .map(|k| format!("Account key : {}", k)), - ); tv.output_expert.extend(vec![ - format!("Threshold : {}", init_validator.threshold), + format!("Address : {}", init_validator.address), format!("Consensus key : {}", init_validator.consensus_key), format!("Ethereum cold key : {}", init_validator.eth_cold_key), format!("Ethereum hot key : {}", init_validator.eth_hot_key), @@ -1176,10 +1151,6 @@ pub async fn to_ledger_vector<'a>( tv.output_expert .push(format!("Discord handle : {}", discord_handle)); } - tv.output_expert.push(format!( - "Validator VP type : {}", - HEXLOWER.encode(&extra.code.hash().0) - )); } else if code_sec.tag == Some(TX_INIT_PROPOSAL.to_string()) { let init_proposal_data = InitProposalData::try_from_slice( &tx.data() diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index e26bbff4e2..9f269ac806 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -70,8 +70,8 @@ use crate::{display_line, edisplay_line, Namada}; /// Initialize account transaction WASM pub const TX_INIT_ACCOUNT_WASM: &str = "tx_init_account.wasm"; -/// Initialize validator transaction WASM path -pub const TX_INIT_VALIDATOR_WASM: &str = "tx_init_validator.wasm"; +/// Become validator transaction WASM path +pub const TX_BECOME_VALIDATOR_WASM: &str = "tx_become_validator.wasm"; /// Unjail validator transaction WASM path pub const TX_UNJAIL_VALIDATOR_WASM: &str = "tx_unjail_validator.wasm"; /// Deactivate validator transaction WASM path diff --git a/tx_prelude/src/proof_of_stake.rs b/tx_prelude/src/proof_of_stake.rs index ec5f6f0ab8..4c78e23609 100644 --- a/tx_prelude/src/proof_of_stake.rs +++ b/tx_prelude/src/proof_of_stake.rs @@ -1,9 +1,8 @@ //! Proof of Stake system integration with functions for transactions use namada_core::types::dec::Dec; -use namada_core::types::hash::Hash; use namada_core::types::key::common; -use namada_core::types::transaction::pos::InitValidator; +use namada_core::types::transaction::pos::BecomeValidator; use namada_core::types::{key, token}; pub use namada_proof_of_stake::parameters::PosParams; use namada_proof_of_stake::types::ValidatorMetaData; @@ -12,7 +11,7 @@ use namada_proof_of_stake::{ change_validator_commission_rate, change_validator_metadata, claim_reward_tokens, deactivate_validator, reactivate_validator, read_pos_params, redelegate_tokens, unbond_tokens, unjail_validator, - withdraw_tokens, BecomeValidator, + withdraw_tokens, }; pub use namada_proof_of_stake::{parameters, types, ResultSlashing}; @@ -114,11 +113,10 @@ impl Ctx { /// Attempt to initialize a validator account. On success, returns the /// initialized validator account's address. - pub fn init_validator( + pub fn become_validator( &mut self, - InitValidator { - account_keys, - threshold, + BecomeValidator { + address, consensus_key, eth_cold_key, eth_hot_key, @@ -129,29 +127,17 @@ impl Ctx { description, website, discord_handle, - validator_vp_code_hash: _, - }: InitValidator, - validator_vp_code_hash: Hash, - validator_vp_code_tag: &Option, + }: BecomeValidator, ) -> EnvResult
{ let current_epoch = self.get_block_epoch()?; - // Init validator account - let validator_address = - self.init_account(validator_vp_code_hash, validator_vp_code_tag)?; - storage_api::account::init_account_storage( - self, - &validator_address, - &account_keys, - threshold, - )?; let eth_cold_key = key::common::PublicKey::Secp256k1(eth_cold_key); let eth_hot_key = key::common::PublicKey::Secp256k1(eth_hot_key); - let params = read_pos_params(self)?; - become_validator(BecomeValidator { + + become_validator(namada_proof_of_stake::BecomeValidator { storage: self, params: ¶ms, - address: &validator_address, + address: &address, consensus_key: &consensus_key, protocol_key: &protocol_key, eth_cold_key: ð_cold_key, @@ -168,7 +154,7 @@ impl Ctx { offset_opt: None, })?; - Ok(validator_address) + Ok(address) } /// Deactivate validator diff --git a/wasm/wasm_source/Cargo.toml b/wasm/wasm_source/Cargo.toml index c4025c1207..8e198626c2 100644 --- a/wasm/wasm_source/Cargo.toml +++ b/wasm/wasm_source/Cargo.toml @@ -23,7 +23,7 @@ tx_from_intent = ["namada_tx_prelude"] tx_ibc = ["namada_tx_prelude"] tx_init_account = ["namada_tx_prelude"] tx_init_proposal = ["namada_tx_prelude"] -tx_init_validator = ["namada_tx_prelude"] +tx_become_validator = ["namada_tx_prelude"] tx_reactivate_validator = ["namada_tx_prelude"] tx_redelegate = ["namada_tx_prelude"] tx_reveal_pk = ["namada_tx_prelude"] diff --git a/wasm/wasm_source/Makefile b/wasm/wasm_source/Makefile index 2da935ba7c..f01292af1e 100644 --- a/wasm/wasm_source/Makefile +++ b/wasm/wasm_source/Makefile @@ -15,7 +15,7 @@ wasms += tx_deactivate_validator wasms += tx_ibc wasms += tx_init_account wasms += tx_init_proposal -wasms += tx_init_validator +wasms += tx_become_validator wasms += tx_redelegate wasms += tx_reactivate_validator wasms += tx_reveal_pk diff --git a/wasm/wasm_source/src/lib.rs b/wasm/wasm_source/src/lib.rs index e44ac1564e..4e27cb92ad 100644 --- a/wasm/wasm_source/src/lib.rs +++ b/wasm/wasm_source/src/lib.rs @@ -1,3 +1,5 @@ +#[cfg(feature = "tx_become_validator")] +pub mod tx_become_validator; #[cfg(feature = "tx_bond")] pub mod tx_bond; #[cfg(feature = "tx_bridge_pool")] @@ -18,8 +20,6 @@ pub mod tx_ibc; pub mod tx_init_account; #[cfg(feature = "tx_init_proposal")] pub mod tx_init_proposal; -#[cfg(feature = "tx_init_validator")] -pub mod tx_init_validator; #[cfg(feature = "tx_reactivate_validator")] pub mod tx_reactivate_validator; #[cfg(feature = "tx_redelegate")] diff --git a/wasm/wasm_source/src/tx_become_validator.rs b/wasm/wasm_source/src/tx_become_validator.rs new file mode 100644 index 0000000000..4f959f6921 --- /dev/null +++ b/wasm/wasm_source/src/tx_become_validator.rs @@ -0,0 +1,44 @@ +//! A tx to initialize a new validator account with a given public keys and a +//! validity predicates. + +use namada_tx_prelude::transaction::pos::BecomeValidator; +use namada_tx_prelude::*; + +#[transaction(gas = 4395397)] +fn apply_tx(ctx: &mut Ctx, tx_data: Tx) -> TxResult { + let signed = tx_data; + let data = signed.data().ok_or_err_msg("Missing data").map_err(|err| { + ctx.set_commitment_sentinel(); + err + })?; + let become_validator = BecomeValidator::try_from_slice(&data[..]) + .wrap_err("failed to decode InitValidator")?; + debug_log!("apply_tx called to init a new validator account"); + + // Check that the tx has been signed with all the keys to be used for the + // validator account + let all_pks = vec![ + become_validator.consensus_key.clone(), + key::common::PublicKey::Secp256k1( + become_validator.eth_cold_key.clone(), + ), + key::common::PublicKey::Secp256k1(become_validator.eth_hot_key.clone()), + become_validator.protocol_key.clone(), + ]; + if !matches!(verify_signatures_of_pks(ctx, &signed, all_pks), Ok(true)) { + debug_log!("Keys ownership signature verification failed"); + panic!() + } + + // Register the validator in PoS + match ctx.become_validator(become_validator) { + Ok(validator_address) => { + debug_log!("Created validator {}", validator_address.encode(),) + } + Err(err) => { + debug_log!("Validator creation failed with: {}", err); + panic!() + } + } + Ok(()) +} diff --git a/wasm/wasm_source/src/tx_init_validator.rs b/wasm/wasm_source/src/tx_init_validator.rs deleted file mode 100644 index f7aa70997b..0000000000 --- a/wasm/wasm_source/src/tx_init_validator.rs +++ /dev/null @@ -1,64 +0,0 @@ -//! A tx to initialize a new validator account with a given public keys and a -//! validity predicates. - -use namada_tx_prelude::transaction::pos::InitValidator; -use namada_tx_prelude::*; - -#[transaction(gas = 4395397)] -fn apply_tx(ctx: &mut Ctx, tx_data: Tx) -> TxResult { - let signed = tx_data; - let data = signed.data().ok_or_err_msg("Missing data").map_err(|err| { - ctx.set_commitment_sentinel(); - err - })?; - let init_validator = InitValidator::try_from_slice(&data[..]) - .wrap_err("failed to decode InitValidator")?; - debug_log!("apply_tx called to init a new validator account"); - - // Get the validator vp code from the extra section - let validator_vp_code_sec = signed - .get_section(&init_validator.validator_vp_code_hash) - .ok_or_err_msg("validator vp section not found") - .map_err(|err| { - ctx.set_commitment_sentinel(); - err - })? - .extra_data_sec() - .ok_or_err_msg("validator vp section must be tagged as extra") - .map_err(|err| { - ctx.set_commitment_sentinel(); - err - })?; - - // Check that the tx has been signed with all the keys to be used for the - // validator account - let mut all_pks = init_validator.account_keys.clone(); - all_pks.push(init_validator.consensus_key.clone()); - all_pks.push(key::common::PublicKey::Secp256k1( - init_validator.eth_cold_key.clone(), - )); - all_pks.push(key::common::PublicKey::Secp256k1( - init_validator.eth_hot_key.clone(), - )); - all_pks.push(init_validator.protocol_key.clone()); - if !matches!(verify_signatures_of_pks(ctx, &signed, all_pks), Ok(true)) { - debug_log!("Keys ownership signature verification failed"); - panic!() - } - - // Register the validator in PoS - match ctx.init_validator( - init_validator, - validator_vp_code_sec.code.hash(), - &validator_vp_code_sec.tag, - ) { - Ok(validator_address) => { - debug_log!("Created validator {}", validator_address.encode(),) - } - Err(err) => { - debug_log!("Validator creation failed with: {}", err); - panic!() - } - } - Ok(()) -} From 69bde2c05e73d06fe9b8242ae0d23f7c37aa8386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 21 Nov 2023 18:24:30 +0100 Subject: [PATCH 040/175] PoS: add checks for `become_validator` --- apps/src/lib/client/rpc.rs | 8 +++ apps/src/lib/client/tx.rs | 107 +++++++++++++++++++++++++------------ core/src/types/address.rs | 10 ++++ proof_of_stake/src/lib.rs | 36 +++++++++++++ sdk/src/queries/vp/pos.rs | 15 ++++++ sdk/src/rpc.rs | 8 +++ 6 files changed, 150 insertions(+), 34 deletions(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index f696a0602b..27b4f95c3e 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -2318,6 +2318,14 @@ pub async fn is_delegator_at( .unwrap() } +/// Check if the given address is a known validator. +pub async fn has_bonds( + client: &C, + address: &Address, +) -> bool { + namada_sdk::rpc::has_bonds(client, address).await.unwrap() +} + /// Check if the address exists on chain. Established address exists if it has a /// stored validity predicate. Implicit and internal addresses always return /// true. diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index c88d231a99..af0ac2de83 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -513,6 +513,79 @@ pub async fn submit_become_validator<'a>( .or_else(|| Some(config.ledger.chain_id.clone())), ..tx_args.clone() }; + + // Check that the address is established + if !address.is_established() { + edisplay_line!( + namada.io(), + "The given address {address} is not established. Only established \ + address can become a validator.", + ); + if !tx_args.force { + safe_exit(1) + } + }; + + // Check that the address is not already a validator + if rpc::is_validator(namada.client(), &address).await { + edisplay_line!( + namada.io(), + "The given address {address} is already a validator", + ); + if !tx_args.force { + safe_exit(1) + } + }; + + // If the address is not yet a validator, it cannot have self-bonds, but it + // may have delegations. It has to unbond those before it can become a + // validator. + if rpc::has_bonds(namada.client(), &address).await { + edisplay_line!( + namada.io(), + "The given address {address} has delegations and therefore cannot \ + become a validator. To become a validator, you have to unbond \ + your delegations first.", + ); + if !tx_args.force { + safe_exit(1) + } + } + + // Validate the commission rate data + if commission_rate > Dec::one() || commission_rate < Dec::zero() { + edisplay_line!( + namada.io(), + "The validator commission rate must not exceed 1.0 or 100%, and \ + it must be 0 or positive" + ); + if !tx_args.force { + safe_exit(1) + } + } + if max_commission_rate_change > Dec::one() + || max_commission_rate_change < Dec::zero() + { + edisplay_line!( + namada.io(), + "The validator maximum change in commission rate per epoch must \ + not exceed 1.0 or 100%" + ); + if !tx_args.force { + safe_exit(1) + } + } + // Validate the email + if email.is_empty() { + edisplay_line!( + namada.io(), + "The validator email must not be an empty string" + ); + if !tx_args.force { + safe_exit(1) + } + } + let alias = tx_args .initialized_account_alias .as_ref() @@ -645,40 +718,6 @@ pub async fn submit_become_validator<'a>( ) .map_err(|err| error::Error::Other(err.to_string()))?; - // Validate the commission rate data - if commission_rate > Dec::one() || commission_rate < Dec::zero() { - edisplay_line!( - namada.io(), - "The validator commission rate must not exceed 1.0 or 100%, and \ - it must be 0 or positive" - ); - if !tx_args.force { - safe_exit(1) - } - } - if max_commission_rate_change > Dec::one() - || max_commission_rate_change < Dec::zero() - { - edisplay_line!( - namada.io(), - "The validator maximum change in commission rate per epoch must \ - not exceed 1.0 or 100%" - ); - if !tx_args.force { - safe_exit(1) - } - } - // Validate the email - if email.is_empty() { - edisplay_line!( - namada.io(), - "The validator email must not be an empty string" - ); - if !tx_args.force { - safe_exit(1) - } - } - let tx_code_hash = query_wasm_code_hash(namada, tx_code_path.to_string_lossy()) .await diff --git a/core/src/types/address.rs b/core/src/types/address.rs index 2543fc7f54..44373695a3 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -282,6 +282,16 @@ impl Address { } } } + + /// If the address established? + pub fn is_established(&self) -> bool { + matches!(self, Address::Established(_)) + } + + /// If the address implicit? + pub fn is_implicit(&self) -> bool { + matches!(self, Address::Implicit(_)) + } } impl string_encoding::Format for Address { diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 5aa6fb6f07..3aabb58ca6 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -2764,6 +2764,28 @@ where } = args; let offset = offset_opt.unwrap_or(params.pipeline_len); + if !address.is_established() { + return Err(storage_api::Error::new_const( + "The given address {address} is not established. Only established \ + address can become a validator.", + )); + } + + if is_validator(storage, address)? { + return Err(storage_api::Error::new_const( + "The given address is already a validator", + )); + } + + // If the address is not yet a validator, it cannot have self-bonds, but it + // may have delegations. + if has_bonds(storage, address)? { + return Err(storage_api::Error::new_const( + "The given address has delegations and therefore cannot become a \ + validator. Unbond first.", + )); + } + // This will fail if the key is already being used try_insert_consensus_key(storage, consensus_key)?; @@ -3623,6 +3645,20 @@ where Ok(delegations) } +/// Find if the given source address has any bonds. +pub fn has_bonds(storage: &S, source: &Address) -> storage_api::Result +where + S: StorageRead, +{ + let max_epoch = Epoch(u64::MAX); + let delegations = find_delegations(storage, source, &max_epoch)?; + Ok(!delegations + .values() + .cloned() + .sum::() + .is_zero()) +} + /// Find PoS slashes applied to a validator, if any pub fn find_validator_slashes( storage: &S, diff --git a/sdk/src/queries/vp/pos.rs b/sdk/src/queries/vp/pos.rs index 8a464179f1..0a4777514a 100644 --- a/sdk/src/queries/vp/pos.rs +++ b/sdk/src/queries/vp/pos.rs @@ -113,6 +113,9 @@ router! {POS, ( "consensus_keys" ) -> BTreeSet = consensus_key_set, + ( "has_bonds" / [source: Address] ) + -> bool = has_bonds, + } /// Enriched bonds data with extra information calculated from the data queried @@ -597,6 +600,18 @@ where namada_proof_of_stake::get_consensus_key_set(ctx.wl_storage) } +/// Find if the given source address has any bonds. +fn has_bonds( + ctx: RequestCtx<'_, D, H, V, T>, + source: Address, +) -> storage_api::Result +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + namada_proof_of_stake::has_bonds(ctx.wl_storage, &source) +} + /// Client-only methods for the router type are composed from router functions. #[cfg(any(test, feature = "async-client"))] pub mod client_only_methods { diff --git a/sdk/src/rpc.rs b/sdk/src/rpc.rs index 0d0d69a79b..3e18c686b9 100644 --- a/sdk/src/rpc.rs +++ b/sdk/src/rpc.rs @@ -213,6 +213,14 @@ pub async fn is_delegator_at( ) } +/// Find if the given source address has any bonds. +pub async fn has_bonds( + client: &C, + source: &Address, +) -> Result { + convert_response::(RPC.vp().pos().has_bonds(client, source).await) +} + /// Get the set of consensus keys registered in the network pub async fn get_consensus_keys( client: &C, From 6ab8fc6f32136376d0b7bc69eaa87a040ee663e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 22 Nov 2023 11:22:23 +0100 Subject: [PATCH 041/175] wasm/vp_user: add authorization for tx_become_validator --- wasm/wasm_source/src/vp_user.rs | 184 +++++++++++++++++++++++++++++++- 1 file changed, 183 insertions(+), 1 deletion(-) diff --git a/wasm/wasm_source/src/vp_user.rs b/wasm/wasm_source/src/vp_user.rs index c6b7d6920e..390bc389fb 100644 --- a/wasm/wasm_source/src/vp_user.rs +++ b/wasm/wasm_source/src/vp_user.rs @@ -191,6 +191,10 @@ fn validate_tx( true } } + (None, Some(_post)) => { + // Becoming a validator must be authorized + *valid_sig + } _ => true, } } @@ -259,7 +263,7 @@ mod tests { use namada::proto::{Code, Data, Signature}; use namada::types::dec::Dec; use namada::types::storage::Epoch; - use namada::types::transaction::TxType; + use namada::types::transaction::{self, TxType}; use namada_test_utils::TestWasms; // Use this as `#[test]` annotation to enable logging use namada_tests::log::test; @@ -551,6 +555,90 @@ mod tests { ); } + /// Test that a PoS action to become validator that must be authorized is + /// rejected without a valid signature. + #[test] + fn test_unsigned_become_validator_pos_action_rejected() { + // Init PoS genesis + let pos_params = PosParams::default(); + let validator = address::testing::established_address_3(); + let initial_stake = token::Amount::from_uint(10_098_123, 0).unwrap(); + let consensus_key = key::testing::keypair_2().ref_to(); + let protocol_key = key::testing::keypair_1().ref_to(); + let eth_cold_key = key::testing::keypair_3().ref_to(); + let eth_hot_key = key::testing::keypair_4().ref_to(); + let commission_rate = Dec::new(5, 2).unwrap(); + let max_commission_rate_change = Dec::new(1, 2).unwrap(); + + let genesis_validators = [GenesisValidator { + address: validator, + tokens: initial_stake, + consensus_key, + protocol_key, + commission_rate, + max_commission_rate_change, + eth_hot_key, + eth_cold_key, + metadata: Default::default(), + }]; + + init_pos(&genesis_validators[..], &pos_params, Epoch(0)); + + // Initialize a tx environment + let mut tx_env = tx_host_env::take(); + + let secret_key = key::testing::keypair_1(); + let public_key = secret_key.ref_to(); + let vp_owner: Address = address::testing::established_address_2(); + + // Spawn the accounts to be able to modify their storage + tx_env.init_account_storage(&vp_owner, vec![public_key], 1); + + // Initialize VP environment from PoS action to become a validator + vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { + let consensus_key = key::common::PublicKey::Ed25519( + key::testing::gen_keypair::().ref_to(), + ); + let protocol_key = key::common::PublicKey::Ed25519( + key::testing::gen_keypair::().ref_to(), + ); + let eth_cold_key = + key::testing::gen_keypair::() + .ref_to(); + let eth_hot_key = + key::testing::gen_keypair::() + .ref_to(); + let commission_rate = Dec::new(5, 2).unwrap(); + let max_commission_rate_change = Dec::new(1, 2).unwrap(); + let args = transaction::pos::BecomeValidator { + address: address.clone(), + consensus_key, + eth_cold_key, + eth_hot_key, + protocol_key, + commission_rate, + max_commission_rate_change, + email: "cucumber@tastes.good".to_string(), + description: None, + website: None, + discord_handle: None, + }; + tx::ctx().become_validator(args).unwrap(); + }); + + let vp_env = vp_host_env::take(); + let mut tx_data = Tx::from_type(TxType::Raw); + tx_data.set_data(Data::new(vec![])); + let keys_changed: BTreeSet = + vp_env.all_touched_storage_keys(); + let verifiers: BTreeSet
= BTreeSet::default(); + vp_host_env::set(vp_env); + assert!( + !validate_tx(&CTX, tx_data, vp_owner, keys_changed, verifiers) + .unwrap() + ); + } + /// Test that a validator PoS action that must be authorized is rejected /// without a valid signature. #[test] @@ -736,6 +824,100 @@ mod tests { ); } + /// Test that a signed PoS action to become validator that must be + /// authorized is accepted with a valid signature. + #[test] + fn test_signed_become_validator_pos_action_accepted() { + // Init PoS genesis + let pos_params = PosParams::default(); + let validator = address::testing::established_address_3(); + let initial_stake = token::Amount::from_uint(10_098_123, 0).unwrap(); + let consensus_key = key::testing::keypair_2().ref_to(); + let protocol_key = key::testing::keypair_1().ref_to(); + let eth_cold_key = key::testing::keypair_3().ref_to(); + let eth_hot_key = key::testing::keypair_4().ref_to(); + let commission_rate = Dec::new(5, 2).unwrap(); + let max_commission_rate_change = Dec::new(1, 2).unwrap(); + + let genesis_validators = [GenesisValidator { + address: validator, + tokens: initial_stake, + consensus_key, + protocol_key, + commission_rate, + max_commission_rate_change, + eth_hot_key, + eth_cold_key, + metadata: Default::default(), + }]; + + init_pos(&genesis_validators[..], &pos_params, Epoch(0)); + + // Initialize a tx environment + let mut tx_env = tx_host_env::take(); + + let secret_key = key::testing::keypair_1(); + let public_key = secret_key.ref_to(); + let vp_owner: Address = address::testing::established_address_2(); + + // Spawn the accounts to be able to modify their storage + tx_env.init_account_storage(&vp_owner, vec![public_key.clone()], 1); + + // Initialize VP environment from PoS action to become a validator + vp_host_env::init_from_tx(vp_owner.clone(), tx_env, |address| { + let consensus_key = key::common::PublicKey::Ed25519( + key::testing::gen_keypair::().ref_to(), + ); + let protocol_key = key::common::PublicKey::Ed25519( + key::testing::gen_keypair::().ref_to(), + ); + let eth_cold_key = + key::testing::gen_keypair::() + .ref_to(); + let eth_hot_key = + key::testing::gen_keypair::() + .ref_to(); + let commission_rate = Dec::new(5, 2).unwrap(); + let max_commission_rate_change = Dec::new(1, 2).unwrap(); + let args = transaction::pos::BecomeValidator { + address: address.clone(), + consensus_key, + eth_cold_key, + eth_hot_key, + protocol_key, + commission_rate, + max_commission_rate_change, + email: "cucumber@tastes.good".to_string(), + description: None, + website: None, + discord_handle: None, + }; + tx::ctx().become_validator(args).unwrap(); + }); + + let pks_map = AccountPublicKeysMap::from_iter(vec![public_key]); + + let mut vp_env = vp_host_env::take(); + let mut tx = vp_env.tx.clone(); + tx.set_data(Data::new(vec![])); + tx.set_code(Code::new(vec![], None)); + tx.add_section(Section::Signature(Signature::new( + vec![tx.raw_header_hash()], + pks_map.index_secret_keys(vec![secret_key]), + None, + ))); + let signed_tx = tx.clone(); + vp_env.tx = signed_tx.clone(); + let keys_changed: BTreeSet = + vp_env.all_touched_storage_keys(); + let verifiers: BTreeSet
= BTreeSet::default(); + vp_host_env::set(vp_env); + assert!( + validate_tx(&CTX, signed_tx, vp_owner, keys_changed, verifiers) + .unwrap() + ); + } + /// Test that a validator PoS action that must be authorized is accepted /// with a valid signature. #[test] From b315986f74cc3a860427f6a94399f190c851d1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 22 Nov 2023 12:49:56 +0100 Subject: [PATCH 042/175] test/pos: `become_validator` fails on account with delegations --- apps/src/lib/node/ledger/shell/init_chain.rs | 2 +- .../shell/vote_extensions/bridge_pool_vext.rs | 30 ++++--- ethereum_bridge/src/test_utils.rs | 30 ++++--- proof_of_stake/src/lib.rs | 36 ++++---- proof_of_stake/src/tests.rs | 87 +++++++++++++++---- proof_of_stake/src/tests/state_machine.rs | 30 ++++--- proof_of_stake/src/tests/state_machine_v2.rs | 30 ++++--- tx_prelude/src/proof_of_stake.rs | 38 ++++---- 8 files changed, 172 insertions(+), 111 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index aad1fcc362..1f612b2f26 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -448,8 +448,8 @@ where // TODO: replace pos::init_genesis validators arg with // init_genesis_validator from here if let Err(err) = pos::namada_proof_of_stake::become_validator( + &mut self.wl_storage, BecomeValidator { - storage: &mut self.wl_storage, params, address, consensus_key: &consensus_key.pk.raw, diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/bridge_pool_vext.rs b/apps/src/lib/node/ledger/shell/vote_extensions/bridge_pool_vext.rs index 2486d2d442..5e4f34ac2c 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/bridge_pool_vext.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/bridge_pool_vext.rs @@ -249,20 +249,22 @@ mod test_bp_vote_extensions { let hot_key = gen_secp256k1_keypair(); let cold_key = gen_secp256k1_keypair(); - become_validator(BecomeValidator { - storage: &mut shell.wl_storage, - params: ¶ms, - address: &bertha_address(), - consensus_key: &consensus_key.ref_to(), - protocol_key: &protocol_key.ref_to(), - eth_hot_key: &hot_key.ref_to(), - eth_cold_key: &cold_key.ref_to(), - current_epoch: 0.into(), - commission_rate: Default::default(), - max_commission_rate_change: Default::default(), - metadata: Default::default(), - offset_opt: None, - }) + become_validator( + &mut shell.wl_storage, + BecomeValidator { + params: ¶ms, + address: &bertha_address(), + consensus_key: &consensus_key.ref_to(), + protocol_key: &protocol_key.ref_to(), + eth_hot_key: &hot_key.ref_to(), + eth_cold_key: &cold_key.ref_to(), + current_epoch: 0.into(), + commission_rate: Default::default(), + max_commission_rate_change: Default::default(), + metadata: Default::default(), + offset_opt: None, + }, + ) .expect("Test failed"); // we advance forward to the next epoch diff --git a/ethereum_bridge/src/test_utils.rs b/ethereum_bridge/src/test_utils.rs index 3552b27bf9..cbaf10b38e 100644 --- a/ethereum_bridge/src/test_utils.rs +++ b/ethereum_bridge/src/test_utils.rs @@ -270,20 +270,22 @@ pub fn append_validators_to_storage( let eth_cold_key = &keys.eth_gov.ref_to(); let eth_hot_key = &keys.eth_bridge.ref_to(); - become_validator(BecomeValidator { - storage: wl_storage, - params: ¶ms, - address: &validator, - consensus_key, - protocol_key, - eth_cold_key, - eth_hot_key, - current_epoch, - commission_rate: Dec::new(5, 2).unwrap(), - max_commission_rate_change: Dec::new(1, 2).unwrap(), - metadata: Default::default(), - offset_opt: Some(1), - }) + become_validator( + wl_storage, + BecomeValidator { + params: ¶ms, + address: &validator, + consensus_key, + protocol_key, + eth_cold_key, + eth_hot_key, + current_epoch, + commission_rate: Dec::new(5, 2).unwrap(), + max_commission_rate_change: Dec::new(1, 2).unwrap(), + metadata: Default::default(), + offset_opt: Some(1), + }, + ) .expect("Test failed"); credit_tokens(wl_storage, &staking_token, &validator, stake) .expect("Test failed"); diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 3aabb58ca6..6e77eb4c04 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -2714,9 +2714,7 @@ where } /// Arguments to [`become_validator`]. -pub struct BecomeValidator<'a, S> { - /// Storage implementation. - pub storage: &'a mut S, +pub struct BecomeValidator<'a> { /// Proof-of-stake parameters. pub params: &'a PosParams, /// The validator's address. @@ -2743,13 +2741,13 @@ pub struct BecomeValidator<'a, S> { /// Initialize data for a new validator. pub fn become_validator( - args: BecomeValidator<'_, S>, + storage: &mut S, + args: BecomeValidator<'_>, ) -> storage_api::Result<()> where S: StorageRead + StorageWrite, { let BecomeValidator { - storage, params, address, consensus_key, @@ -5861,20 +5859,22 @@ pub mod test_utils { metadata, } in validators { - become_validator(BecomeValidator { + become_validator( storage, - params, - address: &address, - consensus_key: &consensus_key, - protocol_key: &protocol_key, - eth_cold_key: ð_cold_key, - eth_hot_key: ð_hot_key, - current_epoch, - commission_rate, - max_commission_rate_change, - metadata, - offset_opt: Some(0), - })?; + BecomeValidator { + params, + address: &address, + consensus_key: &consensus_key, + protocol_key: &protocol_key, + eth_cold_key: ð_cold_key, + eth_hot_key: ð_hot_key, + current_epoch, + commission_rate, + max_commission_rate_change, + metadata, + offset_opt: Some(0), + }, + )?; // Credit token amount to be bonded to the validator address so it // can be bonded let staking_token = staking_token_address(storage); diff --git a/proof_of_stake/src/tests.rs b/proof_of_stake/src/tests.rs index 6beedb955d..0398a7b3d7 100644 --- a/proof_of_stake/src/tests.rs +++ b/proof_of_stake/src/tests.rs @@ -1027,7 +1027,25 @@ fn test_become_validator_aux( ); assert!(!is_validator(&s, &new_validator).unwrap()); - // Initialize the validator account + // Credit the `new_validator` account + let staking_token = staking_token_address(&s); + let amount = token::Amount::from_uint(100_500_000, 0).unwrap(); + // Credit twice the amount as we're gonna bond it in delegation first, then + // self-bond + credit_tokens(&mut s, &staking_token, &new_validator, amount * 2).unwrap(); + + // Add a delegation from `new_validator` to `genesis_validator` + let genesis_validator = &validators.first().unwrap().address; + bond_tokens( + &mut s, + Some(&new_validator), + genesis_validator, + amount, + current_epoch, + None, + ) + .unwrap(); + let consensus_key = new_validator_consensus_key.to_public(); let protocol_sk = common_sk_from_simple_seed(0); let protocol_key = protocol_sk.to_public(); @@ -1037,21 +1055,57 @@ fn test_become_validator_aux( let eth_cold_key = key::common::PublicKey::Secp256k1( key::testing::gen_keypair::().ref_to(), ); - become_validator(BecomeValidator { - storage: &mut s, - params: ¶ms, - address: &new_validator, - consensus_key: &consensus_key, - protocol_key: &protocol_key, - eth_cold_key: ð_cold_key, - eth_hot_key: ð_hot_key, + + // Try to become a validator - it should fail as there is a delegation + let result = become_validator( + &mut s, + BecomeValidator { + params: ¶ms, + address: &new_validator, + consensus_key: &consensus_key, + protocol_key: &protocol_key, + eth_cold_key: ð_cold_key, + eth_hot_key: ð_hot_key, + current_epoch, + commission_rate: Dec::new(5, 2).expect("Dec creation failed"), + max_commission_rate_change: Dec::new(5, 2) + .expect("Dec creation failed"), + metadata: Default::default(), + offset_opt: None, + }, + ); + assert!(result.is_err()); + assert!(!is_validator(&s, &new_validator).unwrap()); + + // Unbond the delegation + unbond_tokens( + &mut s, + Some(&new_validator), + genesis_validator, + amount, current_epoch, - commission_rate: Dec::new(5, 2).expect("Dec creation failed"), - max_commission_rate_change: Dec::new(5, 2) - .expect("Dec creation failed"), - metadata: Default::default(), - offset_opt: None, - }) + false, + ) + .unwrap(); + + // Try to become a validator account again - it should pass now + become_validator( + &mut s, + BecomeValidator { + params: ¶ms, + address: &new_validator, + consensus_key: &consensus_key, + protocol_key: &protocol_key, + eth_cold_key: ð_cold_key, + eth_hot_key: ð_hot_key, + current_epoch, + commission_rate: Dec::new(5, 2).expect("Dec creation failed"), + max_commission_rate_change: Dec::new(5, 2) + .expect("Dec creation failed"), + metadata: Default::default(), + offset_opt: None, + }, + ) .unwrap(); assert!(is_validator(&s, &new_validator).unwrap()); @@ -1066,9 +1120,6 @@ fn test_become_validator_aux( current_epoch = advance_epoch(&mut s, ¶ms); // Self-bond to the new validator - let staking_token = staking_token_address(&s); - let amount = token::Amount::from_uint(100_500_000, 0).unwrap(); - credit_tokens(&mut s, &staking_token, &new_validator, amount).unwrap(); bond_tokens(&mut s, None, &new_validator, amount, current_epoch, None) .unwrap(); diff --git a/proof_of_stake/src/tests/state_machine.rs b/proof_of_stake/src/tests/state_machine.rs index 9681c6f409..781d276105 100644 --- a/proof_of_stake/src/tests/state_machine.rs +++ b/proof_of_stake/src/tests/state_machine.rs @@ -264,20 +264,22 @@ impl StateMachineTest for ConcretePosState { tracing::debug!("\nCONCRETE Init validator"); let current_epoch = state.current_epoch(); - super::become_validator(super::BecomeValidator { - storage: &mut state.s, - params: ¶ms, - address: &address, - consensus_key: &consensus_key, - protocol_key: &protocol_key, - eth_cold_key: ð_cold_key, - eth_hot_key: ð_hot_key, - current_epoch, - commission_rate, - max_commission_rate_change, - metadata: Default::default(), - offset_opt: None, - }) + super::become_validator( + &mut state.s, + super::BecomeValidator { + params: ¶ms, + address: &address, + consensus_key: &consensus_key, + protocol_key: &protocol_key, + eth_cold_key: ð_cold_key, + eth_hot_key: ð_hot_key, + current_epoch, + commission_rate, + max_commission_rate_change, + metadata: Default::default(), + offset_opt: None, + }, + ) .unwrap(); let params = read_pos_params(&state.s).unwrap(); diff --git a/proof_of_stake/src/tests/state_machine_v2.rs b/proof_of_stake/src/tests/state_machine_v2.rs index 70b0216d0b..cf59a59238 100644 --- a/proof_of_stake/src/tests/state_machine_v2.rs +++ b/proof_of_stake/src/tests/state_machine_v2.rs @@ -1992,20 +1992,22 @@ impl StateMachineTest for ConcretePosState { tracing::debug!("\nCONCRETE Init validator"); let current_epoch = state.current_epoch(); - super::become_validator(super::BecomeValidator { - storage: &mut state.s, - params: ¶ms, - address: &address, - consensus_key: &consensus_key, - protocol_key: &protocol_key, - eth_cold_key: ð_cold_key, - eth_hot_key: ð_hot_key, - current_epoch, - commission_rate, - max_commission_rate_change, - metadata: Default::default(), - offset_opt: None, - }) + super::become_validator( + &mut state.s, + super::BecomeValidator { + params: ¶ms, + address: &address, + consensus_key: &consensus_key, + protocol_key: &protocol_key, + eth_cold_key: ð_cold_key, + eth_hot_key: ð_hot_key, + current_epoch, + commission_rate, + max_commission_rate_change, + metadata: Default::default(), + offset_opt: None, + }, + ) .unwrap(); let params = read_pos_params(&state.s).unwrap(); diff --git a/tx_prelude/src/proof_of_stake.rs b/tx_prelude/src/proof_of_stake.rs index 4c78e23609..15250e760a 100644 --- a/tx_prelude/src/proof_of_stake.rs +++ b/tx_prelude/src/proof_of_stake.rs @@ -134,25 +134,27 @@ impl Ctx { let eth_hot_key = key::common::PublicKey::Secp256k1(eth_hot_key); let params = read_pos_params(self)?; - become_validator(namada_proof_of_stake::BecomeValidator { - storage: self, - params: ¶ms, - address: &address, - consensus_key: &consensus_key, - protocol_key: &protocol_key, - eth_cold_key: ð_cold_key, - eth_hot_key: ð_hot_key, - current_epoch, - commission_rate, - max_commission_rate_change, - metadata: ValidatorMetaData { - email, - description, - website, - discord_handle, + become_validator( + self, + namada_proof_of_stake::BecomeValidator { + params: ¶ms, + address: &address, + consensus_key: &consensus_key, + protocol_key: &protocol_key, + eth_cold_key: ð_cold_key, + eth_hot_key: ð_hot_key, + current_epoch, + commission_rate, + max_commission_rate_change, + metadata: ValidatorMetaData { + email, + description, + website, + discord_handle, + }, + offset_opt: None, }, - offset_opt: None, - })?; + )?; Ok(address) } From 3736701629ff23366d43f11f1f82a3cbc1e9e50f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 22 Nov 2023 12:58:20 +0100 Subject: [PATCH 043/175] benches: update for `become_validator` --- benches/txs.rs | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/benches/txs.rs b/benches/txs.rs index 97a4e16945..f41ca0c896 100644 --- a/benches/txs.rs +++ b/benches/txs.rs @@ -25,11 +25,11 @@ use namada::ibc::core::ics24_host::identifier::{ ClientId, ConnectionId, PortId, }; use namada::ledger::eth_bridge::read_native_erc20_address; -use namada::ledger::storage_api::StorageRead; +use namada::ledger::storage_api::{StorageRead, StorageWrite}; use namada::proof_of_stake::types::SlashType; use namada::proof_of_stake::{self, read_pos_params, KeySeg}; use namada::proto::{Code, Section}; -use namada::types::address::Address; +use namada::types::address::{self, Address}; use namada::types::eth_bridge_pool::{GasFee, PendingTransfer}; use namada::types::hash::Hash; use namada::types::key::{ed25519, secp256k1, PublicKey, RefTo}; @@ -586,8 +586,9 @@ fn vote_proposal(c: &mut Criterion) { group.finish(); } -fn init_validator(c: &mut Criterion) { +fn become_validator(c: &mut Criterion) { let mut csprng = rand::rngs::OsRng {}; + let address = address::testing::established_address_1(); let consensus_key_sk = ed25519::SigScheme::generate(&mut csprng) .try_to_sk::() .unwrap(); @@ -612,22 +613,8 @@ fn init_validator(c: &mut Criterion) { let protocol_key = protocol_key_sk.to_public(); let shell = BenchShell::default(); - let validator_vp_code_hash: Hash = shell - .read_storage_key(&Key::wasm_hash(VP_USER_WASM)) - .unwrap(); - let extra_section = Section::ExtraData(Code::from_hash( - validator_vp_code_hash, - Some(VP_USER_WASM.to_string()), - )); - let extra_hash = Hash( - extra_section - .hash(&mut sha2::Sha256::new()) - .finalize_reset() - .into(), - ); let data = BecomeValidator { - account_keys: vec![defaults::albert_keypair().to_public()], - threshold: 1, + address: address.clone(), consensus_key, eth_cold_key, eth_hot_key, @@ -638,13 +625,12 @@ fn init_validator(c: &mut Criterion) { description: None, website: None, discord_handle: None, - validator_vp_code_hash: extra_hash, }; let tx = shell.generate_tx( TX_BECOME_VALIDATOR_WASM, data, None, - Some(vec![extra_section]), + None, vec![ &defaults::albert_keypair(), &consensus_key_sk, @@ -654,9 +640,22 @@ fn init_validator(c: &mut Criterion) { ], ); - c.bench_function("init_validator", |b| { + c.bench_function("become_validator", |b| { b.iter_batched_ref( - BenchShell::default, + || { + let mut shell = BenchShell::default(); + // Initialize the account to be able to use it + shell + .wl_storage + .write_bytes( + &namada::types::storage::Key::validity_predicate( + &address, + ), + vec![], + ) + .unwrap(); + shell + }, |shell| shell.execute_tx(&tx), criterion::BatchSize::SmallInput, ) @@ -1089,7 +1088,7 @@ criterion_group!( init_account, init_proposal, vote_proposal, - init_validator, + become_validator, change_validator_commission, ibc, unjail_validator, From 4b3fe18739c6cacfeadb4d75eb9939f8b5666828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 22 Nov 2023 13:52:04 +0100 Subject: [PATCH 044/175] changelog: add #2208 --- .../improvements/2208-init-validator-wo-account.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changelog/unreleased/improvements/2208-init-validator-wo-account.md diff --git a/.changelog/unreleased/improvements/2208-init-validator-wo-account.md b/.changelog/unreleased/improvements/2208-init-validator-wo-account.md new file mode 100644 index 0000000000..f12ec7704f --- /dev/null +++ b/.changelog/unreleased/improvements/2208-init-validator-wo-account.md @@ -0,0 +1,9 @@ +- A new `tx_become_validator` replaces `tx_init_validator`. This tx doesn't + initialize a new account and instead it modifies an existing established + address to become a validator. This currently requires that there are no + delegations on the source account before it can become a validator (if there + are some, they have to be unbonded, but they don't have to be withdrawn). + A new client command `become-validator` is added that requires an `--address`. + The client command `init-validator` is kept for convenience and updated to + send `tx_init_account` tx before `tx_become_validator`. + ([\#2208](https://github.com/anoma/namada/pull/2208)) \ No newline at end of file From 127c8188c81e651f0f2fbeab5a1c178ff433fd6d Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 22 Nov 2023 13:38:09 -0800 Subject: [PATCH 045/175] cli: fix metadata args to validator initialization txs --- apps/src/lib/cli.rs | 44 ++++++++------------------------------------ 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index f6ac24a6fd..412f289789 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -4147,24 +4147,10 @@ pub mod args { Expressed as a decimal between 0 and 1. This is a \ required parameter.", )) - .arg(EMAIL_OPT.def().help( - "The desired new validator email. To remove the existing \ - email, pass an empty string to this argument.", - )) - .arg(DESCRIPTION_OPT.def().help( - "The desired new validator description. To remove the \ - existing description, pass an empty string to this \ - argument.", - )) - .arg(WEBSITE_OPT.def().help( - "The desired new validator website. To remove the \ - existing website, pass an empty string to this argument.", - )) - .arg(DISCORD_OPT.def().help( - "The desired new validator discord handle. To remove the \ - existing discord handle, pass an empty string to this \ - argument.", - )) + .arg(EMAIL.def().help("The validator's email.")) + .arg(DESCRIPTION_OPT.def().help("The validator's description.")) + .arg(WEBSITE_OPT.def().help("The validator's website.")) + .arg(DISCORD_OPT.def().help("The validator's discord handle.")) .arg(VALIDATOR_CODE_PATH.def().help( "The path to the validity predicate WASM code to be used \ for the validator account. Uses the default validator VP \ @@ -4305,24 +4291,10 @@ pub mod args { Expressed as a decimal between 0 and 1. This is a \ required parameter.", )) - .arg(EMAIL_OPT.def().help( - "The desired new validator email. To remove the existing \ - email, pass an empty string to this argument.", - )) - .arg(DESCRIPTION_OPT.def().help( - "The desired new validator description. To remove the \ - existing description, pass an empty string to this \ - argument.", - )) - .arg(WEBSITE_OPT.def().help( - "The desired new validator website. To remove the \ - existing website, pass an empty string to this argument.", - )) - .arg(DISCORD_OPT.def().help( - "The desired new validator discord handle. To remove the \ - existing discord handle, pass an empty string to this \ - argument.", - )) + .arg(EMAIL.def().help("The validator's email.")) + .arg(DESCRIPTION_OPT.def().help("The validator's description.")) + .arg(WEBSITE_OPT.def().help("The validator's website.")) + .arg(DISCORD_OPT.def().help("The validator's discord handle.")) .arg(VALIDATOR_CODE_PATH.def().help( "The path to the validity predicate WASM code to be used \ for the validator account. Uses the default validator VP \ From 0863e04143c03611c58b9e2b259caf3f1b226fa6 Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 22 Nov 2023 13:17:39 -0800 Subject: [PATCH 046/175] cli: fix help and err messages --- apps/src/lib/cli.rs | 2 +- apps/src/lib/client/tx.rs | 10 +++++----- proof_of_stake/src/lib.rs | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 412f289789..0bab1938cb 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -1434,7 +1434,7 @@ pub mod cmds { fn def() -> App { App::new(Self::CMD) .about( - "Send a signed transaction to create a established \ + "Send a signed transaction to create an established \ account and then become a validator.", ) .add_args::>() diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index af0ac2de83..7f2f2f930b 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -518,8 +518,8 @@ pub async fn submit_become_validator<'a>( if !address.is_established() { edisplay_line!( namada.io(), - "The given address {address} is not established. Only established \ - address can become a validator.", + "The given address {address} is not established. Only an \ + established address can become a validator.", ); if !tx_args.force { safe_exit(1) @@ -557,7 +557,7 @@ pub async fn submit_become_validator<'a>( edisplay_line!( namada.io(), "The validator commission rate must not exceed 1.0 or 100%, and \ - it must be 0 or positive" + it must be 0 or positive." ); if !tx_args.force { safe_exit(1) @@ -569,7 +569,7 @@ pub async fn submit_become_validator<'a>( edisplay_line!( namada.io(), "The validator maximum change in commission rate per epoch must \ - not exceed 1.0 or 100%" + not exceed 1.0 or 100%, and it must be 0 or positive." ); if !tx_args.force { safe_exit(1) @@ -579,7 +579,7 @@ pub async fn submit_become_validator<'a>( if email.is_empty() { edisplay_line!( namada.io(), - "The validator email must not be an empty string" + "The validator email must not be an empty string." ); if !tx_args.force { safe_exit(1) diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 6e77eb4c04..4ab419905b 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -2764,8 +2764,8 @@ where if !address.is_established() { return Err(storage_api::Error::new_const( - "The given address {address} is not established. Only established \ - address can become a validator.", + "The given address {address} is not established. Only an \ + established address can become a validator.", )); } From 8159327a0296aa766bf009aad6e317fca7f3772d Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 22 Nov 2023 14:19:31 -0800 Subject: [PATCH 047/175] fix docstrings --- apps/src/lib/client/rpc.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 27b4f95c3e..788e54a80b 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -2288,7 +2288,7 @@ pub async fn get_public_key( rpc::get_public_key_at(client, address, index).await } -/// Check if the given address is a known validator. +/// Check if the given address has any bonds. pub async fn is_validator( client: &C, address: &Address, @@ -2318,7 +2318,7 @@ pub async fn is_delegator_at( .unwrap() } -/// Check if the given address is a known validator. +/// Check if the given address has any bonds. pub async fn has_bonds( client: &C, address: &Address, From ff68f7b85d84671b59d0e7e767dc8ff3bc986469 Mon Sep 17 00:00:00 2001 From: yito88 Date: Thu, 23 Nov 2023 22:42:43 +0100 Subject: [PATCH 048/175] remove unneeded write --- apps/src/lib/node/ledger/storage/mod.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/src/lib/node/ledger/storage/mod.rs b/apps/src/lib/node/ledger/storage/mod.rs index 2fd1fc5aa8..0a433fd8f6 100644 --- a/apps/src/lib/node/ledger/storage/mod.rs +++ b/apps/src/lib/node/ledger/storage/mod.rs @@ -620,9 +620,6 @@ mod tests { let bytes = types::encode(&nonce); storage.write(&bp_nonce_key, bytes).unwrap(); - let bytes = types::encode(&Uint::default()); - storage.write(&bp_nonce_key, bytes).unwrap(); - storage.block.epoch = storage.block.epoch.next(); storage.block.pred_epochs.new_epoch(BlockHeight(6)); let batch = PersistentStorage::batch(); From 6974b5d115af59325ceee9b8ebbaa5fb4e57302e Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Fri, 24 Nov 2023 08:10:22 +0200 Subject: [PATCH 049/175] Made the key not found error more informative by embedding alias inside. Corrected extend_from_pre_genesis_validator to also extend public keys. --- apps/src/lib/cli/wallet.rs | 2 +- apps/src/lib/config/genesis/transactions.rs | 2 +- apps/src/lib/wallet/mod.rs | 5 +- sdk/src/wallet/mod.rs | 30 +++++++----- sdk/src/wallet/store.rs | 12 +++-- wasm/checksums.json | 50 ++++++++++---------- wasm_for_tests/tx_fail.wasm | Bin 387383 -> 369591 bytes wasm_for_tests/tx_memory_limit.wasm | Bin 438268 -> 420689 bytes wasm_for_tests/tx_no_op.wasm | Bin 387544 -> 369602 bytes wasm_for_tests/tx_proposal_code.wasm | Bin 440466 -> 418158 bytes wasm_for_tests/tx_read_storage_key.wasm | Bin 442958 -> 426327 bytes wasm_for_tests/tx_write.wasm | Bin 449600 -> 431030 bytes wasm_for_tests/vp_always_false.wasm | Bin 409829 -> 392260 bytes wasm_for_tests/vp_always_true.wasm | Bin 409795 -> 392414 bytes wasm_for_tests/vp_eval.wasm | Bin 483964 -> 466354 bytes wasm_for_tests/vp_memory_limit.wasm | Bin 462210 -> 444449 bytes wasm_for_tests/vp_read_storage_key.wasm | Bin 469245 -> 448693 bytes 17 files changed, 55 insertions(+), 46 deletions(-) diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index 4d22365f80..c0dcecd751 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -135,7 +135,7 @@ fn address_key_find( Ok(spending_key) => { display_line!(io, "Spending key: {}", spending_key) } - Err(FindKeyError::KeyNotFound) => {} + Err(FindKeyError::KeyNotFound(_)) => {} Err(err) => edisplay_line!(io, "{}", err), } } diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index d457ef87f5..d1f9fb8655 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -345,7 +345,7 @@ pub fn sign_delegation_bond_tx( }; let source_key = match found_key { Ok(key) => key, - Err(FindKeyError::KeyNotFound) => { + Err(FindKeyError::KeyNotFound(_)) => { // If it's not in the wallet, it must be an established account // so we need to look-up its public key first let pk = established_accounts diff --git a/apps/src/lib/wallet/mod.rs b/apps/src/lib/wallet/mod.rs index 140a85f69d..6c1034c994 100644 --- a/apps/src/lib/wallet/mod.rs +++ b/apps/src/lib/wallet/mod.rs @@ -223,12 +223,13 @@ where { maybe_pk .map(|pk| { + let pkh = PublicKeyHash::from(&pk); wallet // TODO: optionally encrypt validator keys - .find_key_by_pkh(&PublicKeyHash::from(&pk), None) + .find_key_by_pkh(&pkh, None) .ok() .or_else(|| wallet.get_validator_data().map(extract_key)) - .ok_or(FindKeyError::KeyNotFound) + .ok_or_else(|| FindKeyError::KeyNotFound(pkh.to_string())) }) .transpose() } diff --git a/sdk/src/wallet/mod.rs b/sdk/src/wallet/mod.rs index 28b25c1076..3fd5579a35 100644 --- a/sdk/src/wallet/mod.rs +++ b/sdk/src/wallet/mod.rs @@ -254,8 +254,8 @@ fn gen_spending_key( #[derive(Error, Debug)] pub enum FindKeyError { /// Could not find a given key in the wallet - #[error("No matching key found")] - KeyNotFound, + #[error("No key matching {0} found")] + KeyNotFound(String), /// Could not decrypt a given key in the wallet #[error("{0}")] KeyDecryptionError(keys::DecryptionError), @@ -403,9 +403,9 @@ impl Wallet { &mut self, alias: impl AsRef, ) -> Result<&ExtendedViewingKey, FindKeyError> { - self.store - .find_viewing_key(alias.as_ref()) - .ok_or(FindKeyError::KeyNotFound) + self.store.find_viewing_key(alias.as_ref()).ok_or_else(|| { + FindKeyError::KeyNotFound(alias.as_ref().to_string()) + }) } /// Find the payment address with the given alias in the wallet and return @@ -688,7 +688,9 @@ impl Wallet { let stored_key = self .store .find_secret_key(alias_pkh_or_pk.as_ref()) - .ok_or(FindKeyError::KeyNotFound)?; + .ok_or_else(|| { + FindKeyError::KeyNotFound(alias_pkh_or_pk.as_ref().to_string()) + })?; Self::decrypt_stored_key::<_>( &mut self.decrypted_key_cache, stored_key, @@ -705,7 +707,9 @@ impl Wallet { self.store .find_public_key(alias_or_pkh.as_ref()) .cloned() - .ok_or(FindKeyError::KeyNotFound) + .ok_or_else(|| { + FindKeyError::KeyNotFound(alias_or_pkh.as_ref().to_string()) + }) } /// Find the spending key with the given alias in the wallet and return it. @@ -726,7 +730,9 @@ impl Wallet { let stored_spendkey = self .store .find_spending_key(alias.as_ref()) - .ok_or(FindKeyError::KeyNotFound)?; + .ok_or_else(|| { + FindKeyError::KeyNotFound(alias.as_ref().to_string()) + })?; Self::decrypt_stored_key::<_>( &mut self.decrypted_spendkey_cache, stored_spendkey, @@ -756,7 +762,7 @@ impl Wallet { ) -> Result { self.store .find_path_by_pkh(pkh) - .ok_or(FindKeyError::KeyNotFound) + .ok_or_else(|| FindKeyError::KeyNotFound(pkh.to_string())) } /// Find the public key by a public key hash. @@ -770,7 +776,7 @@ impl Wallet { self.store .find_public_key_by_pkh(pkh) .cloned() - .ok_or(FindKeyError::KeyNotFound) + .ok_or_else(|| FindKeyError::KeyNotFound(pkh.to_string())) } /// Find the stored key by a public key hash. @@ -795,7 +801,7 @@ impl Wallet { let stored_key = self .store .find_key_by_pkh(pkh) - .ok_or(FindKeyError::KeyNotFound)?; + .ok_or_else(|| FindKeyError::KeyNotFound(pkh.to_string()))?; Self::decrypt_stored_key( &mut self.decrypted_key_cache, stored_key, @@ -830,7 +836,7 @@ impl Wallet { decrypted_key_cache .get(&alias) .cloned() - .ok_or(FindKeyError::KeyNotFound) + .ok_or_else(|| FindKeyError::KeyNotFound(alias.to_string())) } StoredKeypair::Raw(raw) => Ok(raw.clone()), } diff --git a/sdk/src/wallet/store.rs b/sdk/src/wallet/store.rs index 980aa6ae70..4211af3ccc 100644 --- a/sdk/src/wallet/store.rs +++ b/sdk/src/wallet/store.rs @@ -631,15 +631,17 @@ impl Store { let account_pk = other.account_key.ref_to(); let consensus_pk = other.consensus_key.ref_to(); let tendermint_node_pk = other.tendermint_node_key.ref_to(); - let addresses = [ - (account_key_alias.clone(), (&account_pk).into()), - (consensus_key_alias.clone(), (&consensus_pk).into()), + let public_keys = [ + (account_key_alias.clone(), account_pk.clone()), + (consensus_key_alias.clone(), consensus_pk.clone()), ( tendermint_node_key_alias.clone(), - (&tendermint_node_pk).into(), + tendermint_node_pk.clone(), ), ]; - self.addresses.extend(addresses.into_iter()); + self.public_keys.extend(public_keys.clone().into_iter()); + self.addresses + .extend(public_keys.into_iter().map(|(k, v)| (k, (&v).into()))); let pkhs = [ ((&account_pk).into(), account_key_alias), diff --git a/wasm/checksums.json b/wasm/checksums.json index 8c94ff7a0d..36e9aca5e6 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,27 +1,27 @@ { - "tx_bond.wasm": "tx_bond.a660b13a79bd5c50c75a055ab4fed8eddb1cc2ae6d93e5505fbeb876b307fc49.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.9564137202b291bd8930410700a5b0e08a1949bb4f79da5ee3e3dc9654266f4d.wasm", - "tx_change_consensus_key.wasm": "tx_change_consensus_key.4d2de1a762b4575925222fdeacadada429896a93fe3586f41657f247480161d9.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.457abeb00c021822e54674b77ae97535620555707efd2029e52b0d4335a32b55.wasm", - "tx_change_validator_metadata.wasm": "tx_change_validator_metadata.b56e2fbaefe19800d8a6d989883ab0ceac439bdeac96fb1299f6aa2ce424e521.wasm", - "tx_claim_rewards.wasm": "tx_claim_rewards.c4fc5d2ace6b0ee785f12f90a6cc600e3a0a8f19f7237ecf9374a32ba27eb99e.wasm", - "tx_deactivate_validator.wasm": "tx_deactivate_validator.c7cb406926241ffaa5df56e43c8cc43854bdcb0ea565144f63b6a3e2eb697a96.wasm", - "tx_ibc.wasm": "tx_ibc.14568fef2ec08752b87ec97cb2c87b76adec72e6eeea771274948d7c7ddb92a8.wasm", - "tx_init_account.wasm": "tx_init_account.0017279b252083d2d337d943bf84251d3f8223756ecfd9648e7ce66305c45796.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.cb9d7a33dd9a37675dd1d9cb761f3f87a48728eae38f377a623c0b8f9a97b612.wasm", - "tx_init_validator.wasm": "tx_init_validator.53fefa66ce6351d6b3e7de7a2c993bd4435fbd478b66caecf5c588b5efdcf669.wasm", - "tx_reactivate_validator.wasm": "tx_reactivate_validator.6a40f8daebdd6b9f6bcc9ab88686b40bb7a7882443cd07443c0795a3fae27cb5.wasm", - "tx_redelegate.wasm": "tx_redelegate.ded70e2609371fc9d81de875cf44b0ec60757fb46f61f23a26418cfa9f437b0f.wasm", - "tx_resign_steward.wasm": "tx_resign_steward.a881ed70174b53a15402cbbe6e64200f72431ec73604f7b173fd77ea80b5aedb.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.fbe760707aa0559c898cee47c91a5c7d0bc4b2f545cb47cc459ddcb8f97c455e.wasm", - "tx_transfer.wasm": "tx_transfer.aef75ec63198e4e6f95307a55e53fd0440448caf46617047f7a7557a7a2f1f4e.wasm", - "tx_unbond.wasm": "tx_unbond.1fd257addac3d91d77e1ae334b9394085335075581a6500ce2364cd403d028e9.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.ba0e378bb48d5ba577dd898e618478c917e80ee11e46f79b00bb72fea4f91c28.wasm", - "tx_update_account.wasm": "tx_update_account.aa4ef57619b8b7c7c3849fa71873448808f7342fcc8d612e4b5e688a708a174a.wasm", - "tx_update_steward_commission.wasm": "tx_update_steward_commission.e7bf45b9039a5b4ef399fe926a4b56e035e9a7eedc4fdd59fc89210b4a8bbf74.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.4b39fd9c6ccc8a9537a295d154a8b9e60b8d135fe995276a01d714bc8097be6a.wasm", - "tx_withdraw.wasm": "tx_withdraw.2f6bf8c3cafbd5d987849db1583bd63e10bbe06193f619859caa80ab10f2e2a9.wasm", - "vp_implicit.wasm": "vp_implicit.262b8660014cd140bcbbef2d187863160678cb0034903257815dc08d947b03fa.wasm", - "vp_user.wasm": "vp_user.d66a3a289c9c9e6353a2741335775eab1487e2e7ee4b8baa69d32e73083363d3.wasm", - "vp_validator.wasm": "vp_validator.d89911d9c27b2e0926499623cc88ee35c4396c8ef0563f897386ff431c8148e7.wasm" + "tx_bond.wasm": "tx_bond.8738a65235424fee316bcdcb778630e23427c9fbc2c478e8e19a45035d02d0b9.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.47c47662a9dc5ddcd0c2c257f9670d450f2ffe34e6afca16b978b3b1a13900d5.wasm", + "tx_change_consensus_key.wasm": "tx_change_consensus_key.72bae3002ed1d0b308cf465ca18e683eae91b314b7e8ac8f5ce15a6345dd6952.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.ad86c86385047e2574f6491fdefef2fa058631e73fb7f2b5894620bf13b427fb.wasm", + "tx_change_validator_metadata.wasm": "tx_change_validator_metadata.09570fa077eedf6b50c4cdcfb20d77e45c6a27876741dfbce0f26b8f4e42affd.wasm", + "tx_claim_rewards.wasm": "tx_claim_rewards.9b7d89bd7ce07b299115da6c9e4e38f6aa14562bf58508885f23c5d6829ca920.wasm", + "tx_deactivate_validator.wasm": "tx_deactivate_validator.f3b39bb8f7b52ec0d20c0ee7f1853ddf916959a1e29fe3d4705645cd52f44c5a.wasm", + "tx_ibc.wasm": "tx_ibc.cdc79f1e9dfedbacf06a0db0471f86d4ee78b78e63cc349c4d346bd2c0046c79.wasm", + "tx_init_account.wasm": "tx_init_account.7abb77505300309f0c7d9c25e0a4e0576075d70ca1de52e9fe52d47a3ccf6489.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.9b63a3f70537a41bee82add2154586db3eac0b1f9f5e02f34e6521f7f841dd5f.wasm", + "tx_init_validator.wasm": "tx_init_validator.401575bb26daf0efb4526286816260e140c6673b85f9ae4e34ffb53e42676027.wasm", + "tx_reactivate_validator.wasm": "tx_reactivate_validator.78774e67aa69990d4344c43542ef0d966a2eeb0b602e046a710851b65ed577af.wasm", + "tx_redelegate.wasm": "tx_redelegate.2070c97cb4c7fefb4c53479effdcadd8e966d4710ee7e2bf52180799757e36f2.wasm", + "tx_resign_steward.wasm": "tx_resign_steward.b0097f8e9e44f684415d2dbb6094d3ff79f442114cc750494523f4513b9836fe.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8d4e200830a9f603d647799fafdbf1946e07a038a67cfa09d4eeb31c80c774ce.wasm", + "tx_transfer.wasm": "tx_transfer.db70a50989adbee063033f431d751d191a1547b6879f4912a6bb73a61d53518e.wasm", + "tx_unbond.wasm": "tx_unbond.e88109da453c72395f22386de59f7525202df99f0c6de287df4df27a10938753.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.90a48e8c5dac021bda49b31c4101d92f162eb27d9e6e24390460ef20033e1066.wasm", + "tx_update_account.wasm": "tx_update_account.240313672ed1fac1c01767f5099c8b7b6431591046b264f184f41eb0445cf343.wasm", + "tx_update_steward_commission.wasm": "tx_update_steward_commission.d7c9c4ebe58d11943ec1f3f410f7031f447a3396c5c3d40c90a1211f03899a3b.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.75715379f4efb91872542fbf0fc7ea5c1f329a1b0fad357fd67580b51019497f.wasm", + "tx_withdraw.wasm": "tx_withdraw.6e4a75619277da40b3a5e569c5bb0905691f3d1c8e0c5997a4d652a852bfefd7.wasm", + "vp_implicit.wasm": "vp_implicit.83b85caa5ff2030587e0e6f39863414c34414bf661146fa2e319bfc8bbf4241d.wasm", + "vp_user.wasm": "vp_user.845bb56a3ad3b388e7c1d4fc57f7bb72d0844aae2c725e08ea0d747243e1100d.wasm", + "vp_validator.wasm": "vp_validator.1e624e89b31c319a2ceafc775f32ebcb3b904f60459fa128cd2a2c5c266c643c.wasm" } \ No newline at end of file diff --git a/wasm_for_tests/tx_fail.wasm b/wasm_for_tests/tx_fail.wasm index f6406827b4d0415e3378f6e2d576e8eb29d2a2d0..06c7475a6041d16e4d564b8f4ecda73c76fea32d 100755 GIT binary patch delta 51514 zcmce931Ae((*Jb#?9R?^j?H~1n~)O{2=^&4;Z(UrK|uu()S!TXilQbeAV^Sf!A3#A z6Ht(7kVQodii&^|2m&e!`VfPHq9URO`2Tv2%_PA4;Jxqr56t#-cXf4jb#--hbB#PV^RcVlu|{ZZkZ4#;0Tc-#jlG*MH5+dDMVa=#($?XMvnnZ;Iv<{l=?@J*tj_0 zbLcpMR)hqBC*J=!iFYs+&;Hj))699BBu|N?Rf$k(E<5iSeaHBT_fko{apZ&vx8Hl? z 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 Y0>r3Haorx-nb|bBUls@VXZLjf2ZJye!2kdN delta 69266 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 vgxDeTo#x%D^Tz)8u`KWB}%7G#aLo67$m+x41M diff --git a/wasm_for_tests/tx_memory_limit.wasm b/wasm_for_tests/tx_memory_limit.wasm index efc2fb7bd7ec79a7353bec78d6205845e00e2686..77c8164050898f8c1e6542e988c52765786c5cf8 100755 GIT binary patch delta 56168 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 z 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 delta 73450 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 IH8}kL0AUP|IRF3v diff --git a/wasm_for_tests/tx_no_op.wasm b/wasm_for_tests/tx_no_op.wasm index cf752705ea14e2ec079c5c2bbb65a335545b7849..fdc961842134be3440731aad78827345fd541478 100755 GIT binary patch delta 47927 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
    !YI#D9 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 LS$u!iHRJvlnUoc| diff --git a/wasm_for_tests/tx_proposal_code.wasm b/wasm_for_tests/tx_proposal_code.wasm index 022b5cef965c155190aed222f232fa0431985465..d5cc51093b5c1014ff3682243276c2c8370ccbe3 100755 GIT binary patch delta 78113 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 a4L@x*3`M9)6%h~x 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 delta 119175 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 diff --git a/wasm_for_tests/tx_write.wasm b/wasm_for_tests/tx_write.wasm index 40cdb973717b689aa500da2904cbd198da6c35dc..d02b5159d0fc4ad255b5cab2e5992590db59dba8 100755 GIT binary patch delta 69656 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 delta 88385 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

    ~8_T-o{8~cA2V}lj?Kl5+ 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 Q)`|k{nU)!A#f;GZ1MgM(TmS$7 diff --git a/wasm_for_tests/vp_always_false.wasm b/wasm_for_tests/vp_always_false.wasm index bbeaa24274e2a2d44755f47af56b41f1c227afaa..14cba7c52f889d17ad21a5f3b2e3e9b59fcc9b77 100755 GIT binary patch delta 55014 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 delta 72531 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ⅆ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"pE|6EPaO_~PaWY8pQv9)=<)LoxqDf%vGlE@A?c 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 CMHe{$ diff --git a/wasm_for_tests/vp_always_true.wasm b/wasm_for_tests/vp_always_true.wasm index 90ea4c6fc4d86c1a82722295a2d80b396e124b24..573766ea90db5911972e861fa5dccfc4981177ce 100755 GIT binary patch delta 59351 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 delta 77116 zcmd44cVJXS7dL!o?%kSfvMHNhHUUCHuc4O<(mNtWK*61ud$Br|*==8G zon#-d51I4yCy`&Xx4F#x2lxuUbDO`PJc(Y1~WJhk*^|5NVz?5KaPJBw* z@Hr?k*>8=Tj8s`%RsXuUx>~Bg_F2W>J-)A=Dmff)r$R3#CHt=?Oh9T-;yAwVrvIJ9 znPA)|X|$GkN=H@oznI(;=--m}5Mo!#bO6;-X9gL(mYNAME~M50$CBvuUm3er;>!4z z$6WlqR8kwEO{b+i_4LmGZu(u7r<=9N|E5K*R@5R_p~d3LEm)cVYUQ^Q%3z_{97+r4 zt-Xqu!34tdRP^uBD${E3T)JOUt?uj$DNH3oFVE)Txm*foWGaNo<#sRkN-CeOmM!y7 z%=#5ASX(vGKd)*ML| zH1KqdsnNkEay2_oJ({nzFstTAtmvg$Uu#Blx%MJ+bN`jmY^Xy;H`Gh$=VjSk$+WjqT6=k$dHMJ&DzrC}`$Gk= zF?^yk+)gjgkvnE8&u23AFE&M0I=D!eW#}iVDU6x7ks8Sz!!2P@v0Y{3GOhlo`bj=Z zQ_03#oB#7#B4mkiS<|qTmuWGVM^R5Fms8{68JEkc!(`P1Lzlc3q+;`GN_ur(IY$ad zjr5i?6t7%cVi{JiTvG}Q4+~SJ3=2u;Lj~4`479L6UAP2a2K~z)f-_C`e%i)8N8F7nDhmq+* zrpa1og3mS0T5poILd{lC`sB%(wl;sU`E8Wmu5e;^UZa88!jLkVX1QwXab7*;h3X5m zrl8*%$&Jw{Mg*?gOxd+&v2>=de9DDR44&2rA?iJ7A#FmxeHpdBrRnxXf7q9 z{W)?1n&PCo|4;O3)AR`@((&@=gL zWOkeyt955+AZc>ta139xmlTglv8FUI10%k+G$6yOI?!H>YqPdNsU}b@jmvc{CzPw& zMm1Gbbwgd(ZgjPl3h7$WHLS}o!`*7Swy6=Q*5-dTw~@~l2LEi=M)dzIJqdz3sokL# zJN15p!WuWC3cX4rDN*aR#^|&e?a5aV^Fd<2*rZ~xKYs3`|K`LaxYaUTjU1(;GY^TsdQZ0F2 zo5<+MV-l?tdq^1hnkIB5kX8yyRy1zIdD*Ix51Tp|$MklgS)E928l*uV_G@G$^NIcI zc)ZxKj$2BaH-Et9J@h^eemD5h+?mT0sCt?tC7Omep74Lr_8Mm1x9+Ipc$=Ee^1`|Q z{2g&I284!a25NJc`Lo+quSgYw7?lYRmI+g1-EWtyZMRs#^p@TEb9{z(8P!sJXNsf} z^3)Y(7?IXuGYsM8nc-jk#a&ur⁢+Syo)~Uf0Gv?dDZeqz3wHfOCvU?UMNTZjJ&X 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,?m~o6BI){>AcT7L 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

    &x}D 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 Rc{%P=)XnV|=D2_B{{KYQ9v1)r diff --git a/wasm_for_tests/vp_memory_limit.wasm b/wasm_for_tests/vp_memory_limit.wasm index 5c91e6113c678741e0ce50aabdeb9c3af532e830..50f47cf81cbf4d7520c6de0f7489d1bf8fe225ff 100755 GIT binary patch delta 64695 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 z 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̶+=?+~R#A?afkojY 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 diff --git a/wasm_for_tests/vp_read_storage_key.wasm b/wasm_for_tests/vp_read_storage_key.wasm index 7665fa7e39d74c8ff4470db4e9852f229146fcdc..8b1ee071b914dbc384406e3aa51c5342491898ae 100755 GIT binary patch delta 75673 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 delta 95883 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

      Hj&ssW92QsqtD` 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 From 970c1803ec80e7eda3b40b6e106fa454e59224b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Fri, 24 Nov 2023 09:24:40 +0100 Subject: [PATCH 050/175] fixup! Merge branch 'tomas/combine-user-validator-vp' (#2202) --- ...D6D32B22A46CEDD254F52B6C69E813898FE60B.bin | Bin 0 -> 10382 bytes ...A57D1F470F585C2F4633E5103CB67AE2726938.bin | Bin 0 -> 7448 bytes ...13CAF693649A17FBEE435298C9C1624C6060F2.bin | Bin 0 -> 7448 bytes ...5DB11F0B17E6564F3AA56244770F24B56FC18B.bin | Bin 0 -> 7448 bytes ...3F779253B53A9A0BD62FD3DF8F6FCF4AF1E145.bin | Bin 17018 -> 0 bytes ...BF9BC175A70082068C8785BDDBF49DCCA4BE66.bin | Bin 7448 -> 0 bytes ...BD9698F791D337CEF8DE82C684C1A1279D772E.bin | Bin 0 -> 9649 bytes ...2279865699251D54141F79A4989D5343D72681.bin | Bin 0 -> 7448 bytes ...92A006D0519A21D3F1D72D7D930324584CD2DE.bin | Bin 0 -> 9941 bytes ...C89879834677F926130D56EB5E4067728EB5CF.bin | Bin 10382 -> 0 bytes ...BE50202AF004DFD895A721EDA284D96B253ACC.bin | Bin 7448 -> 0 bytes ...1508A065BC804ED18DA58F0064137E1251EED.bin} | Bin 9941 -> 9941 bytes ...3CEA99A9BC66B2BAB03D4ABA1AE57B12596061.bin | Bin 7448 -> 0 bytes ...F136D4522BAFC99E0E81FD54A28A38E8419CFC.bin | Bin 20518 -> 0 bytes ...596406702B1323505211981C8DABB0FDC6B41B.bin | Bin 0 -> 24494 bytes ...6D2CF14C7F9E90A8588BA75DA0D2860F36E2CB.bin | Bin 9649 -> 0 bytes ...396732D2EBF77728D2772EB251123DF2CEF6A1.bin | Bin 9941 -> 0 bytes ...5CF776D5DE7C9153D67B7FDF22ED6F35558738.bin | Bin 24494 -> 0 bytes ...DBA1FDB2515DF33D43611F2860B8D3C178B474.bin | Bin 7448 -> 0 bytes ...0F348721EF5366FDD8E62B9062254B2D286E0F.bin | Bin 0 -> 15257 bytes ...57D436A33F919BC377C8C6EE7A8DC8D210A6D9.bin | Bin 0 -> 17018 bytes ...D2D1A30B9CFAD55AA750B6CC36A4BD55D6BD2B.bin | Bin 0 -> 15597 bytes ...6C8B75587507CA52981F48FD1FC9C5BE0BEE43.bin | Bin 15257 -> 0 bytes ...AF47822630FC911AF7F91B196C540372EC0E8.bin} | Bin 7448 -> 7448 bytes 24 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test_fixtures/masp_proofs/0075192A544500F2AD0C92E1A2D6D32B22A46CEDD254F52B6C69E813898FE60B.bin create mode 100644 test_fixtures/masp_proofs/341E00D564C672701199B58E69A57D1F470F585C2F4633E5103CB67AE2726938.bin create mode 100644 test_fixtures/masp_proofs/4F74C729C8F775EF554F4475BD13CAF693649A17FBEE435298C9C1624C6060F2.bin create mode 100644 test_fixtures/masp_proofs/51034B90AF95B8899A631D37B45DB11F0B17E6564F3AA56244770F24B56FC18B.bin delete mode 100644 test_fixtures/masp_proofs/51EF94B13138B91DB3081F95193F779253B53A9A0BD62FD3DF8F6FCF4AF1E145.bin delete mode 100644 test_fixtures/masp_proofs/544F7432B95E26E312105FB804BF9BC175A70082068C8785BDDBF49DCCA4BE66.bin create mode 100644 test_fixtures/masp_proofs/5F7D9B39ABA3A1CF6A124CFC26BD9698F791D337CEF8DE82C684C1A1279D772E.bin create mode 100644 test_fixtures/masp_proofs/650AB811C362FB33B9190DDA9D2279865699251D54141F79A4989D5343D72681.bin create mode 100644 test_fixtures/masp_proofs/68380B89FFFC47364F7AA8D3F992A006D0519A21D3F1D72D7D930324584CD2DE.bin delete mode 100644 test_fixtures/masp_proofs/6DD5A788D36258E9D5FEF454DBC89879834677F926130D56EB5E4067728EB5CF.bin delete mode 100644 test_fixtures/masp_proofs/6E92D0B97A65FB5ADFA6371A6CBE50202AF004DFD895A721EDA284D96B253ACC.bin rename test_fixtures/masp_proofs/{B947FEFC6EC94A041657FF3A9420D5BB3FDEB1199EF712C059C80C4DBF6F3ED8.bin => 75FB5C5ECE98BF9246CED847F2F1508A065BC804ED18DA58F0064137E1251EED.bin} (54%) delete mode 100644 test_fixtures/masp_proofs/8032CA7B951C625E43F48AEBD53CEA99A9BC66B2BAB03D4ABA1AE57B12596061.bin delete mode 100644 test_fixtures/masp_proofs/8A79BF5E0292339E70287DB626F136D4522BAFC99E0E81FD54A28A38E8419CFC.bin create mode 100644 test_fixtures/masp_proofs/A14785AC0F54CDB43F6DCE5AFB596406702B1323505211981C8DABB0FDC6B41B.bin delete mode 100644 test_fixtures/masp_proofs/A8A9963AC2983B576BAE4DE9BA6D2CF14C7F9E90A8588BA75DA0D2860F36E2CB.bin delete mode 100644 test_fixtures/masp_proofs/AEA19C9B07742FF5F6D759B171396732D2EBF77728D2772EB251123DF2CEF6A1.bin delete mode 100644 test_fixtures/masp_proofs/C788F9057C615CCE7B260BB8BF5CF776D5DE7C9153D67B7FDF22ED6F35558738.bin delete mode 100644 test_fixtures/masp_proofs/CBF4087F2AB578C83A736E4598DBA1FDB2515DF33D43611F2860B8D3C178B474.bin create mode 100644 test_fixtures/masp_proofs/CD50FD3DE1D59F43FBD6F3ED220F348721EF5366FDD8E62B9062254B2D286E0F.bin create mode 100644 test_fixtures/masp_proofs/CEC3CA2BCC727589C923B70A3F57D436A33F919BC377C8C6EE7A8DC8D210A6D9.bin create mode 100644 test_fixtures/masp_proofs/EDB31EB869290C1252C3395D7ED2D1A30B9CFAD55AA750B6CC36A4BD55D6BD2B.bin delete mode 100644 test_fixtures/masp_proofs/EDE8DC791D02098C5C199CAF2F6C8B75587507CA52981F48FD1FC9C5BE0BEE43.bin rename test_fixtures/masp_proofs/{90502CEAE917AE038FDA2337AFB0464F2130123149D5691B85C35AABC49FA2BD.bin => F6021F5E0CC7E0346EEF9BDF849AF47822630FC911AF7F91B196C540372EC0E8.bin} (52%) diff --git a/test_fixtures/masp_proofs/0075192A544500F2AD0C92E1A2D6D32B22A46CEDD254F52B6C69E813898FE60B.bin b/test_fixtures/masp_proofs/0075192A544500F2AD0C92E1A2D6D32B22A46CEDD254F52B6C69E813898FE60B.bin new file mode 100644 index 0000000000000000000000000000000000000000..6e8d6b3ae4fdf9e073b8e193f0299373355ef47e GIT binary patch literal 10382 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 CT{X)9 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/4F74C729C8F775EF554F4475BD13CAF693649A17FBEE435298C9C1624C6060F2.bin b/test_fixtures/masp_proofs/4F74C729C8F775EF554F4475BD13CAF693649A17FBEE435298C9C1624C6060F2.bin new file mode 100644 index 0000000000000000000000000000000000000000..d235345ec7e87e1395512c5da04dce64b9cc5e96 GIT binary patch literal 7448 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/51034B90AF95B8899A631D37B45DB11F0B17E6564F3AA56244770F24B56FC18B.bin b/test_fixtures/masp_proofs/51034B90AF95B8899A631D37B45DB11F0B17E6564F3AA56244770F24B56FC18B.bin new file mode 100644 index 0000000000000000000000000000000000000000..e64778b23802f2989e244dede85f5d6543acef70 GIT binary patch literal 7448 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 diff --git a/test_fixtures/masp_proofs/544F7432B95E26E312105FB804BF9BC175A70082068C8785BDDBF49DCCA4BE66.bin b/test_fixtures/masp_proofs/544F7432B95E26E312105FB804BF9BC175A70082068C8785BDDBF49DCCA4BE66.bin deleted file mode 100644 index 1636c1394f086ad2f8bb900c9ad58e1fc5e4caef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 zcmeHMWl$Vjw;h7JBxqo;;1HaF03rCGfdPUOLI}>_7ChMCF2Nyaa0@cHySoz@BtXy* zoR{49S-raTZf<=)@7-0qYj>YseQNDq=kz{(kN^Mx@efD&;h@u z_e>#^G-8J_Q*`_9R8_@GH34hiP=DM8*k08+Yu%V3D|p#)vKvYnyChgXQ9;1rvb13S zoD8hF%a?-t39S9D? zgltJUfQy*E4-xJEB7Yz2;vf`$@|YQeV^xsO0OWiFf1}t(R0I*!t1@%+ij52W|FFNc zA^kZ1^gkp|jdgkVANJ1&|CTwx&T2F%#ZHP_y!sG;4?}i(6_-c@aR!Zw-Q-=NBj~lV zuK`q~pW_OoxfK0jNB_uj+l`A^){RAjT|mBkePlP$unq=eNsi*kk>aJo;gF>6AN6z3 z+lGCpQj8VuZq5`D=YiBsg2g>@uPqI2^bAo%hS)rMN8&Fyndo`IHK^y+T_43T*TCPR{Yy&q-=zP9Xn*y)@?VR#*c&&! zG-t9!U9c`_T?yyh%R6b#Gav5`K&AqAXD_AyTeSave}Bp7Pl)zc3!490wD8(VZ1=hi zN)5Dxn*-Oov%~vvJ|p*Boa|{~sQ<{N)!(B1OG@=$r0@NRu$b~0^PKK>eqQ`-mGG;@ z>+hBMzgk259`;wK^54V$>WKP1><`{3j9O=k=8NJ&6V=1_sK*BIyL)O{i^j+FPH?54 zT6Dai&UDwtv2O5;xM*p^>2V?yv+g2k-V(^auJ3I$j??It#?XBNjn1D~8#Id|+K53A zq>t+~iYV?(w0|kBQrh!6Ko-MssG~*F=@}wT;x3DisCvBUZ)fg^1%KC+F*acm`fSDC;leDejC+4goP{LA_70vI zIN@dv7(B#0rZd#pwOM%D$AJRg)TE0a-y?9g+)6K>H=dcjP0u%HN`iI7WbGmM%MGWAm;u`H6Q6 z@%=j}^sY~dW_(7=>UP~wSsW@$n8-!1M)9ujctNZD0<|M0(Fl5wrfz!sTq|Ge3E<0C zKt%)J!88KUp5XS10eTOh!w)`{4m5#<9I#QpGFlS}sGS@9gk5lw+gw#Nw1+sPc6dOY zsB6|GEAuVjGvzu^j^!f54s#9SGgkYYBmbekkp?7IY#fDz8`)06QX?edwrI6J0_!L+ zGOc`p(%rF5iUjMmbw#k4I>KJdfevUt(min9LomX56rOZXPk0igiP=rbvFP4ct!1Ae zRW7A@)fmtnE(0J>LK;}g$nLVS_@3FCnG>GSE&C)w;vNA)%JLQ)irfcR{N6zT6;3T! zsXLpeDfXXsWHPdAJ8jXbVP<(Z1IZQ=W|Fusdo@nO`2mb=k~=A9>**!_RAKMCt04() zWoPn?h;#B*nh52CDt7R&T@=tpawT$eYY3yHbgo(dB&~O5)4XC^(5@wUY;&4y?BpDT zWs4E_i5HH+#LvTxMD^62AxRdP*EO#z1?zvKgmVQf%b>JUDRyR=nz<$RyukGIyRl@`3DHl^z3!4vyxFNb-kj6h zXoi8g(Ln5UHrFxRg3?Gr{r1PVMv7ehNyssRbO%x|Q>4ZuQobZV?ra<=Fus1RJ4aIb za7rIcYR;u*Qyi6ACK1mA<(bnDlS&$sk%h*6XN|t)o!Dp}r}kL4SRl)J^cJxlJH zWLHK6WFZeVyRS9sW`Pa$m+#-uK|(=MhlGmE*0|TDygc~En_IrD9`wwPs8gbf`soMs ztuEHL)Ane^wzQwi&+-!GWK8JZ!_RV`zc3hEM9g^9Xe@BOR$)iVI6jM1tpQYMGF*H^@8LUd z7i98F+!AeYgG&-22l;Jjky}8uvO{92j61lYtSDqMc|%9b4)M_u1ZGo@I+&93)R$!T z^DqLCm3zuO#sm4iAaJC9VEOHlx4kk7i?L!V8c&Q}IzPBuc03Bne679CK3}Hs!!V%s zk^fX&R85B3?Il!XYS}y^`h4I2_@pb=a3eZd(W}+iwiB#~lhH%UQq31)z5>dq$45ui zqOTQgD)&~WvB~GTvs`mHOuf>KRWW|466$VTZ*{Kt4bM6F4yAMjb6e%DoBqO+PuKMI z&_kZxG6@Ng1$3`BZbN08t?-?kSCd%j9fZ{VB1&b~_*`L#vrnHcb$Qv3&r%&ocTw84X%|e_Ks3 zL51ERP;7lbq05=QhXppK4!sBd^_!Xp#o`YVDj?wF2>L_}ni^ZA_07Ax$mPbqSRnvsLo)0;njXKN3Cs$f+aj^D%e-IPd@r8F_C~7ToO4azded+ey7=5f-N9UNLuO?Z zV=>4-Gh79Z$Wrk(U)LTtfLJx%@z}_rP|-rV;7(Xe+l2TYYSq@L<$Ei)2YGTXiZ7b= zGkZ%#@F-ioZFR*{KIWAGNX&tP{p?L@t^8)!HZz|iFJi`vRk=Foyd=amcU=h)aVRm* z_NOUp%o}`S9WfIz;tJ+R?|7dK-%Z$>h~8M{vIf~-5!=puj}dw>5=z$aRbnIEoCS6W zAkMrZ7E!~G#U$F^+Yb-8@xDSWVYx&Xd&Z-MMam-CdBu?=6;dchFVmBncIyRed~EFG zcoc?T*JOHNaK2Q2)O~S|d3z~)zxsu>y=9=WQ1K;dk?+^(g164F#7dTL<2bLqz(Nx0 zGas~N*gq2r^wB3~=P*Eg_)W10!spmh>au<3;kViTeYe-vai_Y9M}_QWyCJ8$eL&15 zye;|oN$b(oHY*lyTx?#Cd1o)Z9KSt-f<_vuR&o#OQ`y)Zn`mi_Rz7`%vlLd@p0;&! zDi2YSQc}5V)T4C@vMV5CZ3np-c#HQrO=)I$4jCaJe3UiOAca6PmrISX2sOVtTS~JL z{y?|rL+~e$oLI(|1^-ZSQ;1%HRJD5hnT27ap-J-c!!qgqp&QJCb1G`+ zoTy|0>b`i%b(tuYx$sw&&k{Xs=dwEl2cB!!eQ>3q*9rY19BAfU{!=*btfV43p+N1x zH34}nIgIhb6&PVzhC+U8_7gd9)0w2BpRULm+0pJz5Rk;HFacUu__`Z?y?Jwq)w0ja z@$O=sx2)4S+&2dILW1#3*S7>k>>y7^)FlCg%HN*<1K*% zH)q4}{)D$TP}?}4rcE$cY&DND4q^2=c8ulYi%bfawLU)nCJVInn-WF?58rm`>MU_i zixSpdoQ__x8cs1)i-6Br-(Fii5vq!`kroer7#j!6EO(u1nV%V1cZk+wQ`)kL2l6!9 z;0XBpnhf4tGF67Q>{r%N=r}@Zgix(o)NbiCsXODUuk~bSVqG$UQvKjIJx!+oN3Yp6 zK?Nule_!1fYBv22?4=s^p)TH|WkCMXyqFgcUQhVBL3A;_(OwqDYm)=Y6r*ZOf+SY zVdV&)YeDjgX1u@A>PZv^&MO3l1GRt5!_ZkC7)2SiGWr$8bj zm%Da_L5y-H+SO{b%o#L<*O!m#*7I&HmabiMwiTJHl1v!7Nz7htcF{IZA8jbiy>+1$ zHLj+)UaxNvNq5e}GB-(5&&h>8pM#RXh`)a0WCzZZ^})((xJAmjB@yHy84%=03{-n3 zsGCWFZKLr*=!kX$nL2l^TUOfP(0-Ca6|InDbyve5)t(qKUQ-qI>Aa%ES@hRW|-;9`RiFrL@t3~f^@oe8Iq}` zy_B>`yMt%OS7_x*&p9t6-zT{O8;(BI8)09Dlow&QJbX;GrreJvZm$#aUABU{`01?_ zWonKa_Pa%Kq(59l{hzG{zljxPb*-z{n#aAvw|)bA@|BNLbPO028@!1&I+L5lD*_~6 z-yhU^*!MD}yEPMHnN+pRBXm)NNmZVsnRg4p!ehwXA$^lUhAvK}ald}0haNuOThyh~ zw;wLJ0u$4xf z)lX&btQ&$TJl3uTjg$(r`Z-Z9ZD6z2C+SPQfFsmny~8cfcc0->d`|N!Oala}T)`9y zZg}`u?)?_oM#p1QgZnLX@An2Dvy7jdSqv8xMrcp1JgyR)Qrm}wXdXGd+{KHe)$kJf z8X)H$duM7Q%p2oxtf6dy5O4NpGpfE`ulmSm(gM}3HzUc_GH%Hy@=)9vMqISQ<@eOrYZ9|l= zcCy(|tXWJb^#zT+2`Z1qJ;lj%G*O3y?eyk1WPUibVa{>RDBza2mApY8txD~C-J diff --git a/test_fixtures/masp_proofs/5F7D9B39ABA3A1CF6A124CFC26BD9698F791D337CEF8DE82C684C1A1279D772E.bin b/test_fixtures/masp_proofs/5F7D9B39ABA3A1CF6A124CFC26BD9698F791D337CEF8DE82C684C1A1279D772E.bin new file mode 100644 index 0000000000000000000000000000000000000000..4ff46ab0b35d86cce94c270e6cac5bfb64c5afef GIT binary patch literal 9649 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%0A}3TGI3Vry3_g!@x_#UbXQeN%B}b}S^1GTq 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/6DD5A788D36258E9D5FEF454DBC89879834677F926130D56EB5E4067728EB5CF.bin b/test_fixtures/masp_proofs/6DD5A788D36258E9D5FEF454DBC89879834677F926130D56EB5E4067728EB5CF.bin deleted file mode 100644 index 94f997688ba6215afe7dba75785ff44eb9cd9d65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10382 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 yQm)ULrC^#S;f-urKbk{I+BPA&yozg=~ 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 A)&Kwi diff --git a/test_fixtures/masp_proofs/8032CA7B951C625E43F48AEBD53CEA99A9BC66B2BAB03D4ABA1AE57B12596061.bin b/test_fixtures/masp_proofs/8032CA7B951C625E43F48AEBD53CEA99A9BC66B2BAB03D4ABA1AE57B12596061.bin deleted file mode 100644 index b983254f6b6b56c0574db0d1880140d8aa00309c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 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 RzPIoH>u>&k^=*pAe*+GM4_^QP literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/A8A9963AC2983B576BAE4DE9BA6D2CF14C7F9E90A8588BA75DA0D2860F36E2CB.bin b/test_fixtures/masp_proofs/A8A9963AC2983B576BAE4DE9BA6D2CF14C7F9E90A8588BA75DA0D2860F36E2CB.bin deleted file mode 100644 index e475b08f8b72978c2a6cf90280bec31fc71997bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9649 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 S`T6eG_!p=Db^hxv(0>8E_ROCE diff --git a/test_fixtures/masp_proofs/AEA19C9B07742FF5F6D759B171396732D2EBF77728D2772EB251123DF2CEF6A1.bin b/test_fixtures/masp_proofs/AEA19C9B07742FF5F6D759B171396732D2EBF77728D2772EB251123DF2CEF6A1.bin deleted file mode 100644 index 4b7967cf8517fcab5932ceb352630a2cdb92311b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9941 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 diff --git a/test_fixtures/masp_proofs/C788F9057C615CCE7B260BB8BF5CF776D5DE7C9153D67B7FDF22ED6F35558738.bin b/test_fixtures/masp_proofs/C788F9057C615CCE7B260BB8BF5CF776D5DE7C9153D67B7FDF22ED6F35558738.bin deleted file mode 100644 index d3c3a5c24181bdbe0be7e43634ce4e5cd0ac396a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24494 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 u;ob6nK|>OYA(L2 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/CEC3CA2BCC727589C923B70A3F57D436A33F919BC377C8C6EE7A8DC8D210A6D9.bin b/test_fixtures/masp_proofs/CEC3CA2BCC727589C923B70A3F57D436A33F919BC377C8C6EE7A8DC8D210A6D9.bin new file mode 100644 index 0000000000000000000000000000000000000000..3f3374c98bf75f51e4f37abbf5aa29931822c009 GIT binary patch literal 17018 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/EDB31EB869290C1252C3395D7ED2D1A30B9CFAD55AA750B6CC36A4BD55D6BD2B.bin b/test_fixtures/masp_proofs/EDB31EB869290C1252C3395D7ED2D1A30B9CFAD55AA750B6CC36A4BD55D6BD2B.bin new file mode 100644 index 0000000000000000000000000000000000000000..b8e866408a4b4a0413989eac2d5d04784c89a636 GIT binary patch literal 15597 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 diff --git a/test_fixtures/masp_proofs/90502CEAE917AE038FDA2337AFB0464F2130123149D5691B85C35AABC49FA2BD.bin b/test_fixtures/masp_proofs/F6021F5E0CC7E0346EEF9BDF849AF47822630FC911AF7F91B196C540372EC0E8.bin similarity index 52% rename from test_fixtures/masp_proofs/90502CEAE917AE038FDA2337AFB0464F2130123149D5691B85C35AABC49FA2BD.bin rename to test_fixtures/masp_proofs/F6021F5E0CC7E0346EEF9BDF849AF47822630FC911AF7F91B196C540372EC0E8.bin index 44754a7a468bd33137f1d504b5f7e3d54f8ed301..c04d382648da88cf1bc3174b5dfe8bd888b15220 100644 GIT binary patch delta 2133 zcmc(gX;c#E8plylBMeDKM>7kv#-(i1!37m1vrOhQ%DigO{!II2O zBazAwaW9v!Oc6EH6jziCO>p5-HtrX@U*^m`=X%e%ALcpd`SkvO=Xsz1|2^l;waT?3 z$N>NVby)*tJ?7X4#`ZL!VoLmY8q5w{Y0#^lIK$92y9mX=l>H|ltnXOnP`!LsfKw^4s# z3E$wi{*3U2@+S)P{5surh@Kn6F2OFLBTf8B51(?3pHBQY`XBH&cIJCrO=$b*Kl87f zy1q}Y^s7%{j!g{rB0j$B0QSp{H!Rrb&DJLw%GvMTOtj%qw(>F7kerh| zd^1x>OprY*6DU(|=D;`QF=d%@vwc}iP@FvBf4Sy{Gk=NW|B3R?NfQ2sC;>o@BCZI? zYTyu+%_lCL&hQReqS&$@he@9xwWNzGN3(?Qy3EbZr&E6=jFR!XWLBF?2i2H6R52zz zW=ErC^Sw!a+Ys=TPg&sI;1* zXc9ba61tL@DMDOX#6eGI8A@}ajDY$6BAf{*+DH4i+hujCw+YhY9D%aE(TMsNa_OFT4 z6s@B6D6(I1pYJd5VYNeL^KFPO28kWwW{ZeSSP0zdJJPZm4kO+*z2A!*{5pZsbG7cPRSbvRSg^lTe$~js2UZm$h`XKt7YIV%bFuCd56BY*6(Ko`7ZoQ>#-36> z1ig1P5GCEy7v0rA-D$TL^xia3BNb>M;C%1Xx(c>YYmxqXsEl=PEDy={$M1d%GV-k^ zIU$aIU`aJ(^ZBqHY;ahN6B)M8LfhiF1xZiKb@Nw$j+3l1>@<%qs%gV^(T(WW8dH9AhTYNONS%d|fE^_P z-IXVj_l`g-4J_)sS8!W~f{|hgvMP?ZmNWUF&8-%x6AH<=taaQ6)#ZX26D~}s4G{~w z=XxdfzdR^o)O*D+Af35Gr570JMq}c+0iieKesXU^S!E)Ra4CAuPIP+If#hr8)qicI zkfC*rp6J~9jCO}VD+z)SE!@&N)U{2Cq>h9#!&c$JYnmQsV;rmI46&`lV}|hE#f0sa zwg(3#rKNoT-+_}*ydf}@`x(0)+{~%B_M^xhmVOWiPHDbRypyoEjwk62(QKAVa48=P zarY3(XUBpY@o*?E|e3J73QCD1k=A52k~bZ;AZI?j_EbqYi-kkiyzW z`o-lC$Z!1zUg&rTx4fEiS3NF*%oIO@4-!2~3g`ssc&kdV@frOQ@|-U zVYQL()y8(caww2?dwa0q2~1nT*IcL(YM+YaQknv5u^^`Jmi}!nWu@nQ?af|{L(90$ zIhG?wKA;=V$$z#}vqy9hmaGg)XfTBX?|n@PDckjcApl2V!*}D^g-f9--c|ZL#*|l8YF1WoyY16O~<>EZI0+bvP zMUQp8!?|{oUnk$(n!`S8ibc{JeZ|cDk(&kEa7`2o%FleB%EmvkQ9#nn&i(%a7T5^I delta 2133 zcmc(gc{JPU8pnf>)EbmFMVqR%v_q|-y(L5iwIsyac2HAP8>TaM;<$9EE%npVpw_B2 zw5g<#RxEANWok>bQd@)SHbE>YS50*O>6v@ZbTRgRgo1@ z3oeS#NvuUlg=AwXe2;3+`U^iBQb8bZ+7VIa0!NZhk;1 z1^R5>>o^Yt%b6k?(6hptma6dDY)GsH*}<7aZFR)C(|Wsohq0b}U?-?_IfOXuD}=87 z3x6=gyBsH>ZY|^i?-bl^&`#Iv9qX(HIxbyfFSH6$f~DvDkyElOi3tB*wLg3mD&5|+ z{q_;X^h;Ol>+~nRq~*v95s46CePU;eIpabg5Cbzs#2xYlcZ`IFQ1Wk2*4%{Q#-unr zIOyHy+#9%0*vf%S>NA*Velj7`d~vgSxyhd+z?(l$1=f|^ZG?F~75Aat8bfhfKh&G8 zBp{1yJx|4FCzOiGU4WfYVmHt;IYcq(s52QVT7b>hXjJijoY!zK-R4j{``BxI; znIxuhq|Wlmr?AOGKJe?y_pE_3Ra1m+PFSnlw7y(b-my`8DH^`}`k2gM5VnhBI~Cnp zh$c`4s-pR7q3u4>%w=8{f8tJ;>dgV*0Ni8yS0C{-WAnSZJ4>NAmuCf5QEeI(w3VMM zFg4u-S8y_^GYR@n54cvI_k!*^xNoHL?6mzz)RNnLxp&|Cvv$FoN+iteHv>wOf3QUT zg{v?3&PlaB8`mHamkbBWMdTB%Pj=61_rt4AN`Y0DLxf@BW`7 z7ruDAJ%UR#HyD{8WOm8of>^0Vt;_y@%%rWCXOM#j>AQslMqZ!qIOdCD$h=u&;(-y*y_f4(&7j!B@9>EXSKY--8IBThumYYd0p33W8uWEYMp8P zN_pDFk-5-O$;_PuJijO7Y4x=6%ZU$^SfNHT*rDG~`&hqGz&^v&_qXQd3@U@embg(W zH?;l{Xng;HyG&CGbWx#1JF|U(UN@aGic0OMh&D{87&?n@B*+&$tn0E<%{KD11=MTZ zdZ0$HT|e4BJ^0U6`HlQYz2s#xz$TCxS^E2EbR%Zm zQ*f-VjG~Zx#4~7*d_iMGl(kgdt~R3Ep2ZV>%MBlh-4EsSTs)q~2f*1KJxidSQ#!^_ zNjX^usk~7?X*$bl;mxlh-N%PcLQ{82Q=YS;%e><$tcKZO{lb3mF9R2m{({+(>Xyy( zKC}|J!i+JNz^g!b{}gbgJA3`4$;-#?2aDT6I(ZD9xYDB9&;`4ct43b0YWvw26@y&Z zLo{n*lJFcrCy$S5fgg=?Ei|QY^fLbZEd~}BQNF{%;>*zGUc~rX9c*ynw5gg*Pue-4 zGTuEyIdaYFu9#cBU6zYmZ<&{Unyr)bgvao&F=p((s2Uw@**URKx;qR4kZ+Gq(iu>?!Ch zDRFdt6pvw<9ezi$gh0r<@Z5}aO&%1L`e@cgMR6vv+x4WccVw2vda(f#t4ESzhZPQ^ zJHweOQy&L(Y(H7zJwIqYPO~0`?j5*+{u(qxN-|lZTEw{QTADh%^^JThFz{L3;7`hB B6g>a{ From 17d765d0e01df2141de8570e45d09fcacce02d2a Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 9 Nov 2023 15:54:55 +0100 Subject: [PATCH 051/175] Remove aliases from genesis templates --- apps/src/lib/cli.rs | 115 ++- apps/src/lib/client/utils.rs | 40 +- apps/src/lib/config/genesis.rs | 313 +++++--- apps/src/lib/config/genesis/chain.rs | 210 +++-- apps/src/lib/config/genesis/templates.rs | 90 +-- apps/src/lib/config/genesis/transactions.rs | 757 ++++++------------- apps/src/lib/node/ledger/shell/init_chain.rs | 149 +--- core/src/types/address.rs | 15 + core/src/types/key/mod.rs | 1 + sdk/src/wallet/pre_genesis.rs | 2 +- tests/src/e2e/helpers.rs | 70 +- tests/src/e2e/ibc_tests.rs | 3 +- tests/src/e2e/ledger_tests.rs | 40 +- tests/src/e2e/setup.rs | 34 +- 14 files changed, 713 insertions(+), 1126 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 0bab1938cb..fbc24acf65 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -3034,7 +3034,6 @@ pub mod args { pub const RAW_PUBLIC_KEY: Arg = arg("public-key"); pub const RAW_PUBLIC_KEY_OPT: ArgOpt = arg_opt("public-key"); - pub const RAW_SOURCE: Arg = arg("source"); pub const RECEIVER: Arg = arg("receiver"); pub const RELAYER: Arg
      = arg("relayer"); pub const SAFE_MODE: ArgFlag = flag("safe-mode"); @@ -3060,8 +3059,6 @@ pub mod args { pub const TM_ADDRESS: Arg = arg("tm-address"); pub const TOKEN_OPT: ArgOpt = TOKEN.opt(); pub const TOKEN: Arg = arg("token"); - pub const TRANSFER_FROM_SOURCE_AMOUNT: Arg = - arg("transfer-from-source-amount"); pub const TRANSFER_SOURCE: Arg = arg("source"); pub const TRANSFER_TARGET: Arg = arg("target"); pub const TX_HASH: Arg = arg("tx-hash"); @@ -6702,14 +6699,12 @@ pub mod args { #[derive(Clone, Debug)] pub struct InitGenesisValidator { - pub source: String, pub alias: String, pub commission_rate: Dec, pub max_commission_rate_change: Dec, pub net_address: SocketAddr, pub unsafe_dont_encrypt: bool, pub key_scheme: SchemeType, - pub transfer_from_source_amount: token::DenominatedAmount, pub self_bond_amount: token::DenominatedAmount, pub email: String, pub description: Option, @@ -6719,7 +6714,6 @@ pub mod args { impl Args for InitGenesisValidator { fn parse(matches: &ArgMatches) -> Self { - let source = RAW_SOURCE.parse(matches); let alias = ALIAS.parse(matches); let commission_rate = COMMISSION_RATE.parse(matches); let max_commission_rate_change = @@ -6727,12 +6721,6 @@ pub mod args { let net_address = NET_ADDRESS.parse(matches); let unsafe_dont_encrypt = UNSAFE_DONT_ENCRYPT.parse(matches); let key_scheme = SCHEME.parse(matches); - // The denomination validation is handled by validating genesis - // files later. - // At this stage, we treat amounts as opaque and pass them on - // verbatim. - let transfer_from_source_amount = - TRANSFER_FROM_SOURCE_AMOUNT.parse(matches); // this must be an amount of native tokens let self_bond_amount = SELF_BOND_AMOUNT.parse(matches); let email = EMAIL.parse(matches); @@ -6740,14 +6728,12 @@ pub mod args { let website = WEBSITE_OPT.parse(matches); let discord_handle = DISCORD_OPT.parse(matches); Self { - source, alias, net_address, unsafe_dont_encrypt, key_scheme, commission_rate, max_commission_rate_change, - transfer_from_source_amount, self_bond_amount, email, description, @@ -6757,64 +6743,49 @@ pub mod args { } fn def(app: App) -> App { - app.arg(RAW_SOURCE.def().help( - "The source key for native token transfer from the \ - `balances.toml` genesis template.", - )) - .arg(ALIAS.def().help("The validator address alias.")) - .arg(NET_ADDRESS.def().help( - "Static {host:port} of your validator node's P2P address. \ - Namada uses port `26656` for P2P connections by default, but \ - you can configure a different value.", - )) - .arg(COMMISSION_RATE.def().help( - "The commission rate charged by the validator for delegation \ - rewards. This is a required parameter.", - )) - .arg(MAX_COMMISSION_RATE_CHANGE.def().help( - "The maximum change per epoch in the commission rate charged \ - by the validator for delegation rewards. This is a required \ - parameter.", - )) - .arg(UNSAFE_DONT_ENCRYPT.def().help( - "UNSAFE: Do not encrypt the generated keypairs. Do not use \ - this for keys used in a live network.", - )) - .arg(SCHEME.def().help( - "The key scheme/type used for the validator keys. Currently \ - supports ed25519 and secp256k1.", - )) - .arg(TRANSFER_FROM_SOURCE_AMOUNT.def().help( - "The amount of native token to transfer into the validator \ - account from the `--source`. To self-bond some tokens to the \ - validator at genesis, specify `--self-bond-amount`.", - )) - .arg( - SELF_BOND_AMOUNT - .def() - .help( - "The amount of native token to self-bond in PoS. \ - Because this amount will be bonded from the \ - validator's account, it must be lower or equal to \ - the amount specified in \ - `--transfer-from-source-amount`.", - ) - .requires(TRANSFER_FROM_SOURCE_AMOUNT.name), - ) - .arg(EMAIL.def().help( - "The email address of the validator. This is a required \ - parameter.", - )) - .arg(DESCRIPTION_OPT.def().help( - "The validator's description. This is an optional parameter.", - )) - .arg(WEBSITE_OPT.def().help( - "The validator's website. This is an optional parameter.", - )) - .arg(DISCORD_OPT.def().help( - "The validator's discord handle. This is an optional \ - parameter.", - )) + app.arg(ALIAS.def().help("The validator address alias.")) + .arg(NET_ADDRESS.def().help( + "Static {host:port} of your validator node's P2P address. \ + Namada uses port `26656` for P2P connections by default, \ + but you can configure a different value.", + )) + .arg(COMMISSION_RATE.def().help( + "The commission rate charged by the validator for \ + delegation rewards. This is a required parameter.", + )) + .arg(MAX_COMMISSION_RATE_CHANGE.def().help( + "The maximum change per epoch in the commission rate \ + charged by the validator for delegation rewards. This is \ + a required parameter.", + )) + .arg(UNSAFE_DONT_ENCRYPT.def().help( + "UNSAFE: Do not encrypt the generated keypairs. Do not \ + use this for keys used in a live network.", + )) + .arg(SCHEME.def().help( + "The key scheme/type used for the validator keys. \ + Currently supports ed25519 and secp256k1.", + )) + .arg( + SELF_BOND_AMOUNT.def().help( + "The amount of native token to self-bond in PoS.", + ), + ) + .arg(EMAIL.def().help( + "The email address of the validator. This is a required \ + parameter.", + )) + .arg(DESCRIPTION_OPT.def().help( + "The validator's description. This is an optional \ + parameter.", + )) + .arg(WEBSITE_OPT.def().help( + "The validator's website. This is an optional parameter.", + )) + .arg(DISCORD_OPT.def().help( + "The validator's discord handle. This is an optional \ + parameter.", + )) } } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 0ae2388fd2..a73898be0c 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -232,16 +232,12 @@ pub async fn join_network( .map(|(alias, _wallet)| alias.clone()); let validator_keys = validator_alias_and_pre_genesis_wallet.as_ref().map( |(_alias, wallet)| { - let tendermint_node_key: common::SecretKey = wallet - .tendermint_node_key - .try_to_sk() - .unwrap_or_else(|_err| { - eprintln!( - "Tendermint node key must be common (need to change?)" - ); - safe_exit(1) - }); - (tendermint_node_key, wallet.consensus_key.clone()) + let validator_account_pk: common::PublicKey = + wallet.account_key.ref_to(); + let tendermint_node_key: common::SecretKey = + wallet.tendermint_node_key.clone(); + let consensus_key: common::SecretKey = wallet.consensus_key.clone(); + (validator_account_pk, tendermint_node_key, consensus_key) }, ); let node_mode = if validator_alias.is_some() { @@ -254,7 +250,7 @@ pub async fn join_network( let config = genesis.derive_config( &chain_dir, node_mode, - validator_alias, + validator_keys.as_ref().map(|(pk, _, _)| pk), allow_duplicate_ip, ); @@ -273,7 +269,7 @@ pub async fn join_network( crate::wallet::save(&wallet).unwrap(); // Setup the node for a genesis validator, if used - if let Some((tendermint_node_key, consensus_key)) = validator_keys { + if let Some((_, tendermint_node_key, consensus_key)) = validator_keys { println!( "Setting up validator keys in CometBFT. Consensus key: {}.", consensus_key.to_public() @@ -596,14 +592,12 @@ pub fn default_base_dir( pub fn init_genesis_validator( global_args: args::Global, args::InitGenesisValidator { - source, alias, commission_rate, max_commission_rate_change, net_address, unsafe_dont_encrypt, key_scheme, - transfer_from_source_amount, self_bond_amount, email, description, @@ -611,20 +605,6 @@ pub fn init_genesis_validator( discord_handle, }: args::InitGenesisValidator, ) { - let (mut source_wallet, wallet_file) = - load_pre_genesis_wallet_or_exit(&global_args.base_dir); - - let source_key = source_wallet - .find_secret_key(&source, None) - .unwrap_or_else(|err| { - eprintln!( - "Couldn't find key for source \"{source}\" in the pre-genesis \ - wallet {}. Failed with {err}.", - wallet_file.to_string_lossy() - ); - safe_exit(1) - }); - // Validate the commission rate data if commission_rate > Dec::one() { eprintln!("The validator commission rate must not exceed 1.0 or 100%"); @@ -664,19 +644,15 @@ pub fn init_genesis_validator( let transactions = genesis::transactions::init_validator( genesis::transactions::GenesisValidatorData { - source_key, - alias: alias::Alias::from(alias), commission_rate, max_commission_rate_change, net_address, - transfer_from_source_amount, self_bond_amount, email, description, website, discord_handle, }, - &mut source_wallet, &validator_wallet, ); diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index 32d2fcf3ae..7e527a50ed 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -5,19 +5,18 @@ pub mod templates; pub mod toml_utils; pub mod transactions; -use std::array::TryFromSliceError; use std::collections::{BTreeMap, HashMap}; +use std::fmt::{Display, Formatter}; use borsh::{BorshDeserialize, BorshSerialize}; -use data_encoding::HEXLOWER; use derivative::Derivative; use namada::core::ledger::governance::parameters::GovernanceParameters; use namada::core::ledger::pgf::parameters::PgfParameters; -use namada::core::types::string_encoding; +use namada::core::types::string_encoding::StringEncoded; use namada::ledger::eth_bridge::EthereumBridgeParams; use namada::ledger::parameters::EpochDuration; use namada::ledger::pos::{Dec, GenesisValidator, OwnedPosParams}; -use namada::types::address::Address; +use namada::types::address::{Address, EstablishedAddress}; use namada::types::chain::ProposalBytes; use namada::types::key::*; use namada::types::time::{DateTimeUtc, DurationSecs}; @@ -28,6 +27,115 @@ use serde::{Deserialize, Serialize}; #[cfg(all(any(test, feature = "benches"), not(feature = "integration")))] use crate::config::genesis::chain::Finalized; +#[derive( + Clone, + Debug, + BorshSerialize, + BorshDeserialize, + PartialEq, + Eq, + Ord, + PartialOrd, + Hash, +)] +pub enum GenesisAddress { + /// Encoded as `public_key = "value"` in toml. + PublicKey(StringEncoded), + /// Encoded as `established_address = "value"` in toml. + EstablishedAddress(EstablishedAddress), +} + +impl GenesisAddress { + /// Return an [`Address`] from this [`GenesisAddress`]. + #[inline] + pub fn address(&self) -> Address { + match self { + Self::EstablishedAddress(addr) => { + Address::Established(addr.clone()) + } + Self::PublicKey(pk) => (&pk.raw).into(), + } + } +} + +impl Serialize for GenesisAddress { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match self { + GenesisAddress::EstablishedAddress(address) => { + Serialize::serialize( + &Address::Established(address.clone()), + serializer, + ) + } + GenesisAddress::PublicKey(pk) => { + Serialize::serialize(pk, serializer) + } + } + } +} + +impl<'de> Deserialize<'de> for GenesisAddress { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use std::str::FromStr; + + struct FieldVisitor; + + impl<'de> serde::de::Visitor<'de> for FieldVisitor { + type Value = GenesisAddress; + + fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { + formatter.write_str( + "a bech32m encoded public key or an established address", + ) + } + + fn visit_str(self, value: &str) -> Result + where + E: serde::de::Error, + { + // Try to deserialize a PK first + let maybe_pk = + StringEncoded::::from_str(value); + match maybe_pk { + Ok(pk) => Ok(GenesisAddress::PublicKey(pk)), + Err(_) => { + // If that doesn't work, attempt to retrieve + // an established address + let address = Address::from_str(value) + .map_err(serde::de::Error::custom)?; + if let Address::Established(established) = address { + Ok(GenesisAddress::EstablishedAddress(established)) + } else { + Err(serde::de::Error::custom( + "expected an established address or public key", + )) + } + } + } + } + } + + deserializer.deserialize_str(FieldVisitor) + } +} + +impl Display for GenesisAddress { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + GenesisAddress::EstablishedAddress(address) => { + write!(f, "{}", Address::Established(address.clone()).encode()) + } + GenesisAddress::PublicKey(pk) => write!(f, "{}", pk), + } + } +} + #[derive(Debug, BorshSerialize, BorshDeserialize)] #[borsh(init=init)] pub struct Genesis { @@ -189,55 +297,6 @@ pub struct Parameters { pub minimum_gas_price: BTreeMap, } -#[derive( - Clone, - Debug, - Deserialize, - Serialize, - BorshSerialize, - BorshDeserialize, - PartialOrd, - Ord, - PartialEq, - Eq, -)] -pub struct HexString(pub String); - -impl HexString { - pub fn parse(&self) -> Result, HexKeyError> { - let bytes = HEXLOWER.decode(self.0.as_ref())?; - Ok(bytes) - } -} - -#[derive(thiserror::Error, Debug)] -pub enum HexKeyError { - #[error("Invalid hex string: {0:?}")] - InvalidHexString(data_encoding::DecodeError), - #[error("Invalid sha256 checksum: {0}")] - InvalidSha256(TryFromSliceError), - #[error("Invalid public key: {0}")] - InvalidPublicKey(string_encoding::DecodeError), -} - -impl From for HexKeyError { - fn from(err: data_encoding::DecodeError) -> Self { - Self::InvalidHexString(err) - } -} - -impl From for HexKeyError { - fn from(err: string_encoding::DecodeError) -> Self { - Self::InvalidPublicKey(err) - } -} - -impl From for HexKeyError { - fn from(err: TryFromSliceError) -> Self { - Self::InvalidSha256(err) - } -} - /// Modify the default genesis file (namada/genesis/localnet/) to /// accommodate testing. /// @@ -252,16 +311,16 @@ pub fn make_dev_genesis( use std::str::FromStr; use std::time::Duration; - use namada::core::types::string_encoding::StringEncoded; use namada::ledger::eth_bridge::{Contracts, UpgradeableContract}; use namada::proto::{standalone_signature, SerializeWithBorsh}; use namada::types::address::wnam; use namada::types::chain::ChainIdPrefix; use namada::types::ethereum_events::EthAddress; + use namada::types::key::*; use namada::types::token::NATIVE_MAX_DECIMAL_PLACES; use namada_sdk::wallet::alias::Alias; - use crate::config::genesis::chain::finalize; + use crate::config::genesis::chain::{finalize, DeriveEstablishedAddress}; use crate::config::genesis::transactions::UnsignedValidatorAccountTx; use crate::wallet::defaults; @@ -314,17 +373,6 @@ pub fn make_dev_genesis( }; } - // Use the default address for matching established accounts - let default_addresses: HashMap = - defaults::addresses().into_iter().collect(); - if let Some(accs) = genesis.transactions.established_account.as_mut() { - for acc in accs { - if let Some(addr) = default_addresses.get(&acc.tx.alias) { - acc.address = addr.clone(); - } - } - } - // Use the default token address for matching tokens let default_tokens: HashMap = defaults::tokens() .into_iter() @@ -336,14 +384,25 @@ pub fn make_dev_genesis( } } + let assert_established_addr = |addr: &Address| { + if let Address::Established(addr) = addr { + addr.clone() + } else { + panic!("should have gotten an established address") + } + }; + // remove Albert's bond since it messes up existing unit test math if let Some(bonds) = genesis.transactions.bond.as_mut() { - bonds.retain(|bond| { - bond.source - != transactions::AliasOrPk::Alias( - Alias::from_str("albert").unwrap(), - ) - }) + let default_addresses: HashMap = + defaults::addresses().into_iter().collect(); + let fat_alberts_address = + GenesisAddress::EstablishedAddress(assert_established_addr( + default_addresses + .get(&Alias::from_str("albert").unwrap()) + .unwrap(), + )); + bonds.retain(|bond| bond.source != fat_alberts_address); }; let secp_eth_cold_keypair = secp256k1::SecretKey::try_from_slice(&[ 90, 83, 107, 155, 193, 251, 120, 27, 76, 1, 188, 8, 116, 121, 90, 99, @@ -360,38 +419,65 @@ pub fn make_dev_genesis( }, }; // Add other validators with randomly generated keys if needed - for val in 0..(num_validators - 1) { + for _val in 0..(num_validators - 1) { let consensus_keypair: common::SecretKey = testing::gen_keypair::() .try_to_sk() .unwrap(); let account_keypair = consensus_keypair.clone(); - let address = namada::types::address::gen_established_address( - "validator account", - ); let eth_cold_keypair = common::SecretKey::try_from_sk(&secp_eth_cold_keypair).unwrap(); let (protocol_keypair, eth_bridge_keypair) = defaults::validator_keys(); - let alias = Alias::from_str(&format!("validator-{}", val + 1)) - .expect("infallible"); // add the validator - if let Some(vals) = genesis.transactions.validator_account.as_mut() { + let validator_address = if let Some(vals) = + genesis.transactions.validator_account.as_mut() + { + let validator_account_tx = transactions::ValidatorAccountTx { + vp: "vp_validator".to_string(), + commission_rate: Dec::new(5, 2).expect("This can't fail"), + max_commission_rate_change: Dec::new(1, 2) + .expect("This can't fail"), + email: "null@null.net".to_string(), + description: None, + website: None, + discord_handle: None, + net_address: SocketAddr::new( + IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), + 8080, + ), + account_key: StringEncoded { + raw: account_keypair.to_public(), + }, + consensus_key: StringEncoded { + raw: consensus_keypair.to_public(), + }, + protocol_key: StringEncoded { + raw: protocol_keypair.to_public(), + }, + tendermint_node_key: StringEncoded { + raw: consensus_keypair.to_public(), + }, + eth_hot_key: StringEncoded { + raw: eth_bridge_keypair.to_public(), + }, + eth_cold_key: StringEncoded { + raw: eth_cold_keypair.to_public(), + }, + }; + let validator_address = + validator_account_tx.derive_established_address(); vals.push(chain::FinalizedValidatorAccountTx { - address, + address: Address::Established(validator_address.clone()), tx: transactions::ValidatorAccountTx { - alias: alias.clone(), - vp: "vp_user".to_string(), - commission_rate: Dec::new(5, 2).expect("This can't fail"), - max_commission_rate_change: Dec::new(1, 2) - .expect("This can't fail"), - email: "null@null.net".to_string(), - description: None, - website: None, - discord_handle: None, - net_address: SocketAddr::new( - IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), - 8080, - ), + vp: validator_account_tx.vp, + commission_rate: validator_account_tx.commission_rate, + max_commission_rate_change: validator_account_tx + .max_commission_rate_change, + email: validator_account_tx.email, + description: validator_account_tx.description, + website: validator_account_tx.website, + discord_handle: validator_account_tx.discord_handle, + net_address: validator_account_tx.net_address, account_key: sign_pk(&account_keypair), consensus_key: sign_pk(&consensus_keypair), protocol_key: sign_pk(&protocol_keypair), @@ -399,43 +485,18 @@ pub fn make_dev_genesis( eth_hot_key: sign_pk(ð_bridge_keypair), eth_cold_key: sign_pk(ð_cold_keypair), }, - }) + }); + validator_address + } else { + unreachable!() }; - // add the balance to validators implicit key - if let Some(bals) = genesis - .balances - .token - .get_mut(&Alias::from_str("nam").unwrap()) - { - bals.0.insert( - StringEncoded { - raw: account_keypair.ref_to(), - }, - token::DenominatedAmount { - amount: token::Amount::native_whole(200_000), - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }, - ); - } - // transfer funds from implicit key to validator - if let Some(trans) = genesis.transactions.transfer.as_mut() { - trans.push(transactions::TransferTx { - token: Alias::from_str("nam").expect("infallible"), - source: StringEncoded { - raw: account_keypair.ref_to(), - }, - target: alias.clone(), - amount: token::DenominatedAmount { - amount: token::Amount::native_whole(200_000), - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }, - }) - } // self bond if let Some(bonds) = genesis.transactions.bond.as_mut() { bonds.push(transactions::BondTx { - source: transactions::AliasOrPk::Alias(alias.clone()), - validator: alias, + source: GenesisAddress::EstablishedAddress( + validator_address.clone(), + ), + validator: Address::Established(validator_address), amount: token::DenominatedAmount { amount: token::Amount::native_whole(100_000), denom: NATIVE_MAX_DECIMAL_PLACES.into(), diff --git a/apps/src/lib/config/genesis/chain.rs b/apps/src/lib/config/genesis/chain.rs index 502e8c27f5..a0d82b52ed 100644 --- a/apps/src/lib/config/genesis/chain.rs +++ b/apps/src/lib/config/genesis/chain.rs @@ -5,10 +5,13 @@ use std::str::FromStr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; use namada::ledger::parameters::EpochDuration; -use namada::types::address::{Address, EstablishedAddressGen, MASP}; +use namada::types::address::{ + Address, EstablishedAddress, EstablishedAddressGen, +}; use namada::types::chain::{ChainId, ChainIdPrefix}; use namada::types::dec::Dec; use namada::types::hash::Hash; +use namada::types::key::{common, RefTo}; use namada::types::time::{DateTimeUtc, DurationNanos, Rfc3339String}; use namada::types::token::Amount; use namada_sdk::wallet::store::AddressVpType; @@ -29,9 +32,33 @@ use crate::wasm_loader; pub const METADATA_FILE_NAME: &str = "chain.toml"; -// Rng source used for generating genesis addresses. Because the process has to -// be deterministic, change of this value is a breaking change for genesis. -const ADDRESS_RNG_SOURCE: &[u8] = &[]; +/// Derive established addresses from seed data. +pub trait DeriveEstablishedAddress { + /// Arbitrary data to hash the seed data with. + const SALT: &'static str; + + /// Derive an established address. + fn derive_established_address(&self) -> EstablishedAddress + where + Self: BorshSerialize, + { + let mut hasher = Sha256::new(); + hasher.update(Self::SALT.as_bytes()); + hasher.update(self.serialize_to_vec()); + let digest = hasher.finalize(); + let digest_ref: &[u8; 32] = digest.as_ref(); + EstablishedAddress::from(*digest_ref) + } + + /// Derive an address. + #[inline] + fn derive_address(&self) -> Address + where + Self: BorshSerialize, + { + Address::Established(self.derive_established_address()) + } +} impl Finalized { /// Write all genesis and the chain metadata TOML files to the given @@ -111,31 +138,14 @@ impl Finalized { config.address.clone(), ); } - if let Some(txs) = &self.transactions.validator_account { - for tx in txs { - wallet.insert_address( - tx.tx.alias.normalize(), - tx.address.clone(), - false, - ); - } - } - if let Some(txs) = &self.transactions.established_account { - for tx in txs { - wallet.insert_address( - tx.tx.alias.normalize(), - tx.address.clone(), - false, - ); - } - } if let Some(pre_genesis_wallet) = pre_genesis_wallet { wallet.extend(pre_genesis_wallet); } if let Some((alias, validator_wallet)) = validator { + let account_pk = validator_wallet.account_key.ref_to(); let address = self .transactions - .find_validator(&alias) + .find_validator(&account_pk) .map(|tx| tx.address.clone()) .expect("Validator alias not found in genesis transactions."); wallet.extend_from_pre_genesis_validator( @@ -152,10 +162,12 @@ impl Finalized { &self, base_dir: &Path, node_mode: TendermintMode, - validator_alias: Option, + validator_account_pk: Option<&common::PublicKey>, allow_duplicate_ip: bool, ) -> Config { - if node_mode != TendermintMode::Validator && validator_alias.is_some() { + if node_mode != TendermintMode::Validator + && validator_account_pk.is_some() + { println!( "Warning: Validator alias used to derive config, but node \ mode is not validator, it is {node_mode:?}!" @@ -166,15 +178,17 @@ impl Finalized { // Derive persistent peers from genesis let persistent_peers = self.derive_persistent_peers(); - // If `validator_wallet` is given, find its net_address + // If `validator_account_pk` is given, find its net_address let validator_net_and_tm_address = - if let Some(alias) = validator_alias.as_ref() { - self.transactions.find_validator(alias).map(|validator_tx| { - ( - validator_tx.tx.net_address, - validator_tx.derive_tendermint_address(), - ) - }) + if let Some(account_pk) = validator_account_pk { + self.transactions.find_validator(account_pk).map( + |validator_tx| { + ( + validator_tx.tx.net_address, + validator_tx.derive_tendermint_address(), + ) + }, + ) } else { None }; @@ -413,31 +427,6 @@ impl Finalized { pub fn get_token_address(&self, alias: &Alias) -> Option<&Address> { self.tokens.token.get(alias).map(|token| &token.address) } - - pub fn get_user_address(&self, alias: &Alias) -> Option
      { - if alias.to_string() == *"masp" { - return Some(MASP); - } - let established = self.transactions.established_account.as_ref()?; - let validators = self.transactions.validator_account.as_ref()?; - established - .iter() - .find_map(|tx| { - (&tx.tx.alias == alias).then_some(tx.address.clone()) - }) - .or_else(|| { - validators.iter().find_map(|tx| { - (&tx.tx.alias == alias).then_some(tx.address.clone()) - }) - }) - } - - pub fn get_validator_address(&self, alias: &Alias) -> Option<&Address> { - let validators = self.transactions.validator_account.as_ref()?; - validators - .iter() - .find_map(|tx| (&tx.tx.alias == alias).then_some(&tx.address)) - } } /// Create the [`Finalized`] chain configuration. Derives the chain ID from the @@ -467,7 +456,7 @@ pub fn finalize( }, }; let genesis_bytes = genesis_to_gen_address.serialize_to_vec(); - let mut addr_gen = established_address_gen(&genesis_bytes); + let addr_gen = established_address_gen(&genesis_bytes); // Generate addresses let templates::All { @@ -477,11 +466,9 @@ pub fn finalize( parameters, transactions, } = genesis_to_gen_address.templates; - let tokens = FinalizedTokens::finalize_from(tokens, &mut addr_gen); - let transactions = - FinalizedTransactions::finalize_from(transactions, &mut addr_gen); - let parameters = - FinalizedParameters::finalize_from(&transactions, parameters); + let tokens = FinalizedTokens::finalize_from(tokens); + let transactions = FinalizedTransactions::finalize_from(transactions); + let parameters = FinalizedParameters::finalize_from(parameters); // Store the last state of the address generator in the metadata let mut metadata = genesis_to_gen_address.metadata; @@ -530,20 +517,6 @@ pub fn finalize( } } -/// Use bytes as a deterministic seed for address generator. -fn established_address_gen(bytes: &[u8]) -> EstablishedAddressGen { - let mut hasher = Sha256::new(); - hasher.update(bytes); - // hex of the first 40 chars of the hash - let hash = format!("{:.width$X}", hasher.finalize(), width = 40); - EstablishedAddressGen::new(hash) -} - -/// Deterministically generate an [`Address`]. -fn gen_address(gen: &mut EstablishedAddressGen) -> Address { - gen.generate_address(ADDRESS_RNG_SOURCE) -} - /// Chain genesis config to be finalized. This struct is used to derive the /// chain ID to construct a [`Finalized`] chain genesis config. #[derive( @@ -563,6 +536,15 @@ pub type ToFinalize = Chain; /// Chain genesis config. pub type Finalized = Chain; +/// Use bytes as a deterministic seed for address generator. +fn established_address_gen(bytes: &[u8]) -> EstablishedAddressGen { + let mut hasher = Sha256::new(); + hasher.update(bytes); + // hex of the first 40 chars of the hash + let hash = format!("{:.width$X}", hasher.finalize(), width = 40); + EstablishedAddressGen::new(hash) +} + /// Chain genesis config with generic chain ID. #[derive( Clone, @@ -599,15 +581,14 @@ pub struct FinalizedTokens { } impl FinalizedTokens { - fn finalize_from( - tokens: templates::Tokens, - addr_gen: &mut EstablishedAddressGen, - ) -> FinalizedTokens { + fn finalize_from(tokens: templates::Tokens) -> FinalizedTokens { let templates::Tokens { token } = tokens; let token = token .into_iter() .map(|(key, config)| { - let address = gen_address(addr_gen); + let address = Address::Established( + (&key, &config).derive_established_address(), + ); (key, FinalizedTokenConfig { address, config }) }) .collect(); @@ -631,6 +612,10 @@ pub struct FinalizedTokenConfig { pub config: templates::TokenConfig, } +impl DeriveEstablishedAddress for (&Alias, &templates::TokenConfig) { + const SALT: &'static str = "token-config"; +} + #[derive( Clone, Debug, @@ -645,52 +630,55 @@ pub struct FinalizedTokenConfig { pub struct FinalizedTransactions { pub established_account: Option>, pub validator_account: Option>, - pub transfer: Option>>, pub bond: Option>>, } impl FinalizedTransactions { fn finalize_from( transactions: transactions::Transactions, - addr_gen: &mut EstablishedAddressGen, ) -> FinalizedTransactions { let transactions::Transactions { established_account, validator_account, - transfer, bond, } = transactions; let established_account = established_account.map(|txs| { txs.into_iter() - .map(|tx| { - let address = gen_address(addr_gen); - FinalizedEstablishedAccountTx { address, tx } + .map(|tx| FinalizedEstablishedAccountTx { + address: transactions::UnsignedEstablishedAccountTx::from( + &tx, + ) + .derive_address(), + tx, }) .collect() }); let validator_account = validator_account.map(|txs| { txs.into_iter() - .map(|tx| { - let address = gen_address(addr_gen); - FinalizedValidatorAccountTx { address, tx } + .map(|tx| FinalizedValidatorAccountTx { + address: transactions::UnsignedValidatorAccountTx::from( + &tx, + ) + .derive_address(), + tx, }) .collect() }); FinalizedTransactions { established_account, validator_account, - transfer, bond, } } fn find_validator( &self, - alias: &Alias, + validator_account_pk: &common::PublicKey, ) -> Option<&FinalizedValidatorAccountTx> { - self.validator_account - .as_ref() - .and_then(|txs| txs.iter().find(|tx| &tx.tx.alias == alias)) + let validator_accounts = self.validator_account.as_ref()?; + validator_accounts + .iter() + .find(|tx| &tx.tx.account_key.pk.raw == validator_account_pk) } } @@ -705,7 +693,7 @@ impl FinalizedTransactions { Eq, )] pub struct FinalizedParameters { - pub parameters: templates::ChainParams, + pub parameters: templates::ChainParams, pub pos_params: templates::PosParams, pub gov_params: templates::GovernanceParams, pub pgf_params: namada::core::ledger::pgf::parameters::PgfParameters, @@ -714,7 +702,6 @@ pub struct FinalizedParameters { impl FinalizedParameters { fn finalize_from( - txs: &FinalizedTransactions, templates::Parameters { parameters, pos_params, @@ -724,32 +711,11 @@ impl FinalizedParameters { }: templates::Parameters, ) -> Self { use namada::core::ledger::pgf::parameters::PgfParameters; - let mut finalized_pgf_params = PgfParameters { - stewards: Default::default(), + let finalized_pgf_params = PgfParameters { + stewards: pgf_params.stewards, pgf_inflation_rate: pgf_params.pgf_inflation_rate, stewards_inflation_rate: pgf_params.stewards_inflation_rate, }; - finalized_pgf_params.stewards = pgf_params - .stewards - .into_iter() - .map(|alias| { - let maybe_estbd = txs - .established_account - .as_ref() - .unwrap() - .iter() - .find(|tx| tx.tx.alias == alias) - .map(|tx| tx.address.clone()); - let maybe_validator = txs - .validator_account - .as_ref() - .unwrap() - .iter() - .find(|tx| tx.tx.alias == alias) - .map(|tx| tx.address.clone()); - maybe_estbd.or(maybe_validator).unwrap() - }) - .collect(); Self { parameters, pos_params, diff --git a/apps/src/lib/config/genesis/templates.rs b/apps/src/lib/config/genesis/templates.rs index 50afeb9ac8..fab82401f0 100644 --- a/apps/src/lib/config/genesis/templates.rs +++ b/apps/src/lib/config/genesis/templates.rs @@ -5,12 +5,11 @@ use std::marker::PhantomData; use std::path::Path; use borsh::{BorshDeserialize, BorshSerialize}; -use namada::core::types::key::common; -use namada::core::types::string_encoding::StringEncoded; use namada::core::types::{ethereum_structs, token}; use namada::eth_bridge::parameters::{ Contracts, Erc20WhitelistEntry, MinimumConfirmations, }; +use namada::types::address::Address; use namada::types::chain::ProposalBytes; use namada::types::dec::Dec; use namada::types::token::{ @@ -19,10 +18,13 @@ use namada::types::token::{ use serde::{Deserialize, Serialize}; use super::toml_utils::{read_toml, write_toml}; -use super::transactions::{self, Transactions}; -use crate::config::genesis::transactions::{ - BondTx, SignedBondTx, SignedTransferTx, TransferTx, +use super::transactions::{ + self, Transactions, UnsignedEstablishedAccountTx, + UnsignedValidatorAccountTx, }; +use crate::config::genesis::chain::DeriveEstablishedAddress; +use crate::config::genesis::transactions::{BondTx, SignedBondTx}; +use crate::config::genesis::GenesisAddress; use crate::wallet::Alias; pub const BALANCES_FILE_NAME: &str = "balances.toml"; @@ -97,9 +99,9 @@ impl UndenominatedBalances { })? .denom; let mut denominated_bals = BTreeMap::new(); - for (pk, bal) in bals.0.into_iter() { + for (addr, bal) in bals.0.into_iter() { let denominated = bal.increase_precision(denom)?; - denominated_bals.insert(pk, denominated); + denominated_bals.insert(addr, denominated); } balances .token @@ -136,7 +138,7 @@ pub struct DenominatedBalances { Eq, )] pub struct RawTokenBalances( - pub BTreeMap, token::DenominatedAmount>, + pub BTreeMap, ); /// Genesis balances for a given token @@ -151,7 +153,7 @@ pub struct RawTokenBalances( Eq, )] pub struct TokenBalances( - pub BTreeMap, token::DenominatedAmount>, + pub BTreeMap, ); /// Genesis validity predicates @@ -450,7 +452,7 @@ pub struct GovernanceParams { )] pub struct PgfParams { /// The set of stewards - pub stewards: BTreeSet, + pub stewards: BTreeSet
      , /// The pgf funding inflation rate pub pgf_inflation_rate: Dec, /// The pgf stewards inflation rate @@ -489,11 +491,11 @@ pub struct EthBridgeParams { } impl TokenBalances { - pub fn get(&self, pk: common::PublicKey) -> Option { - let pk = StringEncoded { raw: pk }; - self.0.get(&pk).map(|amt| amt.amount) + pub fn get(&self, addr: &GenesisAddress) -> Option { + self.0.get(addr).map(|amt| amt.amount) } } + #[derive( Clone, Debug, @@ -535,14 +537,6 @@ pub trait TemplateValidation: Serialize { + BorshDeserialize + PartialEq + Eq; - type TransferTx: for<'a> Deserialize<'a> - + Serialize - + Clone - + std::fmt::Debug - + BorshSerialize - + BorshDeserialize - + PartialEq - + Eq; type BondTx: for<'a> Deserialize<'a> + Serialize + Clone @@ -564,9 +558,8 @@ pub trait TemplateValidation: Serialize { impl TemplateValidation for Unvalidated { type Amount = token::DenominatedAmount; type Balances = UndenominatedBalances; - type BondTx = SignedBondTx; + type BondTx = SignedBondTx; type GasMinimums = BTreeMap; - type TransferTx = SignedTransferTx; } impl TemplateValidation for Validated { @@ -574,7 +567,6 @@ impl TemplateValidation for Validated { type Balances = DenominatedBalances; type BondTx = BondTx; type GasMinimums = BTreeMap; - type TransferTx = TransferTx; } #[derive( @@ -763,22 +755,16 @@ pub fn load_and_validate(templates_dir: &Path) -> Option> { is_valid = false; } - let txs = if let Some(tokens) = tokens.as_ref() { - if let Some(txs) = transactions.and_then(|txs| { - transactions::validate( - txs, - vps.as_ref(), - balances.as_ref(), - tokens, - parameters.as_ref(), - ) - }) { - println!("Transactions file is valid."); - Some(txs) - } else { - is_valid = false; - None - } + let txs = if let Some(txs) = transactions.and_then(|txs| { + transactions::validate( + txs, + vps.as_ref(), + balances.as_ref(), + parameters.as_ref(), + ) + }) { + println!("Transactions file is valid."); + Some(txs) } else { is_valid = false; None @@ -834,13 +820,21 @@ pub fn validate_parameters( for steward in ¶meters.pgf_params.stewards { let mut found_steward = false; if let Some(accs) = &txs.established_account { - if accs.iter().any(|acct| acct.alias == *steward) { + if accs.iter().any(|acct| { + let addr = + UnsignedEstablishedAccountTx::from(acct).derive_address(); + &addr == steward + }) { found_steward = true; } } if let Some(accs) = &txs.validator_account { - if accs.iter().any(|acct| acct.alias == *steward) { + if accs.iter().any(|acct| { + let addr = + UnsignedValidatorAccountTx::from(acct).derive_address(); + &addr == steward + }) { found_steward = true; } } @@ -941,6 +935,7 @@ mod tests { use std::path::PathBuf; use namada::core::types::key; + use namada::core::types::string_encoding::StringEncoded; use namada::types::key::RefTo; use tempfile::tempdir; @@ -978,6 +973,8 @@ mod tests { let path = test_dir.path().join(BALANCES_FILE_NAME); let sk = key::testing::keypair_1(); let pk = sk.ref_to(); + let address = + GenesisAddress::PublicKey(StringEncoded { raw: pk.clone() }); let balance = token::Amount::from(101_000_001); let token_alias = Alias::from("Some_token".to_string()); let contents = format!( @@ -991,13 +988,6 @@ mod tests { let balances = read_balances(&path).unwrap(); let example_balance = balances.token.get(&token_alias).unwrap(); - assert_eq!( - balance, - example_balance - .0 - .get(&StringEncoded { raw: pk }) - .unwrap() - .amount - ); + assert_eq!(balance, example_balance.0.get(&address).unwrap().amount); } } diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index b617b5a3bf..388f707b23 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -1,13 +1,12 @@ //! Genesis transactions -use std::collections::{BTreeMap, BTreeSet, HashMap}; -use std::fmt::{Debug, Display, Formatter}; +use std::collections::{BTreeMap, BTreeSet}; +use std::fmt::Debug; use std::net::SocketAddr; -use std::str::FromStr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; -use namada::core::types::storage; +use namada::core::types::address::Address; use namada::core::types::string_encoding::StringEncoded; use namada::proto::{ standalone_signature, verify_standalone_sig, SerializeWithBorsh, @@ -17,28 +16,25 @@ use namada::types::key::{common, RefTo, VerifySigError}; use namada::types::time::{DateTimeUtc, MIN_UTC}; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; +use namada_sdk::wallet::alias::Alias; use namada_sdk::wallet::pre_genesis::ValidatorWallet; -use namada_sdk::wallet::{FindKeyError, Wallet}; +use namada_sdk::wallet::Wallet; use serde::{Deserialize, Serialize}; -use super::templates::{ - DenominatedBalances, Parameters, TokenBalances, ValidityPredicates, -}; +use super::templates::{DenominatedBalances, Parameters, ValidityPredicates}; +use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::genesis::templates::{ - TemplateValidation, Tokens, Unvalidated, Validated, + TemplateValidation, Unvalidated, Validated, }; -use crate::config::genesis::HexString; -use crate::wallet::{Alias, CliWalletUtils}; +use crate::config::genesis::GenesisAddress; +use crate::wallet::CliWalletUtils; pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; pub struct GenesisValidatorData { - pub source_key: common::SecretKey, - pub alias: Alias, pub commission_rate: Dec, pub max_commission_rate_change: Dec, pub net_address: SocketAddr, - pub transfer_from_source_amount: token::DenominatedAmount, pub self_bond_amount: token::DenominatedAmount, pub email: String, pub description: Option, @@ -56,7 +52,6 @@ pub fn sign_txs( let UnsignedTransactions { established_account, validator_account, - transfer, bond, } = txs; @@ -69,13 +64,11 @@ pub fn sign_txs( if let Some(bonds) = bond.as_ref() { for bond in bonds { - if let AliasOrPk::Alias(source) = &bond.source { - if source == &bond.validator { - panic!( - "Validator self-bonds must be signed with a validator \ - wallet." - ) - } + if bond.source.address() == bond.validator { + panic!( + "Validator self-bonds must be signed with a validator \ + wallet." + ) } } } @@ -87,11 +80,6 @@ pub fn sign_txs( .collect() }); let validator_account = None; - let transfer = transfer.map(|tx| { - tx.into_iter() - .map(|tx| sign_transfer_tx(tx, wallet)) - .collect() - }); let bond = bond.map(|tx| { tx.into_iter() .map(|tx| sign_delegation_bond_tx(tx, wallet, &established_account)) @@ -101,7 +89,6 @@ pub fn sign_txs( Transactions { established_account, validator_account, - transfer, bond, } } @@ -116,23 +103,18 @@ pub fn parse_unsigned( /// Create signed [`Transactions`] for a genesis validator. pub fn init_validator( GenesisValidatorData { - source_key, - alias, commission_rate, max_commission_rate_change, net_address, - transfer_from_source_amount, self_bond_amount, email, description, website, discord_handle, }: GenesisValidatorData, - source_wallet: &mut Wallet, validator_wallet: &ValidatorWallet, ) -> Transactions { let unsigned_validator_account_tx = UnsignedValidatorAccountTx { - alias: alias.clone(), account_key: StringEncoded::new(validator_wallet.account_key.ref_to()), consensus_key: StringEncoded::new( validator_wallet.consensus_key.ref_to(), @@ -162,31 +144,23 @@ pub fn init_validator( discord_handle, net_address, }; + let unsigned_validator_addr = + unsigned_validator_account_tx.derive_address(); + let unsigned_validator_established_addr = + unsigned_validator_account_tx.derive_established_address(); let validator_account = Some(vec![sign_validator_account_tx( unsigned_validator_account_tx, validator_wallet, )]); - let transfer = if transfer_from_source_amount.amount.is_zero() { - None - } else { - let unsigned_transfer_tx = TransferTx { - // Only native token can be staked - token: Alias::from("NAM"), - source: StringEncoded::new(source_key.ref_to()), - target: alias.clone(), - amount: transfer_from_source_amount, - }; - let transfer_tx = sign_transfer_tx(unsigned_transfer_tx, source_wallet); - Some(vec![transfer_tx]) - }; - let bond = if self_bond_amount.amount.is_zero() { None } else { let unsigned_bond_tx = BondTx { - source: AliasOrPk::Alias(alias.clone()), - validator: alias, + source: GenesisAddress::EstablishedAddress( + unsigned_validator_established_addr, + ), + validator: unsigned_validator_addr, amount: self_bond_amount, }; let bond_tx = sign_self_bond_tx(unsigned_bond_tx, validator_wallet); @@ -195,7 +169,6 @@ pub fn init_validator( Transactions { validator_account, - transfer, bond, ..Default::default() } @@ -215,18 +188,11 @@ pub fn sign_established_account_tx( authorization: sig, } }); - let UnsignedEstablishedAccountTx { - alias, - vp, - public_key: _, - storage, - } = unsigned_tx; + let UnsignedEstablishedAccountTx { vp, public_key: _ } = unsigned_tx; SignedEstablishedAccountTx { - alias, vp, public_key: key, - storage, } } @@ -249,7 +215,6 @@ pub fn sign_validator_account_tx( sign_tx(&unsigned_tx, &validator_wallet.tendermint_node_key); let ValidatorAccountTx { - alias, account_key, consensus_key, protocol_key, @@ -294,7 +259,6 @@ pub fn sign_validator_account_tx( }; SignedValidatorAccountTx { - alias, account_key, consensus_key, protocol_key, @@ -312,20 +276,10 @@ pub fn sign_validator_account_tx( } } -pub fn sign_transfer_tx( - unsigned_tx: TransferTx, - source_wallet: &mut Wallet, -) -> SignedTransferTx { - let source_key = source_wallet - .find_key_by_pk(&unsigned_tx.source, None) - .expect("Key for source must be present to sign with it."); - unsigned_tx.sign(&source_key) -} - pub fn sign_self_bond_tx( unsigned_tx: BondTx, validator_wallet: &ValidatorWallet, -) -> SignedBondTx { +) -> SignedBondTx { unsigned_tx.sign(&validator_wallet.account_key) } @@ -333,76 +287,9 @@ pub fn sign_delegation_bond_tx( unsigned_tx: BondTx, wallet: &mut Wallet, established_accounts: &Option>>, -) -> SignedBondTx { - let alias = &unsigned_tx.source; - // Try to look-up the source from wallet first - if it's an alias of an - // implicit account that should give us the right key - let found_key = match alias { - AliasOrPk::Alias(alias) => { - wallet.find_secret_key(&alias.normalize(), None) - } - AliasOrPk::PublicKey(pk) => wallet.find_key_by_pk(pk, None), - }; - let source_key = match found_key { - Ok(key) => key, - Err(FindKeyError::KeyNotFound) => { - // If it's not in the wallet, it must be an established account - // so we need to look-up its public key first - let pk = established_accounts - .as_ref() - .unwrap_or_else(|| { - panic!( - "Signing a bond failed. Cannot find \"{alias}\" in \ - the wallet and there are no established accounts." - ); - }) - .iter() - .find_map(|account| match alias { - AliasOrPk::Alias(alias) => { - // delegation from established account - if &account.alias == alias { - Some( - &account - .public_key - .as_ref() - .unwrap_or_else(|| { - panic!( - "Signing a bond failed. The \ - established account \"{alias}\" \ - has no public key. Add a public \ - to be able to sign bonds." - ); - }) - .pk - .raw, - ) - } else { - None - } - } - AliasOrPk::PublicKey(pk) => { - // delegation from an implicit account - Some(&pk.raw) - } - }) - .unwrap_or_else(|| { - panic!( - "Signing a bond failed. Cannot find \"{alias}\" in \ - the wallet or in the established accounts." - ); - }); - wallet.find_key_by_pk(pk, None).unwrap_or_else(|err| { - panic!( - "Signing a bond failed. Cannot find key for established \ - account \"{alias}\" in the wallet. Failed with {err}." - ); - }) - } - Err(err) => panic!( - "Signing a bond failed. Failed to read the key for \"{alias}\" \ - from wallet with {err}." - ), - }; +) -> SignedBondTx { + let source_key = + look_up_sk_from(&unsigned_tx.source, wallet, established_accounts); unsigned_tx.sign(&source_key) } @@ -429,7 +316,6 @@ pub fn sign_tx( pub struct Transactions { pub established_account: Option>, pub validator_account: Option>, - pub transfer: Option>, pub bond: Option>, } @@ -456,16 +342,6 @@ impl Transactions { txs }) .or(other.validator_account); - self.transfer = self - .transfer - .take() - .map(|mut txs| { - if let Some(new_txs) = other.transfer.as_mut() { - txs.append(new_txs); - } - txs - }) - .or(other.transfer); self.bond = self .bond .take() @@ -484,7 +360,6 @@ impl Default for Transactions { Self { established_account: None, validator_account: None, - transfer: None, bond: None, } } @@ -509,14 +384,14 @@ impl Transactions { self.bond .as_ref() .map(|txs| { - let mut stakes: BTreeMap<&Alias, token::Amount> = + let mut stakes: BTreeMap<&Address, token::Amount> = BTreeMap::new(); for tx in txs { let entry = stakes.entry(&tx.validator).or_default(); *entry += tx.amount.amount; } - stakes.into_iter().any(|(_validator, stake)| { + stakes.into_values().any(|stake| { let tendermint_voting_power = namada::ledger::pos::into_tm_voting_power( votes_per_token, @@ -536,7 +411,6 @@ impl Transactions { pub struct UnsignedTransactions { pub established_account: Option>, pub validator_account: Option>, - pub transfer: Option>>, pub bond: Option>>, } @@ -556,7 +430,6 @@ pub type SignedValidatorAccountTx = ValidatorAccountTx; Eq, )] pub struct ValidatorAccountTx { - pub alias: Alias, pub vp: String, /// Commission rate charged on rewards for delegators (bounded inside /// 0-1) @@ -579,6 +452,10 @@ pub struct ValidatorAccountTx { pub eth_cold_key: PK, } +impl DeriveEstablishedAddress for UnsignedValidatorAccountTx { + const SALT: &'static str = "validator-account-tx"; +} + pub type UnsignedEstablishedAccountTx = EstablishedAccountTx>; @@ -595,129 +472,21 @@ pub type SignedEstablishedAccountTx = EstablishedAccountTx; Eq, )] pub struct EstablishedAccountTx { - pub alias: Alias, pub vp: String, /// PKs have to come last in TOML to avoid `ValueAfterTable` error pub public_key: Option, - #[serde(default)] - /// Initial storage key values - pub storage: HashMap, -} - -pub type SignedTransferTx = Signed>; - -impl SignedTransferTx { - /// Verify the signature of `TransferTx`. This should not depend - /// on whether the contained amount is denominated or not. - /// - /// Since we denominate amounts as part of validation, we can - /// only verify signatures on [`SignedTransferTx`] - /// types. - pub fn verify_sig(&self) -> Result<(), VerifySigError> { - let Self { data, signature } = self; - verify_standalone_sig::<_, SerializeWithBorsh>( - &data.data_to_sign(), - &data.source.raw, - signature, - ) - } -} - -#[derive( - Clone, - Debug, - Deserialize, - Serialize, - BorshSerialize, - BorshDeserialize, - PartialEq, - Eq, -)] -pub struct TransferTx { - pub token: Alias, - pub source: StringEncoded, - pub target: Alias, - pub amount: T::Amount, } -impl TransferTx { - /// Add the correct denomination to the contained amount - pub fn denominate( - self, - tokens: &Tokens, - ) -> eyre::Result> { - let TransferTx { - token, - source, - target, - amount, - } = self; - let denom = - if let Some(super::templates::TokenConfig { denom, .. }) = - tokens.token.get(&token) - { - *denom - } else { - eprintln!( - "Genesis files contained transfer of token {}, which is \ - not in the `tokens.toml` file", - token - ); - return Err(eyre::eyre!( - "Genesis files contained transfer of token {}, which is \ - not in the `tokens.toml` file", - token - )); - }; - let amount = amount.increase_precision(denom).map_err(|e| { - eprintln!( - "A bond amount in the transactions.toml file was incorrectly \ - formatted:\n{}", - e - ); - e - })?; - - Ok(TransferTx { - token, - source, - target, - amount, - }) - } - - /// The signable data. This does not include the phantom data. - fn data_to_sign(&self) -> Vec { - [ - self.token.serialize_to_vec(), - self.source.serialize_to_vec(), - self.target.serialize_to_vec(), - self.amount.serialize_to_vec(), - ] - .concat() - } - - /// Sign the transfer. - /// - /// Since we denominate amounts as part of validation, we can - /// only verify signatures on [`SignedTransferTx`] - /// types. Thus we only allow signing of [`TransferTx`] - /// types. - pub fn sign(self, key: &common::SecretKey) -> SignedTransferTx { - let sig = standalone_signature::<_, SerializeWithBorsh>( - key, - &self.data_to_sign(), - ); - SignedTransferTx { - data: self, - signature: StringEncoded { raw: sig }, - } - } +impl DeriveEstablishedAddress for UnsignedEstablishedAccountTx { + const SALT: &'static str = "established-account-tx"; } -pub type SignedBondTx = Signed>; +pub type SignedBondTx = Signed>; -impl SignedBondTx { +impl SignedBondTx +where + T: BorshSerialize + TemplateValidation, +{ /// Verify the signature of `BondTx`. This should not depend /// on whether the contained amount is denominated or not. /// @@ -748,11 +517,26 @@ impl SignedBondTx { Eq, )] pub struct BondTx { - pub source: AliasOrPk, - pub validator: Alias, + pub source: GenesisAddress, + pub validator: Address, pub amount: T::Amount, } +impl BondTx +where + T: TemplateValidation + BorshSerialize, +{ + /// The signable data. This does not include the phantom data. + fn data_to_sign(&self) -> Vec { + [ + self.source.serialize_to_vec(), + self.validator.serialize_to_vec(), + self.amount.serialize_to_vec(), + ] + .concat() + } +} + impl BondTx { /// Add the correct denomination to the contained amount pub fn denominate(self) -> eyre::Result> { @@ -778,23 +562,13 @@ impl BondTx { }) } - /// The signable data. This does not include the phantom data. - fn data_to_sign(&self) -> Vec { - [ - self.source.serialize_to_vec(), - self.validator.serialize_to_vec(), - self.amount.serialize_to_vec(), - ] - .concat() - } - /// Sign the transfer. /// /// Since we denominate amounts as part of validation, we can /// only verify signatures on [`SignedBondTx`] /// types. Thus we only allow signing of [`BondTx`] /// types. - pub fn sign(self, key: &common::SecretKey) -> SignedBondTx { + pub fn sign(self, key: &common::SecretKey) -> SignedBondTx { let sig = standalone_signature::<_, SerializeWithBorsh>( key, &self.data_to_sign(), @@ -806,74 +580,6 @@ impl BondTx { } } -#[derive(Clone, Debug, BorshSerialize, BorshDeserialize, PartialEq, Eq)] -pub enum AliasOrPk { - /// `alias = "value"` in toml (encoded via `AliasSerHelper`) - Alias(Alias), - /// `public_key = "value"` in toml (encoded via `PkSerHelper`) - PublicKey(StringEncoded), -} - -impl Serialize for AliasOrPk { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - match self { - AliasOrPk::Alias(alias) => Serialize::serialize(alias, serializer), - AliasOrPk::PublicKey(pk) => Serialize::serialize(pk, serializer), - } - } -} - -impl<'de> Deserialize<'de> for AliasOrPk { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> serde::de::Visitor<'de> for FieldVisitor { - type Value = AliasOrPk; - - fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { - formatter.write_str( - "a bech32m encoded `common::PublicKey` or an alias", - ) - } - - fn visit_str(self, value: &str) -> Result - where - E: serde::de::Error, - { - // Try to deserialize a PK first - let maybe_pk = - StringEncoded::::from_str(value); - match maybe_pk { - Ok(pk) => Ok(AliasOrPk::PublicKey(pk)), - Err(_) => { - // If that doesn't work, use it as an alias - let alias = Alias::from_str(value) - .map_err(serde::de::Error::custom)?; - Ok(AliasOrPk::Alias(alias)) - } - } - } - } - - deserializer.deserialize_str(FieldVisitor) - } -} - -impl Display for AliasOrPk { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - AliasOrPk::Alias(alias) => write!(f, "{}", alias), - AliasOrPk::PublicKey(pk) => write!(f, "{}", pk), - } - } -} - #[derive( Clone, Debug, @@ -909,21 +615,19 @@ pub fn validate( transactions: Transactions, vps: Option<&ValidityPredicates>, balances: Option<&DenominatedBalances>, - tokens: &Tokens, parameters: Option<&Parameters>, ) -> Option> { let mut is_valid = true; - let mut all_used_aliases: BTreeSet = BTreeSet::default(); - let mut established_accounts: BTreeMap> = + let mut all_used_addresses: BTreeSet
      = BTreeSet::default(); + let mut established_accounts: BTreeMap> = BTreeMap::default(); - let mut validator_accounts: BTreeMap = + let mut validator_accounts: BTreeMap = BTreeMap::default(); let Transactions { ref established_account, ref validator_account, - ref transfer, bond, } = transactions; @@ -932,7 +636,7 @@ pub fn validate( if !validate_established_account( tx, vps, - &mut all_used_aliases, + &mut all_used_addresses, &mut established_accounts, ) { is_valid = false; @@ -945,7 +649,7 @@ pub fn validate( if !validate_validator_account( tx, vps, - &mut all_used_aliases, + &mut all_used_addresses, &mut validator_accounts, ) { is_valid = false; @@ -964,10 +668,7 @@ pub fn validate( ( token.clone(), TokenBalancesForValidation { - // Add an accumulator for tokens transferred to - // aliases - aliases: BTreeMap::new(), - pks: token_balances.clone(), + amounts: token_balances.0.clone(), }, ) }) @@ -975,28 +676,6 @@ pub fn validate( }) .unwrap_or_default(); - let validated_txs = if let Some(txs) = transfer { - let validated_txs: Vec<_> = txs - .iter() - .filter_map(|tx| { - validate_transfer( - tx, - &mut token_balances, - &all_used_aliases, - tokens, - ) - }) - .collect(); - if validated_txs.len() != txs.len() { - is_valid = false; - None - } else { - Some(validated_txs) - } - } else { - None - }; - let validated_bonds = if let Some(txs) = bond { if !txs.is_empty() { match parameters { @@ -1038,34 +717,69 @@ pub fn validate( }; is_valid.then_some(Transactions { - established_account: transactions.established_account, - validator_account: transactions.validator_account, - transfer: validated_txs, + established_account: transactions.established_account.map( + |established_accounts| { + established_accounts + .into_iter() + .map(|acct| EstablishedAccountTx { + vp: acct.vp, + public_key: acct.public_key, + }) + .collect() + }, + ), + validator_account: transactions.validator_account.map( + |validator_accounts| { + validator_accounts + .into_iter() + .map(|acct| ValidatorAccountTx { + vp: acct.vp, + commission_rate: acct.commission_rate, + max_commission_rate_change: acct + .max_commission_rate_change, + email: acct.email, + description: acct.description, + website: acct.website, + discord_handle: acct.discord_handle, + net_address: acct.net_address, + account_key: acct.account_key, + consensus_key: acct.consensus_key, + protocol_key: acct.protocol_key, + tendermint_node_key: acct.tendermint_node_key, + eth_hot_key: acct.eth_hot_key, + eth_cold_key: acct.eth_cold_key, + }) + .collect() + }, + ), bond: validated_bonds, }) } fn validate_bond( - tx: SignedBondTx, + tx: SignedBondTx, balances: &mut BTreeMap, - established_accounts: &BTreeMap>, - validator_accounts: &BTreeMap, + established_accounts: &BTreeMap>, + validator_accounts: &BTreeMap, parameters: &Parameters, ) -> Option> { // Check signature let mut is_valid = { let source = &tx.data.source; if let Some(source_pk) = match source { - AliasOrPk::Alias(alias) => { + GenesisAddress::EstablishedAddress(address) => { // Try to find the source's PK in either established_accounts or // validator_accounts + let established_addr = Address::Established(address.clone()); established_accounts - .get(alias) + .get(&established_addr) .cloned() .flatten() - .or_else(|| validator_accounts.get(alias).cloned()) + .or_else(|| { + validator_accounts.get(&established_addr).cloned() + }) } - AliasOrPk::PublicKey(pk) => Some(pk.raw.clone()), + GenesisAddress::PublicKey(pk) => Some(pk.raw.clone()), } { if tx.verify_sig(&source_pk).is_err() { eprintln!("Invalid bond tx signature.",); @@ -1104,10 +818,7 @@ fn validate_bond( let native_token = ¶meters.parameters.native_token; match balances.get_mut(native_token) { Some(balances) => { - let balance = match source { - AliasOrPk::Alias(source) => balances.aliases.get_mut(source), - AliasOrPk::PublicKey(source) => balances.pks.0.get_mut(source), - }; + let balance = balances.amounts.get_mut(source); match balance { Some(balance) => { if *balance < *amount { @@ -1121,14 +832,7 @@ fn validate_bond( } else { // Deduct the amount from source if amount == balance { - match source { - AliasOrPk::Alias(source) => { - balances.aliases.remove(source); - } - AliasOrPk::PublicKey(source) => { - balances.pks.0.remove(source); - } - } + balances.amounts.remove(source); } else { balance.amount -= amount.amount; } @@ -1157,34 +861,33 @@ fn validate_bond( #[derive(Clone, Debug)] pub struct TokenBalancesForValidation { - /// Accumulator for tokens transferred to aliases - pub aliases: BTreeMap, - /// Token balances from the balances file, associated with PKs - pub pks: TokenBalances, + /// Accumulator for tokens transferred to accounts + pub amounts: BTreeMap, } pub fn validate_established_account( tx: &SignedEstablishedAccountTx, vps: Option<&ValidityPredicates>, - all_used_aliases: &mut BTreeSet, - established_accounts: &mut BTreeMap>, + all_used_addresses: &mut BTreeSet
      , + established_accounts: &mut BTreeMap>, ) -> bool { let mut is_valid = true; + let established_address = EstablishedAccountTx::from(tx).derive_address(); established_accounts.insert( - tx.alias.clone(), + established_address.clone(), tx.public_key.as_ref().map(|signed| signed.pk.raw.clone()), ); - // Check that alias is unique - if all_used_aliases.contains(&tx.alias) { + // Check that the established address is unique + if all_used_addresses.contains(&established_address) { eprintln!( - "A duplicate alias \"{}\" found in a `established_account` tx.", - tx.alias + "A duplicate address \"{}\" found in a `established_account` tx.", + established_address ); is_valid = false; } else { - all_used_aliases.insert(tx.alias.clone()); + all_used_addresses.insert(established_address); } // Check the VP exists @@ -1221,22 +924,24 @@ fn validate_established_account_sig( pub fn validate_validator_account( tx: &ValidatorAccountTx, vps: Option<&ValidityPredicates>, - all_used_aliases: &mut BTreeSet, - validator_accounts: &mut BTreeMap, + all_used_addresses: &mut BTreeSet
      , + validator_accounts: &mut BTreeMap, ) -> bool { let mut is_valid = true; - validator_accounts.insert(tx.alias.clone(), tx.account_key.pk.raw.clone()); + let established_address = ValidatorAccountTx::from(tx).derive_address(); + validator_accounts + .insert(established_address.clone(), tx.account_key.pk.raw.clone()); - // Check that alias is unique - if all_used_aliases.contains(&tx.alias) { + // Check that address is unique + if all_used_addresses.contains(&established_address) { eprintln!( - "A duplicate alias \"{}\" found in a `validator_account` tx.", - tx.alias + "A duplicate address \"{}\" found in a `validator_account` tx.", + established_address ); is_valid = false; } else { - all_used_aliases.insert(tx.alias.clone()); + all_used_addresses.insert(established_address.clone()); } // Check the VP exists @@ -1261,8 +966,8 @@ pub fn validate_validator_account( ) { eprintln!( "Invalid `account_key` authorization for `validator_account` tx \ - with alias \"{}\".", - tx.alias + with address \"{}\".", + established_address ); is_valid = false; } @@ -1273,8 +978,8 @@ pub fn validate_validator_account( ) { eprintln!( "Invalid `consensus_key` authorization for `validator_account` tx \ - with alias \"{}\".", - tx.alias + with address \"{}\".", + established_address ); is_valid = false; } @@ -1285,8 +990,8 @@ pub fn validate_validator_account( ) { eprintln!( "Invalid `protocol_key` authorization for `validator_account` tx \ - with alias \"{}\".", - tx.alias + with address \"{}\".", + established_address ); is_valid = false; } @@ -1297,8 +1002,8 @@ pub fn validate_validator_account( ) { eprintln!( "Invalid `tendermint_node_key` authorization for \ - `validator_account` tx with alias \"{}\".", - tx.alias + `validator_account` tx with address \"{}\".", + established_address ); is_valid = false; } @@ -1310,8 +1015,8 @@ pub fn validate_validator_account( ) { eprintln!( "Invalid `eth_hot_key` authorization for `validator_account` tx \ - with alias \"{}\".", - tx.alias + with address \"{}\".", + established_address ); is_valid = false; } @@ -1323,8 +1028,8 @@ pub fn validate_validator_account( ) { eprintln!( "Invalid `eth_cold_key` authorization for `validator_account` tx \ - with alias \"{}\".", - tx.alias + with address \"{}\".", + established_address ); is_valid = false; } @@ -1332,90 +1037,6 @@ pub fn validate_validator_account( is_valid } -/// Updates the token balances with all the valid transfers applied -pub fn validate_transfer( - tx: &SignedTransferTx, - balances: &mut BTreeMap, - all_used_aliases: &BTreeSet, - tokens: &Tokens, -) -> Option> { - let mut is_valid = true; - // Check signature - if tx.verify_sig().is_err() { - eprintln!("Invalid transfer tx signature.",); - is_valid = false; - } - - let unsigned: TransferTx = tx.into(); - let validated = unsigned.denominate(tokens).ok()?; - let TransferTx { - token, - source, - target, - amount, - .. - } = &validated; - - // Check that the target exists - if !all_used_aliases.contains(target) { - eprintln!( - "Invalid transfer tx. The target alias \"{target}\" no matching \ - account found." - ); - is_valid = false; - } - - // Check token balance of the source and update token balances of the source - // and target - match balances.get_mut(token) { - Some(balances) => match balances.pks.0.get_mut(source) { - Some(balance) => { - if balance.amount < amount.amount { - eprintln!( - "Invalid transfer tx. Source {source} doesn't have \ - enough balance of token \"{token}\" to transfer {}. \ - Got {}.", - amount, balance, - ); - is_valid = false; - } else { - // Deduct the amount from source - if amount.amount == balance.amount { - balances.pks.0.remove(source); - } else { - balance.amount -= amount.amount; - } - - // Add the amount to target - let target_balance = balances - .aliases - .entry(target.clone()) - .or_insert_with(|| DenominatedAmount { - amount: token::Amount::zero(), - denom: amount.denom, - }); - target_balance.amount += amount.amount; - } - } - None => { - eprintln!( - "Invalid transfer tx. Source {source} has no balance of \ - token \"{token}\"." - ); - is_valid = false; - } - }, - None => { - eprintln!( - "Invalid transfer tx. Token \"{token}\" not found in balances." - ); - is_valid = false; - } - } - - is_valid.then_some(validated) -} - fn validate_signature( tx_data: &T, pk: &common::PublicKey, @@ -1434,17 +1055,10 @@ fn validate_signature( impl From<&SignedEstablishedAccountTx> for UnsignedEstablishedAccountTx { fn from(tx: &SignedEstablishedAccountTx) -> Self { - let SignedEstablishedAccountTx { - alias, - vp, - public_key, - storage, - } = tx; + let SignedEstablishedAccountTx { vp, public_key } = tx; Self { - alias: alias.clone(), vp: vp.clone(), public_key: public_key.as_ref().map(|signed| signed.pk.clone()), - storage: storage.clone(), } } } @@ -1452,7 +1066,6 @@ impl From<&SignedEstablishedAccountTx> for UnsignedEstablishedAccountTx { impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { fn from(tx: &SignedValidatorAccountTx) -> Self { let SignedValidatorAccountTx { - alias, vp, commission_rate, max_commission_rate_change, @@ -1467,10 +1080,10 @@ impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { tendermint_node_key, eth_hot_key, eth_cold_key, + .. } = tx; Self { - alias: alias.clone(), vp: vp.clone(), commission_rate: *commission_rate, max_commission_rate_change: *max_commission_rate_change, @@ -1489,16 +1102,78 @@ impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { } } -impl From<&SignedTransferTx> for TransferTx { - fn from(tx: &SignedTransferTx) -> Self { - let SignedTransferTx { data, signature: _ } = tx; +impl From<&SignedBondTx> for BondTx { + fn from(tx: &SignedBondTx) -> Self { + let SignedBondTx { data, .. } = tx; data.clone() } } -impl From<&SignedBondTx> for BondTx { - fn from(tx: &SignedBondTx) -> Self { - let SignedBondTx { data, signature: _ } = tx; - data.clone() +/// Attempt to look-up a secret key. +fn look_up_sk_from( + source: &GenesisAddress, + wallet: &mut Wallet, + established_accounts: &Option>>, +) -> common::SecretKey { + // Try to look-up the source from wallet first + match source { + GenesisAddress::EstablishedAddress(_) => None, + GenesisAddress::PublicKey(pk) => wallet.find_key_by_pk(pk, None).ok(), } + .unwrap_or_else(|| { + // If it's not in the wallet, it must be an established account + // so we need to look-up its public key first + let pk = established_accounts + .as_ref() + .unwrap_or_else(|| { + panic!( + "Signing failed. Cannot find \"{source}\" in the wallet \ + and there are no established accounts." + ); + }) + .iter() + .find_map(|account| match source { + GenesisAddress::EstablishedAddress(address) => { + // delegation from established account + if &EstablishedAccountTx::from(account) + .derive_established_address() + == address + { + Some( + &account + .public_key + .as_ref() + .unwrap_or_else(|| { + panic!( + "Signing failed. The established \ + account \"{source}\" has no public \ + key. Add a public to be able to sign \ + bonds." + ); + }) + .pk + .raw, + ) + } else { + None + } + } + GenesisAddress::PublicKey(pk) => { + // delegation from an implicit account + Some(&pk.raw) + } + }) + .unwrap_or_else(|| { + panic!( + "Signing failed. Cannot find \"{source}\" in the wallet \ + or in the established accounts." + ); + }); + wallet.find_key_by_pk(pk, None).unwrap_or_else(|err| { + panic!( + "Signing failed. Cannot find key for established account \ + \"{source}\" in the wallet. Failed with {err}." + ); + }) + }) } diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index 1f612b2f26..3714ea6aef 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -25,7 +25,7 @@ use crate::config::genesis::chain::{ }; use crate::config::genesis::templates::{TokenBalances, TokenConfig}; use crate::config::genesis::transactions::{ - BondTx, EstablishedAccountTx, TransferTx, ValidatorAccountTx, + BondTx, EstablishedAccountTx, ValidatorAccountTx, }; use crate::facade::tendermint::v0_37::abci::{request, response}; use crate::facade::tendermint_proto::google::protobuf; @@ -154,7 +154,6 @@ where &pos_params, current_epoch, ); - self.apply_genesis_txs_transfer(&genesis); self.apply_genesis_txs_bonds(&genesis); pos::namada_proof_of_stake::compute_and_store_total_consensus_stake( @@ -307,25 +306,26 @@ where .expect("Token with configured balance not found in genesis.") .address; let mut total_token_balance = token::Amount::zero(); - for (owner_pk, balance) in balances { - let owner = Address::from(&owner_pk.raw); - storage_api::account::set_public_key_at( - &mut self.wl_storage, - &owner, - &owner_pk.raw, - 0, - ) - .unwrap(); + for (owner, balance) in balances { + if let genesis::GenesisAddress::PublicKey(pk) = owner { + storage_api::account::set_public_key_at( + &mut self.wl_storage, + &owner.address(), + &pk.raw, + 0, + ) + .unwrap(); + } tracing::info!( "Crediting {} {} tokens to {}", balance, token_alias, - owner_pk.raw + owner, ); credit_tokens( &mut self.wl_storage, token_address, - &owner, + &owner.address(), balance.amount, ) .expect("Couldn't credit initial balance"); @@ -350,18 +350,12 @@ where if let Some(txs) = genesis.transactions.established_account.as_ref() { for FinalizedEstablishedAccountTx { address, - tx: - EstablishedAccountTx { - alias, - vp, - public_key, - storage, - }, + tx: EstablishedAccountTx { vp, public_key }, } in txs { tracing::debug!( "Applying genesis tx to init an established account \ - {alias}" + {address}" ); let vp_code = self.lookup_vp(vp, genesis, vp_cache); let code_hash = CodeHash::sha256(&vp_code); @@ -378,16 +372,6 @@ where ) .unwrap(); } - - // Place the keys under the owners sub-storage - let sub_key = namada::core::types::storage::Key::from( - address.to_db_key(), - ); - for (key, value) in storage { - self.wl_storage - .write_bytes(&sub_key.join(key), value.parse().unwrap()) - .unwrap(); - } } } } @@ -405,7 +389,6 @@ where address, tx: ValidatorAccountTx { - alias, vp, commission_rate, max_commission_rate_change, @@ -420,11 +403,12 @@ where tendermint_node_key: _, eth_hot_key, eth_cold_key, + .. }, } in txs { tracing::debug!( - "Applying genesis tx to init a validator account {alias}" + "Applying genesis tx to init a validator account {address}" ); let vp_code = self.lookup_vp(vp, genesis, vp_cache); @@ -469,8 +453,8 @@ where }, ) { tracing::warn!( - "Genesis init genesis validator tx for {alias} failed \ - with {err}. Skipping." + "Genesis init genesis validator tx for {address} \ + failed with {err}. Skipping." ); continue; } @@ -478,70 +462,6 @@ where } } - /// Apply genesis txs to transfer tokens - fn apply_genesis_txs_transfer( - &mut self, - genesis: &genesis::chain::Finalized, - ) { - if let Some(txs) = &genesis.transactions.transfer { - for TransferTx { - token, - source, - target, - amount, - .. - } in txs - { - let token = match genesis.get_token_address(token) { - Some(token) => { - tracing::debug!( - "Applying genesis tx to transfer {} of token \ - {token} from {source} to {target}", - amount - ); - token - } - None => { - tracing::warn!( - "Genesis token transfer tx uses an unknown token \ - alias {token}. Skipping." - ); - continue; - } - }; - let target = match genesis.get_user_address(target) { - Some(target) => target, - None => { - tracing::warn!( - "Genesis token transfer tx uses an unknown target \ - alias {target}. Skipping." - ); - continue; - } - }; - let source: Address = (&source.raw).into(); - tracing::debug!( - "Transfer addresses: token {token} from {source} to \ - {target}" - ); - - if let Err(err) = storage_api::token::transfer( - &mut self.wl_storage, - token, - &source, - &target, - amount.amount, - ) { - tracing::warn!( - "Genesis token transfer tx failed with: {err}. \ - Skipping." - ); - continue; - }; - } - } - } - /// Apply genesis txs to transfer tokens fn apply_genesis_txs_bonds(&mut self, genesis: &genesis::chain::Finalized) { let (current_epoch, _gas) = self.wl_storage.storage.get_current_epoch(); @@ -559,38 +479,9 @@ where amount, ); - let source = match source { - genesis::transactions::AliasOrPk::Alias(alias) => { - match genesis.get_user_address(alias) { - Some(addr) => addr, - None => { - tracing::warn!( - "Cannot find bond source address with \ - alias \"{alias}\". Skipping." - ); - continue; - } - } - } - genesis::transactions::AliasOrPk::PublicKey(pk) => { - Address::from(&pk.raw) - } - }; - - let validator = match genesis.get_validator_address(validator) { - Some(addr) => addr, - None => { - tracing::warn!( - "Cannot find bond validator address with alias \ - \"{validator}\". Skipping." - ); - continue; - } - }; - if let Err(err) = pos::namada_proof_of_stake::bond_tokens( &mut self.wl_storage, - Some(&source), + Some(&source.address()), validator, amount.amount, current_epoch, diff --git a/core/src/types/address.rs b/core/src/types/address.rs index 44373695a3..91028f0750 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -392,6 +392,20 @@ pub struct EstablishedAddress { hash: [u8; HASH_LEN], } +impl From<[u8; HASH_LEN]> for EstablishedAddress { + fn from(hash: [u8; HASH_LEN]) -> Self { + Self { hash } + } +} + +impl From<[u8; SHA_HASH_LEN]> for EstablishedAddress { + fn from(input_hash: [u8; SHA_HASH_LEN]) -> Self { + let mut hash = [0; HASH_LEN]; + hash.copy_from_slice(&input_hash[..HASH_LEN]); + Self { hash } + } +} + /// A generator of established addresses #[derive( Debug, @@ -438,6 +452,7 @@ impl EstablishedAddressGen { #[derive( Debug, Clone, + Default, BorshSerialize, BorshDeserialize, BorshSchema, diff --git a/core/src/types/key/mod.rs b/core/src/types/key/mod.rs index b7a426607a..9a13c13503 100644 --- a/core/src/types/key/mod.rs +++ b/core/src/types/key/mod.rs @@ -371,6 +371,7 @@ pub trait SigScheme: Eq + Ord + Debug + Serialize + Default { PartialOrd, Ord, Hash, + Default, )] pub struct PublicKeyHash(pub(crate) [u8; address::HASH_LEN]); diff --git a/sdk/src/wallet/pre_genesis.rs b/sdk/src/wallet/pre_genesis.rs index 689015c234..a0c9d4d58e 100644 --- a/sdk/src/wallet/pre_genesis.rs +++ b/sdk/src/wallet/pre_genesis.rs @@ -42,7 +42,7 @@ pub struct ValidatorWallet { pub tendermint_node_key: common::SecretKey, } -// Validator pre-genesis wallet store includes all the required keys for +/// Validator pre-genesis wallet store includes all the required keys for /// genesis setup. #[derive(Serialize, Deserialize, Debug)] pub struct ValidatorStore { diff --git a/tests/src/e2e/helpers.rs b/tests/src/e2e/helpers.rs index 09ec4ab808..13fe2b7287 100644 --- a/tests/src/e2e/helpers.rs +++ b/tests/src/e2e/helpers.rs @@ -19,10 +19,13 @@ use namada::types::address::Address; use namada::types::key::*; use namada::types::storage::Epoch; use namada::types::token; -use namada_apps::config::genesis::chain; +use namada_apps::config::genesis::chain::DeriveEstablishedAddress; +use namada_apps::config::genesis::{templates, transactions}; use namada_apps::config::utils::convert_tm_addr_to_socket_addr; use namada_apps::config::{Config, TendermintMode}; use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; +use namada_sdk::wallet::fs::FsWalletUtils; +use namada_sdk::wallet::Wallet; use super::setup::{ self, sleep, NamadaBgCmd, NamadaCmd, Test, ENV_VAR_DEBUG, @@ -172,25 +175,66 @@ pub fn get_actor_rpc(test: &Test, who: &Who) -> String { format!("{}:{}", 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 path = test.test_dir.path().join("genesis"); - let genesis = chain::Finalized::read_toml_files( - &path.join(test.net.chain_id.as_str()), + let mut wallet = get_node_wallet(test, who); + let sk = wallet + .find_secret_key(format!("validator-{index}-validator-key"), None) + .ok()?; + Some(sk.ref_to()) +} + +/// Get a pregenesis wallet. +pub fn get_pregenesis_wallet>( + base_dir_path: P, +) -> Wallet { + let mut wallet_store_dir = base_dir_path.as_ref().to_path_buf(); + wallet_store_dir.push("pre-genesis"); + + let mut wallet = FsWalletUtils::new(wallet_store_dir); + wallet.load().expect("Failed to load wallet"); + + wallet +} + +/// Get a pregenesis public key. +pub fn get_pregenesis_pk>( + alias: &str, + base_dir_path: P, +) -> Option { + let mut wallet = get_pregenesis_wallet(base_dir_path); + let sk = wallet.find_secret_key(alias, None).ok()?; + Some(sk.ref_to()) +} + +/// 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_key.as_ref().expect("the unexpected").pk.raw == pk + })?; + Some( + transactions::UnsignedEstablishedAccountTx::from(acct).derive_address(), ) - .unwrap(); - genesis - .transactions - .validator_account? - .iter() - .find(|val_tx| { - val_tx.tx.alias.to_string() == format!("validator-{}", index) - }) - .map(|val_tx| val_tx.tx.account_key.pk.raw.clone()) } /// Find the address of an account by its alias from the wallet diff --git a/tests/src/e2e/ibc_tests.rs b/tests/src/e2e/ibc_tests.rs index e1b3479d6e..08a864f3d1 100644 --- a/tests/src/e2e/ibc_tests.rs +++ b/tests/src/e2e/ibc_tests.rs @@ -262,13 +262,14 @@ fn setup_two_single_node_nets() -> Result<(Test, Test)> { .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_tx = genesis_b .transactions .validator_account .as_mut() .unwrap() .iter_mut() - .find(|val| val.tx.alias.to_string() == *"validator-0") + .find(|val| val.tx.account_key.pk.raw == validator_pk) .unwrap(); let new_port = validator_tx.tx.net_address.port() + setup::ANOTHER_CHAIN_PORT_OFFSET; diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 9f584e2b24..a8ccfb3f83 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -30,7 +30,6 @@ use namada_core::ledger::governance::cli::onchain::{ }; use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; use namada_sdk::masp::fs::FsShieldedUtils; -use namada_sdk::wallet::alias::Alias; use namada_test_utils::TestWasms; use namada_vp_prelude::BTreeSet; use serde_json::json; @@ -38,8 +37,8 @@ use setup::constants::*; use setup::Test; use super::helpers::{ - epochs_per_year_from_min_duration, get_height, wait_for_block_height, - wait_for_wasm_pre_compile, + epochs_per_year_from_min_duration, get_established_addr_from_pregenesis, + get_height, wait_for_block_height, wait_for_wasm_pre_compile, }; use super::setup::{get_all_wasms_hashes, set_ethereum_bridge_mode, NamadaCmd}; use crate::e2e::helpers::{ @@ -921,15 +920,13 @@ fn pos_bonds() -> Result<()> { base_dir, default_port_offset, ); - let bonds = genesis.transactions.bond.unwrap(); - genesis.transactions.bond = Some( + genesis.transactions.bond = Some({ + let mut bonds = genesis.transactions.bond.unwrap(); + // NB: the last bond should be from `validator-1`. + // we will filter it out from the list of bonds + bonds.pop(); bonds - .into_iter() - .filter(|bond| { - (&bond.data.validator).as_ref() != "validator-1" - }) - .collect(), - ); + }); genesis }, None, @@ -2116,7 +2113,12 @@ fn pgf_governance_proposal() -> Result<()> { genesis.parameters.parameters.min_num_of_blocks = 4; genesis.parameters.parameters.max_expected_time_per_block = 1; genesis.parameters.pgf_params.stewards = - BTreeSet::from_iter(Alias::from_str("albert")); + BTreeSet::from_iter([get_established_addr_from_pregenesis( + "albert-key", + base_dir, + &genesis, + ) + .unwrap()]); setup::set_validators(1, genesis, base_dir, |_| 0) }, None, @@ -3170,15 +3172,13 @@ fn deactivate_and_reactivate_validator() -> Result<()> { base_dir, default_port_offset, ); - let bonds = genesis.transactions.bond.unwrap(); - genesis.transactions.bond = Some( + genesis.transactions.bond = Some({ + let mut bonds = genesis.transactions.bond.unwrap(); + // NB: the last bond should be from `validator-1`. + // we will filter it out from the list of bonds + bonds.pop(); bonds - .into_iter() - .filter(|bond| { - (&bond.data.validator).as_ref() != "validator-1" - }) - .collect(), - ); + }); genesis }, None, diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index 35f5216905..6d4379720a 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -23,15 +23,15 @@ use namada_apps::client::utils::{ self, validator_pre_genesis_dir, validator_pre_genesis_txs_file, }; use namada_apps::config::genesis::toml_utils::read_toml; -use namada_apps::config::genesis::{chain, templates}; +use namada_apps::config::genesis::{templates, GenesisAddress}; use namada_apps::config::{ethereum_bridge, genesis, Config}; use namada_apps::{config, wallet}; +use namada_core::types::address::Address; use namada_core::types::key::{RefTo, SchemeType}; use namada_core::types::string_encoding::StringEncoded; use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; use namada_sdk::wallet::alias::Alias; use namada_tx_prelude::token; -use namada_vp_prelude::HashSet; use once_cell::sync::Lazy; use rand::rngs::OsRng; use rand::Rng; @@ -169,7 +169,7 @@ where .expect("NAM balances should exist in pre-genesis wallet already") .0 .insert( - StringEncoded::new(sk.ref_to()), + GenesisAddress::PublicKey(StringEncoded::new(sk.ref_to())), token::DenominatedAmount { amount: token::Amount::from_uint( 3000000, @@ -251,10 +251,10 @@ fn remove_self_bonds(genesis: &mut templates::All) { bonds .into_iter() .filter(|bond| { - if let genesis::transactions::AliasOrPk::Alias(alias) = + if let genesis::GenesisAddress::EstablishedAddress(address) = &bond.data.source { - *alias != bond.data.validator + Address::Established(address.clone()) != bond.data.validator } else { true } @@ -400,27 +400,23 @@ pub fn network( archive_dir, ); - let genesis_new = chain::Finalized::read_toml_files( - &genesis_dir.join(net.chain_id.as_str()), - ) - .unwrap(); - let validator_aliases = genesis_new + let validator_aliases = templates .transactions .validator_account .as_ref() .map(|txs| { - txs.iter().fold(HashSet::new(), |mut acc, finalized| { - acc.insert(finalized.tx.alias.to_string()); - acc - }) + Either::Right( + // hacky way to get all the validator indexes :-) + (0..txs.len()).map(|index| format!("validator-{index}")), + ) }) - .unwrap_or_default(); + .unwrap_or(Either::Left([].into_iter())); // Setup a dir for every validator and non-validator using their // pre-genesis wallets - for alias in &validator_aliases { + for alias in validator_aliases { let validator_base_dir = - test_dir.path().join(utils::NET_ACCOUNTS_DIR).join(alias); + test_dir.path().join(utils::NET_ACCOUNTS_DIR).join(&alias); // Copy the main wallet from templates dir into validator's base dir. { @@ -440,7 +436,7 @@ pub fn network( } println!("{} {}.", "Joining network with ".yellow(), alias); let validator_base_dir = - test_dir.path().join(utils::NET_ACCOUNTS_DIR).join(alias); + test_dir.path().join(utils::NET_ACCOUNTS_DIR).join(&alias); let mut join_network = run_cmd( Bin::Client, [ @@ -449,7 +445,7 @@ pub fn network( "--chain-id", net.chain_id.as_str(), "--genesis-validator", - alias, + &alias, "--dont-prefetch-wasm", ], Some(5), From 9980166034bde65b2676f9d61bf79fa1edd68aeb Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 16 Nov 2023 13:53:56 +0000 Subject: [PATCH 052/175] Load test established addrs from pre-genesis wallet Additionally, lazy-load the pre-genesis user and validator wallets, such that loading a key during a test does not result in a new I/O operation. --- apps/src/lib/wallet/defaults.rs | 112 +++++++++++++++++--------------- 1 file changed, 60 insertions(+), 52 deletions(-) diff --git a/apps/src/lib/wallet/defaults.rs b/apps/src/lib/wallet/defaults.rs index 71be346c70..19c8eda366 100644 --- a/apps/src/lib/wallet/defaults.rs +++ b/apps/src/lib/wallet/defaults.rs @@ -12,6 +12,7 @@ pub use dev::{ mod dev { use std::collections::HashMap; + use lazy_static::lazy_static; use namada::ledger::{governance, pgf, pos}; use namada::types::address::{ apfel, btc, dot, eth, kartoffel, nam, schnitzel, Address, @@ -19,15 +20,19 @@ mod dev { use namada::types::key::*; use namada_sdk::wallet::alias::Alias; use namada_sdk::wallet::pre_genesis::ValidatorWallet; + use namada_sdk::wallet::Wallet; + + use crate::wallet::CliWalletUtils; /// Get protocol, eth_bridge, and dkg keys from the validator pre-genesis /// wallet pub fn validator_keys() -> (common::SecretKey, common::SecretKey) { - let protocol_key = get_validator_pre_genesis_wallet() + let protocol_key = VALIDATOR_WALLET .store .validator_keys - .protocol_keypair; - let eth_bridge_key = get_validator_pre_genesis_wallet().eth_hot_key; + .protocol_keypair + .clone(); + let eth_bridge_key = VALIDATOR_WALLET.eth_hot_key.clone(); (protocol_key, eth_bridge_key) } @@ -86,25 +91,30 @@ mod dev { /// An established user address for testing & development pub fn albert_address() -> Address { - Address::decode("tnam1qxgzrwqn9qny9fzd7xnlrdkf7hhj9ecyx5mv3sgw") - .expect("The token address decoding shouldn't fail") + PREGENESIS_WALLET + .find_address("albert") + .expect("Albert's address should be in the pre-genesis wallet") + .into_owned() } /// An established user address for testing & development pub fn bertha_address() -> Address { - Address::decode("tnam1qyctxtpnkhwaygye0sftkq28zedf774xc5a2m7st") - .expect("The token address decoding shouldn't fail") + PREGENESIS_WALLET + .find_address("bertha") + .expect("Bertha's address should be in the pre-genesis wallet") + .into_owned() } /// An established user address for testing & development pub fn christel_address() -> Address { - Address::decode("tnam1q99ylwumqqs5r7uwgmyu7e94n07vjeqr4g970na0") - .expect("The token address decoding shouldn't fail") + PREGENESIS_WALLET + .find_address("christel") + .expect("Christel's address should be in the pre-genesis wallet") + .into_owned() } /// An implicit user address for testing & development pub fn daewon_address() -> Address { - // "tnam1qq83g60hemh00tza9naxmrhg7stz7neqhytnj6l0" (&daewon_keypair().ref_to()).into() } @@ -115,25 +125,21 @@ mod dev { /// An established validator address for testing & development pub fn validator_address() -> Address { - Address::decode("tnam1qxcc0xpgs72z6s5kx9ayvejs3mftf05jkutgz2cc") - .expect("The token address decoding shouldn't fail") + PREGENESIS_WALLET + .find_address("validator-0") + .expect( + "The zeroth validator's address should be in the pre-genesis \ + wallet", + ) + .into_owned() } /// Get an unecrypted keypair from the pre-genesis wallet. pub fn get_unencrypted_keypair(name: &str) -> common::SecretKey { - let mut root_dir = std::env::current_dir() - .expect("Current directory should exist") - .canonicalize() - .expect("Current directory should exist"); - // Find the project root dir - while !root_dir.join("rust-toolchain.toml").exists() { - root_dir.pop(); - } - let path = root_dir.join("genesis/localnet/src/pre-genesis"); - let wallet = crate::wallet::load(&path).unwrap(); - let sk = match wallet.get_secret_keys().get(name).unwrap().0 { + let sk = match PREGENESIS_WALLET.get_secret_keys().get(name).unwrap().0 + { namada_sdk::wallet::StoredKeypair::Encrypted(_) => { - panic!("{}'s keypair should not be encrypted", name) + panic!("{name}'s keypair should not be encrypted") } namada_sdk::wallet::StoredKeypair::Raw(sk) => sk, }; @@ -165,35 +171,37 @@ mod dev { get_unencrypted_keypair("ester") } - /// Get validator pre-genesis wallet - pub fn get_validator_pre_genesis_wallet() -> ValidatorWallet { - let mut root_dir = std::env::current_dir() - .expect("Current directory should exist") - .canonicalize() - .expect("Current directory should exist"); - // Find the project root dir - while !root_dir.join("rust-toolchain.toml").exists() { - root_dir.pop(); - } - let path = - root_dir.join("genesis/localnet/src/pre-genesis/validator-0"); - crate::wallet::pre_genesis::load(&path).unwrap() - } - /// Get the validator consensus keypair from the wallet. pub fn validator_keypair() -> common::SecretKey { - let mut root_dir = std::env::current_dir() - .expect("Current directory should exist") - .canonicalize() - .expect("Current directory should exist"); - // Find the project root dir - while !root_dir.join("rust-toolchain.toml").exists() { - root_dir.pop(); - } - let path = - root_dir.join("genesis/localnet/src/pre-genesis/validator-0"); - - let wallet = crate::wallet::pre_genesis::load(&path).unwrap(); - wallet.consensus_key + VALIDATOR_WALLET.consensus_key.clone() + } + + lazy_static! { + static ref PREGENESIS_WALLET: Wallet = { + let mut root_dir = std::env::current_dir() + .expect("Current directory should exist") + .canonicalize() + .expect("Current directory should exist"); + // Find the project root dir + while !root_dir.join("rust-toolchain.toml").exists() { + root_dir.pop(); + } + let path = root_dir.join("genesis/localnet/src/pre-genesis"); + crate::wallet::load(&path).unwrap() + }; + + static ref VALIDATOR_WALLET: ValidatorWallet = { + let mut root_dir = std::env::current_dir() + .expect("Current directory should exist") + .canonicalize() + .expect("Current directory should exist"); + // Find the project root dir + while !root_dir.join("rust-toolchain.toml").exists() { + root_dir.pop(); + } + let path = + root_dir.join("genesis/localnet/src/pre-genesis/validator-0"); + crate::wallet::pre_genesis::load(&path).unwrap() + }; } } From 8d6fbf8014a52a0d82ad646dbbd68816b103ec80 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 15 Nov 2023 10:39:02 +0000 Subject: [PATCH 053/175] Fix localnet genesis templates --- genesis/localnet/balances.toml | 133 +++++++++--------- genesis/localnet/parameters.toml | 7 +- .../established-account-tx-albert.toml | 6 + .../established-account-tx-bertha.toml | 6 + .../established-account-tx-christel.toml | 6 + .../src/pre-genesis/signed-transactions.toml | 118 ++-------------- .../pre-genesis/unsigned-transactions.toml | 95 ++----------- genesis/localnet/src/pre-genesis/wallet.toml | 32 ++--- 8 files changed, 127 insertions(+), 276 deletions(-) create mode 100644 genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml create mode 100644 genesis/localnet/src/pre-genesis/established/established-account-tx-bertha.toml create mode 100644 genesis/localnet/src/pre-genesis/established/established-account-tx-christel.toml diff --git a/genesis/localnet/balances.toml b/genesis/localnet/balances.toml index 308cea9776..78ddf06758 100644 --- a/genesis/localnet/balances.toml +++ b/genesis/localnet/balances.toml @@ -1,7 +1,8 @@ # Genesis balances. # # This files contains the genesis balances of any tokens present at genesis -# associated with public keys. +# associated with implicit addresses (in the form of public keys) or established +# addresses. # # For example: # ``` @@ -9,102 +10,108 @@ # some_pk_bech32m_encoding = 10 # genesis tokens, the amount can have up to 6 decimal places # ``` # -# The public keys present in here are taken from `pre-genesis/wallet.toml` +# The public keys present in here are taken from `pre-genesis/wallet.toml`. +# As for the established addresses, these are derived from their respective +# genesis tx toml files. [token.NAM] -# albert-key -tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r = "2000000" -# bertha-key -tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t = "2000000" +# albert +tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "2000000" +tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "2000000" +# bertha +tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "2000000" +tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq = "2000000" # christel -tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu = "2000000" +tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "2000000" +tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79 = "2000000" # daewon tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "100000000" # ester tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" -# validator-0-key -tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch = "200000" +# validator-0 +tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "200000" +tpknam1qpzrttnzfyt6xfu2vy092eruasll3z52rjfexwapdw0rdww5uktlk3j73dw = "200000" [token.BTC] -# albert-key -tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r = "1000000" -# bertha-key -tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t = "1000000" +# albert +tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +# bertha +tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" # christel -tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu = "1000000" -# daewon +tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +# daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" -# ester +# ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" -# validator-0-key -tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch = "1000000" +# validator-0 +tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" [token.ETH] -# albert-key -tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r = "1000000" -# bertha-key -tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t = "1000000" +# albert +tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +# bertha +tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" # christel -tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu = "1000000" -# daewon +tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +# daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" -# ester +# ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" -# validator-0-key -tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch = "1000000" +# validator-0 +tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" [token.DOT] -# albert-key -tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r = "1000000" -# bertha-key -tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t = "1000000" +# albert +tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +# bertha +tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" # christel -tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu = "1000000" -# daewon +tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +# daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" -# ester +# ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" -# validator-0-key -tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch = "1000000" +# validator-0 +tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" [token.Schnitzel] -# albert-key -tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r = "1000000" -# bertha-key -tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t = "1000000" +# albert +tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +# bertha +tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" # christel -tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu = "1000000" -# daewon +tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +# daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" -# ester +# ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" -# validator-0-key -tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch = "1000000" +# validator-0 +tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" [token.Apfel] -# albert-key -tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r = "1000000" -# bertha-key -tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t = "1000000" +# albert +tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +# bertha +tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" # christel -tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu = "1000000" -# daewon +tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +# daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" -# ester +# ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" -# validator-0-key -tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch = "1000000" +# validator-0 +tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" [token.Kartoffel] -# albert-key -tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r = "1000000" -# bertha-key -tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t = "1000000" +# albert +tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +# bertha +tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" # christel -tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu = "1000000" -# daewon +tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +# daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" -# ester +# ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" -# validator-0-key -tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch = "1000000" \ No newline at end of file +# validator-0 +tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" diff --git a/genesis/localnet/parameters.toml b/genesis/localnet/parameters.toml index 238af98bdd..00a721290f 100644 --- a/genesis/localnet/parameters.toml +++ b/genesis/localnet/parameters.toml @@ -91,7 +91,12 @@ min_proposal_grace_epochs = 6 # Public goods funding parameters [pgf_params] # Initial set of stewards -stewards = ["bertha", "validator-0"] +stewards = [ + # bertha + "tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7", + # validator-0 + "tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w" +] # The pgf funding inflation rate pgf_inflation_rate = "0.1" # The pgf stewards inflation rate diff --git a/genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml b/genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml new file mode 100644 index 0000000000..8bdc7b04b1 --- /dev/null +++ b/genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml @@ -0,0 +1,6 @@ +[[established_account]] +vp = "vp_user" + +[established_account.public_key] +pk = "tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha" +authorization = "signam1qz39jpapmmxyc99ra8ty74kdx8c0kax3n42z7n5y44e3tcara4ezm3l4llgwgqhp0kgg0kz48d02v2xfeqn5at4h069dddvmlhral7qgm59d37" diff --git a/genesis/localnet/src/pre-genesis/established/established-account-tx-bertha.toml b/genesis/localnet/src/pre-genesis/established/established-account-tx-bertha.toml new file mode 100644 index 0000000000..b6b1611bb5 --- /dev/null +++ b/genesis/localnet/src/pre-genesis/established/established-account-tx-bertha.toml @@ -0,0 +1,6 @@ +[[established_account]] +vp = "vp_user" + +[established_account.public_key] +pk = "tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq" +authorization = "signam1qqqvnh3e3j8rv6au622yw74jj76wpty7pttlnfussnyffhg8sk07q7g5ehw5hyz67amnvr4afmcr6tcfs6ktylcqrtc0h350j4zd0qgpqwn9z7" diff --git a/genesis/localnet/src/pre-genesis/established/established-account-tx-christel.toml b/genesis/localnet/src/pre-genesis/established/established-account-tx-christel.toml new file mode 100644 index 0000000000..2ecbd53966 --- /dev/null +++ b/genesis/localnet/src/pre-genesis/established/established-account-tx-christel.toml @@ -0,0 +1,6 @@ +[[established_account]] +vp = "vp_user" + +[established_account.public_key] +pk = "tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79" +authorization = "signam1qqfsz9dvtsan6kqp8zn256gvnuw5hsr27935w63cu0hl30535ewx7tpsf3zypq0hxmjh23z4q4sk7l046n6gjqmvg9ueyxl69lxgzvcfvujj9x" diff --git a/genesis/localnet/src/pre-genesis/signed-transactions.toml b/genesis/localnet/src/pre-genesis/signed-transactions.toml index 29157987cc..9d6baed550 100644 --- a/genesis/localnet/src/pre-genesis/signed-transactions.toml +++ b/genesis/localnet/src/pre-genesis/signed-transactions.toml @@ -1,126 +1,26 @@ [[established_account]] -alias = "albert" vp = "vp_user" [established_account.public_key] -pk = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -authorization = "signam1qzq6dwf2a9dq4hp3nmxfgckh55mulzryxsfkqhr9uvfvmtr9wt38lyyvzvfqryxnat2a4ry6hygv957z683dyngu03gse2uvl5ldfccyqvdpfr" - -[established_account.storage] +pk = "tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha" +authorization = "signam1qz39jpapmmxyc99ra8ty74kdx8c0kax3n42z7n5y44e3tcara4ezm3l4llgwgqhp0kgg0kz48d02v2xfeqn5at4h069dddvmlhral7qgm59d37" [[established_account]] -alias = "bertha" vp = "vp_user" [established_account.public_key] -pk = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -authorization = "signam1qzt58nd7k2mj647x8x4ydhsjkut7dmsl7yjlnrnwu9kzjdch3cljv6dq05mx2kvwn80kjezh7lz26adc5ksvyn3knufymtkhlmnhg3c8rvmxvv" - -[established_account.storage] +pk = "tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq" +authorization = "signam1qqqvnh3e3j8rv6au622yw74jj76wpty7pttlnfussnyffhg8sk07q7g5ehw5hyz67amnvr4afmcr6tcfs6ktylcqrtc0h350j4zd0qgpqwn9z7" [[established_account]] -alias = "christel" vp = "vp_user" [established_account.public_key] -pk = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -authorization = "signam1qrf2l6a5u4ywskryhdueudnm50j3kqhujas3mmktenqm89fmlskjnyeskr2tr7js5swmtqqtenkj6ap9xpelx2w40fjjczc4w9xtdggqn3k4vv" - -[established_account.storage] - -[[transfer]] -token = "nam" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qrxfthuz5yzapdt82d8nc656ffrzkxnkfg6fw8w7e6045vcpn8kpr4c536ug4fs2ddz5823dfd3w4qnhcl40qmtasfccaa99a0hvjcqv97vg8n" - -[[transfer]] -token = "btc" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qq826qel8zn5p4dfx25ma45uxeskx0yjlsaxp38uyvehvds6t93c8wkhaydunm4nzz9750dwhkjst00mfrwmu066y3rj6gtk5wjskxq9rksf35" - -[[transfer]] -token = "eth" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qzghddk0u6kpqaxhskrj8ah69d3hce95wndgvlpuyvuw0h0fnyrnp026ltvtfmfhpzywkf88yyhv80hzkus57s9nn6vn3ljvmkkf7zgqtfyyak" - -[[transfer]] -token = "dot" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qqlu8kajh0up5zhewd2h44fhq7zdaapqt9xaj8xp7jmdqpv4dl9d5tesw3wyr9su962rvpkf02x27579vqjk4f4advx7t9ejz74cjrc24m6y4r" - -[[transfer]] -token = "schnitzel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qpukdd6f7pvtgau9v58xxwrnmv5pjra6527aggce9j8cu6fnekzag2cmmf4w0x0cn76gpth2vw6zcsnw37xjuz96hflqfnk5sznxe6cfvwa9m4" - -[[transfer]] -token = "apfel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qprnsyhlruvw4a6jjs98xdd04gxdsgycywzt79gyyak68gn4f50ppdvdm0q6ns44cheu7s43kal0qsldml8s0zexqk3s9zmglu4l6fsz0zx8xa" - -[[transfer]] -token = "kartoffel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qpg4y6ltax3qfclguym2kpa0ezlkf4hz4u3h8fc2ndmuzm4zfe26ygq9u6nhjjvj93n5v296x4arkvjk22ygee2fx054ce7ap6gvynq2nsscys" - -[[transfer]] -token = "nam" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" -signature = "signam1qpe3ms76cxvqsa58624ked5ndjr3jr3u7lf9ypalxdh29gajwmsxtzjxzswk0xmza90u47tgksr0d7enpd730ps7fq5u76l7ekxeyvgfj9fhwt" - -[[transfer]] -token = "btc" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" -signature = "signam1qqq4yc6s3h4ysezcmgsdgyfsqu8mmrwwc8a358sm864zehx74ums8fmgmkyyr3wz9qqrc5fagwrw0a4mgqkkleumc0u6ynshj5ns0tcdz7wtf3" - -[[transfer]] -token = "eth" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" -signature = "signam1qzyqkdxt3cxf0huv0hzskqmuthw38s3kj2sx50znzc68gzx64hrd3hkyx0g27pruwa9fv42suw3k8gkfaelcp4ymnvfw7ltx0mz2z9qrt9gesf" - -[[transfer]] -token = "nam" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" -signature = "signam1qran2jh0dwuwchh45snhk3p9uyxqym57eg527pcjeekwhvpr5j0fy6dte7x3v2dwwc6vqmv49drpvmk6uhzlt2p8rqx0th3h7smf8rqrem03s8" - -[[transfer]] -token = "btc" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" -signature = "signam1qrxp6p56qtvsyp7jfs4jru3mkfv6l4t7hpguur72579pqjaexdry9turgmzwzj6qmua3s2y2a4krtuxwaag66j4dpz44aaqksy30tfcx6f3ez0" - -[[transfer]] -token = "eth" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" -signature = "signam1qrtrec6mps9p7zhmm7sywxwc7zdm32umt0zdwpuflrkh6952rx74amnsf9hn0yughs4e6czgpdmwsmujvkr4ptk2x24vtc8phz0s2asv27zjfs" +pk = "tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79" +authorization = "signam1qqfsz9dvtsan6kqp8zn256gvnuw5hsr27935w63cu0hl30535ewx7tpsf3zypq0hxmjh23z4q4sk7l046n6gjqmvg9ueyxl69lxgzvcfvujj9x" [[bond]] -source = "albert" -validator = "validator-0" +source = "tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt" +validator = "tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w" amount = "20000" -signature = "signam1qpx0kc8rl966vnnswfwhcwxh5vv69p7lev2apc2yephag978gqg5903kuw6dugg9c6pg5jdw048umk72ntympphz0dka74aspldslaqrs6cwg6" +signature = "signam1qz00emwjxmvgjlknc55qffxepur6xlay4zhmnejchw32nuwz2kajmn06hdkmdctu9nrnp3kk0hg6495rsvm5paglyuvyekzcvcxzp2qxvf8hlh" diff --git a/genesis/localnet/src/pre-genesis/unsigned-transactions.toml b/genesis/localnet/src/pre-genesis/unsigned-transactions.toml index 66029a039d..4450ea7289 100644 --- a/genesis/localnet/src/pre-genesis/unsigned-transactions.toml +++ b/genesis/localnet/src/pre-genesis/unsigned-transactions.toml @@ -13,102 +13,23 @@ # Albert [[established_account]] -alias = "albert" vp = "vp_user" -public_key = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" +public_key = "tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha" # Bertha [[established_account]] -alias = "bertha" vp = "vp_user" -public_key = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" +public_key = "tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq" # Christel [[established_account]] -alias = "christel" vp = "vp_user" -public_key = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" +public_key = "tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79" -# Transfer all the Albert's tokens into it's established account: -[[transfer]] -token = "NAM" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" - -[[transfer]] -token = "BTC" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" - -[[transfer]] -token = "ETH" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" - -[[transfer]] -token = "DOT" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" - -[[transfer]] -token = "Schnitzel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" - -[[transfer]] -token = "Apfel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" - -[[transfer]] -token = "Kartoffel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" - -[[transfer]] -token = "NAM" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" - -[[transfer]] -token = "BTC" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" - -[[transfer]] -token = "ETH" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" - -[[transfer]] -token = "NAM" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" - -[[transfer]] -token = "BTC" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" - -[[transfer]] -token = "ETH" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" +########################################################################################## +# Albert bonds to `validator-0` [[bond]] -source = "albert" -validator = "validator-0" -amount = "20000" \ No newline at end of file +source = "tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt" +validator = "tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w" +amount = "20000" diff --git a/genesis/localnet/src/pre-genesis/wallet.toml b/genesis/localnet/src/pre-genesis/wallet.toml index 14efec25d9..60a328c0c0 100644 --- a/genesis/localnet/src/pre-genesis/wallet.toml +++ b/genesis/localnet/src/pre-genesis/wallet.toml @@ -5,41 +5,41 @@ [payment_addrs] [secret_keys] -albert-key = "unencrypted:0083318ccceac6c08a0177667840b4b93f0e455e45d4c38c28b73b8f8462fbf548" -bertha-key = "unencrypted:0073ed61817720d27784e7a9bca4a60668d763a6f7ecac2d45ed1f241aa5c59e99" -christel-key = "unencrypted:003625b939a58ef60402d7cf8fc04250026cc1ba90cc3028af1ce6b22be857ffc7" +albert-key = "unencrypted:000d5e9d7d66f0e4307edacde6e6578e31d331bcf234352647d00d20955102d3ce" +bertha-key = "unencrypted:0009eedb2e68fd69d6772bf02d92a10f85dfa7eac6fdad0ee589255756b25ab760" +christel-key = "unencrypted:00a08de8d33b9798328d2e4476fade49f515dc82754451fc6ef7060ea0bd1e8f1a" daewon = "unencrypted:00d19e226c0e7d123d79f5908b5948d4c461b66a5f8aa95600c28b55ab6f5dc772" ester = "unencrypted:01369093e2035d84f72a7e5a17c89b7a938b5d08cc87b2289805e3afcc66ef9a42" faucet-key = "unencrypted:00548aa8393422b88dce5f4be8ee0320638061c3e0649ada1b0dacbec4c0c75bb2" -validator-0-balance-key = "unencrypted:000b9c8cb8f3ad6b8a387b064a11c0e98189814e9733aa7bb1e802425f6356f98a" [public_keys] -albert-key = "ED25519_PK_PREFIXtpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -bertha-key = "ED25519_PK_PREFIXtpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -christel-key = "ED25519_PK_PREFIXtpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" +albert-key = "ED25519_PK_PREFIXtpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha" +bertha-key = "ED25519_PK_PREFIXtpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq" +christel-key = "ED25519_PK_PREFIXtpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79" daewon = "ED25519_PK_PREFIXtpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm" ester = "SECP256K1_PK_PREFIXtpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4" faucet-key = "ED25519_PK_PREFIXtpknam1qzh2d8vk9wvj2j63fa3cvjru9uldpdjctjjxpafl5r8vwwf56pdgyq0vra4" -validator-0-balance-key = "ED25519_PK_PREFIXtpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch" [derivation_paths] [addresses] -albert-key = "tnam1qp2yqaffsk2wekd8fheu5c0cv3heg8v37vmdd45u" -bertha-key = "tnam1qqm6sgr63e2zgngh5hlff8r8rennq4vldgdyqdaa" -christel-key = "tnam1qrcgykypppxwx96zkejvhjnda7mn9m3prsz78pkf" +albert = "tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt" +bertha = "tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7" +christel = "tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns" +albert-key = "tnam1qrr8r00nrf6490ff9zgfz52xrnfhdja7rqvldl46" +bertha-key = "tnam1qqc2ge6tg7s03nlshjr5d79dqyjr33aa8g2mxyzm" +christel-key = "tnam1qz0nvec686e9pks8ynhm5ddq8ke7j2eey50uagtr" daewon = "tnam1qpca48f45pdtpcz06rue7k4kfdcjrvrux5cr3pwn" ester = "tnam1qpm3dpsv76ttu382vfggtr7m8n00na3sfyzm2g2q" faucet-key = "tnam1qzgcl2znamndmku7ujw6e79dmvd4v7rfd5c89dfz" -validator-0-balance-key = "tnam1qrarncdv96reutgdetkwewdpdyncykaflyzz36vh" +validator-0 = "tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w" [pkhs] -37A8207A8E54244D17A5FE949C671E6730559F6A = "bertha-key" -544075298594ECD9A74DF3CA61F8646F941D91F3 = "albert-key" +30A4674B47A0F8CFF0BC8746F8AD012438C7BD3A = "bertha-key" +C671BDF31A7552BD2928909151461CD376CBBE18 = "albert-key" 71DA9D35A05AB0E04FD0F99F5AB64B7121B07C35 = "daewon" 918FA853EEE6DDDB9EE49DACF8ADDB1B5678696D = "faucet-key" -F0825881084CE31742B664CBCA6DEFB732EE211C = "christel-key" +9F36671A3EB250DA0724EFBA35A03DB3E92B3925 = "christel-key" 7716860CF696BE44EA6250858FDB3CDEF9F63049 = "ester" -FA39E1AC2E879E2D0DCAECECB9A16927825BA9F9 = "validator-0-balance-key" [address_vp_types] From 89d8e07ee7abd1657513a38e820a31120d2bdd0b Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 17 Nov 2023 15:01:55 +0000 Subject: [PATCH 054/175] Early check of available balance to bond --- proof_of_stake/src/lib.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 4ab419905b..0026adb25f 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -803,9 +803,7 @@ where return Ok(()); } - let params = read_pos_params(storage)?; - let offset = offset_opt.unwrap_or(params.pipeline_len); - let offset_epoch = current_epoch + offset; + // Transfer the bonded tokens from the source to PoS if let Some(source) = source { if source != validator && is_validator(storage, source)? { return Err( @@ -813,6 +811,15 @@ where ); } } + let source = source.unwrap_or(validator); + tracing::debug!("Source {source} --> Validator {validator}"); + + let staking_token = staking_token_address(storage); + token::transfer(storage, &staking_token, source, &ADDRESS, amount)?; + + let params = read_pos_params(storage)?; + let offset = offset_opt.unwrap_or(params.pipeline_len); + let offset_epoch = current_epoch + offset; // Check that the validator is actually a validator let validator_state_handle = validator_state_handle(validator); @@ -821,9 +828,6 @@ where return Err(BondError::NotAValidator(validator.clone()).into()); } - let source = source.unwrap_or(validator); - tracing::debug!("Source {} --> Validator {}", source, validator); - let bond_handle = bond_handle(source, validator); let total_bonded_handle = total_bonded_handle(validator); @@ -877,10 +881,6 @@ where offset_opt, )?; - // Transfer the bonded tokens from the source to PoS - let staking_token = staking_token_address(storage); - token::transfer(storage, &staking_token, source, &ADDRESS, amount)?; - Ok(()) } From ddb700e07017527a86bc665716605e1b1275a68e Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 17 Nov 2023 15:05:08 +0000 Subject: [PATCH 055/175] Adjust dev genesis --- apps/src/lib/config/genesis.rs | 72 ++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index 7e527a50ed..52320210f6 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -317,7 +317,6 @@ pub fn make_dev_genesis( use namada::types::chain::ChainIdPrefix; use namada::types::ethereum_events::EthAddress; use namada::types::key::*; - use namada::types::token::NATIVE_MAX_DECIMAL_PLACES; use namada_sdk::wallet::alias::Alias; use crate::config::genesis::chain::{finalize, DeriveEstablishedAddress}; @@ -356,23 +355,6 @@ pub fn make_dev_genesis( erc20_whitelist: vec![], }); - if let Some(vals) = genesis.transactions.validator_account.as_mut() { - let tx = vals.get_mut(0).unwrap(); - // Use the default validator address - tx.address = defaults::validator_address(); - - // Use the default validator key - have to add it with a sig - tx.address = defaults::validator_address(); - let sk = defaults::validator_keypair(); - let pk = StringEncoded::new(sk.to_public()); - let unsigned_tx = UnsignedValidatorAccountTx::from(&tx.tx); - let sig = transactions::sign_tx(&unsigned_tx, &sk); - tx.tx.account_key = transactions::SignedPk { - pk, - authorization: sig, - }; - } - // Use the default token address for matching tokens let default_tokens: HashMap = defaults::tokens() .into_iter() @@ -404,6 +386,35 @@ pub fn make_dev_genesis( )); bonds.retain(|bond| bond.source != fat_alberts_address); }; + // fetch validator's balances + let (first_val_balance, first_val_bonded) = { + let nam_balances = genesis + .balances + .token + .get_mut(&Alias::from_str("nam").unwrap()) + .unwrap(); + + let tx = genesis + .transactions + .validator_account + .as_ref() + .unwrap() + .get(0) + .unwrap(); + let genesis_addr = GenesisAddress::EstablishedAddress( + UnsignedValidatorAccountTx::from(&tx.tx) + .derive_established_address(), + ); + + let balance = *nam_balances.0.get(&genesis_addr).unwrap(); + let bonded = { + let bond = + genesis.transactions.bond.as_mut().unwrap().get(0).unwrap(); + bond.amount + }; + + (balance, bonded) + }; let secp_eth_cold_keypair = secp256k1::SecretKey::try_from_slice(&[ 90, 83, 107, 155, 193, 251, 120, 27, 76, 1, 188, 8, 116, 121, 90, 99, 65, 17, 187, 6, 238, 141, 63, 188, 76, 38, 102, 7, 47, 185, 28, 52, @@ -429,7 +440,7 @@ pub fn make_dev_genesis( common::SecretKey::try_from_sk(&secp_eth_cold_keypair).unwrap(); let (protocol_keypair, eth_bridge_keypair) = defaults::validator_keys(); // add the validator - let validator_address = if let Some(vals) = + let (validator_address, account_pk) = if let Some(vals) = genesis.transactions.validator_account.as_mut() { let validator_account_tx = transactions::ValidatorAccountTx { @@ -486,10 +497,26 @@ pub fn make_dev_genesis( eth_cold_key: sign_pk(ð_cold_keypair), }, }); - validator_address + (validator_address, account_keypair.ref_to()) } else { unreachable!() }; + // credit nam tokens to validators such that they can bond + { + let nam_balances = genesis + .balances + .token + .get_mut(&Alias::from_str("nam").unwrap()) + .unwrap(); + + let validator_addr = + GenesisAddress::EstablishedAddress(validator_address.clone()); + let account_pk = + GenesisAddress::PublicKey(StringEncoded::new(account_pk)); + + nam_balances.0.insert(validator_addr, first_val_balance); + nam_balances.0.insert(account_pk, first_val_balance); + } // self bond if let Some(bonds) = genesis.transactions.bond.as_mut() { bonds.push(transactions::BondTx { @@ -497,10 +524,7 @@ pub fn make_dev_genesis( validator_address.clone(), ), validator: Address::Established(validator_address), - amount: token::DenominatedAmount { - amount: token::Amount::native_whole(100_000), - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }, + amount: first_val_bonded, }) } } From cae69500bdb1a0c1e139bded606630cf5193d3ed Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 17 Nov 2023 15:36:25 +0000 Subject: [PATCH 056/175] Fix PoS rewards rounding errors in unit tests --- apps/src/lib/node/ledger/shell/finalize_block.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 257b766a03..d7c35e8bd9 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -2545,8 +2545,8 @@ mod test_finalize_block { (Dec::one() - stake_ratio) * inflation_3 + commission; let exp_del_reward = del_rewards_no_commission - commission; - assert_eq!(exp_val_reward, val_reward_2); - assert_eq!(exp_del_reward, del_reward_1); + assert!(is_reward_equal_enough(exp_val_reward, val_reward_2, 1)); + assert!(is_reward_equal_enough(exp_del_reward, del_reward_1, 1)); } /// A unit test for changing consensus keys and communicating to CometBFT From 77fd80f8584c803db0ced86866e5ae6e1078c721 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 15 Nov 2023 14:22:21 +0000 Subject: [PATCH 057/175] CLI utils subcmd to generate established account genesis tx --- apps/src/lib/cli.rs | 54 +++++++++++++++++++ apps/src/lib/cli/client.rs | 3 ++ apps/src/lib/client/utils.rs | 60 +++++++++++++++++++++ apps/src/lib/config/genesis/transactions.rs | 19 +++++++ 4 files changed, 136 insertions(+) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index fbc24acf65..a5132d78f3 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2179,6 +2179,7 @@ pub mod cmds { FetchWasms(FetchWasms), ValidateWasm(ValidateWasm), InitNetwork(InitNetwork), + InitGenesisEstablishedAccount(InitGenesisEstablishedAccount), InitGenesisValidator(InitGenesisValidator), PkToTmAddress(PkToTmAddress), DefaultBaseDir(DefaultBaseDir), @@ -2199,6 +2200,8 @@ pub mod cmds { SubCmd::parse(matches).map(Self::ValidateWasm); let init_network = SubCmd::parse(matches).map(Self::InitNetwork); + let init_established = SubCmd::parse(matches) + .map(Self::InitGenesisEstablishedAccount); let init_genesis = SubCmd::parse(matches).map(Self::InitGenesisValidator); let pk_to_tm_address = @@ -2214,6 +2217,7 @@ pub mod cmds { .or(fetch_wasms) .or(validate_wasm) .or(init_network) + .or(init_established) .or(init_genesis) .or(pk_to_tm_address) .or(default_base_dir) @@ -2230,6 +2234,7 @@ pub mod cmds { .subcommand(FetchWasms::def()) .subcommand(ValidateWasm::def()) .subcommand(InitNetwork::def()) + .subcommand(InitGenesisEstablishedAccount::def()) .subcommand(InitGenesisValidator::def()) .subcommand(PkToTmAddress::def()) .subcommand(DefaultBaseDir::def()) @@ -2320,6 +2325,29 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct InitGenesisEstablishedAccount( + pub args::InitGenesisEstablishedAccount, + ); + + impl SubCmd for InitGenesisEstablishedAccount { + const CMD: &'static str = "init-genesis-established-account"; + + fn parse(matches: &ArgMatches) -> Option { + matches.subcommand_matches(Self::CMD).map(|matches| { + Self(args::InitGenesisEstablishedAccount::parse(matches)) + }) + } + + fn def() -> App { + App::new(Self::CMD) + .about( + "Initialize an established account available at genesis.", + ) + .add_args::() + } + } + #[derive(Clone, Debug)] pub struct InitGenesisValidator(pub args::InitGenesisValidator); @@ -3084,6 +3112,7 @@ pub mod args { pub const VERIFICATION_KEY: ArgOpt = arg_opt("verification-key"); pub const VIEWING_KEY: Arg = arg("key"); + pub const VP: ArgOpt = arg_opt("vp"); pub const WALLET_ALIAS_FORCE: ArgFlag = flag("wallet-alias-force"); pub const WASM_CHECKSUMS_PATH: Arg = arg("wasm-checksums-path"); pub const WASM_DIR: ArgOpt = arg_opt("wasm-dir"); @@ -6697,6 +6726,31 @@ pub mod args { } } + #[derive(Clone, Debug)] + pub struct InitGenesisEstablishedAccount { + pub vp: String, + pub wallet_alias: String, + } + + impl Args for InitGenesisEstablishedAccount { + fn parse(matches: &ArgMatches) -> Self { + let wallet_alias = ALIAS.parse(matches); + let vp = VP.parse(matches).unwrap_or_else(|| "vp_user".to_string()); + Self { wallet_alias, vp } + } + + fn def(app: App) -> App { + app.arg( + ALIAS + .def() + .help("The alias of the key to use from the wallet."), + ) + .arg(VP.def().help( + "The validity predicate of the account. Defaults to `vp_user`.", + )) + } + } + #[derive(Clone, Debug)] pub struct InitGenesisValidator { pub alias: String, diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 4d56c1e9c1..449fb2f839 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -634,6 +634,9 @@ impl CliApi { Utils::InitNetwork(InitNetwork(args)) => { utils::init_network(global_args, args) } + Utils::InitGenesisEstablishedAccount( + InitGenesisEstablishedAccount(args), + ) => utils::init_genesis_established_account(global_args, args), Utils::InitGenesisValidator(InitGenesisValidator(args)) => { utils::init_genesis_validator(global_args, args) } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index a73898be0c..bb0b9c587b 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -5,6 +5,7 @@ use std::path::{Path, PathBuf}; use std::str::FromStr; use borsh_ext::BorshSerializeExt; +use color_eyre::owo_colors::OwoColorize; use flate2::read::GzDecoder; use flate2::write::GzEncoder; use flate2::Compression; @@ -587,6 +588,56 @@ pub fn default_base_dir( ); } +/// Initialize a genesis established account. +/// key into a special "pre-genesis" wallet. +pub fn init_genesis_established_account( + global_args: args::Global, + args: args::InitGenesisEstablishedAccount, +) { + let (mut pre_genesis_wallet, _) = + load_pre_genesis_wallet_or_exit(&global_args.base_dir); + + let alias = args.wallet_alias.as_str(); + let public_key = { + let sk = pre_genesis_wallet + .find_secret_key(alias, None) + .unwrap_or_else(|err| { + eprintln!( + "Failed to look-up `{alias}` in the pre-genesis wallet: \ + {err}", + ); + safe_exit(1) + }); + sk.ref_to() + }; + + let (address, txs) = genesis::transactions::init_established_account( + args.vp, + public_key, + &mut pre_genesis_wallet, + ); + let toml_path = { + let pre_genesis_dir = global_args.base_dir.join(PRE_GENESIS_DIR); + established_acc_pre_genesis_txs_file(alias, &pre_genesis_dir) + }; + let toml_path_str = toml_path.to_string_lossy(); + + let genesis_part = toml::to_string(&txs).unwrap(); + fs::write(&toml_path, genesis_part).unwrap_or_else(|err| { + eprintln!( + "Couldn't write pre-genesis transactions file to {toml_path_str}. \ + Failed with: {err}", + ); + safe_exit(1) + }); + + println!( + "{}: {address}", + "Derived established account address".bold() + ); + println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); +} + /// Initialize genesis validator's address, consensus key and validator account /// key into a special "pre-genesis" wallet. pub fn init_genesis_validator( @@ -760,6 +811,15 @@ pub fn validator_pre_genesis_txs_file(pre_genesis_path: &Path) -> PathBuf { pre_genesis_path.join("transactions.toml") } +/// The default path to an established account txs file. +pub fn established_acc_pre_genesis_txs_file( + wallet_key_alias: &str, + pre_genesis_path: &Path, +) -> PathBuf { + pre_genesis_path + .join(format!("established-account-tx-{wallet_key_alias}.toml")) +} + /// The default validator pre-genesis directory pub fn validator_pre_genesis_dir(base_dir: &Path, alias: &str) -> PathBuf { base_dir.join(PRE_GENESIS_DIR).join(alias) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 388f707b23..6495da6a6f 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -100,6 +100,25 @@ pub fn parse_unsigned( toml::from_slice(bytes) } +/// Create signed [`Transactions`] for an established account. +pub fn init_established_account( + vp: String, + public_key: common::PublicKey, + wallet: &mut Wallet, +) -> (Address, Transactions) { + let unsigned_tx = EstablishedAccountTx { + vp, + public_key: Some(StringEncoded::new(public_key)), + }; + let address = unsigned_tx.derive_address(); + let signed_tx = sign_established_account_tx(unsigned_tx, wallet); + let txs = Transactions { + established_account: Some(vec![signed_tx]), + ..Default::default() + }; + (address, txs) +} + /// Create signed [`Transactions`] for a genesis validator. pub fn init_validator( GenesisValidatorData { From 78fbee71238b42ef75e89787f2c09776d86d5c4f Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 15 Nov 2023 14:38:53 +0000 Subject: [PATCH 058/175] Rework CLI utils subcmd to generate validator account genesis tx --- apps/src/lib/client/utils.rs | 25 ++++++++------------- apps/src/lib/config/genesis/transactions.rs | 15 +++++++------ 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index bb0b9c587b..0b3c1c8a16 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -693,7 +693,7 @@ pub fn init_genesis_validator( pre_genesis::validator_file_name(&pre_genesis_dir).to_string_lossy() ); - let transactions = genesis::transactions::init_validator( + let (address, transactions) = genesis::transactions::init_validator( genesis::transactions::GenesisValidatorData { commission_rate, max_commission_rate_change, @@ -706,27 +706,20 @@ pub fn init_genesis_validator( }, &validator_wallet, ); + let toml_path = validator_pre_genesis_txs_file(&pre_genesis_dir); + let toml_path_str = toml_path.to_string_lossy(); let genesis_part = toml::to_string(&transactions).unwrap(); - println!("Your public signed pre-genesis transactions TOML:"); - println!(); - println!("{genesis_part}"); - - let file_name = validator_pre_genesis_txs_file(&pre_genesis_dir); - fs::write(&file_name, genesis_part).unwrap_or_else(|err| { + fs::write(&toml_path, genesis_part).unwrap_or_else(|err| { eprintln!( - "Couldn't write pre-genesis transactions file to {}. Failed with: \ - {}", - file_name.to_string_lossy(), - err + "Couldn't write pre-genesis transactions file to {toml_path_str}. \ + Failed with: {err}", ); safe_exit(1) }); - println!(); - println!( - "Pre-genesis transactions TOML written to {}", - file_name.to_string_lossy() - ); + + println!("{}: {address}", "Derived validator account address".bold()); + println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); } /// Try to load a pre-genesis wallet or terminate if it cannot be found. diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 6495da6a6f..56c75687dc 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -132,7 +132,7 @@ pub fn init_validator( discord_handle, }: GenesisValidatorData, validator_wallet: &ValidatorWallet, -) -> Transactions { +) -> (Address, Transactions) { let unsigned_validator_account_tx = UnsignedValidatorAccountTx { account_key: StringEncoded::new(validator_wallet.account_key.ref_to()), consensus_key: StringEncoded::new( @@ -164,8 +164,6 @@ pub fn init_validator( net_address, }; let unsigned_validator_addr = - unsigned_validator_account_tx.derive_address(); - let unsigned_validator_established_addr = unsigned_validator_account_tx.derive_established_address(); let validator_account = Some(vec![sign_validator_account_tx( unsigned_validator_account_tx, @@ -177,20 +175,23 @@ pub fn init_validator( } else { let unsigned_bond_tx = BondTx { source: GenesisAddress::EstablishedAddress( - unsigned_validator_established_addr, + unsigned_validator_addr.clone(), ), - validator: unsigned_validator_addr, + validator: Address::Established(unsigned_validator_addr.clone()), amount: self_bond_amount, }; let bond_tx = sign_self_bond_tx(unsigned_bond_tx, validator_wallet); Some(vec![bond_tx]) }; - Transactions { + let address = Address::Established(unsigned_validator_addr); + let txs = Transactions { validator_account, bond, ..Default::default() - } + }; + + (address, txs) } pub fn sign_established_account_tx( From 3dbb4e897193f4aa5cf5af30ca13f66d8d886ee5 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 15 Nov 2023 15:55:33 +0000 Subject: [PATCH 059/175] CLI utils subcmd to derive genesis account addrs --- apps/src/lib/cli.rs | 40 ++++++++++++ apps/src/lib/cli/client.rs | 3 + apps/src/lib/client/utils.rs | 119 +++++++++++++++++++++++++++++++---- 3 files changed, 150 insertions(+), 12 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index a5132d78f3..dbddc20565 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2179,6 +2179,7 @@ pub mod cmds { FetchWasms(FetchWasms), ValidateWasm(ValidateWasm), InitNetwork(InitNetwork), + DeriveGenesisAddresses(DeriveGenesisAddresses), InitGenesisEstablishedAccount(InitGenesisEstablishedAccount), InitGenesisValidator(InitGenesisValidator), PkToTmAddress(PkToTmAddress), @@ -2200,6 +2201,8 @@ pub mod cmds { SubCmd::parse(matches).map(Self::ValidateWasm); let init_network = SubCmd::parse(matches).map(Self::InitNetwork); + let derive_addresses = + SubCmd::parse(matches).map(Self::DeriveGenesisAddresses); let init_established = SubCmd::parse(matches) .map(Self::InitGenesisEstablishedAccount); let init_genesis = @@ -2217,6 +2220,7 @@ pub mod cmds { .or(fetch_wasms) .or(validate_wasm) .or(init_network) + .or(derive_addresses) .or(init_established) .or(init_genesis) .or(pk_to_tm_address) @@ -2234,6 +2238,7 @@ pub mod cmds { .subcommand(FetchWasms::def()) .subcommand(ValidateWasm::def()) .subcommand(InitNetwork::def()) + .subcommand(DeriveGenesisAddresses::def()) .subcommand(InitGenesisEstablishedAccount::def()) .subcommand(InitGenesisValidator::def()) .subcommand(PkToTmAddress::def()) @@ -2325,6 +2330,25 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct DeriveGenesisAddresses(pub args::DeriveGenesisAddresses); + + impl SubCmd for DeriveGenesisAddresses { + const CMD: &'static str = "derive-genesis-addresses"; + + fn parse(matches: &ArgMatches) -> Option { + matches.subcommand_matches(Self::CMD).map(|matches| { + Self(args::DeriveGenesisAddresses::parse(matches)) + }) + } + + fn def() -> App { + App::new(Self::CMD) + .about("Derive account addresses from a genesis txs toml file.") + .add_args::() + } + } + #[derive(Clone, Debug)] pub struct InitGenesisEstablishedAccount( pub args::InitGenesisEstablishedAccount, @@ -6726,6 +6750,22 @@ pub mod args { } } + #[derive(Clone, Debug)] + pub struct DeriveGenesisAddresses { + pub genesis_txs_path: PathBuf, + } + + impl Args for DeriveGenesisAddresses { + fn parse(matches: &ArgMatches) -> Self { + let genesis_txs_path = PATH.parse(matches); + Self { genesis_txs_path } + } + + fn def(app: App) -> App { + app.arg(PATH.def().help("Path to the genesis txs toml file.")) + } + } + #[derive(Clone, Debug)] pub struct InitGenesisEstablishedAccount { pub vp: String, diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 449fb2f839..2f06a497d4 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -634,6 +634,9 @@ impl CliApi { Utils::InitNetwork(InitNetwork(args)) => { utils::init_network(global_args, args) } + Utils::DeriveGenesisAddresses(DeriveGenesisAddresses(args)) => { + utils::derive_genesis_addresses(global_args, args) + } Utils::InitGenesisEstablishedAccount( InitGenesisEstablishedAccount(args), ) => utils::init_genesis_established_account(global_args, args), diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 0b3c1c8a16..4f4b88a7e5 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -22,6 +22,7 @@ use sha2::{Digest, Sha256}; use crate::cli::args; use crate::cli::context::ENV_VAR_WASM_DIR; +use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::global::GlobalConfig; use crate::config::{ self, genesis, get_default_namada_folder, Config, TendermintMode, @@ -588,6 +589,95 @@ pub fn default_base_dir( ); } +/// Derive and print all established addresses from the provided +/// genesis txs toml file. +pub fn derive_genesis_addresses( + global_args: args::Global, + args: args::DeriveGenesisAddresses, +) { + let maybe_pre_genesis_wallet = + try_load_pre_genesis_wallet(&global_args.base_dir) + .map(|(wallet, _)| wallet); + + let genesis_txs = + genesis::templates::read_transactions(&args.genesis_txs_path).unwrap(); + + println!("{}", "Established account txs:".underline().bold()); + for tx in genesis_txs + .established_account + .as_ref() + .into_iter() + .flatten() + { + let address = { + let unsigned = + genesis::transactions::UnsignedEstablishedAccountTx::from(tx); + unsigned.derive_address() + }; + let pk = if let Some(public_key) = tx.public_key.as_ref() { + &public_key.pk.raw + } else { + continue; + }; + + println!(); + println!("{} {address}", "Address:".bold().bright_green()); + println!("{} {pk}", "Public key:".bold().bright_green()); + + let maybe_alias = + maybe_pre_genesis_wallet.as_ref().and_then(|wallet| { + let implicit_address = pk.into(); + wallet.find_alias(&implicit_address) + }); + + if let Some(alias) = maybe_alias { + println!("{} {alias}", "Wallet alias:".bold().bright_green()); + } + } + if genesis_txs + .established_account + .as_ref() + .map(|txs| txs.is_empty()) + .unwrap_or(true) + { + println!(); + println!("{}", "".dimmed()); + } + + println!(); + + println!("{}", "Validator account txs:".underline().bold()); + for tx in genesis_txs.validator_account.as_ref().into_iter().flatten() { + let address = { + let unsigned = + genesis::transactions::UnsignedValidatorAccountTx::from(tx); + unsigned.derive_address() + }; + println!(); + println!("{} {address}", "Address:".bold().bright_green()); + let keys = [ + ("Account key:", &tx.account_key.pk.raw), + ("Consensus key:", &tx.consensus_key.pk.raw), + ("Protocol key:", &tx.protocol_key.pk.raw), + ("Tendermint node key:", &tx.tendermint_node_key.pk.raw), + ("Ethereum hot key:", &tx.eth_hot_key.pk.raw), + ("Ethereum cold key:", &tx.eth_cold_key.pk.raw), + ]; + for (description, key) in keys { + println!("{} {key}", description.bold().bright_green()); + } + } + if genesis_txs + .validator_account + .as_ref() + .map(|txs| txs.is_empty()) + .unwrap_or(true) + { + println!(); + println!("{}", "".dimmed()); + } +} + /// Initialize a genesis established account. /// key into a special "pre-genesis" wallet. pub fn init_genesis_established_account( @@ -722,22 +812,27 @@ pub fn init_genesis_validator( println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); } +/// Try to load a pre-genesis wallet or return nothing, +/// if it cannot be found. +pub fn try_load_pre_genesis_wallet( + base_dir: &Path, +) -> Option<(Wallet, PathBuf)> { + let pre_genesis_dir = base_dir.join(PRE_GENESIS_DIR); + + crate::wallet::load(&pre_genesis_dir).map(|wallet| { + let wallet_file = crate::wallet::wallet_file(&pre_genesis_dir); + (wallet, wallet_file) + }) +} + /// Try to load a pre-genesis wallet or terminate if it cannot be found. pub fn load_pre_genesis_wallet_or_exit( base_dir: &Path, ) -> (Wallet, PathBuf) { - let pre_genesis_dir = base_dir.join(PRE_GENESIS_DIR); - let wallet_file = crate::wallet::wallet_file(&pre_genesis_dir); - ( - crate::wallet::load(&pre_genesis_dir).unwrap_or_else(|| { - eprintln!( - "No pre-genesis wallet found at {}.", - wallet_file.to_string_lossy() - ); - safe_exit(1) - }), - wallet_file, - ) + try_load_pre_genesis_wallet(base_dir).unwrap_or_else(|| { + eprintln!("No pre-genesis wallet found.",); + safe_exit(1) + }) } async fn download_file(url: impl AsRef) -> reqwest::Result { From 682bc05a282239f988d0ae6dc957419b40f07b30 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 20 Nov 2023 12:55:24 +0000 Subject: [PATCH 060/175] Update masp proofs --- ...14612B09451DF258B1B593CFED41B0E9256A2E.bin | Bin 0 -> 24494 bytes ...EAD637C92544211E7B3765CA7AA186FB1E409.bin} | Bin 7448 -> 7448 bytes ...4E2EF3EC23A99F9E8F0A5B95AB1BEB71B18583.bin | Bin 0 -> 7448 bytes ...37D60B440C71729F148923838380D5CFE71A9.bin} | Bin 9941 -> 9941 bytes ...9402D995E6F74FFBF5CE3BA13049D272C5E752.bin | Bin 0 -> 9941 bytes ...FE78D0FC876E11ADD563D149168D4BDE86FBB8.bin | Bin 0 -> 7448 bytes ...6BC11A30C23464FD05B13516E0B576456D6BE9.bin | Bin 0 -> 9649 bytes ...6D2AEEF55A6F202D8EB4564017DB5BEF872107.bin | Bin 0 -> 15597 bytes ...98CB65B7F71F737870C86AEA55454B8B32DC2D.bin | Bin 0 -> 7448 bytes ...8B21F6D7D9EE1DA5A6E60E9A37CD30DA4A505F.bin | Bin 0 -> 7448 bytes ...99481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin | Bin 0 -> 15257 bytes ...699E65D4B40A4E1BC9E7A32D63CF28466A2F20.bin | Bin 0 -> 17018 bytes ...79048F119C09D85335704A083700CA11415DF3.bin | Bin 0 -> 10382 bytes 13 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test_fixtures/masp_proofs/0AB9DC2FED12A93FDA42447E6A14612B09451DF258B1B593CFED41B0E9256A2E.bin rename test_fixtures/masp_proofs/{90502CEAE917AE038FDA2337AFB0464F2130123149D5691B85C35AABC49FA2BD.bin => 25FA248C27E805F28102B6E3DCFEAD637C92544211E7B3765CA7AA186FB1E409.bin} (52%) create mode 100644 test_fixtures/masp_proofs/2E78CC40C345D7EA50407110784E2EF3EC23A99F9E8F0A5B95AB1BEB71B18583.bin rename test_fixtures/masp_proofs/{B947FEFC6EC94A041657FF3A9420D5BB3FDEB1199EF712C059C80C4DBF6F3ED8.bin => 76BADC1367FEF1062029B180AD637D60B440C71729F148923838380D5CFE71A9.bin} (58%) create mode 100644 test_fixtures/masp_proofs/8DAE054DE58BDFFE4F551092B09402D995E6F74FFBF5CE3BA13049D272C5E752.bin create mode 100644 test_fixtures/masp_proofs/96CBC406931DDBC76053B417CCFE78D0FC876E11ADD563D149168D4BDE86FBB8.bin create mode 100644 test_fixtures/masp_proofs/ABB08197C40226F64D449C7F116BC11A30C23464FD05B13516E0B576456D6BE9.bin create mode 100644 test_fixtures/masp_proofs/AE4CEC9192B52E8CE5AB0C25936D2AEEF55A6F202D8EB4564017DB5BEF872107.bin create mode 100644 test_fixtures/masp_proofs/B74C1EC89D48DC01F71DA402F898CB65B7F71F737870C86AEA55454B8B32DC2D.bin create mode 100644 test_fixtures/masp_proofs/CA6AF0286DB05F3AB2513109958B21F6D7D9EE1DA5A6E60E9A37CD30DA4A505F.bin create mode 100644 test_fixtures/masp_proofs/D007D1734AD42D34174F04566899481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin create mode 100644 test_fixtures/masp_proofs/DEDF664AD06184041515677A72699E65D4B40A4E1BC9E7A32D63CF28466A2F20.bin create mode 100644 test_fixtures/masp_proofs/FD874BACE965B637E528BF66B079048F119C09D85335704A083700CA11415DF3.bin diff --git a/test_fixtures/masp_proofs/0AB9DC2FED12A93FDA42447E6A14612B09451DF258B1B593CFED41B0E9256A2E.bin b/test_fixtures/masp_proofs/0AB9DC2FED12A93FDA42447E6A14612B09451DF258B1B593CFED41B0E9256A2E.bin new file mode 100644 index 0000000000000000000000000000000000000000..7524753fec47fdf4c0e73b22036c7a19f82254b9 GIT binary patch literal 24494 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

      JDQtI*;I|w*r8`pBru!%!` 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 M|MT}xU#DpNH?ielt^fc4 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/90502CEAE917AE038FDA2337AFB0464F2130123149D5691B85C35AABC49FA2BD.bin b/test_fixtures/masp_proofs/25FA248C27E805F28102B6E3DCFEAD637C92544211E7B3765CA7AA186FB1E409.bin similarity index 52% rename from test_fixtures/masp_proofs/90502CEAE917AE038FDA2337AFB0464F2130123149D5691B85C35AABC49FA2BD.bin rename to test_fixtures/masp_proofs/25FA248C27E805F28102B6E3DCFEAD637C92544211E7B3765CA7AA186FB1E409.bin index 44754a7a468bd33137f1d504b5f7e3d54f8ed301..60aa5777a44a62800525dddf8d444f2de76bccf5 100644 GIT binary patch delta 2133 zcmbPXHN&c&k%56h6o^@X*x}BE6;l4&&IMcTSnhLJk6U8O#oARFy;m%Y?8J}$`%<*_x?28M^PJjUpRDk<=2xD$byc-xG`sw+#cuIw+xz!%GO$*6oiJ8f zW$9}5oM8*d3NS#^TMyRUVG?+;M%{lI$6e0_C!fvN-hQcR)tguA@|<2XY0O-|{wxm7 zV7)5q0!sV5d{?eH$K9jTn^>wclVc*cXsqD6l7N#Z#V^mnrD50uUzT{mGh) zo+^YCfx>7KyX)rLj6O^XgaT#qMo!Po6Ig&M355Vyr7Js7B_aQA-pE-p;GQB#*iXi=-sS44xCBXbnWquD=}Mp&qL7r zXx;CF2gEWbmkXFEoaJ;17I*FL(JVIHenXI{Qnlb?q+o8`2Sy9NU>DPXj?Je9fcC4n zNgUdHC&eYBQGd_#*XgX2e+vaT96X(MA&D`3vfF(Xw~Fp>Dm)=detT82r_7O=aI@eF z$D-MMQpwh0T|Cns6(86oYvT6#biDj&^@EdUWPS6Tc>KNp{{r+gzgJ4_q;P zxI=tvL8a1NSG74384S7(S@(K6{hK%67Y5pYb5gr~#p7Vn#?a2;IMYn zLftqO{WzsBhdmC6dR;$Y-eF%gJzs9a+gy$ynnE!nCz@2%0z$tj8Nx~I1t zHK>y?IHz^j^!uY3*^}psnJBb#Eo$hzG$;C+>V-W!#S2&tEI!(9V)42A?8+C06I_y3 zZ2l|;w7=eP_Txjp+h^C_;`_L}y6nPaWywIosXpga$A2U+GokI{r~b-K&Z#zBjb3F} z-7S}IX7m=1KWz7{^b%8ezF*58jonONCOG6xcp!f<^xJZ=M;+_a|FXXO-LJZF+f&Z8 z6{j@T9%xkw4p`L6wfcO0Myj?;@7j>368Bs8FYz$XuV(#Lbh28Lbr=7w8Ru`@?<|vJ zC^D_sarMy`Po7e+W|#R3J%Z zMpX8nYxa_vccQfBbFAyKCK_=Dx1`Ca?QKG-kJxRo&^PU@5S;a-RoG#+wkOztAc#y?#ogZub<^{ zd8cHWZ$ISv^S_!`jQT!#Ro>q*r(aEHsz1DW=hWsb-L0qdU!L9>m2qYTlkV5}TpM-Y z$6OWyHv>jiw?Cim}kUo z)y7 zYex0)yo=o#40I>h#VO>b)qGwcrY*UiDNm?>L*=fo8GPCP{SJB0@~mIOVWPQBYzG1RK)R7dMFS|XKO?J3kZa3YTwB>uZ;WhIZ?JI4o-RO!kr44Sw!S z_OIvT$eO>Un&|Gws=%l}k(KljM0hh@B6`DvrjYeVt&qpFe9Pj@VOeR|jKdDyJRcUhYn*HVTlq}mM uB`&{?ZV+s~agSZ*K(emVnf?c=Un5uV+Bj#@yL%hiLG=g-uuOg{qYVI3M!&iM delta 2133 zcmc(gc{JPU8pnf>)EbmFMVqR%v_q|-y(L5iwIsyac2HAP8>TaM;<$9EE%npVpw_B2 zw5g<#RxEANWok>bQd@)SHbE>YS50*O>6v@ZbTRgRgo1@ z3oeS#NvuUlg=AwXe2;3+`U^iBQb8bZ+7VIa0!NZhk;1 z1^R5>>o^Yt%b6k?(6hptma6dDY)GsH*}<7aZFR)C(|Wsohq0b}U?-?_IfOXuD}=87 z3x6=gyBsH>ZY|^i?-bl^&`#Iv9qX(HIxbyfFSH6$f~DvDkyElOi3tB*wLg3mD&5|+ z{q_;X^h;Ol>+~nRq~*v95s46CePU;eIpabg5Cbzs#2xYlcZ`IFQ1Wk2*4%{Q#-unr zIOyHy+#9%0*vf%S>NA*Velj7`d~vgSxyhd+z?(l$1=f|^ZG?F~75Aat8bfhfKh&G8 zBp{1yJx|4FCzOiGU4WfYVmHt;IYcq(s52QVT7b>hXjJijoY!zK-R4j{``BxI; znIxuhq|Wlmr?AOGKJe?y_pE_3Ra1m+PFSnlw7y(b-my`8DH^`}`k2gM5VnhBI~Cnp zh$c`4s-pR7q3u4>%w=8{f8tJ;>dgV*0Ni8yS0C{-WAnSZJ4>NAmuCf5QEeI(w3VMM zFg4u-S8y_^GYR@n54cvI_k!*^xNoHL?6mzz)RNnLxp&|Cvv$FoN+iteHv>wOf3QUT zg{v?3&PlaB8`mHamkbBWMdTB%Pj=61_rt4AN`Y0DLxf@BW`7 z7ruDAJ%UR#HyD{8WOm8of>^0Vt;_y@%%rWCXOM#j>AQslMqZ!qIOdCD$h=u&;(-y*y_f4(&7j!B@9>EXSKY--8IBThumYYd0p33W8uWEYMp8P zN_pDFk-5-O$;_PuJijO7Y4x=6%ZU$^SfNHT*rDG~`&hqGz&^v&_qXQd3@U@embg(W zH?;l{Xng;HyG&CGbWx#1JF|U(UN@aGic0OMh&D{87&?n@B*+&$tn0E<%{KD11=MTZ zdZ0$HT|e4BJ^0U6`HlQYz2s#xz$TCxS^E2EbR%Zm zQ*f-VjG~Zx#4~7*d_iMGl(kgdt~R3Ep2ZV>%MBlh-4EsSTs)q~2f*1KJxidSQ#!^_ zNjX^usk~7?X*$bl;mxlh-N%PcLQ{82Q=YS;%e><$tcKZO{lb3mF9R2m{({+(>Xyy( zKC}|J!i+JNz^g!b{}gbgJA3`4$;-#?2aDT6I(ZD9xYDB9&;`4ct43b0YWvw26@y&Z zLo{n*lJFcrCy$S5fgg=?Ei|QY^fLbZEd~}BQNF{%;>*zGUc~rX9c*ynw5gg*Pue-4 zGTuEyIdaYFu9#cBU6zYmZ<&{Unyr)bgvao&F=p((s2Uw@**URKx;qR4kZ+Gq(iu>?!Ch zDRFdt6pvw<9ezi$gh0r<@Z5}aO&%1L`e@cgMR6vv+x4WccVw2vda(f#t4ESzhZPQ^ zJHweOQy&L(Y(H7zJwIqYPO~0`?j5*+{u(qxN-|lZTEw{QTADh%^^JThFz{L3;7`hB B6g>a{ diff --git a/test_fixtures/masp_proofs/2E78CC40C345D7EA50407110784E2EF3EC23A99F9E8F0A5B95AB1BEB71B18583.bin b/test_fixtures/masp_proofs/2E78CC40C345D7EA50407110784E2EF3EC23A99F9E8F0A5B95AB1BEB71B18583.bin new file mode 100644 index 0000000000000000000000000000000000000000..84a26fb9c53d6d0fb35ffc72b4793cddd2bf5ba0 GIT binary patch literal 7448 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 P2TJWtK3~S>io*W```{Q& delta 3321 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/96CBC406931DDBC76053B417CCFE78D0FC876E11ADD563D149168D4BDE86FBB8.bin b/test_fixtures/masp_proofs/96CBC406931DDBC76053B417CCFE78D0FC876E11ADD563D149168D4BDE86FBB8.bin new file mode 100644 index 0000000000000000000000000000000000000000..8c4d3c8e9b19a4a18ab50b12050c676db892002d GIT binary patch literal 7448 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%0Aya*| zvj}fgz)VP+@j6F0yh0#fzg=3!QglDn=w(c3Vr0uAbmdz4+Zaf=)9Y@lZ;MC;yd zOl^QO1`IU5gpQN-2Km=sHD!j_(vRa1vhLM?5<{Eq9+-)4gufH=9JaD8(xZ_{MV~|j za;g=%OTV10QIDfERRU{A}tbVIc?EWyNJ1KQtdh;o%p3mn_IQLxbHx!lf=#Zuu&CJ;*n&3 z762Y3nAHLa#X9$egH)lLRgsN7jCz)f4khy2oz<0HaczJ77SaLD3)`EVAspHHiDjj6B9-0{$e*nS<#*RZNnB;Q3}|oSREu$8{I;d>%Nge{M}7a-5dMAh%WlUn_FMbE04L1?S^xk5 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/ABB08197C40226F64D449C7F116BC11A30C23464FD05B13516E0B576456D6BE9.bin b/test_fixtures/masp_proofs/ABB08197C40226F64D449C7F116BC11A30C23464FD05B13516E0B576456D6BE9.bin new file mode 100644 index 0000000000000000000000000000000000000000..2282101aaa8a712f861f1835cf6d76c5577c8012 GIT binary patch literal 9649 zcmeI2bx>T*mcVBQXMiBV?S>&Z1lQm)I0Ow6!r-n6?(VK3xNCyD2MZP~XmAJ`2pR~4 zeRbR9=6ukr*wBv+e#utOZ&-NBODC;tXBtz}=Kqw(Bvs-9hMUD8F0)iy}mK zhY~hpR=BdL28*`2nHe2iB%aa_$w3g5q*CncKMnkMjQlk8Q^4lvoTC{dR#M-aus(B{ zUM)*Re)U?myYIiv46U7HXe8mk1Q5Uj)M&L2y1vUKXHAI{UYl)}O4ET+LvE|lQdyF8r6k?k&T^j5XI z0!St8#YWPK{&4LKWK%>{9 z6V{2ArOvH`rync2&ODf$F&fb1#Kbq9&v-I+SL2Dvb~D_QHAXA>3z=61S24;Y?`2#E zc<2(Q8KhFt7m8D#eadKG&x!oCtnOP^i`-kQ7RTUX`R3Su{4rg0y2=8@@vn;43df_8 zdLV9e_{UXje9f&3yST({t`!>GK^v!fP<7TfY~D=QatNO1+OkF_r6kQeM{2yIoIV0~ zBz%?N8@>U=-4NLr`!LpXYLB{CP~{Du11UWVuA@X=kArmaxJyyV00BETC^7&nOI{5- z9q56F1n)@wi-uiIYghYmMyHQIb$|Vor*?+}R1#h_qWDO0oI#1FMqEgh0tKo+&Cfvr z9spu2V{F0(gx{J7b$&Uo3)x)HqDY@*VN8O@_de=*C}6F_5#ry#1;kt^v$P`3ywTy5 zs!=cR-Bqe>CPYbDb4E(SR<4Qp?9e+sRIa%}`4;2&!G`5urYyfYu^AEbsmpys~ecK&oew zcsh2dRzFs};^a<)li~vh#Np@D$seV5dt@+#77NLerj<4_>Ud7Yp=v3~4lNzFKt0VG z+gfg!RL1%Xyw@HFoYx(<>xwY}3K7Ob47MhrvQXIJb^oIRgEvX8Zc(^x9U}%jBA_of^5yw-*C+)WaoE*8nwpnDr$$ z&ls>zV5`Ulh!n$K{IF2Aim9JYL*;r9otyH$Hs$8iiUmh9XWHqeCg2{!O_XegcWtIk zg}VifWWnrI_a%BW@NjJUV7tcsJ}uy9Rh{1zF0D+Yt^Z|=O7Q3l6C&uL0ZAUWXycD2 zYad%cIY#G$qNtSR?o3eNO|ZaXNYn|Jii9>k*~f3#4MPsBfTG!0X?=j?Q3spR#DXAF zLDcs#i=zk3k6kOO*I0C$jQ~CE`x=iSWeH4Xz#3Z|spO3wQtPX=r#2u~<75X;b2LD( zfXt$-uYT!@4uU zCjb~&WYc%(;rCGiEr}Xl+%#_E<(=e9yC?Ml4Nc(hYWVU`swrtQ-qi}}0rI6R;k^n+ zH%0gw;3U2G0*OdMTyKCbuUUKfGP&a=RzQQ2ON%2NGAjAvwc5xbOCl_C*PaDt^K zaKOa4=AkCWOFUow*R=nvM<* zo!KpnlI4s&R`lj*E!n1n5*R?+gNK+lzPjc;gG#qD`>bs&sgbOU@*#L-LntUS;zT$= z&6Xu0ZwVEvpQvh-fOR$k%BE>1IyCL=uL@LWcsoe~s#h%oK1YzV8K!AsZI!uxwcy3- z=U~hOW0Xj2u47~4@P8l$62}t=t>u2`Jz`(!I5T?axTcjLbg*IP9KV4>?;c)*2&Mif zeE#0}9kEDm{*`Zcce+JA&V5W9{)8=(!47GA41`ph+2UP6y+LlOS1~jOpMMeV53&9b z>kqO1cZk(06kV!BwnP-md~Ui{%~_jZP?M1@YGPYvy~FatkpKoj1F%!;Y-p5sUrrD> zUh{O{#-!BTw~}%z>&`9t9^H-(Y!SJmv2DUU2+%EXT^zeu4W z^)TiLx@4DiIM+TrmIXfd(h)mMaCm}k9>|0el-Nd9Oe)O1%KNd1cvqX2BaYPg4-Wl3 z0Q$T5;i~WCA*_tpl%NH!r(dm`-!OyuLge%k1e6;%6s6kmald*H&&Wo9`aa(9cL3BL z`75?twzy;RekLQO(tli?OU@QkIxzmGQTssl&5IHbK0=n|-`Rn@;#?~-j@o(2kblhn z*yHs#^3don#pkc`lWTR_7yBM>0=HK@ z)uFIXh-{!&@mlSkRGTUAw(l~?V#0~4_9X4Dgl6yVsN2@qFSJQgLC))H=G&=+A}vP6 z%+AIo0wH)O@uPGDVB<1BBn=;ih^0eVXbpO zgH0swExDGHzL~06(%f8XirszZ01rsk+h2#pAG&x0yt!=pQ4?YvHg70u|cGvF!a7RPaB*aoi8>YfutQp)3{q*FT9BIBl^ow-gSP}?$wTkTw;U!vUs=P`k^n#UdKYNC8Q zrPvcb2*oiiTZY{eptS`nZ{Bc~(``JsZc;vb?>4LHi~5%FPCzNRC{Y!{SqE|a0FKH= z7G8-OED(zmtEK&tbTp1f_F3iyQ3OO-NQ^vXq|K1(4TE(lzkG@WY~Q*WX-Aj&V`51I z8GBMc&hxzEyDVng6wE~ChGu<+27W&0oHkSsKT_=V)p2Knh*T-DMvS-Bg0|E~x4WJt zZ_7`_ao+X05LXg7iehikcavW5NjeceO`vv>7^C-Vs=I~3NN2xD23&906c428N7TtD9#f;(du+%DE2T0gSvUAR|46iNqxWY2tAU`MdALP|O4IO(s?amuw zID0pjm`f5_&|Rd~Lan|nnaPc6N>@fYcm(Tw6W|$D!90#VP-t7^FOrAV;Sg~qe0*}n zhI8FVmz8SEKg_0``=!{vdPU`RUv#{opWw<%nWOqaL9@utGrw96;s7n8CcnCxP*2xd zJ2)1_3=%yG=3R|D+K*>grkM4U2h(^G`i>~Z{N`i2A8MPDN1XljKc`EbEPmPXm{Q%& z=ODHYy=WY?3G$+}zA~I!_RX~=Z>ny^$L4c3bU|e_+#x5ZWb3UIL_z}EG%=M5x{AAa zd9AsKH+GgYB0t^V6(@mRhOUl$V}0XE>Ik)a5-0tdy?r#ZK9kxdW94I&3Wl>g!8tz_ z`)Q2ugYp17IpV5*ym8oset?F67GDU=zoAg!w3|d5KBd#>kNq*&e@guTyJ6viZk;sK zDTy4W?t(*cT$tB9pwuOHJ`VQiwWn+(+N@aYVa-caEQo!LdPw=S zU)FcDWtKX1FJVG3pb2l|mU58+A(~a0W?7qXO`RFv@wMDY3uVY+;E_6hg=<+%_|s2| zB^iY9`J)fGwLXM)ZPsUGO7DX{dRZ@(M09oaN`S>@UeGN|^Vl;5N!t=-ywiCc0o%}N zN?Y6_SH5_JyPv*J($^9E>?Amw&KvC-B2Q{5loBq;cIbhn~7?n;z8Nhm%SGc}NRe2-j6N``vfTWT498v$-=oMtIMh6Mx(`ubSS|*-9uI*^Ie4aqgu8A<=FQJ8r{{nwJi&b;S_~iW0tf1r3SdK9oR`EUW@%)0fS_F+Gc5(6XY3eJfn-u#CMUjp{J2Fx7C7#*~gN3F*6{fp8w zLL6~U!4z_-RA45#`?thhR?eN)*K!m2VHksJ-MM>feALq>yjh9o#}BO*S3lN4^ZF>-vFQuJ=~EOnN^- z8%sd0CD&*ew}+03X?Vntsidhi!go(ja`3;r&;D{sewU~JUAjFA=`eAnCYG=b-7*$C z(HlFmVNp^G2YEh|wuCuTie4c`w}7X8OR9nMu}|ma8{FU+EqeV2iI6wt5wvq(`-|8; zc(U$3v=|34o7z;4bUx#wKl1h4pvYB!h?8Hm0cqYwYZ0{{NpeTtR$ZM!{^Bv=41H=k~1Vq~|6(GgUBIHdk0@6$%3HmqL_ z#V0}_f?#zh>iSinU!Zm$Q}A3%5@9xTEnXg6KiE<7Fwi4!@3H;zBkG-7ks`BFgZIvd z!3=p;Ll%M$-klwwQM%#`dm8s{2m9EZ50iZPZd&(JqP`G2$ypYmQ=}b)%nkmgj@EW% zN;UY*2E+SV33nyGDrYlX70vquv7Gi=r<8ODCf1$qbz`X@hjg51E}Ou)WQqe;Z4~|1 zj@*);Q{?y&IU7PKAC12naHyVPLZo@XHZIWx+BvN=4oKI5*^{3rXMcMA&8sR;)|J7$bPKF4dk&-^M!|9ZzK`KcOkLU zJ?kp^_A$m#et%*6j>x6wc2NX$mI3zx#pjRtg%3)aJ|`h`#5`>xyZ0oQVlkA9MPt5<)pKC zL9ZTU`6COfT>?~2W;cdyg~qWMj+@$RRy8lbyGm-|w`fe)W#|VpMq*Q?=X;@6%CWuA z6GRJB>Fiy&-ep?UpOc#rKV}GhQv+6;w?55g+6l&1JzTA z7wye)DWe2d8D-|012Lf>xsf~rGC#@u0v>IN8)GD|SV;_e10K)nI*SGIy+OnN?R67M z=TbqH>^tXOb~t!1dse1wqP_m^hg_l4^SZ07r7E=sZpwN4P_7*C!bqM9iOh=c##vlm z{X5E4GW{|Yf<&v$IJzZLGfVRY6NtyqU`&SrER^2qo(S1&KaOVd>+~r(qX}J8;}gUGL%&FRR*EPlLs=aZ8#B5rL+X z3x{_!2_D07SLMAbdy|NdY5BK4?cgN`hD|+feeNq(G*8FV&!Q2wY!+=xkDErbPk43N zw@Fm(_mVKIRurq%$(8U9Xj4~2xIe{lr_4+CQONEz z)uPW(gi%dd?DAO?hJfwGb$Zqw`7xsQnGEPrWf~j=_$0e5Ef4uK22@dz+i+eELl5Hl zW4>-X(j##k#PFHLe`YB(ZrSa#?9b)L3YCm$+8B(%plBT0E{Ltk969h@x|z{2)`Y6d zb1t~~^aZtoe%$3wiM!+STQzEauJwyzeb)kO)j>6nMj*X@{(4O2^@s_yXN7(^p+Pu^ z&Eo!1Ul}~5;)3-Bfue%nM;8n^>yXElg7S8#OzB!akX`7%URU~+gZVl3tNn}9|Juj+ H$KZbeL!IpY literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/AE4CEC9192B52E8CE5AB0C25936D2AEEF55A6F202D8EB4564017DB5BEF872107.bin b/test_fixtures/masp_proofs/AE4CEC9192B52E8CE5AB0C25936D2AEEF55A6F202D8EB4564017DB5BEF872107.bin new file mode 100644 index 0000000000000000000000000000000000000000..89cbcb8263c2e14317c383f6882ee46b68cae626 GIT binary patch literal 15597 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 Fe*h&YL~;NC literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/B74C1EC89D48DC01F71DA402F898CB65B7F71F737870C86AEA55454B8B32DC2D.bin b/test_fixtures/masp_proofs/B74C1EC89D48DC01F71DA402F898CB65B7F71F737870C86AEA55454B8B32DC2D.bin new file mode 100644 index 0000000000000000000000000000000000000000..53999911ff012f317dacadec5895581c3e897c0b GIT binary patch literal 7448 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/CA6AF0286DB05F3AB2513109958B21F6D7D9EE1DA5A6E60E9A37CD30DA4A505F.bin b/test_fixtures/masp_proofs/CA6AF0286DB05F3AB2513109958B21F6D7D9EE1DA5A6E60E9A37CD30DA4A505F.bin new file mode 100644 index 0000000000000000000000000000000000000000..7efd591c4ee22679b0f4884b1e4b2ef443203576 GIT binary patch literal 7448 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/FD874BACE965B637E528BF66B079048F119C09D85335704A083700CA11415DF3.bin b/test_fixtures/masp_proofs/FD874BACE965B637E528BF66B079048F119C09D85335704A083700CA11415DF3.bin new file mode 100644 index 0000000000000000000000000000000000000000..cf7fa35cdd506f74232707adb1621d4f43bcd063 GIT binary patch literal 10382 zcmeI2Wl&wqmVj|PxCID=gTq0B1P>4#0vtTJ`@vlT2X_lW4j$Yk!QCaegam@SYjB^J zcW-Lu$E&(`YG!^+y{xLv4{+7f+V(vE>Pn zEn?CjCPWH3S(*;57*BTOH&wv|aDIJx&}c+B7H7bG8}7O!*sjaMcH2l-4eUA#Kg*pr z*j}@oQNLs%hHII{G;=m#o<;2|NoqsQRT4a+_tU_C$H>o*`YG^MmwcW^_f;ohN-s9v zM0**5xVES~cgau9t5mStZGmVAe~kO%DI|8P8G~@(GN{~+cbsss?`1AzO3_U(ND%(~ zk|($QLMrS-#j6)5CBZ#-lxh4_Ok~P0(sQIyf#Pa0@NKb}pgr|mgGrXg@1yGv3vYq! zj4hSXuTijBpyKWOuX`rGkdQPE*IG@!eVB4hzhO-XZeRpk0@c0v#pVFab=h1|2nor< zBDh_40(D!UNlg>pTIOM-dI`TRfpE`P$j9DB4OaPb^zySUg36!yd7j%_gM8K=;H0md z9sn`37Je<2epCD9<3k4uNvq8Szm}!0)p?+Y^pS$9QYHKRsV!}{vh0!V-P~H57XZm} z%pi#8{eCKUi)gYHY{SaKc3^LXv2h`zfN5f9+EV*?-ofs5kT zLr(iT@B;#mr2Yj%?q=1?eb^&Y#|xb&3ppx}*uZk4>w09U1jiZR$(La_QiVYNPYd5? z06=aaf{B!gDH|~S-c+#t@Vq8ueKnIjWtxR4K{~Gcc^4hOwH8N+e;pSv<^s&pjQF)u zi&LUXwX}Ojp}LU>IcdciF#!u)_0@w6m@h>Ej{KtHz=_mW#{gBz>4Lg@UX~``OOAeQ z&hKo52MVg(;&IC20VK`Cd_0S-UJ7m|I^{P4tWXh9>|jSkxX^o#jvlDgjutLCc~WC1L8XDB(&tl&-z0Xrq|gQD^2rjW6xPyexKBj^DoKeBO>MTo zTIv*gcv>63O@0u! zn7k_S;Wq_`4s`AhA_H07(P~m7>Lt6*DNRCT`|{L-K=xoHj0%P1U^Nq7S}kC>3ymeS zZS0%7EuHJ0!b=?Pr9wVCb+GpvGUFod?p$-AY}d@u=}t#}4!qBXSIufC+b+woF(bY& zy(W%gapfBtpxv}ZTe|tIk3FeNNMZU_oH`3oV^eBed(P%^TOLmC4{ePfv1vH(c(B5o3tl z69g(?BcJC$gS4$Rze@bez$~x6iaq#?7T8mZSF>(}c|OIOKmkZEL{xTrpw*vrt<=8I z12AjfsbECfL!3?aw6miQ3n&u@ElHC{SFqYwgCV(oS(1VzgLf*XQDK-?Es3#qM!?L2 zu=VR^iz)T%iq^VP@Kvq(M-dt{r2g{&LL|Ydbw?n}!4eFKshvtj;i8JpP8zIEx?5PXSz$Ey+kN^4>AX?u)QM{ztcf%PF>NofnzmEbl|i= z1q$SmS(fzHuFx6Tkb`eu!!1YUU2W={XG>#wOZS5aae(||(F7@@Sm$zMb1LsjY0=4fL2^^BpMNs;j^+%??A>GDH0 z!oWz_`41I7bEIFW`lbILQP|SR@?3OQb&!Ywip+PS-Z^4#01rCZ)VWG=vh zqKHP`Hz0+kinrVIIGP^rH-&#w_&0_BjVau}6=Iv@fG8uT8dm~HoSE}w*R63ZmRI>t+-2?C!Urx&)d^5(=7}*vD6D&+Jyo_@!fhZ@N3?KP>0)?ex@P|+AUITaU?a?oB&;8#WtMvN45eyDR-xO2od%4TY zc_5<9Cm{iBapDlPZw~cFVzLR}|Hy6`#2q6Qj$}Z(Q!E{=FyN^IH0vsMr``7GxY&3X zI@FR_wZ=|QIc+j;utNtwud-0i1(YGt_DIJw`L+HI6VM9RjOI_0XE}3S1R@sA3usN~ z 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 Date: Mon, 20 Nov 2023 12:55:46 +0000 Subject: [PATCH 061/175] Fix masp integration tests --- tests/src/integration/masp.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index c5b51a6eac..bb7ca903b6 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -127,7 +127,7 @@ fn masp_incentives() -> Result<()> { }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0.022")); + assert!(captured.contains("nam: 0.023")); // Assert NAM balance at MASP pool is exclusively the // rewards from the shielded BTC @@ -147,7 +147,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0.022")); + assert!(captured.contains("nam: 0.023")); // Wait till epoch boundary node.next_epoch(); @@ -189,7 +189,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0.08729")); + assert!(captured.contains("nam: 0.09189")); // Assert NAM balance at MASP pool is exclusively the // rewards from the shielded BTC @@ -209,7 +209,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0.08729")); + assert!(captured.contains("nam: 0.09189")); // Wait till epoch boundary node.next_epoch(); @@ -312,7 +312,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0.0207")); + assert!(captured.contains("nam: 0.02085")); // Assert NAM balance at MASP pool is an accumulation of // rewards from both the shielded BTC and shielded ETH @@ -332,7 +332,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0.3726")); + assert!(captured.contains("nam: 0.39198")); // Wait till epoch boundary node.next_epoch(); @@ -398,7 +398,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0.085204")); + assert!(captured.contains("nam: 0.085834")); node.next_epoch(); @@ -420,7 +420,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 1.134567")); + assert!(captured.contains("nam: 1.198717")); // Wait till epoch boundary node.next_epoch(); @@ -483,7 +483,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 1.355211")); + assert!(captured.contains("nam: 1.428567")); // Assert NAM balance at MASP pool is // the accumulation of rewards from the shielded assets (BTC and ETH) @@ -503,7 +503,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 1.459458")); + assert!(captured.contains("nam: 1.541561")); // Wait till epoch boundary node.next_epoch(); @@ -527,7 +527,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 1.520493")); + assert!(captured.contains("nam: 1.602735")); // Assert NAM balance at VK(B) is the rewards dispensed earlier // (since VK(A) has no shielded assets, no further rewards should @@ -548,7 +548,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0.125958")); + assert!(captured.contains("nam: 0.12677")); // Assert NAM balance at MASP pool is // the accumulation of rewards from the shielded assets (BTC and ETH) @@ -568,7 +568,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 1.637454")); + assert!(captured.contains("nam: 1.729505")); // Wait till epoch boundary to prevent conversion expiry during transaction // construction @@ -677,7 +677,7 @@ fn masp_incentives() -> Result<()> { ) }); assert!(captured.result.is_ok()); - assert!(captured.contains("nam: 0")); + assert!(captured.contains("nam: 0.115575")); Ok(()) } From b9d38d752904ca926012c621299ee7c17361ef2b Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 21 Nov 2023 13:01:27 +0100 Subject: [PATCH 062/175] rebased on v0.27 and some initial multisig fixes --- apps/src/lib/client/utils.rs | 31 +-- apps/src/lib/config/genesis/chain.rs | 7 +- apps/src/lib/config/genesis/templates.rs | 5 +- apps/src/lib/config/genesis/transactions.rs | 263 +++++++++---------- apps/src/lib/node/ledger/shell/init_chain.rs | 7 +- core/src/types/key/mod.rs | 7 + tests/src/e2e/helpers.rs | 2 +- tests/src/e2e/ledger_tests.rs | 14 +- 8 files changed, 166 insertions(+), 170 deletions(-) diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 4f4b88a7e5..523fe31fcc 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -609,29 +609,24 @@ pub fn derive_genesis_addresses( .into_iter() .flatten() { - let address = { - let unsigned = - genesis::transactions::UnsignedEstablishedAccountTx::from(tx); - unsigned.derive_address() - }; - let pk = if let Some(public_key) = tx.public_key.as_ref() { - &public_key.pk.raw - } else { - continue; - }; + let address = tx.derive_address(); println!(); println!("{} {address}", "Address:".bold().bright_green()); - println!("{} {pk}", "Public key:".bold().bright_green()); - let maybe_alias = - maybe_pre_genesis_wallet.as_ref().and_then(|wallet| { - let implicit_address = pk.into(); - wallet.find_alias(&implicit_address) - }); + println!("{}", "Public key(s):".bold().bright_green()); + for (ix, pk) in tx.public_keys.iter().enumerate() { + println!(" {}. {}", ix, pk); - if let Some(alias) = maybe_alias { - println!("{} {alias}", "Wallet alias:".bold().bright_green()); + let maybe_alias = + maybe_pre_genesis_wallet.as_ref().and_then(|wallet| { + let implicit_address = (&pk.raw).into(); + wallet.find_alias(&implicit_address) + }); + + if let Some(alias) = maybe_alias { + println!("{} {alias}", "Wallet alias:".bold().bright_green()); + } } } if genesis_txs diff --git a/apps/src/lib/config/genesis/chain.rs b/apps/src/lib/config/genesis/chain.rs index a0d82b52ed..a5dd2a6352 100644 --- a/apps/src/lib/config/genesis/chain.rs +++ b/apps/src/lib/config/genesis/chain.rs @@ -645,10 +645,7 @@ impl FinalizedTransactions { let established_account = established_account.map(|txs| { txs.into_iter() .map(|tx| FinalizedEstablishedAccountTx { - address: transactions::UnsignedEstablishedAccountTx::from( - &tx, - ) - .derive_address(), + address: tx.derive_address(), tx, }) .collect() @@ -739,7 +736,7 @@ impl FinalizedParameters { pub struct FinalizedEstablishedAccountTx { pub address: Address, #[serde(flatten)] - pub tx: transactions::SignedEstablishedAccountTx, + pub tx: transactions::EstablishedAccountTx, } #[derive( diff --git a/apps/src/lib/config/genesis/templates.rs b/apps/src/lib/config/genesis/templates.rs index fab82401f0..423905a847 100644 --- a/apps/src/lib/config/genesis/templates.rs +++ b/apps/src/lib/config/genesis/templates.rs @@ -18,10 +18,7 @@ use namada::types::token::{ use serde::{Deserialize, Serialize}; use super::toml_utils::{read_toml, write_toml}; -use super::transactions::{ - self, Transactions, UnsignedEstablishedAccountTx, - UnsignedValidatorAccountTx, -}; +use super::transactions::{self, Transactions, UnsignedValidatorAccountTx}; use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::genesis::transactions::{BondTx, SignedBondTx}; use crate::config::genesis::GenesisAddress; diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 56c75687dc..b0eb57fb9a 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -6,6 +6,7 @@ use std::net::SocketAddr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; +use itertools::Itertools; use namada::core::types::address::Address; use namada::core::types::string_encoding::StringEncoded; use namada::proto::{ @@ -108,7 +109,7 @@ pub fn init_established_account( ) -> (Address, Transactions) { let unsigned_tx = EstablishedAccountTx { vp, - public_key: Some(StringEncoded::new(public_key)), + public_keys: Some(StringEncoded::new(public_key)), }; let address = unsigned_tx.derive_address(); let signed_tx = sign_established_account_tx(unsigned_tx, wallet); @@ -194,28 +195,6 @@ pub fn init_validator( (address, txs) } -pub fn sign_established_account_tx( - unsigned_tx: UnsignedEstablishedAccountTx, - wallet: &mut Wallet, -) -> SignedEstablishedAccountTx { - let key = unsigned_tx.public_key.as_ref().map(|pk| { - let secret = wallet - .find_key_by_pk(pk, None) - .expect("Key for source must be present to sign with it."); - let sig = sign_tx(&unsigned_tx, &secret); - SignedPk { - pk: pk.clone(), - authorization: sig, - } - }); - let UnsignedEstablishedAccountTx { vp, public_key: _ } = unsigned_tx; - - SignedEstablishedAccountTx { - vp, - public_key: key, - } -} - pub fn sign_validator_account_tx( unsigned_tx: UnsignedValidatorAccountTx, validator_wallet: &ValidatorWallet, @@ -306,7 +285,7 @@ pub fn sign_self_bond_tx( pub fn sign_delegation_bond_tx( unsigned_tx: BondTx, wallet: &mut Wallet, - established_accounts: &Option>>, + established_accounts: &Option>, ) -> SignedBondTx { let source_key = look_up_sk_from(&unsigned_tx.source, wallet, established_accounts); @@ -334,7 +313,7 @@ pub fn sign_tx( Eq, )] pub struct Transactions { - pub established_account: Option>, + pub established_account: Option>, pub validator_account: Option>, pub bond: Option>, } @@ -429,7 +408,7 @@ impl Transactions { #[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)] pub struct UnsignedTransactions { - pub established_account: Option>, + pub established_account: Option>, pub validator_account: Option>, pub bond: Option>>, } @@ -476,11 +455,6 @@ impl DeriveEstablishedAddress for UnsignedValidatorAccountTx { const SALT: &'static str = "validator-account-tx"; } -pub type UnsignedEstablishedAccountTx = - EstablishedAccountTx>; - -pub type SignedEstablishedAccountTx = EstablishedAccountTx; - #[derive( Clone, Debug, @@ -491,13 +465,32 @@ pub type SignedEstablishedAccountTx = EstablishedAccountTx; PartialEq, Eq, )] -pub struct EstablishedAccountTx { +pub struct EstablishedAccountTx { pub vp: String, + #[serde(default = "default_threshold")] + pub threshold: u8, + #[serde(deserialize_with = "deserialize_single_or_vec")] /// PKs have to come last in TOML to avoid `ValueAfterTable` error - pub public_key: Option, + pub public_keys: Vec>, +} + +const fn default_threshold() -> u8 { + 1 } -impl DeriveEstablishedAddress for UnsignedEstablishedAccountTx { +/// Deserialize a vec of type `T`, or if a single `T` is provided, +/// deserialize that and place in a vector. +fn deserialize_single_or_vec<'de, D, T>(d: D) -> Result, D::Error> +where + D: serde::Deserializer<'de>, + T: Deserialize<'de>, +{ + T::deserialize(d.clone()) + .map(|t| vec![t]) + .or_else(|_| Vec::::deserialize(d)) +} + +impl DeriveEstablishedAddress for EstablishedAccountTx { const SALT: &'static str = "established-account-tx"; } @@ -507,7 +500,7 @@ impl SignedBondTx where T: BorshSerialize + TemplateValidation, { - /// Verify the signature of `BondTx`. This should not depend + /// Verify the signatures of `BondTx`. This should not depend /// on whether the contained amount is denominated or not. /// /// Since we denominate amounts as part of validation, we can @@ -515,13 +508,56 @@ where /// types. pub fn verify_sig( &self, - pk: &common::PublicKey, + pks: &[common::PublicKey], + threshold: u8, ) -> Result<(), VerifySigError> { - let Self { data, signature } = self; - verify_standalone_sig::<_, SerializeWithBorsh>( - &data.data_to_sign(), - pk, - signature, + let Self { + data, + signatures: signature, + } = self; + if pks.len() > u8::MAX as usize { + eprintln!("You're multisig is too facking big"); + return Err(VerifySigError::TooGoddamnBig); + } + let mut valid_sigs = 0; + for pk in &pks { + valid_sigs += self.signatures.iter().any(|sig| { + verify_standalone_sig::<_, SerializeWithBorsh>( + &data.data_to_sign(), + pk, + &sig.raw, + ) + .is_ok() + }) as u8; + if valid_sigs >= threshold { + break; + } + } + if valid_sigs >= threshold { + Ok(()) + } else { + Err(VerifySigError::ThresholdNotMet(threshold, valid_sigs)) + } + } +} + +impl SignedBondTx { + /// Sign the transfer and add to the list of signatures. + /// + /// Since we denominate amounts as part of validation, we can + /// only verify signatures on [`SignedBondTx`] + /// types. Thus we only allow signing of [`BondTx`] + /// types. + pub fn sign(&mut self, key: &[common::SecretKey]) { + self.signatures.extend( + key.iter() + .map(|sk| { + standalone_signature::<_, SerializeWithBorsh>( + sk, + &self.data.data_to_sign(), + ) + }) + .collect(), ) } } @@ -581,21 +617,13 @@ impl BondTx { amount, }) } +} - /// Sign the transfer. - /// - /// Since we denominate amounts as part of validation, we can - /// only verify signatures on [`SignedBondTx`] - /// types. Thus we only allow signing of [`BondTx`] - /// types. - pub fn sign(self, key: &common::SecretKey) -> SignedBondTx { - let sig = standalone_signature::<_, SerializeWithBorsh>( - key, - &self.data_to_sign(), - ); +impl From> for SignedBondTx { + fn from(bond: BondTx) -> Self { SignedBondTx { - data: self, - signature: StringEncoded { raw: sig }, + data: bond, + signatures: vec![], } } } @@ -613,7 +641,7 @@ impl BondTx { pub struct Signed { #[serde(flatten)] pub data: T, - pub signature: StringEncoded, + pub signatures: Vec>, } #[derive( @@ -640,8 +668,10 @@ pub fn validate( let mut is_valid = true; let mut all_used_addresses: BTreeSet

      = BTreeSet::default(); - let mut established_accounts: BTreeMap> = - BTreeMap::default(); + let mut established_accounts: BTreeMap< + Address, + (Vec, u8), + > = BTreeMap::default(); let mut validator_accounts: BTreeMap = BTreeMap::default(); @@ -737,17 +767,7 @@ pub fn validate( }; is_valid.then_some(Transactions { - established_account: transactions.established_account.map( - |established_accounts| { - established_accounts - .into_iter() - .map(|acct| EstablishedAccountTx { - vp: acct.vp, - public_key: acct.public_key, - }) - .collect() - }, - ), + established_account: transactions.established_account, validator_account: transactions.validator_account.map( |validator_accounts| { validator_accounts @@ -779,29 +799,33 @@ pub fn validate( fn validate_bond( tx: SignedBondTx, balances: &mut BTreeMap, - established_accounts: &BTreeMap>, + established_accounts: &BTreeMap, u8)>, validator_accounts: &BTreeMap, parameters: &Parameters, ) -> Option> { // Check signature let mut is_valid = { let source = &tx.data.source; - if let Some(source_pk) = match source { + let maybe_source = match source { GenesisAddress::EstablishedAddress(address) => { // Try to find the source's PK in either established_accounts or // validator_accounts let established_addr = Address::Established(address.clone()); established_accounts .get(&established_addr) - .cloned() - .flatten() + .map(|(pks, t)| (pks.as_slice(), *t)) .or_else(|| { - validator_accounts.get(&established_addr).cloned() + validator_accounts + .get(&established_addr) + .map(|addr| (std::slice::from_ref(addr), 1)) }) } - GenesisAddress::PublicKey(pk) => Some(pk.raw.clone()), - } { - if tx.verify_sig(&source_pk).is_err() { + GenesisAddress::PublicKey(pk) => { + Some((std::slice::from_ref(&pk.raw), 1)) + } + }; + if let Some((source_pks, threshold)) = maybe_source { + if tx.verify_sig(&source_pks, threshold).is_err() { eprintln!("Invalid bond tx signature.",); false } else { @@ -886,17 +910,24 @@ pub struct TokenBalancesForValidation { } pub fn validate_established_account( - tx: &SignedEstablishedAccountTx, + tx: &EstablishedAccountTx, vps: Option<&ValidityPredicates>, all_used_addresses: &mut BTreeSet
      , - established_accounts: &mut BTreeMap>, + established_accounts: &mut BTreeMap, u8)>, ) -> bool { let mut is_valid = true; - let established_address = EstablishedAccountTx::from(tx).derive_address(); + let established_address = tx.derive_address(); + if tx.threshold == 0 { + eprintln!("An established account may not have zero thresold"); + is_valid = false; + } established_accounts.insert( established_address.clone(), - tx.public_key.as_ref().map(|signed| signed.pk.raw.clone()), + ( + tx.public_keys.iter().map(|k| k.raw.clone()).collect(), + tx.threshold, + ), ); // Check that the established address is unique @@ -924,23 +955,13 @@ pub fn validate_established_account( } // If PK is used, check the authorization - if let Some(pk) = tx.public_key.as_ref() { - if !validate_established_account_sig(pk, tx) { - is_valid = false; - } + if tx.public_keys.is_empty() { + eprintln!("An `established_account` tx was found with no public keys."); + is_valid = false; } - is_valid } -fn validate_established_account_sig( - SignedPk { pk, authorization }: &SignedPk, - tx: &SignedEstablishedAccountTx, -) -> bool { - let unsigned = UnsignedEstablishedAccountTx::from(tx); - validate_signature(&unsigned, &pk.raw, &authorization.raw) -} - pub fn validate_validator_account( tx: &ValidatorAccountTx, vps: Option<&ValidityPredicates>, @@ -1073,16 +1094,6 @@ fn validate_signature( } } -impl From<&SignedEstablishedAccountTx> for UnsignedEstablishedAccountTx { - fn from(tx: &SignedEstablishedAccountTx) -> Self { - let SignedEstablishedAccountTx { vp, public_key } = tx; - Self { - vp: vp.clone(), - public_key: public_key.as_ref().map(|signed| signed.pk.clone()), - } - } -} - impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { fn from(tx: &SignedValidatorAccountTx) -> Self { let SignedValidatorAccountTx { @@ -1133,17 +1144,19 @@ impl From<&SignedBondTx> for BondTx { fn look_up_sk_from( source: &GenesisAddress, wallet: &mut Wallet, - established_accounts: &Option>>, -) -> common::SecretKey { + established_accounts: &Option>, +) -> Vec { // Try to look-up the source from wallet first match source { GenesisAddress::EstablishedAddress(_) => None, - GenesisAddress::PublicKey(pk) => wallet.find_key_by_pk(pk, None).ok(), + GenesisAddress::PublicKey(pk) => { + wallet.find_key_by_pk(pk, None).map(|sk| vec![sk]).ok() + } } .unwrap_or_else(|| { // If it's not in the wallet, it must be an established account // so we need to look-up its public key first - let pk = established_accounts + established_accounts .as_ref() .unwrap_or_else(|| { panic!( @@ -1155,24 +1168,13 @@ fn look_up_sk_from( .find_map(|account| match source { GenesisAddress::EstablishedAddress(address) => { // delegation from established account - if &EstablishedAccountTx::from(account) - .derive_established_address() - == address - { + if account.derive_established_address() == address { Some( - &account - .public_key - .as_ref() - .unwrap_or_else(|| { - panic!( - "Signing failed. The established \ - account \"{source}\" has no public \ - key. Add a public to be able to sign \ - bonds." - ); - }) - .pk - .raw, + account + .public_keys + .iter() + .map(|pk| &pk.raw) + .collect::>(), ) } else { None @@ -1180,7 +1182,7 @@ fn look_up_sk_from( } GenesisAddress::PublicKey(pk) => { // delegation from an implicit account - Some(&pk.raw) + Some(vec![&pk.raw]) } }) .unwrap_or_else(|| { @@ -1188,12 +1190,9 @@ fn look_up_sk_from( "Signing failed. Cannot find \"{source}\" in the wallet \ or in the established accounts." ); - }); - wallet.find_key_by_pk(pk, None).unwrap_or_else(|err| { - panic!( - "Signing failed. Cannot find key for established account \ - \"{source}\" in the wallet. Failed with {err}." - ); - }) + }) + .iter() + .filter_map(|pk| wallet.find_key_by_pk(pk, None).ok()) + .collect() }) } diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index 3714ea6aef..79ba18f267 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -11,7 +11,6 @@ use namada::ledger::{ibc, pos}; use namada::proof_of_stake::BecomeValidator; use namada::types::hash::Hash as CodeHash; use namada::types::key::*; -use namada::types::storage::KeySeg; use namada::types::time::{DateTimeUtc, TimeZone, Utc}; use namada::vm::validate_untrusted_wasm; use namada_sdk::eth_bridge::EthBridgeStatus; @@ -350,7 +349,11 @@ where if let Some(txs) = genesis.transactions.established_account.as_ref() { for FinalizedEstablishedAccountTx { address, - tx: EstablishedAccountTx { vp, public_key }, + tx: + EstablishedAccountTx { + vp, + public_keys: public_key, + }, } in txs { tracing::debug!( diff --git a/core/src/types/key/mod.rs b/core/src/types/key/mod.rs index 9a13c13503..fb9964cccc 100644 --- a/core/src/types/key/mod.rs +++ b/core/src/types/key/mod.rs @@ -124,6 +124,13 @@ pub enum VerifySigError { MismatchedScheme, #[error("Signature verification went out of gas: {0}")] OutOfGas(#[from] crate::ledger::gas::Error), + #[error( + "The number of valid signatures did not meet the required threshold, \ + required {0} got {1}" + )] + ThresholdNotMet(u8, u8), + #[error("Too many fucking sigs")] + TooGoddamnBig, } #[allow(missing_docs)] diff --git a/tests/src/e2e/helpers.rs b/tests/src/e2e/helpers.rs index 13fe2b7287..704365e652 100644 --- a/tests/src/e2e/helpers.rs +++ b/tests/src/e2e/helpers.rs @@ -230,7 +230,7 @@ pub fn get_established_addr_from_pregenesis>( let established_accounts = genesis.transactions.established_account.as_ref()?; let acct = established_accounts.iter().find(|&acct| { - acct.public_key.as_ref().expect("the unexpected").pk.raw == pk + acct.public_keys.as_ref().expect("the unexpected").pk.raw == pk })?; Some( transactions::UnsignedEstablishedAccountTx::from(acct).derive_address(), diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index a8ccfb3f83..19784b2ddc 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -3475,15 +3475,13 @@ fn test_invalid_validator_txs() -> Result<()> { base_dir, default_port_offset, ); - let bonds = genesis.transactions.bond.unwrap(); - genesis.transactions.bond = Some( + genesis.transactions.bond = Some({ + let mut bonds = genesis.transactions.bond.unwrap(); + // NB: the last bond should be from `validator-1`. + // we will filter it out from the list of bonds + bonds.pop(); bonds - .into_iter() - .filter(|bond| { - (&bond.data.validator).as_ref() != "validator-1" - }) - .collect(), - ); + }); genesis }, None, From 6823331dead1896114d8dc8ffbb993e400d44c2d Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 21 Nov 2023 14:12:43 +0000 Subject: [PATCH 063/175] Remove established account init CLI subcmd --- apps/src/lib/cli.rs | 53 ------------------ apps/src/lib/cli/client.rs | 3 -- apps/src/lib/client/utils.rs | 59 --------------------- apps/src/lib/config/genesis/transactions.rs | 19 ------- 4 files changed, 134 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index dbddc20565..bda9e4b6aa 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2180,7 +2180,6 @@ pub mod cmds { ValidateWasm(ValidateWasm), InitNetwork(InitNetwork), DeriveGenesisAddresses(DeriveGenesisAddresses), - InitGenesisEstablishedAccount(InitGenesisEstablishedAccount), InitGenesisValidator(InitGenesisValidator), PkToTmAddress(PkToTmAddress), DefaultBaseDir(DefaultBaseDir), @@ -2203,8 +2202,6 @@ pub mod cmds { SubCmd::parse(matches).map(Self::InitNetwork); let derive_addresses = SubCmd::parse(matches).map(Self::DeriveGenesisAddresses); - let init_established = SubCmd::parse(matches) - .map(Self::InitGenesisEstablishedAccount); let init_genesis = SubCmd::parse(matches).map(Self::InitGenesisValidator); let pk_to_tm_address = @@ -2221,7 +2218,6 @@ pub mod cmds { .or(validate_wasm) .or(init_network) .or(derive_addresses) - .or(init_established) .or(init_genesis) .or(pk_to_tm_address) .or(default_base_dir) @@ -2239,7 +2235,6 @@ pub mod cmds { .subcommand(ValidateWasm::def()) .subcommand(InitNetwork::def()) .subcommand(DeriveGenesisAddresses::def()) - .subcommand(InitGenesisEstablishedAccount::def()) .subcommand(InitGenesisValidator::def()) .subcommand(PkToTmAddress::def()) .subcommand(DefaultBaseDir::def()) @@ -2349,29 +2344,6 @@ pub mod cmds { } } - #[derive(Clone, Debug)] - pub struct InitGenesisEstablishedAccount( - pub args::InitGenesisEstablishedAccount, - ); - - impl SubCmd for InitGenesisEstablishedAccount { - const CMD: &'static str = "init-genesis-established-account"; - - fn parse(matches: &ArgMatches) -> Option { - matches.subcommand_matches(Self::CMD).map(|matches| { - Self(args::InitGenesisEstablishedAccount::parse(matches)) - }) - } - - fn def() -> App { - App::new(Self::CMD) - .about( - "Initialize an established account available at genesis.", - ) - .add_args::() - } - } - #[derive(Clone, Debug)] pub struct InitGenesisValidator(pub args::InitGenesisValidator); @@ -6766,31 +6738,6 @@ pub mod args { } } - #[derive(Clone, Debug)] - pub struct InitGenesisEstablishedAccount { - pub vp: String, - pub wallet_alias: String, - } - - impl Args for InitGenesisEstablishedAccount { - fn parse(matches: &ArgMatches) -> Self { - let wallet_alias = ALIAS.parse(matches); - let vp = VP.parse(matches).unwrap_or_else(|| "vp_user".to_string()); - Self { wallet_alias, vp } - } - - fn def(app: App) -> App { - app.arg( - ALIAS - .def() - .help("The alias of the key to use from the wallet."), - ) - .arg(VP.def().help( - "The validity predicate of the account. Defaults to `vp_user`.", - )) - } - } - #[derive(Clone, Debug)] pub struct InitGenesisValidator { pub alias: String, diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 2f06a497d4..472b7ae099 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -637,9 +637,6 @@ impl CliApi { Utils::DeriveGenesisAddresses(DeriveGenesisAddresses(args)) => { utils::derive_genesis_addresses(global_args, args) } - Utils::InitGenesisEstablishedAccount( - InitGenesisEstablishedAccount(args), - ) => utils::init_genesis_established_account(global_args, args), Utils::InitGenesisValidator(InitGenesisValidator(args)) => { utils::init_genesis_validator(global_args, args) } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 523fe31fcc..7420029726 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -673,56 +673,6 @@ pub fn derive_genesis_addresses( } } -/// Initialize a genesis established account. -/// key into a special "pre-genesis" wallet. -pub fn init_genesis_established_account( - global_args: args::Global, - args: args::InitGenesisEstablishedAccount, -) { - let (mut pre_genesis_wallet, _) = - load_pre_genesis_wallet_or_exit(&global_args.base_dir); - - let alias = args.wallet_alias.as_str(); - let public_key = { - let sk = pre_genesis_wallet - .find_secret_key(alias, None) - .unwrap_or_else(|err| { - eprintln!( - "Failed to look-up `{alias}` in the pre-genesis wallet: \ - {err}", - ); - safe_exit(1) - }); - sk.ref_to() - }; - - let (address, txs) = genesis::transactions::init_established_account( - args.vp, - public_key, - &mut pre_genesis_wallet, - ); - let toml_path = { - let pre_genesis_dir = global_args.base_dir.join(PRE_GENESIS_DIR); - established_acc_pre_genesis_txs_file(alias, &pre_genesis_dir) - }; - let toml_path_str = toml_path.to_string_lossy(); - - let genesis_part = toml::to_string(&txs).unwrap(); - fs::write(&toml_path, genesis_part).unwrap_or_else(|err| { - eprintln!( - "Couldn't write pre-genesis transactions file to {toml_path_str}. \ - Failed with: {err}", - ); - safe_exit(1) - }); - - println!( - "{}: {address}", - "Derived established account address".bold() - ); - println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); -} - /// Initialize genesis validator's address, consensus key and validator account /// key into a special "pre-genesis" wallet. pub fn init_genesis_validator( @@ -894,15 +844,6 @@ pub fn validator_pre_genesis_txs_file(pre_genesis_path: &Path) -> PathBuf { pre_genesis_path.join("transactions.toml") } -/// The default path to an established account txs file. -pub fn established_acc_pre_genesis_txs_file( - wallet_key_alias: &str, - pre_genesis_path: &Path, -) -> PathBuf { - pre_genesis_path - .join(format!("established-account-tx-{wallet_key_alias}.toml")) -} - /// The default validator pre-genesis directory pub fn validator_pre_genesis_dir(base_dir: &Path, alias: &str) -> PathBuf { base_dir.join(PRE_GENESIS_DIR).join(alias) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index b0eb57fb9a..ddb8f7e90a 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -101,25 +101,6 @@ pub fn parse_unsigned( toml::from_slice(bytes) } -/// Create signed [`Transactions`] for an established account. -pub fn init_established_account( - vp: String, - public_key: common::PublicKey, - wallet: &mut Wallet, -) -> (Address, Transactions) { - let unsigned_tx = EstablishedAccountTx { - vp, - public_keys: Some(StringEncoded::new(public_key)), - }; - let address = unsigned_tx.derive_address(); - let signed_tx = sign_established_account_tx(unsigned_tx, wallet); - let txs = Transactions { - established_account: Some(vec![signed_tx]), - ..Default::default() - }; - (address, txs) -} - /// Create signed [`Transactions`] for a genesis validator. pub fn init_validator( GenesisValidatorData { From ca0b3fa2c0044b01c9d7332141b1458a18f98386 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 21 Nov 2023 14:48:13 +0000 Subject: [PATCH 064/175] Fix rebase + multisig related compilation issues --- apps/src/lib/config/genesis/templates.rs | 3 +- apps/src/lib/config/genesis/transactions.rs | 58 ++++++-------------- apps/src/lib/node/ledger/shell/init_chain.rs | 27 ++++----- tests/src/e2e/helpers.rs | 8 +-- 4 files changed, 36 insertions(+), 60 deletions(-) diff --git a/apps/src/lib/config/genesis/templates.rs b/apps/src/lib/config/genesis/templates.rs index 423905a847..a9f513214e 100644 --- a/apps/src/lib/config/genesis/templates.rs +++ b/apps/src/lib/config/genesis/templates.rs @@ -818,8 +818,7 @@ pub fn validate_parameters( let mut found_steward = false; if let Some(accs) = &txs.established_account { if accs.iter().any(|acct| { - let addr = - UnsignedEstablishedAccountTx::from(acct).derive_address(); + let addr = acct.derive_address(); &addr == steward }) { found_steward = true; diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index ddb8f7e90a..da38a63721 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -6,7 +6,6 @@ use std::net::SocketAddr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; -use itertools::Itertools; use namada::core::types::address::Address; use namada::core::types::string_encoding::StringEncoded; use namada::proto::{ @@ -75,11 +74,6 @@ pub fn sign_txs( } // Sign all the transactions - let established_account = established_account.map(|tx| { - tx.into_iter() - .map(|tx| sign_established_account_tx(tx, wallet)) - .collect() - }); let validator_account = None; let bond = bond.map(|tx| { tx.into_iter() @@ -260,7 +254,9 @@ pub fn sign_self_bond_tx( unsigned_tx: BondTx, validator_wallet: &ValidatorWallet, ) -> SignedBondTx { - unsigned_tx.sign(&validator_wallet.account_key) + let mut signed = SignedBondTx::from(unsigned_tx); + signed.sign(std::slice::from_ref(&validator_wallet.account_key)); + signed } pub fn sign_delegation_bond_tx( @@ -268,9 +264,11 @@ pub fn sign_delegation_bond_tx( wallet: &mut Wallet, established_accounts: &Option>, ) -> SignedBondTx { - let source_key = + let source_keys = look_up_sk_from(&unsigned_tx.source, wallet, established_accounts); - unsigned_tx.sign(&source_key) + let mut signed = SignedBondTx::from(unsigned_tx); + signed.sign(&source_keys); + signed } pub fn sign_tx( @@ -450,7 +448,6 @@ pub struct EstablishedAccountTx { pub vp: String, #[serde(default = "default_threshold")] pub threshold: u8, - #[serde(deserialize_with = "deserialize_single_or_vec")] /// PKs have to come last in TOML to avoid `ValueAfterTable` error pub public_keys: Vec>, } @@ -459,18 +456,6 @@ const fn default_threshold() -> u8 { 1 } -/// Deserialize a vec of type `T`, or if a single `T` is provided, -/// deserialize that and place in a vector. -fn deserialize_single_or_vec<'de, D, T>(d: D) -> Result, D::Error> -where - D: serde::Deserializer<'de>, - T: Deserialize<'de>, -{ - T::deserialize(d.clone()) - .map(|t| vec![t]) - .or_else(|_| Vec::::deserialize(d)) -} - impl DeriveEstablishedAddress for EstablishedAccountTx { const SALT: &'static str = "established-account-tx"; } @@ -492,17 +477,14 @@ where pks: &[common::PublicKey], threshold: u8, ) -> Result<(), VerifySigError> { - let Self { - data, - signatures: signature, - } = self; + let Self { data, signatures } = self; if pks.len() > u8::MAX as usize { eprintln!("You're multisig is too facking big"); return Err(VerifySigError::TooGoddamnBig); } let mut valid_sigs = 0; - for pk in &pks { - valid_sigs += self.signatures.iter().any(|sig| { + for pk in pks { + valid_sigs += signatures.iter().any(|sig| { verify_standalone_sig::<_, SerializeWithBorsh>( &data.data_to_sign(), pk, @@ -530,16 +512,12 @@ impl SignedBondTx { /// types. Thus we only allow signing of [`BondTx`] /// types. pub fn sign(&mut self, key: &[common::SecretKey]) { - self.signatures.extend( - key.iter() - .map(|sk| { - standalone_signature::<_, SerializeWithBorsh>( - sk, - &self.data.data_to_sign(), - ) - }) - .collect(), - ) + self.signatures.extend(key.iter().map(|sk| { + StringEncoded::new(standalone_signature::<_, SerializeWithBorsh>( + sk, + &self.data.data_to_sign(), + )) + })) } } @@ -806,7 +784,7 @@ fn validate_bond( } }; if let Some((source_pks, threshold)) = maybe_source { - if tx.verify_sig(&source_pks, threshold).is_err() { + if tx.verify_sig(source_pks, threshold).is_err() { eprintln!("Invalid bond tx signature.",); false } else { @@ -1149,7 +1127,7 @@ fn look_up_sk_from( .find_map(|account| match source { GenesisAddress::EstablishedAddress(address) => { // delegation from established account - if account.derive_established_address() == address { + if &account.derive_established_address() == address { Some( account .public_keys diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index 79ba18f267..c21463b28d 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -307,11 +307,11 @@ where let mut total_token_balance = token::Amount::zero(); for (owner, balance) in balances { if let genesis::GenesisAddress::PublicKey(pk) = owner { - storage_api::account::set_public_key_at( + storage_api::account::init_account_storage( &mut self.wl_storage, &owner.address(), - &pk.raw, - 0, + std::slice::from_ref(&pk.raw), + 1, ) .unwrap(); } @@ -352,7 +352,8 @@ where tx: EstablishedAccountTx { vp, - public_keys: public_key, + threshold, + public_keys, }, } in txs { @@ -366,15 +367,15 @@ where .write_bytes(&Key::validity_predicate(address), code_hash) .unwrap(); - if let Some(pk) = public_key { - storage_api::account::set_public_key_at( - &mut self.wl_storage, - address, - &pk.pk.raw, - 0, - ) - .unwrap(); - } + let public_keys: Vec<_> = + public_keys.iter().map(|pk| pk.raw.clone()).collect(); + storage_api::account::init_account_storage( + &mut self.wl_storage, + address, + &public_keys, + *threshold, + ) + .unwrap(); } } } diff --git a/tests/src/e2e/helpers.rs b/tests/src/e2e/helpers.rs index 704365e652..d7cea1d79c 100644 --- a/tests/src/e2e/helpers.rs +++ b/tests/src/e2e/helpers.rs @@ -20,7 +20,7 @@ use namada::types::key::*; use namada::types::storage::Epoch; use namada::types::token; use namada_apps::config::genesis::chain::DeriveEstablishedAddress; -use namada_apps::config::genesis::{templates, transactions}; +use namada_apps::config::genesis::templates; use namada_apps::config::utils::convert_tm_addr_to_socket_addr; use namada_apps::config::{Config, TendermintMode}; use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; @@ -230,11 +230,9 @@ pub fn get_established_addr_from_pregenesis>( let established_accounts = genesis.transactions.established_account.as_ref()?; let acct = established_accounts.iter().find(|&acct| { - acct.public_keys.as_ref().expect("the unexpected").pk.raw == pk + acct.public_keys.len() == 1 && acct.public_keys[0].raw == pk })?; - Some( - transactions::UnsignedEstablishedAccountTx::from(acct).derive_address(), - ) + Some(acct.derive_address()) } /// Find the address of an account by its alias from the wallet From f7833530f220a0aea2198c8fdf5379e66a87326c Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 21 Nov 2023 15:36:21 +0000 Subject: [PATCH 065/175] Implement Display and FromStr for established addrs --- core/src/types/address.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/core/src/types/address.rs b/core/src/types/address.rs index 91028f0750..4275ebae0d 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -406,6 +406,29 @@ impl From<[u8; SHA_HASH_LEN]> for EstablishedAddress { } } +impl string_encoding::Format for EstablishedAddress { + type EncodedBytes<'a> = [u8; raw::ADDR_ENCODING_LEN]; + + const HRP: &'static str = string_encoding::ADDRESS_HRP; + + #[inline] + fn to_bytes(&self) -> [u8; raw::ADDR_ENCODING_LEN] { + Address::Established(self.hash.into()).to_bytes() + } + + #[inline] + fn decode_bytes(bytes: &[u8]) -> Result { + match Address::decode_bytes(bytes)? { + Address::Established(established) => Ok(established), + address => Err(DecodeError::InvalidInnerEncoding(format!( + "Expected established address, got {address:?}" + ))), + } + } +} + +impl_display_and_from_str_via_format!(EstablishedAddress); + /// A generator of established addresses #[derive( Debug, From 4b08cf58f088baae7589e204afed7b9bcc707643 Mon Sep 17 00:00:00 2001 From: yito88 Date: Fri, 24 Nov 2023 23:18:11 +0100 Subject: [PATCH 066/175] ibc-rs 0.48.0 --- Cargo.lock | 485 +++++++++++++++--- Cargo.toml | 6 + apps/src/lib/bench_utils.rs | 88 ++-- apps/src/lib/cli.rs | 2 +- apps/src/lib/client/tx.rs | 2 +- core/Cargo.toml | 9 +- core/src/ledger/ibc/context/client.rs | 80 ++- core/src/ledger/ibc/context/common.rs | 43 +- core/src/ledger/ibc/context/execution.rs | 33 +- core/src/ledger/ibc/context/mod.rs | 6 +- core/src/ledger/ibc/context/router.rs | 6 +- core/src/ledger/ibc/context/token_transfer.rs | 13 +- core/src/ledger/ibc/context/transfer_mod.rs | 27 +- core/src/ledger/ibc/context/validation.rs | 52 +- core/src/ledger/ibc/mod.rs | 38 +- core/src/ledger/ibc/storage.rs | 17 +- core/src/types/address.rs | 2 +- core/src/types/ibc.rs | 4 +- core/src/types/token.rs | 2 +- sdk/Cargo.toml | 4 - sdk/src/args.rs | 2 +- sdk/src/events/log/dumb_queries.rs | 12 +- sdk/src/lib.rs | 2 +- sdk/src/queries/router.rs | 4 +- sdk/src/queries/shell.rs | 5 +- sdk/src/signing.rs | 4 +- sdk/src/tx.rs | 19 +- shared/Cargo.toml | 8 +- shared/src/ledger/native_vp/ibc/mod.rs | 143 +++--- tests/Cargo.toml | 3 +- tests/src/e2e/ibc_tests.rs | 133 +++-- tests/src/vm_host_env/ibc.rs | 100 ++-- tests/src/vm_host_env/mod.rs | 2 +- wasm/Cargo.lock | 480 ++++++++++++++--- 34 files changed, 1253 insertions(+), 583 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a760f39701..c0c77999b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -500,7 +500,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.10.1", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "unicode-normalization", "zeroize", ] @@ -597,7 +597,7 @@ dependencies = [ "cc", "cfg-if 1.0.0", "constant_time_eq", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -762,9 +762,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ "serde 1.0.190", ] @@ -1000,13 +1000,13 @@ dependencies = [ "bincode", "bs58", "coins-core", - "digest 0.10.6", + "digest 0.10.7", "getrandom 0.2.10", "hmac 0.12.1", "k256", "lazy_static", "serde 1.0.190", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] @@ -1023,7 +1023,7 @@ dependencies = [ "once_cell", "pbkdf2 0.12.1", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] @@ -1036,13 +1036,13 @@ dependencies = [ "base64 0.21.0", "bech32 0.7.3", "bs58", - "digest 0.10.6", + "digest 0.10.7", "generic-array 0.14.7", "hex", "ripemd", "serde 1.0.190", "serde_derive", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -1559,9 +1559,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid", @@ -1651,7 +1651,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" dependencies = [ "der", - "digest 0.10.6", + "digest 0.10.7", "elliptic-curve", "rfc6979", "serdect", @@ -1734,7 +1734,7 @@ checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.6", + "digest 0.10.7", "ff", "generic-array 0.14.7", "group", @@ -1861,7 +1861,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest 0.10.6", + "digest 0.10.7", "hex", "hmac 0.12.1", "pbkdf2 0.11.0", @@ -1869,7 +1869,7 @@ dependencies = [ "scrypt", "serde 1.0.190", "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", "uuid 0.8.2", @@ -2169,7 +2169,7 @@ dependencies = [ "ethers-core", "hex", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", "tracing", ] @@ -2749,7 +2749,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2891,40 +2891,353 @@ dependencies = [ [[package]] name = "ibc" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "184eb22140cb4143bbcf7ddc8fdfeb9cc058ef73a6066f8ea78162e69d3565d1" +version = "0.48.0" +dependencies = [ + "ibc-apps", + "ibc-clients", + "ibc-core", + "ibc-core-host-cosmos", + "ibc-derive 0.4.0", + "ibc-primitives", +] + +[[package]] +name = "ibc-app-transfer" +version = "0.48.0" +dependencies = [ + "ibc-app-transfer-types", + "ibc-core", + "serde-json-wasm", +] + +[[package]] +name = "ibc-app-transfer-types" +version = "0.48.0" dependencies = [ - "bytes", "derive_more", "displaydoc", - "ibc-derive", + "ibc-core", "ibc-proto", - "ics23", - "num-traits 0.2.15", - "parking_lot", "primitive-types", + "serde 1.0.190", + "uint", +] + +[[package]] +name = "ibc-apps" +version = "0.48.0" +dependencies = [ + "ibc-app-transfer", +] + +[[package]] +name = "ibc-client-tendermint" +version = "0.48.0" +dependencies = [ + "ibc-client-tendermint-types", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", + "serde 1.0.190", + "tendermint", + "tendermint-light-client-verifier", +] + +[[package]] +name = "ibc-client-tendermint-types" +version = "0.48.0" +dependencies = [ + "bytes", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", "prost 0.12.1", "serde 1.0.190", - "serde-json-wasm", - "serde_derive", - "sha2 0.10.6", - "subtle-encoding", "tendermint", "tendermint-light-client-verifier", "tendermint-proto", - "tendermint-testgen", - "time", - "tracing", - "typed-builder", - "uint", +] + +[[package]] +name = "ibc-clients" +version = "0.48.0" +dependencies = [ + "ibc-client-tendermint", +] + +[[package]] +name = "ibc-core" +version = "0.48.0" +dependencies = [ + "ibc-core-channel", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-channel" +version = "0.48.0" +dependencies = [ + "ibc-core-channel-types", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-channel-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde 1.0.190", + "sha2 0.10.8", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-client" +version = "0.48.0" +dependencies = [ + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-client-context" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-derive 0.4.0", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-client-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde 1.0.190", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-commitment-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-primitives", + "ibc-proto", + "ics23", + "prost 0.12.1", + "serde 1.0.190", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-connection" +version = "0.48.0" +dependencies = [ + "ibc-core-client", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-connection-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde 1.0.190", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-handler" +version = "0.48.0" +dependencies = [ + "ibc-core-channel", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-handler-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-host-types", + "ibc-core-router-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde 1.0.190", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-host" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-host-cosmos" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-app-transfer-types", + "ibc-client-tendermint", + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde 1.0.190", + "sha2 0.10.8", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-host-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-primitives", + "serde 1.0.190", +] + +[[package]] +name = "ibc-core-router" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-host-types", + "ibc-core-router-types", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-router-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "ics23", + "prost 0.12.1", + "serde 1.0.190", + "subtle-encoding", + "tendermint", ] [[package]] name = "ibc-derive" -version = "0.3.0" +version = "0.4.0" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "ibc-derive" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92f1528535e9ca495badb76c143bdd4763c1c9d987f59d1f8b47963ba0c11674" +checksum = "df07bf5bc1e65e291506b7497633e07967e49b36a8db10cda77a8fd686eb4548" dependencies = [ "darling", "proc-macro2", @@ -2932,11 +3245,24 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "ibc-primitives" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-proto", + "prost 0.12.1", + "serde 1.0.190", + "tendermint", + "time", +] + [[package]] name = "ibc-proto" -version = "0.37.1" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63042806bb2f662ca1c68026231900cfe13361136ddfd0dd09bcb315056a22b8" +checksum = "93cbf4cbe9e5113cc7c70f3208a7029b2205c629502cbb2ae7ea0a09a97d3005" dependencies = [ "base64 0.21.0", "bytes", @@ -2948,6 +3274,25 @@ dependencies = [ "tendermint-proto", ] +[[package]] +name = "ibc-testkit" +version = "0.48.0" +dependencies = [ + "bytes", + "derive_more", + "displaydoc", + "ibc", + "ibc-proto", + "parking_lot", + "primitive-types", + "prost 0.12.1", + "subtle-encoding", + "tendermint", + "tendermint-testgen", + "tracing", + "typed-builder", +] + [[package]] name = "ics23" version = "0.11.0" @@ -2961,7 +3306,7 @@ dependencies = [ "prost 0.12.1", "ripemd", "serde 1.0.190", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", ] @@ -3208,7 +3553,7 @@ dependencies = [ "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.6", + "sha2 0.10.8", "signature 2.1.0", ] @@ -3263,7 +3608,7 @@ dependencies = [ "ledger-zondax-generic", "prost 0.11.9", "prost-types 0.11.9", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] @@ -3532,7 +3877,7 @@ dependencies = [ "num-traits 0.2.15", "rand 0.8.5", "rand_core 0.6.4", - "sha2 0.10.6", + "sha2 0.10.8", "subtle 2.4.1", "zcash_encoding", ] @@ -3749,6 +4094,7 @@ dependencies = [ "eyre", "fd-lock", "futures", + "ibc-testkit", "itertools 0.10.5", "k256", "loupe", @@ -3922,8 +4268,9 @@ dependencies = [ "ethbridge-structs", "eyre", "ibc", - "ibc-derive", + "ibc-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "ibc-proto", + "ibc-testkit", "ics23", "impl-num-traits", "index-set", @@ -4105,6 +4452,7 @@ dependencies = [ "eyre", "fs_extra", "hyper", + "ibc-testkit", "itertools 0.10.5", "lazy_static", "namada", @@ -4724,7 +5072,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "password-hash", ] @@ -4734,7 +5082,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4743,7 +5091,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0ca0b5a68607598bf3bad68f32227a8164f6254833f84eafaac409cd6746c31" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "hmac 0.12.1", ] @@ -4968,9 +5316,9 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", @@ -5510,7 +5858,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -5812,7 +6160,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.6", + "sha2 0.10.8", ] [[package]] @@ -6047,7 +6395,7 @@ checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -6077,13 +6425,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -6092,7 +6440,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] @@ -6142,7 +6490,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -6433,7 +6781,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" dependencies = [ "bytes", - "digest 0.10.6", + "digest 0.10.7", "ed25519 2.2.2", "ed25519-consensus 2.1.0", "flex-error", @@ -6448,7 +6796,7 @@ dependencies = [ "serde_bytes", "serde_json", "serde_repr", - "sha2 0.10.6", + "sha2 0.10.8", "signature 2.1.0", "subtle 2.4.1", "subtle-encoding", @@ -6989,11 +7337,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -7013,9 +7360,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -7024,9 +7371,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -7120,18 +7467,18 @@ dependencies = [ [[package]] name = "typed-builder" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c6a006a6d3d6a6f143fda41cf4d1ad35110080687628c9f2117bd3cc7924f3" +checksum = "e47c0496149861b7c95198088cbf36645016b1a0734cf350c50e2a38e070f38a" dependencies = [ "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa054ee5e2346187d631d2f1d1fd3b33676772d6d03a2d84e1c5213b31674ee" +checksum = "982ee4197351b5c9782847ef5ec1fdcaf50503fb19d68f9771adae314e72b492" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index c1fa8f6d03..8965f60323 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -81,6 +81,12 @@ flate2 = "1.0.22" fs_extra = "1.2.0" futures = "0.3" git2 = "0.13.25" +#ibc = {version = "0.48.0", default-features = false, features = ["serde"]} +ibc = {path = "../../cosmos/ibc-rs/ibc", default-features = false, features = ["serde"]} +ibc-derive = "0.4.0" +ibc-proto = {version = "0.38.0", default-features = false} +#ibc-testkit = {version = "0.48.0", default-features = false} +ibc-testkit = {path = "../../cosmos/ibc-rs/ibc-testkit", default-features = false} ics23 = "0.11.0" index-set = {git = "https://github.com/heliaxdev/index-set", tag = "v0.8.0", features = ["serialize-borsh", "serialize-serde"]} itertools = "0.10.0" diff --git a/apps/src/lib/bench_utils.rs b/apps/src/lib/bench_utils.rs index 551bf49abd..b069c7ec29 100644 --- a/apps/src/lib/bench_utils.rs +++ b/apps/src/lib/bench_utils.rs @@ -19,39 +19,39 @@ use namada::core::types::address::{self, Address}; use namada::core::types::key::common::SecretKey; use namada::core::types::storage::Key; use namada::core::types::token::{Amount, Transfer}; -use namada::ibc::applications::transfer::msgs::transfer::MsgTransfer; -use namada::ibc::applications::transfer::packet::PacketData; -use namada::ibc::applications::transfer::PrefixedCoin; -use namada::ibc::clients::ics07_tendermint::client_state::{ - AllowUpdate, ClientState, +use namada::ibc::apps::transfer::types::msgs::transfer::MsgTransfer; +use namada::ibc::apps::transfer::types::packet::PacketData; +use namada::ibc::apps::transfer::types::PrefixedCoin; +use namada::ibc::clients::tendermint::client_state::ClientState; +use namada::ibc::clients::tendermint::consensus_state::ConsensusState; +use namada::ibc::clients::tendermint::types::{ + AllowUpdate, ClientState as ClientStateType, + ConsensusState as ConsensusStateType, TrustThreshold, }; -use namada::ibc::clients::ics07_tendermint::consensus_state::ConsensusState; -use namada::ibc::clients::ics07_tendermint::trust_threshold::TrustThreshold; -use namada::ibc::core::ics02_client::client_type::ClientType; -use namada::ibc::core::ics03_connection::connection::{ - ConnectionEnd, Counterparty, State as ConnectionState, -}; -use namada::ibc::core::ics03_connection::version::Version; -use namada::ibc::core::ics04_channel::channel::{ +use namada::ibc::core::channel::types::channel::{ ChannelEnd, Counterparty as ChannelCounterparty, Order, State, }; -use namada::ibc::core::ics04_channel::timeout::TimeoutHeight; -use namada::ibc::core::ics04_channel::Version as ChannelVersion; -use namada::ibc::core::ics23_commitment::commitment::{ +use namada::ibc::core::channel::types::timeout::TimeoutHeight; +use namada::ibc::core::channel::types::Version as ChannelVersion; +use namada::ibc::core::client::types::Height as IbcHeight; +use namada::ibc::core::commitment_types::commitment::{ CommitmentPrefix, CommitmentRoot, }; -use namada::ibc::core::ics23_commitment::specs::ProofSpecs; -use namada::ibc::core::ics24_host::identifier::{ +use namada::ibc::core::commitment_types::specs::ProofSpecs; +use namada::ibc::core::connection::types::version::Version; +use namada::ibc::core::connection::types::{ + ConnectionEnd, Counterparty, State as ConnectionState, +}; +use namada::ibc::core::host::types::identifiers::{ ChainId as IbcChainId, ChannelId as NamadaChannelId, ChannelId, ClientId, - ConnectionId, ConnectionId as NamadaConnectionId, PortId as NamadaPortId, - PortId, + ClientType, ConnectionId, ConnectionId as NamadaConnectionId, + PortId as NamadaPortId, PortId, }; -use namada::ibc::core::ics24_host::path::Path as IbcPath; -use namada::ibc::core::timestamp::Timestamp as IbcTimestamp; -use namada::ibc::core::Msg; -use namada::ibc::Height as IbcHeight; -use namada::ibc_proto::google::protobuf::Any; -use namada::ibc_proto::protobuf::Protobuf; +use namada::ibc::core::host::types::path::{ + ClientConsensusStatePath, ClientStatePath, Path as IbcPath, +}; +use namada::ibc::primitives::proto::{Any, Protobuf}; +use namada::ibc::primitives::{Msg, Timestamp as IbcTimestamp}; use namada::ledger::dry_run_tx; use namada::ledger::gas::TxGasMeter; use namada::ledger::ibc::storage::{channel_key, connection_key}; @@ -424,15 +424,11 @@ impl BenchShell { ClientId::new(ClientType::new("01-tendermint").unwrap(), 1) .unwrap(); let client_state_key = addr_key.join(&Key::from( - IbcPath::ClientState( - namada::ibc::core::ics24_host::path::ClientStatePath( - client_id.clone(), - ), - ) - .to_string() - .to_db_key(), + IbcPath::ClientState(ClientStatePath(client_id.clone())) + .to_string() + .to_db_key(), )); - let client_state = ClientState::new( + let client_state = ClientStateType::new( IbcChainId::from_str(&ChainId::default().to_string()).unwrap(), TrustThreshold::ONE_THIRD, std::time::Duration::new(100, 0), @@ -446,8 +442,9 @@ impl BenchShell { after_misbehaviour: true, }, ) - .unwrap(); - let bytes = >::encode_vec(&client_state); + .unwrap() + .into(); + let bytes = >::encode_vec(client_state); self.wl_storage .storage .write(&client_state_key, bytes) @@ -457,25 +454,24 @@ impl BenchShell { let now: namada::tendermint::Time = DateTimeUtc::now().try_into().unwrap(); let consensus_key = addr_key.join(&Key::from( - IbcPath::ClientConsensusState( - namada::ibc::core::ics24_host::path::ClientConsensusStatePath { - client_id: client_id.clone(), - epoch: 0, - height: 1, - }, - ) + IbcPath::ClientConsensusState(ClientConsensusStatePath { + client_id: client_id.clone(), + revision_number: 0, + revision_height: 1, + }) .to_string() .to_db_key(), )); - let consensus_state = ConsensusState { + let consensus_state = ConsensusStateType { timestamp: now, root: CommitmentRoot::from_bytes(&[]), next_validators_hash: Hash::Sha256([0u8; 32]), - }; + } + .into(); let bytes = - >::encode_vec(&consensus_state); + >::encode_vec(consensus_state); self.wl_storage .storage .write(&consensus_key, bytes) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 3bb7f5c7ad..a251fc2b30 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2818,7 +2818,7 @@ pub mod args { use std::path::PathBuf; use std::str::FromStr; - use namada::ibc::core::ics24_host::identifier::{ChannelId, PortId}; + use namada::ibc::core::host::types::identifiers::{ChannelId, PortId}; use namada::types::address::Address; use namada::types::chain::{ChainId, ChainIdPrefix}; use namada::types::dec::Dec; diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 0317ec43f3..be1738b262 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -13,7 +13,7 @@ use namada::core::ledger::governance::cli::offline::{ use namada::core::ledger::governance::cli::onchain::{ DefaultProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, }; -use namada::ibc::applications::transfer::Memo; +use namada::ibc::apps::transfer::types::Memo; use namada::proto::{CompressedSignature, Section, Signer, Tx}; use namada::types::address::{Address, ImplicitAddress}; use namada::types::dec::Dec; diff --git a/core/Cargo.toml b/core/Cargo.toml index 53ee824077..08961be424 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -17,12 +17,12 @@ default = ["rand"] mainnet = [] wasm-runtime = ["rayon"] rand = ["dep:rand", "rand_core"] -ibc-mocks = ["ibc/mocks" ] ethers-derive = [ "ethbridge-structs/ethers-derive" ] # for integration tests and test utilies testing = [ + "ibc-testkit", "rand", "proptest", ] @@ -42,9 +42,10 @@ ed25519-consensus.workspace = true ethabi.workspace = true ethbridge-structs.workspace = true eyre.workspace = true -ibc = { version = "0.47.0", default-features = false, features = ["serde"]} -ibc-derive = { version = "0.3.0"} -ibc-proto = {version = "0.37.1", default-features = false} +ibc.workspace = true +ibc-derive.workspace = true +ibc-proto.workspace = true +ibc-testkit = {workspace = true, optional = true} ics23.workspace = true impl-num-traits = "0.1.2" index-set.workspace = true diff --git a/core/src/ledger/ibc/context/client.rs b/core/src/ledger/ibc/context/client.rs index 5c771a0712..0000432c76 100644 --- a/core/src/ledger/ibc/context/client.rs +++ b/core/src/ledger/ibc/context/client.rs @@ -1,37 +1,35 @@ //! AnyClientState and AnyConsensusState for IBC context use ibc_derive::ConsensusState; +#[cfg(feature = "testing")] +use ibc_testkit::testapp::ibc::clients::mock::client_state::MockClientContext; +#[cfg(feature = "testing")] +use ibc_testkit::testapp::ibc::clients::mock::client_state::MockClientState; +#[cfg(feature = "testing")] +use ibc_testkit::testapp::ibc::clients::mock::consensus_state::MockConsensusState; use prost::Message; -use crate::ibc::clients::ics07_tendermint::client_state::ClientState as TmClientState; -use crate::ibc::clients::ics07_tendermint::consensus_state::ConsensusState as TmConsensusState; -use crate::ibc::clients::ics07_tendermint::{ +use crate::ibc::clients::tendermint::client_state::ClientState as TmClientState; +use crate::ibc::clients::tendermint::consensus_state::ConsensusState as TmConsensusState; +use crate::ibc::clients::tendermint::context::{ CommonContext, ExecutionContext as TmExecutionContext, ValidationContext as TmValidationContext, }; -use crate::ibc::core::ics02_client::client_state::{ - ClientStateCommon, ClientStateExecution, ClientStateValidation, Status, - UpdateKind, +use crate::ibc::core::client::context::client_state::{ + ClientStateCommon, ClientStateExecution, ClientStateValidation, }; -use crate::ibc::core::ics02_client::client_type::ClientType; -use crate::ibc::core::ics02_client::error::ClientError; -use crate::ibc::core::ics02_client::{ +use crate::ibc::core::client::context::{ ClientExecutionContext, ClientValidationContext, }; -use crate::ibc::core::ics23_commitment::commitment::{ +use crate::ibc::core::client::types::error::ClientError; +use crate::ibc::core::client::types::{Height, Status, UpdateKind}; +use crate::ibc::core::commitment_types::commitment::{ CommitmentPrefix, CommitmentProofBytes, CommitmentRoot, }; -use crate::ibc::core::ics24_host::identifier::ClientId; -use crate::ibc::core::ics24_host::path::Path; -use crate::ibc::core::ExecutionContext; -#[cfg(feature = "ibc-mocks")] -use crate::ibc::mock::client_state::MockClientContext; -#[cfg(feature = "ibc-mocks")] -use crate::ibc::mock::client_state::MockClientState; -#[cfg(feature = "ibc-mocks")] -use crate::ibc::mock::consensus_state::MockConsensusState; -use crate::ibc::Height; -use crate::ibc_proto::google::protobuf::Any; +use crate::ibc::core::host::types::identifiers::{ClientId, ClientType}; +use crate::ibc::core::host::types::path::Path; +use crate::ibc::core::host::ExecutionContext; +use crate::ibc::primitives::proto::Any; // TODO: #[derive(ClientState)] doesn't support contexts with contexts generic // for now @@ -41,7 +39,7 @@ pub enum AnyClientState { /// Tendermint client state Tendermint(TmClientState), - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] /// Mock client state for testing Mock(MockClientState), } @@ -52,7 +50,7 @@ impl From for AnyClientState { } } -#[cfg(feature = "ibc-mocks")] +#[cfg(feature = "testing")] impl From for AnyClientState { fn from(cs: MockClientState) -> Self { Self::Mock(cs) @@ -63,7 +61,7 @@ impl From for Any { fn from(client_state: AnyClientState) -> Self { match client_state { AnyClientState::Tendermint(cs) => cs.into(), - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] AnyClientState::Mock(cs) => cs.into(), } } @@ -73,7 +71,7 @@ impl TryFrom for AnyClientState { type Error = ClientError; fn try_from(client_state: Any) -> Result { - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] if let Ok(cs) = MockClientState::try_from(client_state.clone()) { return Ok(cs.into()); } @@ -93,7 +91,7 @@ pub enum AnyConsensusState { /// Tendermint consensus state Tendermint(TmConsensusState), - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] /// Mock consensus state for testing Mock(MockConsensusState), } @@ -104,7 +102,7 @@ impl From for AnyConsensusState { } } -#[cfg(feature = "ibc-mocks")] +#[cfg(feature = "testing")] impl From for AnyConsensusState { fn from(cs: MockConsensusState) -> Self { Self::Mock(cs) @@ -117,7 +115,7 @@ impl TryFrom for TmConsensusState { fn try_from(any: AnyConsensusState) -> Result { match any { AnyConsensusState::Tendermint(cs) => Ok(cs), - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] _ => Err(ClientError::UnknownConsensusStateType { consensus_state_type: "Only Tendermint client state type is \ supported" @@ -127,7 +125,7 @@ impl TryFrom for TmConsensusState { } } -#[cfg(feature = "ibc-mocks")] +#[cfg(feature = "testing")] impl TryFrom for MockConsensusState { type Error = ClientError; @@ -146,7 +144,7 @@ impl TryFrom for AnyConsensusState { type Error = ClientError; fn try_from(consensus_state: Any) -> Result { - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] if let Ok(cs) = MockConsensusState::try_from(consensus_state.clone()) { return Ok(cs.into()); } @@ -179,7 +177,7 @@ impl ClientStateCommon for AnyClientState { AnyClientState::Tendermint(cs) => { cs.verify_consensus_state(consensus_state) } - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] AnyClientState::Mock(cs) => { cs.verify_consensus_state(consensus_state) } @@ -189,7 +187,7 @@ impl ClientStateCommon for AnyClientState { fn client_type(&self) -> ClientType { match self { AnyClientState::Tendermint(cs) => cs.client_type(), - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] AnyClientState::Mock(cs) => cs.client_type(), } } @@ -197,7 +195,7 @@ impl ClientStateCommon for AnyClientState { fn latest_height(&self) -> Height { match self { AnyClientState::Tendermint(cs) => cs.latest_height(), - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] AnyClientState::Mock(cs) => cs.latest_height(), } } @@ -210,7 +208,7 @@ impl ClientStateCommon for AnyClientState { AnyClientState::Tendermint(cs) => { cs.validate_proof_height(proof_height) } - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] AnyClientState::Mock(cs) => cs.validate_proof_height(proof_height), } } @@ -231,7 +229,7 @@ impl ClientStateCommon for AnyClientState { proof_upgrade_consensus_state, root, ), - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] AnyClientState::Mock(cs) => cs.verify_upgrade_client( upgraded_client_state, upgraded_consensus_state, @@ -254,7 +252,7 @@ impl ClientStateCommon for AnyClientState { AnyClientState::Tendermint(cs) => { cs.verify_membership(prefix, proof, root, path, value) } - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] AnyClientState::Mock(cs) => { cs.verify_membership(prefix, proof, root, path, value) } @@ -272,7 +270,7 @@ impl ClientStateCommon for AnyClientState { AnyClientState::Tendermint(cs) => { cs.verify_non_membership(prefix, proof, root, path) } - #[cfg(feature = "ibc-mocks")] + #[cfg(feature = "testing")] AnyClientState::Mock(cs) => { cs.verify_non_membership(prefix, proof, root, path) } @@ -280,7 +278,7 @@ impl ClientStateCommon for AnyClientState { } } -#[cfg(not(feature = "ibc-mocks"))] +#[cfg(not(feature = "testing"))] impl ClientStateValidation for AnyClientState where V: ClientValidationContext + TmValidationContext, @@ -331,7 +329,7 @@ where } } -#[cfg(feature = "ibc-mocks")] +#[cfg(feature = "testing")] impl ClientStateValidation for AnyClientState where V: ClientValidationContext + TmValidationContext + MockClientContext, @@ -400,7 +398,7 @@ where } } -#[cfg(not(feature = "ibc-mocks"))] +#[cfg(not(feature = "testing"))] impl ClientStateExecution for AnyClientState where E: ExecutionContext + TmExecutionContext, @@ -468,7 +466,7 @@ where } } -#[cfg(feature = "ibc-mocks")] +#[cfg(feature = "testing")] impl ClientStateExecution for AnyClientState where E: ExecutionContext + TmExecutionContext + MockClientContext, diff --git a/core/src/ledger/ibc/context/common.rs b/core/src/ledger/ibc/context/common.rs index d823b005d7..e8245babdd 100644 --- a/core/src/ledger/ibc/context/common.rs +++ b/core/src/ledger/ibc/context/common.rs @@ -7,31 +7,30 @@ use sha2::Digest; use super::client::{AnyClientState, AnyConsensusState}; use super::storage::IbcStorageContext; -use crate::ibc::clients::ics07_tendermint::consensus_state::ConsensusState as TmConsensusState; -use crate::ibc::core::ics02_client::consensus_state::ConsensusState; -use crate::ibc::core::ics02_client::error::ClientError; -use crate::ibc::core::ics02_client::height::Height; -use crate::ibc::core::ics03_connection::connection::ConnectionEnd; -use crate::ibc::core::ics03_connection::error::ConnectionError; -use crate::ibc::core::ics04_channel::channel::ChannelEnd; -use crate::ibc::core::ics04_channel::commitment::{ +use crate::ibc::clients::tendermint::consensus_state::ConsensusState as TmConsensusState; +use crate::ibc::clients::tendermint::types::ConsensusState as TmConsensusStateType; +use crate::ibc::core::channel::types::channel::ChannelEnd; +use crate::ibc::core::channel::types::commitment::{ AcknowledgementCommitment, PacketCommitment, }; -use crate::ibc::core::ics04_channel::error::{ChannelError, PacketError}; -use crate::ibc::core::ics04_channel::packet::{Receipt, Sequence}; -use crate::ibc::core::ics04_channel::timeout::TimeoutHeight; -use crate::ibc::core::ics24_host::identifier::{ - ChannelId, ClientId, ConnectionId, PortId, +use crate::ibc::core::channel::types::error::{ChannelError, PacketError}; +use crate::ibc::core::channel::types::packet::Receipt; +use crate::ibc::core::channel::types::timeout::TimeoutHeight; +use crate::ibc::core::client::context::consensus_state::ConsensusState; +use crate::ibc::core::client::types::error::ClientError; +use crate::ibc::core::client::types::Height; +use crate::ibc::core::connection::types::error::ConnectionError; +use crate::ibc::core::connection::types::ConnectionEnd; +use crate::ibc::core::handler::types::error::ContextError; +use crate::ibc::core::host::types::identifiers::{ + ChannelId, ClientId, ConnectionId, PortId, Sequence, }; -use crate::ibc::core::timestamp::Timestamp; -use crate::ibc::core::ContextError; -use crate::ibc_proto::google::protobuf::Any; -use crate::ibc_proto::protobuf::Protobuf; +use crate::ibc::primitives::proto::{Any, Protobuf}; +use crate::ibc::primitives::Timestamp; use crate::ledger::ibc::storage; use crate::ledger::parameters::storage::get_max_expected_time_per_block_key; use crate::ledger::storage_api; use crate::tendermint::Time as TmTime; -use crate::tendermint_proto::Protobuf as TmProtobuf; use crate::types::storage::{BlockHeight, Key}; use crate::types::time::DurationSecs; @@ -292,8 +291,12 @@ pub trait IbcCommonContext: IbcStorageContext { .next_validators_hash .try_into() .expect("The hash should be converted"); - let consensus_state = - TmConsensusState::new(commitment_root, time, next_validators_hash); + let consensus_state: TmConsensusState = TmConsensusStateType::new( + commitment_root, + time, + next_validators_hash, + ) + .into(); Ok(consensus_state.into()) } diff --git a/core/src/ledger/ibc/context/execution.rs b/core/src/ledger/ibc/context/execution.rs index 893cd67702..bdebb242ef 100644 --- a/core/src/ledger/ibc/context/execution.rs +++ b/core/src/ledger/ibc/context/execution.rs @@ -3,23 +3,26 @@ use super::client::{AnyClientState, AnyConsensusState}; use super::common::IbcCommonContext; use super::IbcContext; -use crate::ibc::core::events::IbcEvent; -use crate::ibc::core::ics02_client::ClientExecutionContext; -use crate::ibc::core::ics03_connection::connection::ConnectionEnd; -use crate::ibc::core::ics04_channel::channel::ChannelEnd; -use crate::ibc::core::ics04_channel::commitment::{ +use crate::ibc::core::channel::types::channel::ChannelEnd; +use crate::ibc::core::channel::types::commitment::{ AcknowledgementCommitment, PacketCommitment, }; -use crate::ibc::core::ics04_channel::packet::{Receipt, Sequence}; -use crate::ibc::core::ics24_host::identifier::{ClientId, ConnectionId}; -use crate::ibc::core::ics24_host::path::{ +use crate::ibc::core::channel::types::packet::Receipt; +use crate::ibc::core::client::context::ClientExecutionContext; +use crate::ibc::core::client::types::Height; +use crate::ibc::core::connection::types::ConnectionEnd; +use crate::ibc::core::handler::types::error::ContextError; +use crate::ibc::core::handler::types::events::IbcEvent; +use crate::ibc::core::host::types::identifiers::{ + ClientId, ConnectionId, Sequence, +}; +use crate::ibc::core::host::types::path::{ AckPath, ChannelEndPath, ClientConnectionPath, ClientConsensusStatePath, ClientStatePath, CommitmentPath, ConnectionPath, ReceiptPath, SeqAckPath, SeqRecvPath, SeqSendPath, }; -use crate::ibc::core::timestamp::Timestamp; -use crate::ibc::core::{ContextError, ExecutionContext}; -use crate::ibc::Height; +use crate::ibc::core::host::ExecutionContext; +use crate::ibc::primitives::Timestamp; use crate::ledger::ibc::storage; impl ClientExecutionContext for IbcContext @@ -47,8 +50,8 @@ where ) -> Result<(), ContextError> { let client_id = consensus_state_path.client_id; let height = Height::new( - consensus_state_path.epoch, - consensus_state_path.height, + consensus_state_path.revision_number, + consensus_state_path.revision_height, )?; self.inner.borrow_mut().store_consensus_state( &client_id, @@ -63,8 +66,8 @@ where ) -> Result<(), ContextError> { let client_id = consensus_state_path.client_id; let height = Height::new( - consensus_state_path.epoch, - consensus_state_path.height, + consensus_state_path.revision_number, + consensus_state_path.revision_height, )?; self.inner .borrow_mut() diff --git a/core/src/ledger/ibc/context/mod.rs b/core/src/ledger/ibc/context/mod.rs index b57819eec1..b661bf2f09 100644 --- a/core/src/ledger/ibc/context/mod.rs +++ b/core/src/ledger/ibc/context/mod.rs @@ -14,8 +14,8 @@ use std::fmt::Debug; use std::rc::Rc; use std::time::Duration; -use crate::ibc::core::ics23_commitment::specs::ProofSpecs; -use crate::ibc::core::ics24_host::identifier::ChainId as IbcChainId; +use crate::ibc::core::commitment_types::specs::ProofSpecs; +use crate::ibc::core::host::types::identifiers::ChainId as IbcChainId; /// IBC context to handle IBC-related data #[derive(Debug)] @@ -58,7 +58,7 @@ pub struct ValidationParams { impl Default for ValidationParams { fn default() -> Self { Self { - chain_id: IbcChainId::new("non-init-chain", 0) + chain_id: IbcChainId::new("non-init-chain") .expect("Convert the default chain ID shouldn't fail"), proof_specs: ProofSpecs::default(), unbonding_period: Duration::default(), diff --git a/core/src/ledger/ibc/context/router.rs b/core/src/ledger/ibc/context/router.rs index daba314a5d..cc9abca1fc 100644 --- a/core/src/ledger/ibc/context/router.rs +++ b/core/src/ledger/ibc/context/router.rs @@ -4,8 +4,10 @@ use std::collections::HashMap; use std::rc::Rc; use super::super::ModuleWrapper; -use crate::ibc::core::ics24_host::identifier::PortId; -use crate::ibc::core::router::{Module, ModuleId, Router}; +use crate::ibc::core::host::types::identifiers::PortId; +use crate::ibc::core::router::module::Module; +use crate::ibc::core::router::router::Router; +use crate::ibc::core::router::types::module::ModuleId; /// IBC router #[derive(Debug, Default)] diff --git a/core/src/ledger/ibc/context/token_transfer.rs b/core/src/ledger/ibc/context/token_transfer.rs index 4c41b8c956..c358049bc2 100644 --- a/core/src/ledger/ibc/context/token_transfer.rs +++ b/core/src/ledger/ibc/context/token_transfer.rs @@ -4,15 +4,14 @@ use std::cell::RefCell; use std::rc::Rc; use super::common::IbcCommonContext; -use crate::ibc::applications::transfer::coin::PrefixedCoin; -use crate::ibc::applications::transfer::context::{ +use crate::ibc::apps::transfer::context::{ TokenTransferExecutionContext, TokenTransferValidationContext, }; -use crate::ibc::applications::transfer::denom::PrefixedDenom; -use crate::ibc::applications::transfer::error::TokenTransferError; -use crate::ibc::core::ics04_channel::error::ChannelError; -use crate::ibc::core::ics24_host::identifier::{ChannelId, PortId}; -use crate::ibc::core::ContextError; +use crate::ibc::apps::transfer::types::error::TokenTransferError; +use crate::ibc::apps::transfer::types::{PrefixedCoin, PrefixedDenom}; +use crate::ibc::core::channel::types::error::ChannelError; +use crate::ibc::core::handler::types::error::ContextError; +use crate::ibc::core::host::types::identifiers::{ChannelId, PortId}; use crate::ledger::ibc::storage; use crate::ledger::storage_api::token::read_denom; use crate::types::address::{Address, InternalAddress}; diff --git a/core/src/ledger/ibc/context/transfer_mod.rs b/core/src/ledger/ibc/context/transfer_mod.rs index b3951e24de..5bc18b35c3 100644 --- a/core/src/ledger/ibc/context/transfer_mod.rs +++ b/core/src/ledger/ibc/context/transfer_mod.rs @@ -6,7 +6,7 @@ use std::rc::Rc; use super::common::IbcCommonContext; use super::token_transfer::TokenTransferContext; -use crate::ibc::applications::transfer::context::{ +use crate::ibc::apps::transfer::module::{ on_acknowledgement_packet_execute, on_acknowledgement_packet_validate, on_chan_close_confirm_execute, on_chan_close_confirm_validate, on_chan_close_init_execute, on_chan_close_init_validate, @@ -17,18 +17,19 @@ use crate::ibc::applications::transfer::context::{ on_recv_packet_execute, on_timeout_packet_execute, on_timeout_packet_validate, }; -use crate::ibc::applications::transfer::error::TokenTransferError; -use crate::ibc::applications::transfer::MODULE_ID_STR; -use crate::ibc::core::ics04_channel::acknowledgement::Acknowledgement; -use crate::ibc::core::ics04_channel::channel::{Counterparty, Order}; -use crate::ibc::core::ics04_channel::error::{ChannelError, PacketError}; -use crate::ibc::core::ics04_channel::packet::Packet; -use crate::ibc::core::ics04_channel::Version; -use crate::ibc::core::ics24_host::identifier::{ +use crate::ibc::apps::transfer::types::error::TokenTransferError; +use crate::ibc::apps::transfer::types::MODULE_ID_STR; +use crate::ibc::core::channel::types::acknowledgement::Acknowledgement; +use crate::ibc::core::channel::types::channel::{Counterparty, Order}; +use crate::ibc::core::channel::types::error::{ChannelError, PacketError}; +use crate::ibc::core::channel::types::packet::Packet; +use crate::ibc::core::channel::types::Version; +use crate::ibc::core::host::types::identifiers::{ ChannelId, ConnectionId, PortId, }; -use crate::ibc::core::router::{Module, ModuleExtras, ModuleId}; -use crate::ibc::Signer; +use crate::ibc::core::router::module::Module; +use crate::ibc::core::router::types::module::{ModuleExtras, ModuleId}; +use crate::ibc::primitives::Signer; /// IBC module wrapper for getting the reference of the module pub trait ModuleWrapper: Module { @@ -331,8 +332,8 @@ fn into_packet_error(error: TokenTransferError) -> PacketError { #[cfg(any(test, feature = "testing"))] pub mod testing { use super::*; - use crate::ibc::applications::transfer::ack_success_b64; - use crate::ibc::core::ics04_channel::acknowledgement::AcknowledgementStatus; + use crate::ibc::apps::transfer::types::ack_success_b64; + use crate::ibc::core::channel::types::acknowledgement::AcknowledgementStatus; /// Dummy IBC module for token transfer #[derive(Debug)] diff --git a/core/src/ledger/ibc/context/validation.rs b/core/src/ledger/ibc/context/validation.rs index ffc0585c8c..8ecd55fe0b 100644 --- a/core/src/ledger/ibc/context/validation.rs +++ b/core/src/ledger/ibc/context/validation.rs @@ -1,35 +1,37 @@ //! ValidationContext implementation for IBC +#[cfg(feature = "testing")] +use ibc_testkit::testapp::ibc::clients::mock::client_state::MockClientState; + use super::client::{AnyClientState, AnyConsensusState}; use super::common::IbcCommonContext; use super::IbcContext; -use crate::ibc::clients::ics07_tendermint::{ +use crate::ibc::clients::tendermint::context::{ CommonContext as TmCommonContext, ValidationContext as TmValidationContext, }; -use crate::ibc::core::ics02_client::error::ClientError; -use crate::ibc::core::ics02_client::ClientValidationContext; -use crate::ibc::core::ics03_connection::connection::ConnectionEnd; -use crate::ibc::core::ics04_channel::channel::ChannelEnd; -use crate::ibc::core::ics04_channel::commitment::{ +use crate::ibc::core::channel::types::channel::ChannelEnd; +use crate::ibc::core::channel::types::commitment::{ AcknowledgementCommitment, PacketCommitment, }; -use crate::ibc::core::ics04_channel::packet::{Receipt, Sequence}; -use crate::ibc::core::ics23_commitment::commitment::CommitmentPrefix; -use crate::ibc::core::ics23_commitment::specs::ProofSpecs; -use crate::ibc::core::ics24_host::identifier::{ - ChainId, ClientId, ConnectionId, +use crate::ibc::core::channel::types::packet::Receipt; +use crate::ibc::core::client::context::ClientValidationContext; +use crate::ibc::core::client::types::error::ClientError; +use crate::ibc::core::client::types::Height; +use crate::ibc::core::commitment_types::commitment::CommitmentPrefix; +use crate::ibc::core::commitment_types::specs::ProofSpecs; +use crate::ibc::core::connection::types::ConnectionEnd; +use crate::ibc::core::handler::types::error::ContextError; +use crate::ibc::core::host::types::identifiers::{ + ChainId, ClientId, ConnectionId, Sequence, }; -use crate::ibc::core::ics24_host::path::{ +use crate::ibc::core::host::types::path::{ AckPath, ChannelEndPath, ClientConsensusStatePath, CommitmentPath, ReceiptPath, SeqAckPath, SeqRecvPath, SeqSendPath, }; -use crate::ibc::core::timestamp::Timestamp; -use crate::ibc::core::{ContextError, ValidationContext}; -use crate::ibc::hosts::tendermint::ValidateSelfClientContext; -#[cfg(any(feature = "ibc-mocks-abcipp", feature = "ibc-mocks"))] -use crate::ibc::mock::client_state::MockClientState; -use crate::ibc::{Height, Signer}; -use crate::ibc_proto::google::protobuf::Any; +use crate::ibc::core::host::ValidationContext; +use crate::ibc::cosmos_host::ValidateSelfClientContext; +use crate::ibc::primitives::proto::Any; +use crate::ibc::primitives::{Signer, Timestamp}; use crate::ledger::ibc::storage; const COMMITMENT_PREFIX: &[u8] = b"ibc"; @@ -85,9 +87,9 @@ where } } -#[cfg(feature = "ibc-mocks")] -use crate::ibc::mock::client_state::MockClientContext; -#[cfg(feature = "ibc-mocks")] +#[cfg(feature = "testing")] +use ibc_testkit::testapp::ibc::clients::mock::client_state::MockClientContext; +#[cfg(feature = "testing")] impl MockClientContext for IbcContext where C: IbcCommonContext, @@ -164,8 +166,8 @@ where client_cons_state_path: &ClientConsensusStatePath, ) -> Result { let height = Height::new( - client_cons_state_path.epoch, - client_cons_state_path.height, + client_cons_state_path.revision_number, + client_cons_state_path.revision_height, )?; self.inner .borrow() @@ -205,7 +207,7 @@ where &self, counterparty_client_state: Any, ) -> Result<(), ContextError> { - #[cfg(any(feature = "ibc-mocks-abcipp", feature = "ibc-mocks"))] + #[cfg(feature = "testing")] { if MockClientState::try_from(counterparty_client_state.clone()) .is_ok() diff --git a/core/src/ledger/ibc/mod.rs b/core/src/ledger/ibc/mod.rs index 2a4919100e..808ed013af 100644 --- a/core/src/ledger/ibc/mod.rs +++ b/core/src/ledger/ibc/mod.rs @@ -18,19 +18,23 @@ pub use context::ValidationParams; use prost::Message; use thiserror::Error; -use crate::ibc::applications::transfer::error::TokenTransferError; -use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; -use crate::ibc::applications::transfer::{ - is_receiver_chain_source, send_transfer_execute, send_transfer_validate, - PrefixedDenom, TracePrefix, +use crate::ibc::apps::transfer::handler::{ + send_transfer_execute, send_transfer_validate, }; -use crate::ibc::core::ics04_channel::msgs::PacketMsg; -use crate::ibc::core::ics24_host::identifier::{ - ChannelId, IdentifierError, PortId, +use crate::ibc::apps::transfer::types::error::TokenTransferError; +use crate::ibc::apps::transfer::types::msgs::transfer::MsgTransfer; +use crate::ibc::apps::transfer::types::{ + is_receiver_chain_source, PrefixedDenom, TracePrefix, }; -use crate::ibc::core::router::ModuleId; -use crate::ibc::core::{execute, validate, MsgEnvelope, RouterError}; -use crate::ibc_proto::google::protobuf::Any; +use crate::ibc::core::channel::types::msgs::PacketMsg; +use crate::ibc::core::entrypoint::{execute, validate}; +use crate::ibc::core::handler::types::error::ContextError; +use crate::ibc::core::handler::types::msgs::MsgEnvelope; +use crate::ibc::core::host::types::error::IdentifierError; +use crate::ibc::core::host::types::identifiers::{ChannelId, PortId}; +use crate::ibc::core::router::types::error::RouterError; +use crate::ibc::core::router::types::module::ModuleId; +use crate::ibc::primitives::proto::Any; use crate::types::address::{Address, MASP}; use crate::types::ibc::{ get_shielded_transfer, is_ibc_denom, EVENT_TYPE_DENOM_TRACE, @@ -45,14 +49,12 @@ pub enum Error { DecodingData(prost::DecodeError), #[error("Decoding message error: {0}")] DecodingMessage(RouterError), - #[error("IBC storage error: {0}")] - IbcStorage(storage::Error), #[error("IBC execution error: {0}")] - Execution(RouterError), + Execution(ContextError), #[error("IBC token transfer error: {0}")] TokenTransfer(TokenTransferError), #[error("IBC validation error: {0}")] - Validation(RouterError), + Validation(ContextError), #[error("IBC module doesn't exist")] NoModule, #[error("Denom error: {0}")] @@ -114,8 +116,8 @@ where .map_err(Error::TokenTransfer) } Err(_) => { - let envelope = - MsgEnvelope::try_from(any_msg).map_err(Error::Execution)?; + let envelope = MsgEnvelope::try_from(any_msg) + .map_err(Error::DecodingMessage)?; execute(&mut self.ctx, &mut self.router, envelope.clone()) .map_err(Error::Execution)?; // For receiving the token to a shielded address @@ -230,7 +232,7 @@ where } Err(_) => { let envelope = MsgEnvelope::try_from(any_msg) - .map_err(Error::Validation)?; + .map_err(Error::DecodingMessage)?; validate(&self.ctx, &self.router, envelope) .map_err(Error::Validation) } diff --git a/core/src/ledger/ibc/storage.rs b/core/src/ledger/ibc/storage.rs index dae7d8d0d2..eeaecd2efa 100644 --- a/core/src/ledger/ibc/storage.rs +++ b/core/src/ledger/ibc/storage.rs @@ -5,12 +5,11 @@ use std::str::FromStr; use sha2::{Digest, Sha256}; use thiserror::Error; -use crate::ibc::core::ics02_client::height::Height; -use crate::ibc::core::ics04_channel::packet::Sequence; -use crate::ibc::core::ics24_host::identifier::{ - ChannelId, ClientId, ConnectionId, PortId, +use crate::ibc::core::client::types::Height; +use crate::ibc::core::host::types::identifiers::{ + ChannelId, ClientId, ConnectionId, PortId, Sequence, }; -use crate::ibc::core::ics24_host::path::{ +use crate::ibc::core::host::types::path::{ AckPath, ChannelEndPath, ClientConnectionPath, ClientConsensusStatePath, ClientStatePath, CommitmentPath, ConnectionPath, Path, PortPath, ReceiptPath, SeqAckPath, SeqRecvPath, SeqSendPath, @@ -81,8 +80,8 @@ pub fn client_state_key(client_id: &ClientId) -> Key { pub fn consensus_state_key(client_id: &ClientId, height: Height) -> Key { let path = Path::ClientConsensusState(ClientConsensusStatePath { client_id: client_id.clone(), - epoch: height.revision_number(), - height: height.revision_height(), + revision_number: height.revision_number(), + revision_height: height.revision_height(), }); ibc_key(path.to_string()) .expect("Creating a key for the consensus state shouldn't fail") @@ -92,8 +91,8 @@ pub fn consensus_state_key(client_id: &ClientId, height: Height) -> Key { pub fn consensus_state_prefix(client_id: &ClientId) -> Key { let path = Path::ClientConsensusState(ClientConsensusStatePath { client_id: client_id.clone(), - epoch: 0, - height: 0, + revision_number: 0, + revision_height: 0, }); let suffix = "/0-0".to_string(); let path = path.to_string(); diff --git a/core/src/types/address.rs b/core/src/types/address.rs index 2543fc7f54..b444ef756b 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -14,7 +14,7 @@ use data_encoding::HEXUPPER; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; -use crate::ibc::Signer; +use crate::ibc::primitives::Signer; use crate::impl_display_and_from_str_via_format; use crate::types::ethereum_events::EthAddress; use crate::types::ibc::IbcTokenHash; diff --git a/core/src/types/ibc.rs b/core/src/types/ibc.rs index 9490f1efdc..2f04e11709 100644 --- a/core/src/types/ibc.rs +++ b/core/src/types/ibc.rs @@ -11,8 +11,8 @@ use serde::{Deserialize, Serialize}; use thiserror::Error; use super::address::HASH_LEN; -use crate::ibc::applications::transfer::{Memo, PrefixedDenom, TracePath}; -use crate::ibc::core::events::{ +use crate::ibc::apps::transfer::types::{Memo, PrefixedDenom, TracePath}; +use crate::ibc::core::handler::types::events::{ Error as IbcEventError, IbcEvent as RawIbcEvent, }; use crate::tendermint::abci::Event as AbciEvent; diff --git a/core/src/types/token.rs b/core/src/types/token.rs index 5c319b7da6..2becc07151 100644 --- a/core/src/types/token.rs +++ b/core/src/types/token.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; use thiserror::Error; use super::dec::POS_DECIMAL_PRECISION; -use crate::ibc::applications::transfer::Amount as IbcAmount; +use crate::ibc::apps::transfer::types::Amount as IbcAmount; use crate::ledger::storage as ledger_storage; use crate::ledger::storage_api::token::read_denom; use crate::ledger::storage_api::{self, StorageRead, StorageWrite}; diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 713f99e035..e1a36a2d09 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -41,10 +41,6 @@ async-client = [ "async-trait", ] -ibc-mocks = [ - "namada_core/ibc-mocks", -] - # for integration tests and test utilies testing = [ "namada_core/testing", diff --git a/sdk/src/args.rs b/sdk/src/args.rs index 3359c08ec4..f80256b6c5 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -22,7 +22,7 @@ use serde::{Deserialize, Serialize}; use zeroize::Zeroizing; use crate::eth_bridge::bridge_pool; -use crate::ibc::core::ics24_host::identifier::{ChannelId, PortId}; +use crate::ibc::core::host::types::identifiers::{ChannelId, PortId}; use crate::signing::SigningTxData; use crate::{rpc, tx, Namada}; diff --git a/sdk/src/events/log/dumb_queries.rs b/sdk/src/events/log/dumb_queries.rs index 44988fb0dc..8a639b5a1b 100644 --- a/sdk/src/events/log/dumb_queries.rs +++ b/sdk/src/events/log/dumb_queries.rs @@ -12,9 +12,10 @@ use namada_core::types::hash::Hash; use namada_core::types::storage::BlockHeight; use crate::events::{Event, EventType}; -use crate::ibc::core::ics04_channel::packet::Sequence; -use crate::ibc::core::ics24_host::identifier::{ChannelId, ClientId, PortId}; -use crate::ibc::Height as IbcHeight; +use crate::ibc::core::client::types::Height as IbcHeight; +use crate::ibc::core::host::types::identifiers::{ + ChannelId, ClientId, PortId, Sequence, +}; /// A [`QueryMatcher`] verifies if a Namada event matches a /// given Tendermint query. @@ -65,8 +66,9 @@ impl QueryMatcher { client_id: ClientId, consensus_height: BlockHeight, ) -> Self { - use crate::ibc::core::ics02_client::events::{ + use crate::ibc::core::client::types::events::{ CLIENT_ID_ATTRIBUTE_KEY, CONSENSUS_HEIGHTS_ATTRIBUTE_KEY, + UPDATE_CLIENT_EVENT, }; let mut attributes = HashMap::new(); @@ -79,7 +81,7 @@ impl QueryMatcher { .to_string(), ); Self { - event_type: EventType::Ibc("update_client".to_string()), + event_type: EventType::Ibc(UPDATE_CLIENT_EVENT.to_string()), attributes, } } diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index f5c0ae37fa..5c31194990 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -32,6 +32,7 @@ use std::path::PathBuf; use std::str::FromStr; use args::{InputAmount, SdkTypes}; +use namada_core::ibc::core::host::types::identifiers::{ChannelId, PortId}; use namada_core::types::address::Address; use namada_core::types::dec::Dec; use namada_core::types::ethereum_events::EthAddress; @@ -42,7 +43,6 @@ use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; use namada_core::types::transaction::GasLimit; use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; -use crate::ibc::core::ics24_host::identifier::{ChannelId, PortId}; use crate::io::Io; use crate::masp::{ShieldedContext, ShieldedUtils}; use crate::proto::Tx; diff --git a/sdk/src/queries/router.rs b/sdk/src/queries/router.rs index b632097738..c78c0a6fcd 100644 --- a/sdk/src/queries/router.rs +++ b/sdk/src/queries/router.rs @@ -830,7 +830,7 @@ macro_rules! router { /// You can expand the `handlers!` macro invocation with e.g.: /// ```shell -/// cargo expand ledger::queries::router::test_rpc_handlers --features "ibc-mocks, testing, wasm-runtime, tendermint-rpc" --tests --lib +/// cargo expand ledger::queries::router::test_rpc_handlers --features "testing, wasm-runtime, tendermint-rpc" --tests --lib /// ``` #[cfg(test)] mod test_rpc_handlers { @@ -959,7 +959,7 @@ mod test_rpc_handlers { /// You can expand the `router!` macro invocation with e.g.: /// ```shell -/// cargo expand ledger::queries::router::test_rpc --features "ibc-mocks, testing, wasm-runtime, tendermint-rpc" --tests --lib +/// cargo expand ledger::queries::router::test_rpc --features "testing, wasm-runtime, tendermint-rpc" --tests --lib /// ``` #[cfg(test)] mod test_rpc { diff --git a/sdk/src/queries/shell.rs b/sdk/src/queries/shell.rs index c8e907671f..23f7441cae 100644 --- a/sdk/src/queries/shell.rs +++ b/sdk/src/queries/shell.rs @@ -24,8 +24,9 @@ use namada_core::types::transaction::TxResult; use self::eth_bridge::{EthBridge, ETH_BRIDGE}; use crate::events::log::dumb_queries; use crate::events::{Event, EventType}; -use crate::ibc::core::ics04_channel::packet::Sequence; -use crate::ibc::core::ics24_host::identifier::{ChannelId, ClientId, PortId}; +use crate::ibc::core::host::types::identifiers::{ + ChannelId, ClientId, PortId, Sequence, +}; use crate::queries::types::{RequestCtx, RequestQuery}; use crate::queries::{require_latest_height, EncodedResponseQuery}; use crate::tendermint::merkle::proof::ProofOps; diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index 6784be92ba..a9bdece9d9 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -41,8 +41,8 @@ use crate::core::ledger::governance::storage::vote::{ StorageProposalVote, VoteType, }; use crate::error::{EncodingError, Error, TxError}; -use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; -use crate::ibc_proto::google::protobuf::Any; +use crate::ibc::apps::transfer::types::msgs::transfer::MsgTransfer; +use crate::ibc::primitives::proto::Any; use crate::io::*; use crate::masp::make_asset_type; use crate::proto::{MaspBuilder, Section, Tx}; diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index 9378615890..dd8315bb7a 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -16,13 +16,13 @@ use masp_primitives::transaction::components::transparent::fees::{ InputView as TransparentInputView, OutputView as TransparentOutputView, }; use masp_primitives::transaction::components::I128Sum; -use namada_core::ibc::applications::transfer::msgs::transfer::MsgTransfer; -use namada_core::ibc::applications::transfer::packet::PacketData; -use namada_core::ibc::applications::transfer::PrefixedCoin; -use namada_core::ibc::core::ics04_channel::timeout::TimeoutHeight; -use namada_core::ibc::core::timestamp::Timestamp as IbcTimestamp; -use namada_core::ibc::core::Msg; -use namada_core::ibc::Height as IbcHeight; +use namada_core::ibc::apps::transfer::types::msgs::transfer::MsgTransfer; +use namada_core::ibc::apps::transfer::types::packet::PacketData; +use namada_core::ibc::apps::transfer::types::PrefixedCoin; +use namada_core::ibc::core::channel::types::timeout::TimeoutHeight; +use namada_core::ibc::core::client::types::Height as IbcHeight; +use namada_core::ibc::core::host::types::identifiers::{ChannelId, PortId}; +use namada_core::ibc::primitives::{Msg, Timestamp as IbcTimestamp}; use namada_core::ledger::governance::cli::onchain::{ DefaultProposal, OnChainProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, @@ -53,7 +53,6 @@ use namada_proof_of_stake::types::{CommissionPair, ValidatorState}; use crate::args::{self, InputAmount}; use crate::control_flow::time; use crate::error::{EncodingError, Error, QueryError, Result, TxError}; -use crate::ibc::core::ics24_host::identifier::{ChannelId, PortId}; use crate::io::Io; use crate::masp::TransferErr::Build; use crate::masp::{make_asset_type, ShieldedContext, ShieldedTransfer}; @@ -2617,8 +2616,8 @@ async fn get_ibc_src_port_channel<'a>( dest_port_id: &PortId, dest_channel_id: &ChannelId, ) -> Result<(PortId, ChannelId)> { - use crate::ibc::core::ics04_channel::channel::ChannelEnd; - use crate::ibc_proto::protobuf::Protobuf; + use crate::ibc::core::channel::types::channel::ChannelEnd; + use crate::ibc::primitives::proto::Protobuf; let channel_key = channel_key(dest_port_id, dest_channel_id); let bytes = rpc::query_storage_value_bytes( diff --git a/shared/Cargo.toml b/shared/Cargo.toml index 2d83a73498..87ae575175 100644 --- a/shared/Cargo.toml +++ b/shared/Cargo.toml @@ -53,11 +53,6 @@ http-client = [ "tendermint-rpc/http-client" ] -ibc-mocks = [ - "namada_core/ibc-mocks", - "namada_sdk/ibc-mocks", -] - # for integration tests and test utilies testing = [ "namada_core/testing", @@ -144,7 +139,7 @@ tokio = {workspace = true, default-features = false, features = ["sync"]} wasmtimer = "0.2.0" [dev-dependencies] -namada_core = {path = "../core", default-features = false, features = ["testing", "ibc-mocks"]} +namada_core = {path = "../core", default-features = false, features = ["testing"]} namada_ethereum_bridge = {path = "../ethereum_bridge", default-features = false, features = ["testing"]} namada_proof_of_stake = {path = "../proof_of_stake", default-features = false, features = ["testing"]} namada_test_utils = {path = "../test_utils"} @@ -152,6 +147,7 @@ assert_matches.workspace = true async-trait.workspace = true base58.workspace = true byte-unit.workspace = true +ibc-testkit.workspace = true k256.workspace = true pretty_assertions.workspace = true proptest.workspace = true diff --git a/shared/src/ledger/native_vp/ibc/mod.rs b/shared/src/ledger/native_vp/ibc/mod.rs index 78e1378baa..cd0a1e5680 100644 --- a/shared/src/ledger/native_vp/ibc/mod.rs +++ b/shared/src/ledger/native_vp/ibc/mod.rs @@ -22,7 +22,7 @@ use namada_core::types::storage::Key; use namada_proof_of_stake::read_pos_params; use thiserror::Error; -use crate::ibc::core::ics24_host::identifier::ChainId as IbcChainId; +use crate::ibc::core::host::types::identifiers::ChainId as IbcChainId; use crate::ledger::ibc::storage::{calc_hash, is_ibc_denom_key, is_ibc_key}; use crate::ledger::native_vp::{self, Ctx, NativeVp, VpEnv}; use crate::ledger::parameters::read_epoch_duration_parameter; @@ -313,6 +313,11 @@ mod tests { use borsh::BorshDeserialize; use borsh_ext::BorshSerializeExt; + use ibc_testkit::testapp::ibc::clients::mock::client_state::{ + client_type, MockClientState, MOCK_CLIENT_TYPE, + }; + use ibc_testkit::testapp::ibc::clients::mock::consensus_state::MockConsensusState; + use ibc_testkit::testapp::ibc::clients::mock::header::MockHeader; use namada_core::ledger::gas::TxGasMeter; use namada_core::ledger::governance::parameters::GovernanceParameters; use prost::Message; @@ -333,72 +338,64 @@ mod tests { }; use crate::core::types::address::{nam, InternalAddress}; use crate::core::types::storage::Epoch; - use crate::ibc::applications::transfer::coin::PrefixedCoin; - use crate::ibc::applications::transfer::denom::TracePrefix; - use crate::ibc::applications::transfer::events::{ + use crate::ibc::apps::transfer::types::events::{ AckEvent, DenomTraceEvent, RecvEvent, TimeoutEvent, TransferEvent, }; - use crate::ibc::applications::transfer::msgs::transfer::MsgTransfer; - use crate::ibc::applications::transfer::packet::PacketData; - use crate::ibc::applications::transfer::{ack_success_b64, VERSION}; - use crate::ibc::core::events::{ - IbcEvent as RawIbcEvent, MessageEvent, ModuleEvent, - }; - use crate::ibc::core::ics02_client::events::{CreateClient, UpdateClient}; - use crate::ibc::core::ics02_client::msgs::create_client::MsgCreateClient; - use crate::ibc::core::ics02_client::msgs::update_client::MsgUpdateClient; - use crate::ibc::core::ics03_connection::connection::{ - ConnectionEnd, Counterparty as ConnCounterparty, State as ConnState, - }; - use crate::ibc::core::ics03_connection::events::{ - OpenAck as ConnOpenAck, OpenConfirm as ConnOpenConfirm, - OpenInit as ConnOpenInit, OpenTry as ConnOpenTry, - }; - use crate::ibc::core::ics03_connection::msgs::conn_open_ack::MsgConnectionOpenAck; - use crate::ibc::core::ics03_connection::msgs::conn_open_confirm::MsgConnectionOpenConfirm; - use crate::ibc::core::ics03_connection::msgs::conn_open_init::MsgConnectionOpenInit; - use crate::ibc::core::ics03_connection::msgs::conn_open_try::MsgConnectionOpenTry; - use crate::ibc::core::ics03_connection::version::{ - get_compatible_versions, Version as ConnVersion, + use crate::ibc::apps::transfer::types::msgs::transfer::MsgTransfer; + use crate::ibc::apps::transfer::types::packet::PacketData; + use crate::ibc::apps::transfer::types::{ + ack_success_b64, PrefixedCoin, TracePrefix, VERSION, }; - use crate::ibc::core::ics04_channel::acknowledgement::{ + use crate::ibc::core::channel::types::acknowledgement::{ Acknowledgement, AcknowledgementStatus, }; - use crate::ibc::core::ics04_channel::channel::{ + use crate::ibc::core::channel::types::channel::{ ChannelEnd, Counterparty as ChanCounterparty, Order, State as ChanState, }; - use crate::ibc::core::ics04_channel::commitment::PacketCommitment; - use crate::ibc::core::ics04_channel::events::{ + use crate::ibc::core::channel::types::commitment::PacketCommitment; + use crate::ibc::core::channel::types::events::{ AcknowledgePacket, OpenAck as ChanOpenAck, OpenConfirm as ChanOpenConfirm, OpenInit as ChanOpenInit, OpenTry as ChanOpenTry, ReceivePacket, SendPacket, TimeoutPacket, WriteAcknowledgement, }; - use crate::ibc::core::ics04_channel::msgs::{ + use crate::ibc::core::channel::types::msgs::{ MsgAcknowledgement, MsgChannelOpenAck, MsgChannelOpenConfirm, MsgChannelOpenInit, MsgChannelOpenTry, MsgRecvPacket, MsgTimeout, MsgTimeoutOnClose, }; - use crate::ibc::core::ics04_channel::packet::{Packet, Sequence}; - use crate::ibc::core::ics04_channel::timeout::TimeoutHeight; - use crate::ibc::core::ics04_channel::Version as ChanVersion; - use crate::ibc::core::ics23_commitment::commitment::{ + use crate::ibc::core::channel::types::packet::Packet; + use crate::ibc::core::channel::types::timeout::TimeoutHeight; + use crate::ibc::core::channel::types::Version as ChanVersion; + use crate::ibc::core::client::types::events::{CreateClient, UpdateClient}; + use crate::ibc::core::client::types::msgs::{ + MsgCreateClient, MsgUpdateClient, + }; + use crate::ibc::core::client::types::Height; + use crate::ibc::core::commitment_types::commitment::{ CommitmentPrefix, CommitmentProofBytes, }; - use crate::ibc::core::ics24_host::identifier::{ - ChannelId, ClientId, ConnectionId, PortId, + use crate::ibc::core::connection::types::events::{ + OpenAck as ConnOpenAck, OpenConfirm as ConnOpenConfirm, + OpenInit as ConnOpenInit, OpenTry as ConnOpenTry, + }; + use crate::ibc::core::connection::types::msgs::{ + MsgConnectionOpenAck, MsgConnectionOpenConfirm, MsgConnectionOpenInit, + MsgConnectionOpenTry, }; - use crate::ibc::core::timestamp::Timestamp; - use crate::ibc::core::Msg; - use crate::ibc::mock::client_state::{ - client_type, MockClientState, MOCK_CLIENT_TYPE, + use crate::ibc::core::connection::types::version::Version as ConnVersion; + use crate::ibc::core::connection::types::{ + ConnectionEnd, Counterparty as ConnCounterparty, State as ConnState, + }; + use crate::ibc::core::handler::types::events::{ + IbcEvent as RawIbcEvent, MessageEvent, }; - use crate::ibc::mock::consensus_state::MockConsensusState; - use crate::ibc::mock::header::MockHeader; - use crate::ibc::Height; - use crate::ibc_proto::google::protobuf::Any; - use crate::ibc_proto::ibc::core::connection::v1::MsgConnectionOpenTry as RawMsgConnectionOpenTry; - use crate::ibc_proto::protobuf::Protobuf; + use crate::ibc::core::host::types::identifiers::{ + ChannelId, ClientId, ConnectionId, PortId, Sequence, + }; + use crate::ibc::core::router::types::event::ModuleEvent; + use crate::ibc::primitives::proto::{Any, Protobuf}; + use crate::ibc::primitives::{Msg, Timestamp}; use crate::ledger::gas::VpGasMeter; use crate::ledger::parameters::storage::{ get_epoch_duration_storage_key, get_max_expected_time_per_block_key, @@ -408,7 +405,6 @@ mod tests { use crate::ledger::{ibc, pos}; use crate::proto::{Code, Data, Section, Signature, Tx}; use crate::tendermint::time::Time as TmTime; - use crate::tendermint_proto::Protobuf as TmProtobuf; use crate::types::key::testing::keypair_1; use crate::types::storage::{BlockHash, BlockHeight, TxIndex}; use crate::types::time::DurationSecs; @@ -480,7 +476,7 @@ mod tests { timestamp: Timestamp::now(), }; let client_state = MockClientState::new(header); - let bytes = Protobuf::::encode_vec(&client_state); + let bytes = Protobuf::::encode_vec(client_state); wl_storage .write_log .write(&client_state_key, bytes) @@ -488,7 +484,7 @@ mod tests { // insert a mock consensus state let consensus_key = consensus_state_key(&client_id, height); let consensus_state = MockConsensusState::new(header); - let bytes = Protobuf::::encode_vec(&consensus_state); + let bytes = Protobuf::::encode_vec(consensus_state); wl_storage .write_log .write(&consensus_key, bytes) @@ -682,7 +678,7 @@ mod tests { }; // client state let client_state_key = client_state_key(&get_client_id()); - let bytes = Protobuf::::encode_vec(&client_state); + let bytes = Protobuf::::encode_vec(client_state); wl_storage .write_log .write(&client_state_key, bytes) @@ -690,7 +686,7 @@ mod tests { keys_changed.insert(client_state_key); // client consensus let consensus_key = consensus_state_key(&client_id, height); - let bytes = Protobuf::::encode_vec(&consensus_state); + let bytes = Protobuf::::encode_vec(consensus_state); wl_storage .write_log .write(&consensus_key, bytes) @@ -780,7 +776,7 @@ mod tests { // insert only client state let client_state = MockClientState::new(header); let client_state_key = client_state_key(&get_client_id()); - let bytes = Protobuf::::encode_vec(&client_state); + let bytes = Protobuf::::encode_vec(client_state); wl_storage .write_log .write(&client_state_key, bytes) @@ -866,7 +862,7 @@ mod tests { }; // client state let client_state = MockClientState::new(header); - let bytes = Protobuf::::encode_vec(&client_state); + let bytes = Protobuf::::encode_vec(client_state); wl_storage .write_log .write(&client_state_key, bytes) @@ -875,7 +871,7 @@ mod tests { // consensus state let consensus_key = consensus_state_key(&client_id, height); let consensus_state = MockConsensusState::new(header); - let bytes = Protobuf::::encode_vec(&consensus_state); + let bytes = Protobuf::::encode_vec(consensus_state); wl_storage .write_log .write(&consensus_key, bytes) @@ -913,7 +909,7 @@ mod tests { client_type(), consensus_height, vec![consensus_height], - Protobuf::::encode_vec(&header), + Protobuf::::encode_vec(header), )); let message_event = RawIbcEvent::Message(MessageEvent::Client); wl_storage @@ -1190,29 +1186,22 @@ mod tests { }; let client_state = MockClientState::new(header); let proof_height = Height::new(0, 1).unwrap(); - // Convert a message from RawMsgConnectionOpenTry - // because MsgConnectionOpenTry cannot be created directly #[allow(deprecated)] - let msg: MsgConnectionOpenTry = RawMsgConnectionOpenTry { - client_id: get_client_id().as_str().to_string(), - client_state: Some(client_state.into()), - counterparty: Some(get_conn_counterparty().into()), - delay_period: 0, - counterparty_versions: get_compatible_versions() - .iter() - .map(|v| v.clone().into()) - .collect(), - proof_init: dummy_proof().into(), - proof_height: Some(proof_height.into()), - proof_consensus: dummy_proof().into(), - consensus_height: Some(client_state.latest_height().into()), - proof_client: dummy_proof().into(), - signer: "account0".to_string(), + let msg = MsgConnectionOpenTry { + client_id_on_b: get_client_id(), + client_state_of_b_on_a: client_state.into(), + counterparty: get_conn_counterparty(), + versions_on_a: vec![ConnVersion::default()], + proofs_height_on_a: proof_height, + proof_conn_end_on_a: dummy_proof(), + proof_client_state_of_b_on_a: dummy_proof(), + proof_consensus_state_of_b_on_a: dummy_proof(), + consensus_height_of_b_on_a: client_state.latest_height(), + delay_period: Duration::from_secs(0), + signer: "account0".to_string().into(), + proof_consensus_state_of_b: Some(dummy_proof()), previous_connection_id: ConnectionId::default().to_string(), - host_consensus_state_proof: dummy_proof().into(), - } - .try_into() - .expect("invalid message"); + }; // insert a TryOpen connection let conn_id = get_connection_id(); diff --git a/tests/Cargo.toml b/tests/Cargo.toml index de9b821ac9..bfc6df073b 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -21,7 +21,7 @@ wasm-runtime = ["namada/wasm-runtime"] integration = ["namada_apps/integration"] [dependencies] -namada = {path = "../shared", features = ["testing", "ibc-mocks"]} +namada = {path = "../shared", features = ["testing"]} namada_core = {path = "../core", features = ["testing"]} namada_sdk = {path = "../sdk"} namada_test_utils = {path = "../test_utils"} @@ -34,6 +34,7 @@ concat-idents.workspace = true copy_dir = "0.1.3" derivative.workspace = true hyper = {version = "0.14.20", features = ["full"]} +ibc-testkit.workspace = true lazy_static.workspace = true num-traits.workspace = true prost.workspace = true diff --git a/tests/src/e2e/ibc_tests.rs b/tests/src/e2e/ibc_tests.rs index e1b3479d6e..7afc278e97 100644 --- a/tests/src/e2e/ibc_tests.rs +++ b/tests/src/e2e/ibc_tests.rs @@ -17,39 +17,41 @@ use std::path::PathBuf; use color_eyre::eyre::Result; use eyre::eyre; -use namada::ibc::applications::transfer::VERSION as ICS20_VERSION; -use namada::ibc::clients::ics07_tendermint::client_state::{ - AllowUpdate, ClientState as TmClientState, +use namada::ibc::apps::transfer::types::VERSION as ICS20_VERSION; +use namada::ibc::clients::tendermint::client_state::ClientState as TmClientState; +use namada::ibc::clients::tendermint::consensus_state::ConsensusState as TmConsensusState; +use namada::ibc::clients::tendermint::types::{ + AllowUpdate, ClientState as TmClientStateType, Header as IbcTmHeader, + TrustThreshold, }; -use namada::ibc::clients::ics07_tendermint::consensus_state::ConsensusState as TmConsensusState; -use namada::ibc::clients::ics07_tendermint::header::Header as IbcTmHeader; -use namada::ibc::clients::ics07_tendermint::trust_threshold::TrustThreshold; -use namada::ibc::core::ics02_client::msgs::create_client::MsgCreateClient; -use namada::ibc::core::ics02_client::msgs::update_client::MsgUpdateClient; -use namada::ibc::core::ics03_connection::connection::Counterparty as ConnCounterparty; -use namada::ibc::core::ics03_connection::msgs::conn_open_ack::MsgConnectionOpenAck; -use namada::ibc::core::ics03_connection::msgs::conn_open_confirm::MsgConnectionOpenConfirm; -use namada::ibc::core::ics03_connection::msgs::conn_open_init::MsgConnectionOpenInit; -use namada::ibc::core::ics03_connection::msgs::conn_open_try::MsgConnectionOpenTry; -use namada::ibc::core::ics03_connection::version::Version as ConnVersion; -use namada::ibc::core::ics04_channel::channel::Order as ChanOrder; -use namada::ibc::core::ics04_channel::msgs::{ +use namada::ibc::core::channel::types::channel::Order as ChanOrder; +use namada::ibc::core::channel::types::msgs::{ MsgAcknowledgement, MsgChannelOpenAck, MsgChannelOpenConfirm, MsgChannelOpenInit, MsgChannelOpenTry, MsgRecvPacket, MsgTimeout, }; -use namada::ibc::core::ics04_channel::packet::Packet; -use namada::ibc::core::ics04_channel::timeout::TimeoutHeight; -use namada::ibc::core::ics04_channel::Version as ChanVersion; -use namada::ibc::core::ics23_commitment::commitment::{ +use namada::ibc::core::channel::types::packet::Packet; +use namada::ibc::core::channel::types::timeout::TimeoutHeight; +use namada::ibc::core::channel::types::Version as ChanVersion; +use namada::ibc::core::client::context::client_state::ClientStateCommon; +use namada::ibc::core::client::types::msgs::{ + MsgCreateClient, MsgUpdateClient, +}; +use namada::ibc::core::client::types::Height; +use namada::ibc::core::commitment_types::commitment::{ CommitmentPrefix, CommitmentProofBytes, }; -use namada::ibc::core::ics23_commitment::merkle::MerkleProof; -use namada::ibc::core::ics24_host::identifier::{ +use namada::ibc::core::commitment_types::merkle::MerkleProof; +use namada::ibc::core::connection::types::msgs::{ + MsgConnectionOpenAck, MsgConnectionOpenConfirm, MsgConnectionOpenInit, + MsgConnectionOpenTry, +}; +use namada::ibc::core::connection::types::version::Version as ConnVersion; +use namada::ibc::core::connection::types::Counterparty as ConnCounterparty; +use namada::ibc::core::host::types::identifiers::{ ChainId, ChannelId, ClientId, ConnectionId, PortId, }; -use namada::ibc::core::Msg; -use namada::ibc::{Height, Signer}; -use namada::ibc_proto::google::protobuf::Any; +use namada::ibc::primitives::proto::Any; +use namada::ibc::primitives::{Msg, Signer, Timestamp}; use namada::ledger::events::EventType; use namada::ledger::ibc::storage::*; use namada::ledger::parameters::{storage as param_storage, EpochDuration}; @@ -299,7 +301,7 @@ fn setup_two_single_node_nets() -> Result<(Test, Test)> { 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 height = client_state.latest_height(); let message = MsgCreateClient { client_state: client_state.into(), consensus_state: make_consensus_state(test_b, height)?.into(), @@ -309,7 +311,7 @@ fn create_client(test_a: &Test, test_b: &Test) -> Result<(ClientId, ClientId)> { let height = query_height(test_a)?; let client_state = make_client_state(test_a, height); - let height = client_state.latest_height; + let height = client_state.latest_height(); let message = MsgCreateClient { client_state: client_state.into(), consensus_state: make_consensus_state(test_a, height)?.into(), @@ -350,7 +352,7 @@ fn make_client_state(test: &Test, height: Height) -> TmClientState { let max_clock_drift = Duration::new(60, 0); let chain_id = ChainId::from_str(test.net.chain_id.as_str()).unwrap(); - TmClientState::new( + TmClientStateType::new( chain_id, TrustThreshold::default(), Duration::from_secs(trusting_period), @@ -365,6 +367,7 @@ fn make_client_state(test: &Test, height: Height) -> TmClientState { }, ) .unwrap() + .into() } fn make_consensus_state( @@ -396,7 +399,7 @@ fn update_client_with_height( }; let client_state = TmClientState::try_from(cs) .expect("the state should be a TmClientState"); - let trusted_height = client_state.latest_height; + let trusted_height = client_state.latest_height(); update_client( src_test, @@ -496,15 +499,22 @@ fn connection_handshake( Some(conn_id_a.clone()), commitment_prefix(), ); - let msg = make_msg_conn_open_try( - client_id_b.clone(), - client_state, + #[allow(deprecated)] + let msg = MsgConnectionOpenTry { + client_id_on_b: client_id_b.clone(), + client_state_of_b_on_a: client_state.clone().into(), counterparty, - conn_proof, - client_state_proof, - consensus_proof, - height_a, - ); + versions_on_a: vec![ConnVersion::default()], + 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::default().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 @@ -518,7 +528,7 @@ fn connection_handshake( 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 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(), @@ -695,7 +705,7 @@ fn get_client_states( .expect("the state should be a TmClientState"); let client_state_proof = convert_proof(tm_proof)?; - let height = client_state.latest_height; + 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))?; @@ -1527,40 +1537,6 @@ fn signer() -> Signer { "signer".to_string().into() } -/// Helper function to make the MsgConnectionOpenTry because it has a private -/// field -fn make_msg_conn_open_try( - client_id: ClientId, - client_state: TmClientState, - counterparty: ConnCounterparty, - conn_proof: CommitmentProofBytes, - client_state_proof: CommitmentProofBytes, - consensus_proof: CommitmentProofBytes, - proofs_height: Height, -) -> MsgConnectionOpenTry { - use namada::ibc_proto::ibc::core::connection::v1::MsgConnectionOpenTry as RawMsgConnectionOpenTry; - - let consensus_height = client_state.latest_height; - #[allow(deprecated)] - RawMsgConnectionOpenTry { - client_id: client_id.as_str().to_string(), - client_state: Some(client_state.into()), - counterparty: Some(counterparty.into()), - delay_period: 0, - counterparty_versions: vec![ConnVersion::default().into()], - proof_init: conn_proof.into(), - proof_height: Some(proofs_height.into()), - proof_client: client_state_proof.into(), - proof_consensus: consensus_proof.into(), - consensus_height: Some(consensus_height.into()), - signer: "signer".to_string(), - previous_connection_id: ConnectionId::default().to_string(), - host_consensus_state_proof: vec![], - } - .try_into() - .expect("invalid message") -} - fn get_client_id_from_events(events: &Vec) -> Option { get_attribute_from_events(events, "client_id").map(|v| v.parse().unwrap()) } @@ -1600,7 +1576,16 @@ fn get_packet_from_events(events: &Vec) -> Option { if !attributes.contains_key("packet_src_port") { continue; } - let mut packet = Packet::default(); + let mut packet = Packet { + seq_on_a: 0.into(), + port_id_on_a: PortId::transfer(), + chan_id_on_a: ChannelId::default(), + port_id_on_b: PortId::transfer(), + chan_id_on_b: ChannelId::default(), + data: vec![], + timeout_height_on_b: TimeoutHeight::default(), + timeout_timestamp_on_b: Timestamp::default(), + }; for (key, val) in attributes { match key.as_str() { "packet_src_port" => packet.port_id_on_a = val.parse().unwrap(), diff --git a/tests/src/vm_host_env/ibc.rs b/tests/src/vm_host_env/ibc.rs index 3ca3705fa9..5bc58a9775 100644 --- a/tests/src/vm_host_env/ibc.rs +++ b/tests/src/vm_host_env/ibc.rs @@ -1,50 +1,51 @@ use core::time::Duration; use std::collections::HashMap; -use namada::ibc::applications::transfer::coin::PrefixedCoin; -use namada::ibc::applications::transfer::error::TokenTransferError; -use namada::ibc::applications::transfer::msgs::transfer::MsgTransfer; -use namada::ibc::applications::transfer::packet::PacketData; -use namada::ibc::applications::transfer::{ack_success_b64, VERSION}; -use namada::ibc::core::ics02_client::msgs::create_client::MsgCreateClient; -use namada::ibc::core::ics02_client::msgs::update_client::MsgUpdateClient; -use namada::ibc::core::ics02_client::msgs::upgrade_client::MsgUpgradeClient; -use namada::ibc::core::ics03_connection::connection::{ - ConnectionEnd, Counterparty as ConnCounterparty, State as ConnState, +use ibc_testkit::testapp::ibc::clients::mock::client_state::{ + client_type, MockClientState, +}; +use ibc_testkit::testapp::ibc::clients::mock::consensus_state::MockConsensusState; +use ibc_testkit::testapp::ibc::clients::mock::header::MockHeader; +use namada::ibc::apps::transfer::types::error::TokenTransferError; +use namada::ibc::apps::transfer::types::msgs::transfer::MsgTransfer; +use namada::ibc::apps::transfer::types::packet::PacketData; +use namada::ibc::apps::transfer::types::{ + ack_success_b64, PrefixedCoin, VERSION, }; -use namada::ibc::core::ics03_connection::msgs::conn_open_ack::MsgConnectionOpenAck; -use namada::ibc::core::ics03_connection::msgs::conn_open_confirm::MsgConnectionOpenConfirm; -use namada::ibc::core::ics03_connection::msgs::conn_open_init::MsgConnectionOpenInit; -use namada::ibc::core::ics03_connection::msgs::conn_open_try::MsgConnectionOpenTry; -use namada::ibc::core::ics03_connection::version::Version as ConnVersion; -use namada::ibc::core::ics04_channel::acknowledgement::{ +use namada::ibc::core::channel::types::acknowledgement::{ AcknowledgementStatus, StatusValue, }; -use namada::ibc::core::ics04_channel::channel::{ +use namada::ibc::core::channel::types::channel::{ ChannelEnd, Counterparty as ChanCounterparty, Order, State as ChanState, }; -use namada::ibc::core::ics04_channel::msgs::{ +use namada::ibc::core::channel::types::msgs::{ MsgAcknowledgement, MsgChannelCloseConfirm, MsgChannelCloseInit, MsgChannelOpenAck, MsgChannelOpenConfirm, MsgChannelOpenInit, MsgChannelOpenTry, MsgRecvPacket, MsgTimeout, MsgTimeoutOnClose, }; -pub use namada::ibc::core::ics04_channel::packet::{Packet, Sequence}; -use namada::ibc::core::ics04_channel::timeout::TimeoutHeight; -use namada::ibc::core::ics04_channel::Version as ChanVersion; -use namada::ibc::core::ics23_commitment::commitment::{ +pub use namada::ibc::core::channel::types::packet::Packet; +use namada::ibc::core::channel::types::timeout::TimeoutHeight; +use namada::ibc::core::channel::types::Version as ChanVersion; +use namada::ibc::core::client::types::msgs::{ + MsgCreateClient, MsgUpdateClient, MsgUpgradeClient, +}; +use namada::ibc::core::client::types::Height; +use namada::ibc::core::commitment_types::commitment::{ CommitmentPrefix, CommitmentProofBytes, }; -pub use namada::ibc::core::ics24_host::identifier::{ - ChannelId, ClientId, ConnectionId, PortId, +use namada::ibc::core::connection::types::msgs::{ + MsgConnectionOpenAck, MsgConnectionOpenConfirm, MsgConnectionOpenInit, + MsgConnectionOpenTry, +}; +use namada::ibc::core::connection::types::version::Version as ConnVersion; +use namada::ibc::core::connection::types::{ + ConnectionEnd, Counterparty as ConnCounterparty, State as ConnState, +}; +pub use namada::ibc::core::host::types::identifiers::{ + ChannelId, ClientId, ConnectionId, PortId, Sequence, }; -use namada::ibc::core::timestamp::Timestamp; -use namada::ibc::mock::client_state::{client_type, MockClientState}; -use namada::ibc::mock::consensus_state::MockConsensusState; -use namada::ibc::mock::header::MockHeader; -use namada::ibc::Height; -use namada::ibc_proto::google::protobuf::Any; -use namada::ibc_proto::ibc::core::connection::v1::MsgConnectionOpenTry as RawMsgConnectionOpenTry; -use namada::ibc_proto::protobuf::Protobuf; +use namada::ibc::primitives::proto::{Any, Protobuf}; +use namada::ibc::primitives::Timestamp; use namada::ledger::gas::VpGasMeter; pub use namada::ledger::ibc::storage::{ ack_key, channel_counter_key, channel_key, client_counter_key, @@ -71,7 +72,6 @@ use namada::ledger::{ibc, pos}; use namada::proof_of_stake::OwnedPosParams; use namada::proto::Tx; use namada::tendermint::time::Time as TmTime; -use namada::tendermint_proto::Protobuf as TmProtobuf; use namada::types::address::{self, Address, InternalAddress}; use namada::types::hash::Hash; use namada::types::storage::{ @@ -301,12 +301,12 @@ pub fn prepare_client() -> (ClientId, Any, HashMap>) { // client state let client_id = client_id(); let key = client_state_key(&client_id); - let bytes = Protobuf::::encode_vec(&client_state); + let bytes = Protobuf::::encode_vec(client_state); writes.insert(key, bytes); // consensus state let height = client_state.latest_height(); let key = consensus_state_key(&client_id, height); - let bytes = Protobuf::::encode_vec(&consensus_state); + let bytes = Protobuf::::encode_vec(consensus_state); writes.insert(key, bytes); // client update time let key = client_update_timestamp_key(&client_id); @@ -463,26 +463,22 @@ pub fn msg_connection_open_try( client_state: Any, ) -> MsgConnectionOpenTry { let consensus_height = Height::new(0, 1).expect("invalid height"); - // Convert a message from RawMsgConnectionOpenTry - // because MsgConnectionOpenTry cannot be created directly #[allow(deprecated)] - RawMsgConnectionOpenTry { - client_id: client_id.as_str().to_string(), + MsgConnectionOpenTry { + client_id_on_b: client_id, + client_state_of_b_on_a: client_state.into(), + counterparty: dummy_connection_counterparty(), + versions_on_a: vec![ConnVersion::default()], + proofs_height_on_a: dummy_proof_height(), + proof_conn_end_on_a: dummy_proof(), + proof_client_state_of_b_on_a: dummy_proof(), + proof_consensus_state_of_b_on_a: dummy_proof(), + consensus_height_of_b_on_a: consensus_height, + delay_period: Duration::from_secs(0), + signer: "test".to_string().into(), + proof_consensus_state_of_b: Some(dummy_proof()), previous_connection_id: ConnectionId::default().to_string(), - client_state: Some(client_state), - counterparty: Some(dummy_connection_counterparty().into()), - delay_period: 0, - counterparty_versions: vec![ConnVersion::default().into()], - proof_height: Some(dummy_proof_height().into()), - proof_init: dummy_proof().into(), - proof_client: dummy_proof().into(), - proof_consensus: dummy_proof().into(), - consensus_height: Some(consensus_height.into()), - signer: "test".to_string(), - host_consensus_state_proof: dummy_proof().into(), } - .try_into() - .expect("invalid message") } pub fn msg_connection_open_ack( diff --git a/tests/src/vm_host_env/mod.rs b/tests/src/vm_host_env/mod.rs index 25fe337ce2..2c80213eb7 100644 --- a/tests/src/vm_host_env/mod.rs +++ b/tests/src/vm_host_env/mod.rs @@ -23,7 +23,7 @@ mod tests { use borsh_ext::BorshSerializeExt; use itertools::Itertools; - use namada::ibc::core::Msg; + use namada::ibc::primitives::Msg; use namada::ledger::ibc::storage as ibc_storage; use namada::ledger::native_vp::ibc::{ get_dummy_header as tm_dummy_header, Error as IbcError, diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 66a3bb5817..9bfafd899a 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -369,7 +369,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.10.1", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "unicode-normalization", "zeroize", ] @@ -450,7 +450,7 @@ dependencies = [ "cc", "cfg-if 1.0.0", "constant_time_eq", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -594,9 +594,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ "serde", ] @@ -766,13 +766,13 @@ dependencies = [ "bincode", "bs58", "coins-core", - "digest 0.10.6", + "digest 0.10.7", "getrandom 0.2.10", "hmac 0.12.1", "k256", "lazy_static", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] @@ -789,7 +789,7 @@ dependencies = [ "once_cell", "pbkdf2 0.12.1", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] @@ -802,13 +802,13 @@ dependencies = [ "base64 0.21.0", "bech32 0.7.3", "bs58", - "digest 0.10.6", + "digest 0.10.7", "generic-array 0.14.7", "hex", "ripemd", "serde", "serde_derive", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -1206,9 +1206,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid", @@ -1286,7 +1286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" dependencies = [ "der", - "digest 0.10.6", + "digest 0.10.7", "elliptic-curve", "rfc6979", "serdect", @@ -1346,7 +1346,7 @@ checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.6", + "digest 0.10.7", "ff", "generic-array 0.14.7", "group", @@ -1461,7 +1461,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest 0.10.6", + "digest 0.10.7", "hex", "hmac 0.12.1", "pbkdf2 0.11.0", @@ -1469,7 +1469,7 @@ dependencies = [ "scrypt", "serde", "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", "uuid", @@ -1765,7 +1765,7 @@ dependencies = [ "ethers-core", "hex", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", "tracing", ] @@ -2211,7 +2211,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2328,40 +2328,353 @@ dependencies = [ [[package]] name = "ibc" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "184eb22140cb4143bbcf7ddc8fdfeb9cc058ef73a6066f8ea78162e69d3565d1" +version = "0.48.0" +dependencies = [ + "ibc-apps", + "ibc-clients", + "ibc-core", + "ibc-core-host-cosmos", + "ibc-derive 0.4.0", + "ibc-primitives", +] + +[[package]] +name = "ibc-app-transfer" +version = "0.48.0" +dependencies = [ + "ibc-app-transfer-types", + "ibc-core", + "serde-json-wasm", +] + +[[package]] +name = "ibc-app-transfer-types" +version = "0.48.0" dependencies = [ - "bytes", "derive_more", "displaydoc", - "ibc-derive", + "ibc-core", "ibc-proto", - "ics23", - "num-traits", - "parking_lot", "primitive-types", + "serde", + "uint", +] + +[[package]] +name = "ibc-apps" +version = "0.48.0" +dependencies = [ + "ibc-app-transfer", +] + +[[package]] +name = "ibc-client-tendermint" +version = "0.48.0" +dependencies = [ + "ibc-client-tendermint-types", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", + "serde", + "tendermint", + "tendermint-light-client-verifier", +] + +[[package]] +name = "ibc-client-tendermint-types" +version = "0.48.0" +dependencies = [ + "bytes", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", "prost 0.12.1", "serde", - "serde-json-wasm", - "serde_derive", - "sha2 0.10.6", - "subtle-encoding", "tendermint", "tendermint-light-client-verifier", "tendermint-proto", - "tendermint-testgen", - "time", - "tracing", - "typed-builder", - "uint", +] + +[[package]] +name = "ibc-clients" +version = "0.48.0" +dependencies = [ + "ibc-client-tendermint", +] + +[[package]] +name = "ibc-core" +version = "0.48.0" +dependencies = [ + "ibc-core-channel", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-channel" +version = "0.48.0" +dependencies = [ + "ibc-core-channel-types", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-channel-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "sha2 0.10.8", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-client" +version = "0.48.0" +dependencies = [ + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-client-context" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-derive 0.4.0", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-client-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-commitment-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-primitives", + "ibc-proto", + "ics23", + "prost 0.12.1", + "serde", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-connection" +version = "0.48.0" +dependencies = [ + "ibc-core-client", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-connection-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-handler" +version = "0.48.0" +dependencies = [ + "ibc-core-channel", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-handler-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-host-types", + "ibc-core-router-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-host" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-host-cosmos" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-app-transfer-types", + "ibc-client-tendermint", + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "sha2 0.10.8", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-host-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-primitives", + "serde", +] + +[[package]] +name = "ibc-core-router" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-host-types", + "ibc-core-router-types", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-router-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "ics23", + "prost 0.12.1", + "serde", + "subtle-encoding", + "tendermint", ] [[package]] name = "ibc-derive" -version = "0.3.0" +version = "0.4.0" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "ibc-derive" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92f1528535e9ca495badb76c143bdd4763c1c9d987f59d1f8b47963ba0c11674" +checksum = "df07bf5bc1e65e291506b7497633e07967e49b36a8db10cda77a8fd686eb4548" dependencies = [ "darling", "proc-macro2", @@ -2369,11 +2682,24 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "ibc-primitives" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-proto", + "prost 0.12.1", + "serde", + "tendermint", + "time", +] + [[package]] name = "ibc-proto" -version = "0.37.1" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63042806bb2f662ca1c68026231900cfe13361136ddfd0dd09bcb315056a22b8" +checksum = "93cbf4cbe9e5113cc7c70f3208a7029b2205c629502cbb2ae7ea0a09a97d3005" dependencies = [ "base64 0.21.0", "bytes", @@ -2385,6 +2711,25 @@ dependencies = [ "tendermint-proto", ] +[[package]] +name = "ibc-testkit" +version = "0.48.0" +dependencies = [ + "bytes", + "derive_more", + "displaydoc", + "ibc", + "ibc-proto", + "parking_lot", + "primitive-types", + "prost 0.12.1", + "subtle-encoding", + "tendermint", + "tendermint-testgen", + "tracing", + "typed-builder", +] + [[package]] name = "ics23" version = "0.11.0" @@ -2398,7 +2743,7 @@ dependencies = [ "prost 0.12.1", "ripemd", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", ] @@ -2636,7 +2981,7 @@ dependencies = [ "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.6", + "sha2 0.10.8", "signature", ] @@ -2790,7 +3135,7 @@ dependencies = [ "num-traits", "rand 0.8.5", "rand_core 0.6.4", - "sha2 0.10.6", + "sha2 0.10.8", "subtle 2.4.1", "zcash_encoding", ] @@ -3012,8 +3357,9 @@ dependencies = [ "ethbridge-structs", "eyre", "ibc", - "ibc-derive", + "ibc-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "ibc-proto", + "ibc-testkit", "ics23", "impl-num-traits", "index-set", @@ -3155,6 +3501,7 @@ dependencies = [ "copy_dir", "derivative", "hyper", + "ibc-testkit", "lazy_static", "namada", "namada_core", @@ -3649,7 +3996,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "password-hash", ] @@ -3659,7 +4006,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -3668,7 +4015,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0ca0b5a68607598bf3bad68f32227a8164f6254833f84eafaac409cd6746c31" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "hmac 0.12.1", ] @@ -3816,9 +4163,9 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", @@ -4337,7 +4684,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4582,7 +4929,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.6", + "sha2 0.10.8", ] [[package]] @@ -4806,13 +5153,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4821,7 +5168,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] @@ -4849,7 +5196,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -5086,7 +5433,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" dependencies = [ "bytes", - "digest 0.10.6", + "digest 0.10.7", "ed25519", "ed25519-consensus 2.1.0", "flex-error", @@ -5101,7 +5448,7 @@ dependencies = [ "serde_bytes", "serde_json", "serde_repr", - "sha2 0.10.6", + "sha2 0.10.8", "signature", "subtle 2.4.1", "subtle-encoding", @@ -5468,11 +5815,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -5481,9 +5827,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -5492,9 +5838,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -5543,18 +5889,18 @@ dependencies = [ [[package]] name = "typed-builder" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c6a006a6d3d6a6f143fda41cf4d1ad35110080687628c9f2117bd3cc7924f3" +checksum = "e47c0496149861b7c95198088cbf36645016b1a0734cf350c50e2a38e070f38a" dependencies = [ "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa054ee5e2346187d631d2f1d1fd3b33676772d6d03a2d84e1c5213b31674ee" +checksum = "982ee4197351b5c9782847ef5ec1fdcaf50503fb19d68f9771adae314e72b492" dependencies = [ "proc-macro2", "quote", From 3a631f189d9135bcde1ff0df8b686f85e1768f7c Mon Sep 17 00:00:00 2001 From: yito88 Date: Fri, 24 Nov 2023 23:55:27 +0100 Subject: [PATCH 067/175] remove ibc-proto dependency --- Cargo.lock | 2 +- Cargo.toml | 1 - core/Cargo.toml | 1 - core/src/lib.rs | 2 +- sdk/src/lib.rs | 2 +- shared/src/lib.rs | 2 +- tests/Cargo.toml | 1 + tests/src/e2e/ibc_tests.rs | 8 ++------ wasm/Cargo.lock | 2 +- 9 files changed, 8 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c0c77999b0..943aec97c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4269,7 +4269,6 @@ dependencies = [ "eyre", "ibc", "ibc-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ibc-proto", "ibc-testkit", "ics23", "impl-num-traits", @@ -4453,6 +4452,7 @@ dependencies = [ "fs_extra", "hyper", "ibc-testkit", + "ics23", "itertools 0.10.5", "lazy_static", "namada", diff --git a/Cargo.toml b/Cargo.toml index 8965f60323..527d69e1fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -84,7 +84,6 @@ git2 = "0.13.25" #ibc = {version = "0.48.0", default-features = false, features = ["serde"]} ibc = {path = "../../cosmos/ibc-rs/ibc", default-features = false, features = ["serde"]} ibc-derive = "0.4.0" -ibc-proto = {version = "0.38.0", default-features = false} #ibc-testkit = {version = "0.48.0", default-features = false} ibc-testkit = {path = "../../cosmos/ibc-rs/ibc-testkit", default-features = false} ics23 = "0.11.0" diff --git a/core/Cargo.toml b/core/Cargo.toml index 08961be424..f13473dda0 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -44,7 +44,6 @@ ethbridge-structs.workspace = true eyre.workspace = true ibc.workspace = true ibc-derive.workspace = true -ibc-proto.workspace = true ibc-testkit = {workspace = true, optional = true} ics23.workspace = true impl-num-traits = "0.1.2" diff --git a/core/src/lib.rs b/core/src/lib.rs index a4db54712b..cbc9588201 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -12,7 +12,7 @@ pub mod ledger; pub mod proto; pub mod types; -pub use {ibc, ibc_proto, tendermint, tendermint_proto}; +pub use {ibc, tendermint, tendermint_proto}; // A handy macro for tests #[cfg(test)] diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 5c31194990..9d1ae3c57f 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -1,6 +1,6 @@ extern crate alloc; -pub use namada_core::{ibc, ibc_proto, proto, tendermint, tendermint_proto}; +pub use namada_core::{ibc, proto, tendermint, tendermint_proto}; #[cfg(feature = "tendermint-rpc")] pub use tendermint_rpc; use tx::{TX_INIT_ACCOUNT_WASM, VP_VALIDATOR_WASM}; diff --git a/shared/src/lib.rs b/shared/src/lib.rs index 0b0304ab3d..5937c345c9 100644 --- a/shared/src/lib.rs +++ b/shared/src/lib.rs @@ -6,7 +6,7 @@ #![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::private_intra_doc_links)] -pub use namada_core::{ibc, ibc_proto, tendermint, tendermint_proto}; +pub use namada_core::{ibc, tendermint, tendermint_proto}; #[cfg(feature = "tendermint-rpc")] pub use tendermint_rpc; pub use {bip39, namada_core as core, namada_proof_of_stake as proof_of_stake}; diff --git a/tests/Cargo.toml b/tests/Cargo.toml index bfc6df073b..f4ed0fbc34 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -35,6 +35,7 @@ copy_dir = "0.1.3" derivative.workspace = true hyper = {version = "0.14.20", features = ["full"]} ibc-testkit.workspace = true +ics23.workspace = true lazy_static.workspace = true num-traits.workspace = true prost.workspace = true diff --git a/tests/src/e2e/ibc_tests.rs b/tests/src/e2e/ibc_tests.rs index 7afc278e97..9d18bb54e5 100644 --- a/tests/src/e2e/ibc_tests.rs +++ b/tests/src/e2e/ibc_tests.rs @@ -1385,19 +1385,15 @@ fn query_value_with_proof( } fn convert_proof(tm_proof: TmProof) -> Result { - use namada::ibc_proto::ibc::core::commitment::v1::MerkleProof as RawMerkleProof; - use namada::ibc_proto::ics23::CommitmentProof; - let mut proofs = Vec::new(); - for op in &tm_proof.ops { - let mut parsed = CommitmentProof { proof: None }; + 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::from(RawMerkleProof { proofs }); + let merkle_proof = MerkleProof { proofs }; CommitmentProofBytes::try_from(merkle_proof).map_err(|e| { eyre!("Proof conversion to CommitmentProofBytes failed: {}", e) }) diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 9bfafd899a..e2e65e5fcb 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -3358,7 +3358,6 @@ dependencies = [ "eyre", "ibc", "ibc-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ibc-proto", "ibc-testkit", "ics23", "impl-num-traits", @@ -3502,6 +3501,7 @@ dependencies = [ "derivative", "hyper", "ibc-testkit", + "ics23", "lazy_static", "namada", "namada_core", From cbd6694600da57fabdc627d370fdf8b6609ccf45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Mon, 27 Nov 2023 10:48:28 +0100 Subject: [PATCH 068/175] wasm: handle cache loading errors --- .../src/vm/wasm/compilation_cache/common.rs | 74 +++++++++++++------ 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/shared/src/vm/wasm/compilation_cache/common.rs b/shared/src/vm/wasm/compilation_cache/common.rs index f866188970..cd95100d25 100644 --- a/shared/src/vm/wasm/compilation_cache/common.rs +++ b/shared/src/vm/wasm/compilation_cache/common.rs @@ -156,16 +156,22 @@ impl Cache { return Ok(Some((module.clone(), store()))); } - let (module, store) = file_load_module(&self.dir, hash); - tracing::info!( - "{} found {} in file cache.", - N::name(), - hash.to_string() - ); - // Put into cache, ignore result if it's full - let _ = in_memory.put_with_weight(*hash, module.clone()); + if let Ok((module, store)) = + file_load_module(&self.dir, hash) + { + tracing::info!( + "{} found {} in file cache.", + N::name(), + hash.to_string() + ); + // Put into cache, ignore result if it's full + let _ = + in_memory.put_with_weight(*hash, module.clone()); - return Ok(Some((module, store))); + return Ok(Some((module, store))); + } else { + return Ok(None); + } } Some(Compilation::Compiling) => { drop(progress); @@ -183,11 +189,15 @@ impl Cache { let (module, store) = if module_file_exists(&self.dir, hash) { tracing::info!( - "Loading {} {} from file.", + "Trying to load {} {} from file.", N::name(), hash.to_string() ); - file_load_module(&self.dir, hash) + if let Ok(res) = file_load_module(&self.dir, hash) { + res + } else { + return Ok(None); + } } else { return Ok(None); }; @@ -246,13 +256,18 @@ impl Cache { return Ok(Some((module.clone(), store()))); } - let (module, store) = file_load_module(&self.dir, hash); - tracing::info!( - "{} found {} in file cache.", - N::name(), - hash.to_string() - ); - return Ok(Some((module, store))); + if let Ok((module, store)) = + file_load_module(&self.dir, hash) + { + tracing::info!( + "{} found {} in file cache.", + N::name(), + hash.to_string() + ); + return Ok(Some((module, store))); + } else { + return Ok(None); + } } Some(Compilation::Compiling) => { drop(progress); @@ -270,11 +285,15 @@ impl Cache { return if module_file_exists(&self.dir, hash) { tracing::info!( - "Loading {} {} from file.", + "Trying to load {} {} from file.", N::name(), hash.to_string() ); - Ok(Some(file_load_module(&self.dir, hash))) + if let Ok(res) = file_load_module(&self.dir, hash) { + return Ok(Some(res)); + } else { + return Ok(None); + } } else { Ok(None) }; @@ -478,13 +497,22 @@ fn file_write_module(dir: impl AsRef, module: &Module, hash: &Hash) { fs_cache.store(CacheHash::new(hash.0), module).unwrap(); } -fn file_load_module(dir: impl AsRef, hash: &Hash) -> (Module, Store) { +fn file_load_module( + dir: impl AsRef, + hash: &Hash, +) -> Result<(Module, Store), wasmer::DeserializeError> { use wasmer_cache::Cache; let fs_cache = fs_cache(dir, hash); let store = store(); let hash = CacheHash::new(hash.0); - let module = unsafe { fs_cache.load(&store, hash) }.unwrap(); - (module, store) + let module = unsafe { fs_cache.load(&store, hash) }; + if let Err(err) = module.as_ref() { + tracing::error!( + "Error loading cached wasm {}: {err}.", + hash.to_string() + ); + } + Ok((module?, store)) } fn fs_cache(dir: impl AsRef, hash: &Hash) -> FileSystemCache { From 85957df5ad5f08afd587417f230fc8c97b8660a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Mon, 27 Nov 2023 11:01:31 +0100 Subject: [PATCH 069/175] changelog: add #2215 --- .changelog/unreleased/improvements/2215-vp-less-permissive.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/2215-vp-less-permissive.md diff --git a/.changelog/unreleased/improvements/2215-vp-less-permissive.md b/.changelog/unreleased/improvements/2215-vp-less-permissive.md new file mode 100644 index 0000000000..57faf65be7 --- /dev/null +++ b/.changelog/unreleased/improvements/2215-vp-less-permissive.md @@ -0,0 +1,2 @@ +- Handle errors on loading WASMs from file-system compilation cache. + ([\#2215](https://github.com/anoma/namada/pull/2215)) \ No newline at end of file From 313c614f918ea523c66529fca597767a84eac7cb Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Mon, 27 Nov 2023 12:54:04 +0200 Subject: [PATCH 070/175] Made build_unjail_validator respect force flag. --- sdk/src/tx.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index 9378615890..ed7d9ebae0 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -930,11 +930,19 @@ pub async fn build_unjail_validator<'a>( Err(Error::Query( QueryError::NoSuchKey(_) | QueryError::General(_), )) => { - return Err(Error::from(TxError::Other(format!( + edisplay_line!( + context.io(), "The given validator address {} is currently frozen and not \ yet eligible to be unjailed.", &validator - )))); + ); + if !tx_args.force { + return Err(Error::from( + TxError::ValidatorFrozenFromUnjailing( + validator.clone(), + ), + )); + } } Err(err) => return Err(err), } From 0ccd2be8ddc7d50b7195ab2039edbd78797d4652 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Mon, 27 Nov 2023 14:35:25 +0200 Subject: [PATCH 071/175] Now compress transactions before sending them to hardware wallet. --- apps/src/lib/client/tx.rs | 5 ++++- core/src/proto/types.rs | 2 +- sdk/src/tx.rs | 4 +--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 71950de60f..b587a582a6 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -134,9 +134,12 @@ pub async fn sign<'a>( response_pubkey, pubkey, ))); } + // Remove unnecessary detail for Ledger signing + let mut compressed_tx = tx.clone(); + compressed_tx.wallet_filter(); // Get the Ledger to sign using our obtained derivation path let response = app - .sign(&path, &tx.serialize_to_vec()) + .sign(&path, &compressed_tx.serialize_to_vec()) .await .map_err(|err| error::Error::Other(err.to_string()))?; // Sign the raw header if that is requested diff --git a/core/src/proto/types.rs b/core/src/proto/types.rs index 97c16f1b1d..77f813348c 100644 --- a/core/src/proto/types.rs +++ b/core/src/proto/types.rs @@ -507,7 +507,7 @@ impl Signature { // vector instead of a map assert!( secret_keys.keys().cloned().eq(0..(secret_keys.len() as u8)), - "secret keys must be enumerateed when signer address is absent" + "secret keys must be enumerated when signer address is absent" ); Signer::PubKeys(secret_keys.values().map(RefTo::ref_to).collect()) }; diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index ed7d9ebae0..e21fb5c3a2 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -938,9 +938,7 @@ pub async fn build_unjail_validator<'a>( ); if !tx_args.force { return Err(Error::from( - TxError::ValidatorFrozenFromUnjailing( - validator.clone(), - ), + TxError::ValidatorFrozenFromUnjailing(validator.clone()), )); } } From 3b6b982e9a62da955a8832201dd8e97dfdd0b691 Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 27 Nov 2023 15:00:44 +0100 Subject: [PATCH 072/175] revert chain ID format --- core/src/types/chain.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/core/src/types/chain.rs b/core/src/types/chain.rs index 2b22a13812..2c7c815a14 100644 --- a/core/src/types/chain.rs +++ b/core/src/types/chain.rs @@ -10,9 +10,8 @@ use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use thiserror::Error; -/// The length of the chain ID string. Tendermint's MAX_LENGTH is 50, and ibc-rs -/// would append a maximum of 21 characters. -pub const CHAIN_ID_LENGTH: usize = 29; +/// The length of the chain ID string +pub const CHAIN_ID_LENGTH: usize = 30; /// The maximum length of chain ID prefix pub const CHAIN_ID_PREFIX_MAX_LEN: usize = 19; /// Separator between chain ID prefix and the generated hash @@ -174,7 +173,7 @@ impl ProposalBytes { } /// Release default chain ID. Must be [`CHAIN_ID_LENGTH`] long. -pub const DEFAULT_CHAIN_ID: &str = "namada-internal.00000000000-0"; +pub const DEFAULT_CHAIN_ID: &str = "namada-internal.00000000000000"; /// Chain ID #[derive( @@ -208,10 +207,10 @@ impl ChainId { let mut hasher = Sha256::new(); hasher.update(genesis_bytes); // less `1` for chain ID prefix separator char - let width = CHAIN_ID_LENGTH - 3 - prefix.len(); + let width = CHAIN_ID_LENGTH - 1 - prefix.len(); // lowercase hex of the first `width` chars of the hash let hash = format!("{:.width$x}", hasher.finalize(), width = width,); - let raw = format!("{}{}{}-0", prefix, CHAIN_ID_PREFIX_SEP, hash); + let raw = format!("{}{}{}", prefix, CHAIN_ID_PREFIX_SEP, hash); ChainId(raw) } @@ -227,10 +226,10 @@ impl ChainId { let mut hasher = Sha256::new(); hasher.update(genesis_bytes); // less `1` for chain ID prefix separator char - let width = CHAIN_ID_LENGTH - 3 - prefix.len(); + let width = CHAIN_ID_LENGTH - 1 - prefix.len(); // lowercase hex of the first `width` chars of the hash let expected_hash = - format!("{:.width$x}-0", hasher.finalize(), width = width,); + format!("{:.width$x}", hasher.finalize(), width = width,); if hash != expected_hash { errors.push(ChainIdValidationError::InvalidHash( expected_hash, From 50bba4be65f4a313175e602bb416058b69e1282b Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 27 Nov 2023 17:01:55 +0100 Subject: [PATCH 073/175] fix bench --- benches/native_vps.rs | 19 +- benches/txs.rs | 19 +- core/src/ledger/ibc/mod.rs | 12 +- shared/src/ledger/native_vp/ibc/mod.rs | 16 +- tests/src/vm_host_env/ibc.rs | 2 +- tests/src/vm_host_env/mod.rs | 2 +- wasm_for_tests/wasm_source/Cargo.lock | 482 +++++++++++++++++++++---- 7 files changed, 446 insertions(+), 106 deletions(-) diff --git a/benches/native_vps.rs b/benches/native_vps.rs index fdaed5d1f9..413f307729 100644 --- a/benches/native_vps.rs +++ b/benches/native_vps.rs @@ -14,16 +14,15 @@ use namada::core::ledger::storage_api::{StorageRead, StorageWrite}; use namada::core::types::address::{self, Address}; use namada::core::types::token::{Amount, Transfer}; use namada::eth_bridge::storage::whitelist; -use namada::ibc::core::ics02_client::client_type::ClientType; -use namada::ibc::core::ics03_connection::connection::Counterparty; -use namada::ibc::core::ics03_connection::msgs::conn_open_init::MsgConnectionOpenInit; -use namada::ibc::core::ics03_connection::version::Version; -use namada::ibc::core::ics04_channel::channel::Order; -use namada::ibc::core::ics04_channel::msgs::MsgChannelOpenInit; -use namada::ibc::core::ics04_channel::Version as ChannelVersion; -use namada::ibc::core::ics23_commitment::commitment::CommitmentPrefix; -use namada::ibc::core::ics24_host::identifier::{ - ClientId, ConnectionId, PortId, +use namada::ibc::core::channel::types::channel::Order; +use namada::ibc::core::channel::types::msgs::MsgChannelOpenInit; +use namada::ibc::core::channel::types::Version as ChannelVersion; +use namada::ibc::core::commitment_types::commitment::CommitmentPrefix; +use namada::ibc::core::connection::types::msgs::MsgConnectionOpenInit; +use namada::ibc::core::connection::types::version::Version; +use namada::ibc::core::connection::types::Counterparty; +use namada::ibc::core::host::types::identifiers::{ + ClientId, ClientType, ConnectionId, PortId, }; use namada::ledger::eth_bridge::read_native_erc20_address; use namada::ledger::gas::{TxGasMeter, VpGasMeter}; diff --git a/benches/txs.rs b/benches/txs.rs index 02d6c9c22d..c492ac90dc 100644 --- a/benches/txs.rs +++ b/benches/txs.rs @@ -13,16 +13,15 @@ use namada::core::types::key::{ use namada::core::types::token::Amount; use namada::core::types::transaction::account::{InitAccount, UpdateAccount}; use namada::core::types::transaction::pos::{InitValidator, MetaDataChange}; -use namada::ibc::core::ics02_client::client_type::ClientType; -use namada::ibc::core::ics03_connection::connection::Counterparty; -use namada::ibc::core::ics03_connection::msgs::conn_open_init::MsgConnectionOpenInit; -use namada::ibc::core::ics03_connection::version::Version; -use namada::ibc::core::ics04_channel::channel::Order; -use namada::ibc::core::ics04_channel::msgs::MsgChannelOpenInit; -use namada::ibc::core::ics04_channel::Version as ChannelVersion; -use namada::ibc::core::ics23_commitment::commitment::CommitmentPrefix; -use namada::ibc::core::ics24_host::identifier::{ - ClientId, ConnectionId, PortId, +use namada::ibc::core::channel::types::channel::Order; +use namada::ibc::core::channel::types::msgs::MsgChannelOpenInit; +use namada::ibc::core::channel::types::Version as ChannelVersion; +use namada::ibc::core::commitment_types::commitment::CommitmentPrefix; +use namada::ibc::core::connection::types::msgs::MsgConnectionOpenInit; +use namada::ibc::core::connection::types::version::Version; +use namada::ibc::core::connection::types::Counterparty; +use namada::ibc::core::host::types::identifiers::{ + ClientId, ClientType, ConnectionId, PortId, }; use namada::ledger::eth_bridge::read_native_erc20_address; use namada::ledger::storage_api::StorageRead; diff --git a/core/src/ledger/ibc/mod.rs b/core/src/ledger/ibc/mod.rs index 808ed013af..1b01017d3f 100644 --- a/core/src/ledger/ibc/mod.rs +++ b/core/src/ledger/ibc/mod.rs @@ -49,14 +49,10 @@ pub enum Error { DecodingData(prost::DecodeError), #[error("Decoding message error: {0}")] DecodingMessage(RouterError), - #[error("IBC execution error: {0}")] - Execution(ContextError), + #[error("IBC context error: {0}")] + Context(Box), #[error("IBC token transfer error: {0}")] TokenTransfer(TokenTransferError), - #[error("IBC validation error: {0}")] - Validation(ContextError), - #[error("IBC module doesn't exist")] - NoModule, #[error("Denom error: {0}")] Denom(String), #[error("Invalid chain ID: {0}")] @@ -119,7 +115,7 @@ where let envelope = MsgEnvelope::try_from(any_msg) .map_err(Error::DecodingMessage)?; execute(&mut self.ctx, &mut self.router, envelope.clone()) - .map_err(Error::Execution)?; + .map_err(|e| Error::Context(Box::new(e)))?; // For receiving the token to a shielded address self.handle_masp_tx(&envelope)?; // the current ibc-rs execution doesn't store the denom for the @@ -234,7 +230,7 @@ where let envelope = MsgEnvelope::try_from(any_msg) .map_err(Error::DecodingMessage)?; validate(&self.ctx, &self.router, envelope) - .map_err(Error::Validation) + .map_err(|e| Error::Context(Box::new(e))) } } } diff --git a/shared/src/ledger/native_vp/ibc/mod.rs b/shared/src/ledger/native_vp/ibc/mod.rs index cd0a1e5680..a4ca254537 100644 --- a/shared/src/ledger/native_vp/ibc/mod.rs +++ b/shared/src/ledger/native_vp/ibc/mod.rs @@ -41,8 +41,6 @@ pub enum Error { IbcAction(ActionError), #[error("State change error: {0}")] StateChange(String), - #[error("Denom error: {0}")] - Denom(String), #[error("IBC event error: {0}")] IbcEvent(String), } @@ -175,7 +173,7 @@ where pipeline_len * epoch_duration.min_duration.0; Ok(ValidationParams { chain_id: IbcChainId::from_str(&chain_id) - .map_err(|e| Error::IbcAction(ActionError::ChainId(e)))?, + .map_err(ActionError::ChainId)?, proof_specs: proof_specs.into(), unbonding_period: Duration::from_secs(unbonding_period_secs), upgrade_path: Vec::new(), @@ -186,24 +184,26 @@ where for key in keys_changed { if let Some((_, hash)) = is_ibc_denom_key(key) { match self.ctx.read_post::(key).map_err(|e| { - Error::Denom(format!( + ActionError::Denom(format!( "Getting the denom failed: Key {}, Error {}", key, e )) })? { Some(denom) => { if calc_hash(&denom) != hash { - return Err(Error::Denom(format!( + return Err(ActionError::Denom(format!( "The denom is invalid: Key {}, Denom {}", key, denom - ))); + )) + .into()); } } None => { - return Err(Error::Denom(format!( + return Err(ActionError::Denom(format!( "The corresponding denom wasn't stored: Key {}", key - ))); + )) + .into()); } } } diff --git a/tests/src/vm_host_env/ibc.rs b/tests/src/vm_host_env/ibc.rs index 5bc58a9775..fda711ad0d 100644 --- a/tests/src/vm_host_env/ibc.rs +++ b/tests/src/vm_host_env/ibc.rs @@ -466,7 +466,7 @@ pub fn msg_connection_open_try( #[allow(deprecated)] MsgConnectionOpenTry { client_id_on_b: client_id, - client_state_of_b_on_a: client_state.into(), + client_state_of_b_on_a: client_state, counterparty: dummy_connection_counterparty(), versions_on_a: vec![ConnVersion::default()], proofs_height_on_a: dummy_proof_height(), diff --git a/tests/src/vm_host_env/mod.rs b/tests/src/vm_host_env/mod.rs index 2c80213eb7..eed12a6112 100644 --- a/tests/src/vm_host_env/mod.rs +++ b/tests/src/vm_host_env/mod.rs @@ -1039,7 +1039,7 @@ mod tests { // VP should fail because the transfer channel cannot be closed assert!(matches!( result.expect_err("validation succeeded unexpectedly"), - IbcError::IbcAction(IbcActionError::Execution(_)), + IbcError::IbcAction(IbcActionError::Context(_)), )); } diff --git a/wasm_for_tests/wasm_source/Cargo.lock b/wasm_for_tests/wasm_source/Cargo.lock index 133935e7f0..5b56bae4fa 100644 --- a/wasm_for_tests/wasm_source/Cargo.lock +++ b/wasm_for_tests/wasm_source/Cargo.lock @@ -369,7 +369,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.10.1", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "unicode-normalization", "zeroize", ] @@ -450,7 +450,7 @@ dependencies = [ "cc", "cfg-if 1.0.0", "constant_time_eq", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -594,9 +594,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ "serde", ] @@ -766,13 +766,13 @@ dependencies = [ "bincode", "bs58", "coins-core", - "digest 0.10.6", + "digest 0.10.7", "getrandom 0.2.10", "hmac 0.12.1", "k256", "lazy_static", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] @@ -789,7 +789,7 @@ dependencies = [ "once_cell", "pbkdf2 0.12.1", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] @@ -802,13 +802,13 @@ dependencies = [ "base64 0.21.0", "bech32 0.7.3", "bs58", - "digest 0.10.6", + "digest 0.10.7", "generic-array 0.14.7", "hex", "ripemd", "serde", "serde_derive", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -1206,9 +1206,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid", @@ -1286,7 +1286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" dependencies = [ "der", - "digest 0.10.6", + "digest 0.10.7", "elliptic-curve", "rfc6979", "serdect", @@ -1346,7 +1346,7 @@ checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.6", + "digest 0.10.7", "ff", "generic-array 0.14.7", "group", @@ -1461,7 +1461,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest 0.10.6", + "digest 0.10.7", "hex", "hmac 0.12.1", "pbkdf2 0.11.0", @@ -1469,7 +1469,7 @@ dependencies = [ "scrypt", "serde", "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", "uuid", @@ -1765,7 +1765,7 @@ dependencies = [ "ethers-core", "hex", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", "tracing", ] @@ -2211,7 +2211,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2328,40 +2328,353 @@ dependencies = [ [[package]] name = "ibc" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "184eb22140cb4143bbcf7ddc8fdfeb9cc058ef73a6066f8ea78162e69d3565d1" +version = "0.48.0" +dependencies = [ + "ibc-apps", + "ibc-clients", + "ibc-core", + "ibc-core-host-cosmos", + "ibc-derive 0.4.0", + "ibc-primitives", +] + +[[package]] +name = "ibc-app-transfer" +version = "0.48.0" +dependencies = [ + "ibc-app-transfer-types", + "ibc-core", + "serde-json-wasm", +] + +[[package]] +name = "ibc-app-transfer-types" +version = "0.48.0" dependencies = [ - "bytes", "derive_more", "displaydoc", - "ibc-derive", + "ibc-core", "ibc-proto", - "ics23", - "num-traits", - "parking_lot", "primitive-types", + "serde", + "uint", +] + +[[package]] +name = "ibc-apps" +version = "0.48.0" +dependencies = [ + "ibc-app-transfer", +] + +[[package]] +name = "ibc-client-tendermint" +version = "0.48.0" +dependencies = [ + "ibc-client-tendermint-types", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", + "serde", + "tendermint", + "tendermint-light-client-verifier", +] + +[[package]] +name = "ibc-client-tendermint-types" +version = "0.48.0" +dependencies = [ + "bytes", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", "prost 0.12.1", "serde", - "serde-json-wasm", - "serde_derive", - "sha2 0.10.6", - "subtle-encoding", "tendermint", "tendermint-light-client-verifier", "tendermint-proto", - "tendermint-testgen", - "time", - "tracing", - "typed-builder", - "uint", +] + +[[package]] +name = "ibc-clients" +version = "0.48.0" +dependencies = [ + "ibc-client-tendermint", +] + +[[package]] +name = "ibc-core" +version = "0.48.0" +dependencies = [ + "ibc-core-channel", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-channel" +version = "0.48.0" +dependencies = [ + "ibc-core-channel-types", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-channel-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "sha2 0.10.8", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-client" +version = "0.48.0" +dependencies = [ + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-client-context" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-derive 0.4.0", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-client-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-commitment-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-primitives", + "ibc-proto", + "ics23", + "prost 0.12.1", + "serde", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-connection" +version = "0.48.0" +dependencies = [ + "ibc-core-client", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-primitives", + "prost 0.12.1", +] + +[[package]] +name = "ibc-core-connection-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-handler" +version = "0.48.0" +dependencies = [ + "ibc-core-channel", + "ibc-core-client", + "ibc-core-commitment-types", + "ibc-core-connection", + "ibc-core-handler-types", + "ibc-core-host", + "ibc-core-router", + "ibc-primitives", +] + +[[package]] +name = "ibc-core-handler-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-host-types", + "ibc-core-router-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-host" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-host-cosmos" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-app-transfer-types", + "ibc-client-tendermint", + "ibc-core-client-context", + "ibc-core-client-types", + "ibc-core-commitment-types", + "ibc-core-connection-types", + "ibc-core-handler-types", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "prost 0.12.1", + "serde", + "sha2 0.10.8", + "subtle-encoding", + "tendermint", +] + +[[package]] +name = "ibc-core-host-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-primitives", + "serde", +] + +[[package]] +name = "ibc-core-router" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-channel-types", + "ibc-core-host-types", + "ibc-core-router-types", + "ibc-primitives", + "prost 0.12.1", + "subtle-encoding", +] + +[[package]] +name = "ibc-core-router-types" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-core-host-types", + "ibc-primitives", + "ibc-proto", + "ics23", + "prost 0.12.1", + "serde", + "subtle-encoding", + "tendermint", ] [[package]] name = "ibc-derive" -version = "0.3.0" +version = "0.4.0" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "ibc-derive" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92f1528535e9ca495badb76c143bdd4763c1c9d987f59d1f8b47963ba0c11674" +checksum = "df07bf5bc1e65e291506b7497633e07967e49b36a8db10cda77a8fd686eb4548" dependencies = [ "darling", "proc-macro2", @@ -2369,11 +2682,24 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "ibc-primitives" +version = "0.48.0" +dependencies = [ + "derive_more", + "displaydoc", + "ibc-proto", + "prost 0.12.1", + "serde", + "tendermint", + "time", +] + [[package]] name = "ibc-proto" -version = "0.37.1" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63042806bb2f662ca1c68026231900cfe13361136ddfd0dd09bcb315056a22b8" +checksum = "93cbf4cbe9e5113cc7c70f3208a7029b2205c629502cbb2ae7ea0a09a97d3005" dependencies = [ "base64 0.21.0", "bytes", @@ -2385,6 +2711,25 @@ dependencies = [ "tendermint-proto", ] +[[package]] +name = "ibc-testkit" +version = "0.48.0" +dependencies = [ + "bytes", + "derive_more", + "displaydoc", + "ibc", + "ibc-proto", + "parking_lot", + "primitive-types", + "prost 0.12.1", + "subtle-encoding", + "tendermint", + "tendermint-testgen", + "tracing", + "typed-builder", +] + [[package]] name = "ics23" version = "0.11.0" @@ -2398,7 +2743,7 @@ dependencies = [ "prost 0.12.1", "ripemd", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", ] @@ -2636,7 +2981,7 @@ dependencies = [ "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.6", + "sha2 0.10.8", "signature", ] @@ -2790,7 +3135,7 @@ dependencies = [ "num-traits", "rand 0.8.5", "rand_core 0.6.4", - "sha2 0.10.6", + "sha2 0.10.8", "subtle 2.4.1", "zcash_encoding", ] @@ -3012,8 +3357,8 @@ dependencies = [ "ethbridge-structs", "eyre", "ibc", - "ibc-derive", - "ibc-proto", + "ibc-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ibc-testkit", "ics23", "impl-num-traits", "index-set", @@ -3155,6 +3500,8 @@ dependencies = [ "copy_dir", "derivative", "hyper", + "ibc-testkit", + "ics23", "lazy_static", "namada", "namada_core", @@ -3642,7 +3989,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "password-hash", ] @@ -3652,7 +3999,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -3661,7 +4008,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0ca0b5a68607598bf3bad68f32227a8164f6254833f84eafaac409cd6746c31" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "hmac 0.12.1", ] @@ -3809,9 +4156,9 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", @@ -4330,7 +4677,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4575,7 +4922,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.6", + "sha2 0.10.8", ] [[package]] @@ -4799,13 +5146,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4814,7 +5161,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] @@ -4842,7 +5189,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -5079,7 +5426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" dependencies = [ "bytes", - "digest 0.10.6", + "digest 0.10.7", "ed25519", "ed25519-consensus 2.1.0", "flex-error", @@ -5094,7 +5441,7 @@ dependencies = [ "serde_bytes", "serde_json", "serde_repr", - "sha2 0.10.6", + "sha2 0.10.8", "signature", "subtle 2.4.1", "subtle-encoding", @@ -5461,11 +5808,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -5474,9 +5820,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -5485,9 +5831,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -5525,18 +5871,18 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "typed-builder" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c6a006a6d3d6a6f143fda41cf4d1ad35110080687628c9f2117bd3cc7924f3" +checksum = "e47c0496149861b7c95198088cbf36645016b1a0734cf350c50e2a38e070f38a" dependencies = [ "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa054ee5e2346187d631d2f1d1fd3b33676772d6d03a2d84e1c5213b31674ee" +checksum = "982ee4197351b5c9782847ef5ec1fdcaf50503fb19d68f9771adae314e72b492" dependencies = [ "proc-macro2", "quote", From a1b2d09399d25e6ee626a61d9e3d8a3ed19ebadf Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Mon, 27 Nov 2023 18:44:43 +0200 Subject: [PATCH 074/175] Fixed sign_raw in the case that the public keys map is non-consecutive. --- core/src/proto/types.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/proto/types.rs b/core/src/proto/types.rs index 77f813348c..ba90b4936f 100644 --- a/core/src/proto/types.rs +++ b/core/src/proto/types.rs @@ -1573,9 +1573,15 @@ impl Tx { let hashes = vec![self.raw_header_hash()]; self.protocol_filter(); + let secret_keys = if signer.is_some() { + account_public_keys_map.index_secret_keys(keypairs) + } else { + (0..).zip(keypairs.into_iter()).collect() + }; + self.add_section(Section::Signature(Signature::new( hashes, - account_public_keys_map.index_secret_keys(keypairs), + secret_keys, signer, ))); self From 1898905ea60a59326440b142e515db753d95406a Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 27 Nov 2023 18:26:12 +0100 Subject: [PATCH 075/175] update ibc-rs to 0.48.1 --- Cargo.lock | 116 +++++++++++++++++--------- Cargo.toml | 6 +- wasm/Cargo.lock | 116 +++++++++++++++++--------- wasm_for_tests/wasm_source/Cargo.lock | 116 +++++++++++++++++--------- 4 files changed, 236 insertions(+), 118 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 943aec97c1..6bfe6f5982 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2891,19 +2891,23 @@ dependencies = [ [[package]] name = "ibc" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "429b6aca6624a9364878e28c90311438c2621a8270942d80732b2651ac38ac74" dependencies = [ "ibc-apps", "ibc-clients", "ibc-core", "ibc-core-host-cosmos", - "ibc-derive 0.4.0", + "ibc-derive", "ibc-primitives", ] [[package]] name = "ibc-app-transfer" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b177b343385d9654d99be4709b5ed1574d41f91dfa4044b2d26d688be4179d7c" dependencies = [ "ibc-app-transfer-types", "ibc-core", @@ -2912,7 +2916,9 @@ dependencies = [ [[package]] name = "ibc-app-transfer-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95f92a3eda225e5c86e7bb6501c95986583ac541c4369d3c528349d81390f947" dependencies = [ "derive_more", "displaydoc", @@ -2925,14 +2931,18 @@ dependencies = [ [[package]] name = "ibc-apps" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4be40d55ed2dea9f2d05b902a3586f20850c723e4bdbfc4fb0ebe7a66ca5e40" dependencies = [ "ibc-app-transfer", ] [[package]] name = "ibc-client-tendermint" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119aa5873214228bf69bded3f20022b9ae1bc35b6841d295afcd73e53db05ccf" dependencies = [ "ibc-client-tendermint-types", "ibc-core-client", @@ -2948,7 +2958,9 @@ dependencies = [ [[package]] name = "ibc-client-tendermint-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f21679016931b332b295a761e65cc122dc6fbfb98444148b681ad3aaa474665" dependencies = [ "bytes", "displaydoc", @@ -2966,14 +2978,18 @@ dependencies = [ [[package]] name = "ibc-clients" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c660323e93107a136aa3dbc412b7fa2eafd315c2fe71184096a43800f8ca5" dependencies = [ "ibc-client-tendermint", ] [[package]] name = "ibc-core" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "100d9d0aa67432c5078a8a1c818e3fc990a193be6d35ed0abeda5b340d16c1da" dependencies = [ "ibc-core-channel", "ibc-core-client", @@ -2987,7 +3003,9 @@ dependencies = [ [[package]] name = "ibc-core-channel" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebaa37629ac029f914dfe552ab5dad01ddb240ec885ed0ae68221cbea4e9bfc" dependencies = [ "ibc-core-channel-types", "ibc-core-client", @@ -3002,7 +3020,9 @@ dependencies = [ [[package]] name = "ibc-core-channel-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2ba72c56c411b1e0ce6dc3f5e1fa1de9e6c84891f425b7be8a9e1705964378" dependencies = [ "derive_more", "displaydoc", @@ -3021,7 +3041,9 @@ dependencies = [ [[package]] name = "ibc-core-client" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c4fac8e05201795073dee8c93d5afe9dfeac9aec2412b4a2b0c5f0d1e1d725" dependencies = [ "ibc-core-client-context", "ibc-core-client-types", @@ -3034,7 +3056,9 @@ dependencies = [ [[package]] name = "ibc-core-client-context" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b82abd9489021730d59ab2d00e9438d3711e8e78ecba4d083b64f833301682b" dependencies = [ "derive_more", "displaydoc", @@ -3042,7 +3066,7 @@ dependencies = [ "ibc-core-commitment-types", "ibc-core-handler-types", "ibc-core-host-types", - "ibc-derive 0.4.0", + "ibc-derive", "ibc-primitives", "prost 0.12.1", "subtle-encoding", @@ -3051,7 +3075,9 @@ dependencies = [ [[package]] name = "ibc-core-client-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafdbf6db5dab4c8ad610b6940e23b4f8abd0a6ac5e8e2801415a95defd4a583" dependencies = [ "derive_more", "displaydoc", @@ -3067,7 +3093,9 @@ dependencies = [ [[package]] name = "ibc-core-commitment-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed4256b0216fc49024bac7e01c61b9bb055e31914ffe9ce6f468d7ce496a9357" dependencies = [ "derive_more", "displaydoc", @@ -3081,7 +3109,9 @@ dependencies = [ [[package]] name = "ibc-core-connection" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e237b70b9ba0177a4e59ac9048fffac2ac44c334703cc0ae403ad221450850" dependencies = [ "ibc-core-client", "ibc-core-connection-types", @@ -3093,7 +3123,9 @@ dependencies = [ [[package]] name = "ibc-core-connection-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca841416fa29626423917099092f3698ae2735074cb3fe42936ddf6b2ccbf2f7" dependencies = [ "derive_more", "displaydoc", @@ -3110,7 +3142,9 @@ dependencies = [ [[package]] name = "ibc-core-handler" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47e5e5a006aa0fc87ec3f5fb1e0ef6dd5aeea5079fa927d799d526c44329987" dependencies = [ "ibc-core-channel", "ibc-core-client", @@ -3124,7 +3158,9 @@ dependencies = [ [[package]] name = "ibc-core-handler-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3d59a8a5eb2069530c42783b4fef63472a89e0e9242334351df1bb58aaf542" dependencies = [ "derive_more", "displaydoc", @@ -3144,7 +3180,9 @@ dependencies = [ [[package]] name = "ibc-core-host" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aa63c895c0e5a75e42fe859b8fd4250c12bfa8b9c6b114f94c927ecfad38a03" dependencies = [ "derive_more", "displaydoc", @@ -3162,7 +3200,9 @@ dependencies = [ [[package]] name = "ibc-core-host-cosmos" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a325862af6c20b0df3d27c072a2d802a7232dc1666214d738cdfbd9a9c99720" dependencies = [ "derive_more", "displaydoc", @@ -3185,7 +3225,9 @@ dependencies = [ [[package]] name = "ibc-core-host-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616955da310febbe93c0569a2feebd9f57cafed3eee5a56b0c3bb953a75f6089" dependencies = [ "derive_more", "displaydoc", @@ -3195,7 +3237,9 @@ dependencies = [ [[package]] name = "ibc-core-router" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31fe115da73e0616bdb44400fa6b11ca251648d070c4ff419d58e27804d30243" dependencies = [ "derive_more", "displaydoc", @@ -3209,7 +3253,9 @@ dependencies = [ [[package]] name = "ibc-core-router-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d1fbb0bbbdeafa7ac989ba1693ed46d22e0e3eb0bdae478544e31157a4fdba6" dependencies = [ "derive_more", "displaydoc", @@ -3223,16 +3269,6 @@ dependencies = [ "tendermint", ] -[[package]] -name = "ibc-derive" -version = "0.4.0" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "ibc-derive" version = "0.4.0" @@ -3247,7 +3283,9 @@ dependencies = [ [[package]] name = "ibc-primitives" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5edea4685267fd68514c87e7aa3a62712340c4cff6903f088a9ab571428a08a" dependencies = [ "derive_more", "displaydoc", @@ -3276,7 +3314,9 @@ dependencies = [ [[package]] name = "ibc-testkit" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f550c91648f3db6474880e18cd2bd294096a99b30621aa01a9059b71e3612d98" dependencies = [ "bytes", "derive_more", @@ -4268,7 +4308,7 @@ dependencies = [ "ethbridge-structs", "eyre", "ibc", - "ibc-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ibc-derive", "ibc-testkit", "ics23", "impl-num-traits", diff --git a/Cargo.toml b/Cargo.toml index 527d69e1fa..be18088e90 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -81,11 +81,9 @@ flate2 = "1.0.22" fs_extra = "1.2.0" futures = "0.3" git2 = "0.13.25" -#ibc = {version = "0.48.0", default-features = false, features = ["serde"]} -ibc = {path = "../../cosmos/ibc-rs/ibc", default-features = false, features = ["serde"]} +ibc = {version = "0.48.1", default-features = false, features = ["serde"]} ibc-derive = "0.4.0" -#ibc-testkit = {version = "0.48.0", default-features = false} -ibc-testkit = {path = "../../cosmos/ibc-rs/ibc-testkit", default-features = false} +ibc-testkit = {version = "0.48.1", default-features = false} ics23 = "0.11.0" index-set = {git = "https://github.com/heliaxdev/index-set", tag = "v0.8.0", features = ["serialize-borsh", "serialize-serde"]} itertools = "0.10.0" diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index e2e65e5fcb..0c6177bd22 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -2328,19 +2328,23 @@ dependencies = [ [[package]] name = "ibc" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "429b6aca6624a9364878e28c90311438c2621a8270942d80732b2651ac38ac74" dependencies = [ "ibc-apps", "ibc-clients", "ibc-core", "ibc-core-host-cosmos", - "ibc-derive 0.4.0", + "ibc-derive", "ibc-primitives", ] [[package]] name = "ibc-app-transfer" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b177b343385d9654d99be4709b5ed1574d41f91dfa4044b2d26d688be4179d7c" dependencies = [ "ibc-app-transfer-types", "ibc-core", @@ -2349,7 +2353,9 @@ dependencies = [ [[package]] name = "ibc-app-transfer-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95f92a3eda225e5c86e7bb6501c95986583ac541c4369d3c528349d81390f947" dependencies = [ "derive_more", "displaydoc", @@ -2362,14 +2368,18 @@ dependencies = [ [[package]] name = "ibc-apps" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4be40d55ed2dea9f2d05b902a3586f20850c723e4bdbfc4fb0ebe7a66ca5e40" dependencies = [ "ibc-app-transfer", ] [[package]] name = "ibc-client-tendermint" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119aa5873214228bf69bded3f20022b9ae1bc35b6841d295afcd73e53db05ccf" dependencies = [ "ibc-client-tendermint-types", "ibc-core-client", @@ -2385,7 +2395,9 @@ dependencies = [ [[package]] name = "ibc-client-tendermint-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f21679016931b332b295a761e65cc122dc6fbfb98444148b681ad3aaa474665" dependencies = [ "bytes", "displaydoc", @@ -2403,14 +2415,18 @@ dependencies = [ [[package]] name = "ibc-clients" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c660323e93107a136aa3dbc412b7fa2eafd315c2fe71184096a43800f8ca5" dependencies = [ "ibc-client-tendermint", ] [[package]] name = "ibc-core" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "100d9d0aa67432c5078a8a1c818e3fc990a193be6d35ed0abeda5b340d16c1da" dependencies = [ "ibc-core-channel", "ibc-core-client", @@ -2424,7 +2440,9 @@ dependencies = [ [[package]] name = "ibc-core-channel" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebaa37629ac029f914dfe552ab5dad01ddb240ec885ed0ae68221cbea4e9bfc" dependencies = [ "ibc-core-channel-types", "ibc-core-client", @@ -2439,7 +2457,9 @@ dependencies = [ [[package]] name = "ibc-core-channel-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2ba72c56c411b1e0ce6dc3f5e1fa1de9e6c84891f425b7be8a9e1705964378" dependencies = [ "derive_more", "displaydoc", @@ -2458,7 +2478,9 @@ dependencies = [ [[package]] name = "ibc-core-client" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c4fac8e05201795073dee8c93d5afe9dfeac9aec2412b4a2b0c5f0d1e1d725" dependencies = [ "ibc-core-client-context", "ibc-core-client-types", @@ -2471,7 +2493,9 @@ dependencies = [ [[package]] name = "ibc-core-client-context" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b82abd9489021730d59ab2d00e9438d3711e8e78ecba4d083b64f833301682b" dependencies = [ "derive_more", "displaydoc", @@ -2479,7 +2503,7 @@ dependencies = [ "ibc-core-commitment-types", "ibc-core-handler-types", "ibc-core-host-types", - "ibc-derive 0.4.0", + "ibc-derive", "ibc-primitives", "prost 0.12.1", "subtle-encoding", @@ -2488,7 +2512,9 @@ dependencies = [ [[package]] name = "ibc-core-client-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafdbf6db5dab4c8ad610b6940e23b4f8abd0a6ac5e8e2801415a95defd4a583" dependencies = [ "derive_more", "displaydoc", @@ -2504,7 +2530,9 @@ dependencies = [ [[package]] name = "ibc-core-commitment-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed4256b0216fc49024bac7e01c61b9bb055e31914ffe9ce6f468d7ce496a9357" dependencies = [ "derive_more", "displaydoc", @@ -2518,7 +2546,9 @@ dependencies = [ [[package]] name = "ibc-core-connection" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e237b70b9ba0177a4e59ac9048fffac2ac44c334703cc0ae403ad221450850" dependencies = [ "ibc-core-client", "ibc-core-connection-types", @@ -2530,7 +2560,9 @@ dependencies = [ [[package]] name = "ibc-core-connection-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca841416fa29626423917099092f3698ae2735074cb3fe42936ddf6b2ccbf2f7" dependencies = [ "derive_more", "displaydoc", @@ -2547,7 +2579,9 @@ dependencies = [ [[package]] name = "ibc-core-handler" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47e5e5a006aa0fc87ec3f5fb1e0ef6dd5aeea5079fa927d799d526c44329987" dependencies = [ "ibc-core-channel", "ibc-core-client", @@ -2561,7 +2595,9 @@ dependencies = [ [[package]] name = "ibc-core-handler-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3d59a8a5eb2069530c42783b4fef63472a89e0e9242334351df1bb58aaf542" dependencies = [ "derive_more", "displaydoc", @@ -2581,7 +2617,9 @@ dependencies = [ [[package]] name = "ibc-core-host" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aa63c895c0e5a75e42fe859b8fd4250c12bfa8b9c6b114f94c927ecfad38a03" dependencies = [ "derive_more", "displaydoc", @@ -2599,7 +2637,9 @@ dependencies = [ [[package]] name = "ibc-core-host-cosmos" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a325862af6c20b0df3d27c072a2d802a7232dc1666214d738cdfbd9a9c99720" dependencies = [ "derive_more", "displaydoc", @@ -2622,7 +2662,9 @@ dependencies = [ [[package]] name = "ibc-core-host-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616955da310febbe93c0569a2feebd9f57cafed3eee5a56b0c3bb953a75f6089" dependencies = [ "derive_more", "displaydoc", @@ -2632,7 +2674,9 @@ dependencies = [ [[package]] name = "ibc-core-router" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31fe115da73e0616bdb44400fa6b11ca251648d070c4ff419d58e27804d30243" dependencies = [ "derive_more", "displaydoc", @@ -2646,7 +2690,9 @@ dependencies = [ [[package]] name = "ibc-core-router-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d1fbb0bbbdeafa7ac989ba1693ed46d22e0e3eb0bdae478544e31157a4fdba6" dependencies = [ "derive_more", "displaydoc", @@ -2660,16 +2706,6 @@ dependencies = [ "tendermint", ] -[[package]] -name = "ibc-derive" -version = "0.4.0" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "ibc-derive" version = "0.4.0" @@ -2684,7 +2720,9 @@ dependencies = [ [[package]] name = "ibc-primitives" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5edea4685267fd68514c87e7aa3a62712340c4cff6903f088a9ab571428a08a" dependencies = [ "derive_more", "displaydoc", @@ -2713,7 +2751,9 @@ dependencies = [ [[package]] name = "ibc-testkit" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f550c91648f3db6474880e18cd2bd294096a99b30621aa01a9059b71e3612d98" dependencies = [ "bytes", "derive_more", @@ -3357,7 +3397,7 @@ dependencies = [ "ethbridge-structs", "eyre", "ibc", - "ibc-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ibc-derive", "ibc-testkit", "ics23", "impl-num-traits", diff --git a/wasm_for_tests/wasm_source/Cargo.lock b/wasm_for_tests/wasm_source/Cargo.lock index 5b56bae4fa..7fe9190e24 100644 --- a/wasm_for_tests/wasm_source/Cargo.lock +++ b/wasm_for_tests/wasm_source/Cargo.lock @@ -2328,19 +2328,23 @@ dependencies = [ [[package]] name = "ibc" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "429b6aca6624a9364878e28c90311438c2621a8270942d80732b2651ac38ac74" dependencies = [ "ibc-apps", "ibc-clients", "ibc-core", "ibc-core-host-cosmos", - "ibc-derive 0.4.0", + "ibc-derive", "ibc-primitives", ] [[package]] name = "ibc-app-transfer" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b177b343385d9654d99be4709b5ed1574d41f91dfa4044b2d26d688be4179d7c" dependencies = [ "ibc-app-transfer-types", "ibc-core", @@ -2349,7 +2353,9 @@ dependencies = [ [[package]] name = "ibc-app-transfer-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95f92a3eda225e5c86e7bb6501c95986583ac541c4369d3c528349d81390f947" dependencies = [ "derive_more", "displaydoc", @@ -2362,14 +2368,18 @@ dependencies = [ [[package]] name = "ibc-apps" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4be40d55ed2dea9f2d05b902a3586f20850c723e4bdbfc4fb0ebe7a66ca5e40" dependencies = [ "ibc-app-transfer", ] [[package]] name = "ibc-client-tendermint" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119aa5873214228bf69bded3f20022b9ae1bc35b6841d295afcd73e53db05ccf" dependencies = [ "ibc-client-tendermint-types", "ibc-core-client", @@ -2385,7 +2395,9 @@ dependencies = [ [[package]] name = "ibc-client-tendermint-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f21679016931b332b295a761e65cc122dc6fbfb98444148b681ad3aaa474665" dependencies = [ "bytes", "displaydoc", @@ -2403,14 +2415,18 @@ dependencies = [ [[package]] name = "ibc-clients" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c660323e93107a136aa3dbc412b7fa2eafd315c2fe71184096a43800f8ca5" dependencies = [ "ibc-client-tendermint", ] [[package]] name = "ibc-core" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "100d9d0aa67432c5078a8a1c818e3fc990a193be6d35ed0abeda5b340d16c1da" dependencies = [ "ibc-core-channel", "ibc-core-client", @@ -2424,7 +2440,9 @@ dependencies = [ [[package]] name = "ibc-core-channel" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebaa37629ac029f914dfe552ab5dad01ddb240ec885ed0ae68221cbea4e9bfc" dependencies = [ "ibc-core-channel-types", "ibc-core-client", @@ -2439,7 +2457,9 @@ dependencies = [ [[package]] name = "ibc-core-channel-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2ba72c56c411b1e0ce6dc3f5e1fa1de9e6c84891f425b7be8a9e1705964378" dependencies = [ "derive_more", "displaydoc", @@ -2458,7 +2478,9 @@ dependencies = [ [[package]] name = "ibc-core-client" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c4fac8e05201795073dee8c93d5afe9dfeac9aec2412b4a2b0c5f0d1e1d725" dependencies = [ "ibc-core-client-context", "ibc-core-client-types", @@ -2471,7 +2493,9 @@ dependencies = [ [[package]] name = "ibc-core-client-context" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b82abd9489021730d59ab2d00e9438d3711e8e78ecba4d083b64f833301682b" dependencies = [ "derive_more", "displaydoc", @@ -2479,7 +2503,7 @@ dependencies = [ "ibc-core-commitment-types", "ibc-core-handler-types", "ibc-core-host-types", - "ibc-derive 0.4.0", + "ibc-derive", "ibc-primitives", "prost 0.12.1", "subtle-encoding", @@ -2488,7 +2512,9 @@ dependencies = [ [[package]] name = "ibc-core-client-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafdbf6db5dab4c8ad610b6940e23b4f8abd0a6ac5e8e2801415a95defd4a583" dependencies = [ "derive_more", "displaydoc", @@ -2504,7 +2530,9 @@ dependencies = [ [[package]] name = "ibc-core-commitment-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed4256b0216fc49024bac7e01c61b9bb055e31914ffe9ce6f468d7ce496a9357" dependencies = [ "derive_more", "displaydoc", @@ -2518,7 +2546,9 @@ dependencies = [ [[package]] name = "ibc-core-connection" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e237b70b9ba0177a4e59ac9048fffac2ac44c334703cc0ae403ad221450850" dependencies = [ "ibc-core-client", "ibc-core-connection-types", @@ -2530,7 +2560,9 @@ dependencies = [ [[package]] name = "ibc-core-connection-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca841416fa29626423917099092f3698ae2735074cb3fe42936ddf6b2ccbf2f7" dependencies = [ "derive_more", "displaydoc", @@ -2547,7 +2579,9 @@ dependencies = [ [[package]] name = "ibc-core-handler" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47e5e5a006aa0fc87ec3f5fb1e0ef6dd5aeea5079fa927d799d526c44329987" dependencies = [ "ibc-core-channel", "ibc-core-client", @@ -2561,7 +2595,9 @@ dependencies = [ [[package]] name = "ibc-core-handler-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3d59a8a5eb2069530c42783b4fef63472a89e0e9242334351df1bb58aaf542" dependencies = [ "derive_more", "displaydoc", @@ -2581,7 +2617,9 @@ dependencies = [ [[package]] name = "ibc-core-host" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aa63c895c0e5a75e42fe859b8fd4250c12bfa8b9c6b114f94c927ecfad38a03" dependencies = [ "derive_more", "displaydoc", @@ -2599,7 +2637,9 @@ dependencies = [ [[package]] name = "ibc-core-host-cosmos" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a325862af6c20b0df3d27c072a2d802a7232dc1666214d738cdfbd9a9c99720" dependencies = [ "derive_more", "displaydoc", @@ -2622,7 +2662,9 @@ dependencies = [ [[package]] name = "ibc-core-host-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616955da310febbe93c0569a2feebd9f57cafed3eee5a56b0c3bb953a75f6089" dependencies = [ "derive_more", "displaydoc", @@ -2632,7 +2674,9 @@ dependencies = [ [[package]] name = "ibc-core-router" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31fe115da73e0616bdb44400fa6b11ca251648d070c4ff419d58e27804d30243" dependencies = [ "derive_more", "displaydoc", @@ -2646,7 +2690,9 @@ dependencies = [ [[package]] name = "ibc-core-router-types" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d1fbb0bbbdeafa7ac989ba1693ed46d22e0e3eb0bdae478544e31157a4fdba6" dependencies = [ "derive_more", "displaydoc", @@ -2660,16 +2706,6 @@ dependencies = [ "tendermint", ] -[[package]] -name = "ibc-derive" -version = "0.4.0" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "ibc-derive" version = "0.4.0" @@ -2684,7 +2720,9 @@ dependencies = [ [[package]] name = "ibc-primitives" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5edea4685267fd68514c87e7aa3a62712340c4cff6903f088a9ab571428a08a" dependencies = [ "derive_more", "displaydoc", @@ -2713,7 +2751,9 @@ dependencies = [ [[package]] name = "ibc-testkit" -version = "0.48.0" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f550c91648f3db6474880e18cd2bd294096a99b30621aa01a9059b71e3612d98" dependencies = [ "bytes", "derive_more", @@ -3357,7 +3397,7 @@ dependencies = [ "ethbridge-structs", "eyre", "ibc", - "ibc-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ibc-derive", "ibc-testkit", "ics23", "impl-num-traits", From 10779f08199329f8720353361fa21afa302d9a0d Mon Sep 17 00:00:00 2001 From: yito88 Date: Mon, 27 Nov 2023 20:49:11 +0100 Subject: [PATCH 076/175] add changelog --- .../unreleased/improvements/2153-revert-chain-id-format.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/2153-revert-chain-id-format.md diff --git a/.changelog/unreleased/improvements/2153-revert-chain-id-format.md b/.changelog/unreleased/improvements/2153-revert-chain-id-format.md new file mode 100644 index 0000000000..d3ca2c0a15 --- /dev/null +++ b/.changelog/unreleased/improvements/2153-revert-chain-id-format.md @@ -0,0 +1,2 @@ +- Revert the chain ID format by upgrading ibc-rs to 0.48.1 + ([\#2153](https://github.com/anoma/namada/issues/2153)) \ No newline at end of file From 686c0d8ee4afebe36e84e53b8d3030317b67263b Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 27 Nov 2023 14:57:22 -0500 Subject: [PATCH 077/175] fix more comments and docstrings --- proof_of_stake/src/lib.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index e87b4caec4..da1051bfb3 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -1018,8 +1018,6 @@ where let tokens_pre = read_validator_stake(storage, params, validator, epoch)?; - // tracing::debug!("VALIDATOR STAKE BEFORE UPDATE: {}", tokens_pre); - let tokens_post = tokens_pre .change() .checked_add(&token_change) @@ -1547,7 +1545,6 @@ where S: StorageRead, { let handle = validator_set_positions_handle(); - // handle.get_position(storage, &epoch, validator, params) handle.get_data_handler().at(&epoch).get(storage, validator) } @@ -4437,7 +4434,11 @@ where Ok(()) } -/// Process slashes NEW +/// Process enqueued slashes that were discovered earlier. This function is +/// called upon a new epoch. The final slash rate considering according to the +/// cubic slashing rate is computed. Then, each slash is recorded in storage +/// along with its computed rate, and stake is deducted from the affected +/// validators. pub fn process_slashes( storage: &mut S, current_epoch: Epoch, From a179344368b3177063c1cd01ad383c94df1c158b Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 27 Nov 2023 16:07:24 -0500 Subject: [PATCH 078/175] fix slashing in `bond_amounts_for_rewards` --- proof_of_stake/src/lib.rs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 5aa6fb6f07..9253368634 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -3301,6 +3301,9 @@ where if !amounts.is_empty() { let slashes = find_validator_slashes(storage, &bond_id.validator)?; + let redelegated_bonded = + delegator_redelegated_bonds_handle(&bond_id.source) + .at(&bond_id.validator); // Apply slashes for (&ep, amounts) in amounts.iter_mut() { @@ -3318,7 +3321,32 @@ where .cloned() .collect::>(); - *amount = apply_list_slashes(¶ms, &list_slashes, *amount); + let slash_epoch_filter = + |e: Epoch| e + params.slash_processing_epoch_offset() <= ep; + + let redelegated_bonds = + redelegated_bonded.at(&start).collect_map(storage)?; + + let result_fold = fold_and_slash_redelegated_bonds( + storage, + ¶ms, + &redelegated_bonds, + start, + &list_slashes, + slash_epoch_filter, + ); + + let total_not_redelegated = + *amount - result_fold.total_redelegated; + + let after_not_redelegated = apply_list_slashes( + ¶ms, + &list_slashes, + total_not_redelegated, + ); + + *amount = + after_not_redelegated + result_fold.total_after_slashing; } } } From 5a3af44cd12a83c4f2fe1e0172ed0ab49d7b0c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 28 Nov 2023 07:56:49 +0100 Subject: [PATCH 079/175] fixup! Merge branch 'tomas/fst-epoch-start-height' (#1993) --- apps/src/lib/node/ledger/storage/mod.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/src/lib/node/ledger/storage/mod.rs b/apps/src/lib/node/ledger/storage/mod.rs index 99cf99389d..3d4b86b215 100644 --- a/apps/src/lib/node/ledger/storage/mod.rs +++ b/apps/src/lib/node/ledger/storage/mod.rs @@ -492,8 +492,7 @@ mod tests { let hash = BlockHash::default(); let height = BlockHeight(1); storage.begin_block(hash, height)?; - // Epoch 1 - storage.block.epoch = storage.block.epoch.next(); + // Epoch 0 storage.block.pred_epochs.new_epoch(height); let mut batch = PersistentStorage::batch(); for (height, key, write_type) in blocks_write_type.clone() { @@ -592,7 +591,6 @@ mod tests { .write(&key, types::encode(&value)) .expect("write failed"); - storage.block.epoch = storage.block.epoch.next(); storage.block.pred_epochs.new_epoch(new_epoch_start); let batch = PersistentStorage::batch(); storage.commit_block(batch).expect("commit failed"); From a1116967836d81f6efab14e731293a9bdbc454c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 28 Nov 2023 08:33:08 +0100 Subject: [PATCH 080/175] fixup! Merge branch 'bat/feature/disable-oracle-gov' (#1764) --- apps/src/lib/node/ledger/shell/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 275a3b4eff..b849c2c5c1 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -1018,10 +1018,10 @@ where ); return; } - let config = EthereumOracleConfig::read(&self.wl_storage).expect( - "The oracle config must be present in storage, since the \ - bridge is enabled", - ); + let Some(config) = EthereumOracleConfig::read(&self.wl_storage) else { + tracing::info!("Not starting oracle as the Ethereum bridge config couldn't be found in storage"); + return; + }; let active = if !self.wl_storage.ethbridge_queries().is_bridge_active() { if !changed_keys From 1a321b28213177582740a9a814bb22558d10abee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 28 Nov 2023 08:38:20 +0100 Subject: [PATCH 081/175] fixup! Merge branch 'tiago/outdated-eth-nonces' (#2035) --- apps/src/lib/node/ledger/shell/mod.rs | 12 +++++++++--- apps/src/lib/node/ledger/shell/prepare_proposal.rs | 10 +++++----- apps/src/lib/node/ledger/shell/process_proposal.rs | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 7735ba4ee3..8e33bf87bb 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -2410,7 +2410,7 @@ mod shell_tests { // sent transfers to namada nonce to 5 .transfers_to_namada = InnerEthEventsQueue::new_at(5.into()); - let (protocol_key, _, _) = wallet::defaults::validator_keys(); + let (protocol_key, _) = wallet::defaults::validator_keys(); // only bad events { @@ -2432,7 +2432,10 @@ mod shell_tests { .sign(&protocol_key, shell.chain_id.clone()) .to_bytes(); let rsp = shell.mempool_validate(&tx, Default::default()); - assert!(rsp.code != 0, "Validation should have failed"); + assert!( + rsp.code != ErrorCodes::Ok.into(), + "Validation should have failed" + ); } // at least one good event @@ -2459,7 +2462,10 @@ mod shell_tests { .sign(&protocol_key, shell.chain_id.clone()) .to_bytes(); let rsp = shell.mempool_validate(&tx, Default::default()); - assert!(rsp.code == 0, "Validation should have passed"); + assert!( + rsp.code == ErrorCodes::Ok.into(), + "Validation should have passed" + ); } } diff --git a/apps/src/lib/node/ledger/shell/prepare_proposal.rs b/apps/src/lib/node/ledger/shell/prepare_proposal.rs index 8c3a4958ed..6a4ca7ab2d 100644 --- a/apps/src/lib/node/ledger/shell/prepare_proposal.rs +++ b/apps/src/lib/node/ledger/shell/prepare_proposal.rs @@ -1393,7 +1393,7 @@ mod test_prepare_proposal { // sent transfers to namada nonce to 5 .transfers_to_namada = InnerEthEventsQueue::new_at(5.into()); - let (protocol_key, _, _) = wallet::defaults::validator_keys(); + let (protocol_key, _) = wallet::defaults::validator_keys(); let validator_addr = wallet::defaults::validator_address(); // test an extension containing solely events with @@ -1418,12 +1418,12 @@ mod test_prepare_proposal { .sign(&protocol_key, shell.chain_id.clone()) .to_bytes(); let req = RequestPrepareProposal { - txs: vec![tx], + txs: vec![tx.into()], ..Default::default() }; let proposed_txs = shell.prepare_proposal(req).txs.into_iter().map(|tx_bytes| { - Tx::try_from(tx_bytes.as_slice()).expect("Test failed") + Tx::try_from(tx_bytes.as_ref()).expect("Test failed") }); // since no events with valid nonces are contained in the vote // extension, we drop it from the proposal @@ -1466,12 +1466,12 @@ mod test_prepare_proposal { .sign(&protocol_key, shell.chain_id.clone()) .to_bytes(); let req = RequestPrepareProposal { - txs: vec![tx], + txs: vec![tx.into()], ..Default::default() }; let proposed_txs = shell.prepare_proposal(req).txs.into_iter().map(|tx_bytes| { - Tx::try_from(tx_bytes.as_slice()).expect("Test failed") + Tx::try_from(tx_bytes.as_ref()).expect("Test failed") }); // find the event with the good nonce let mut ext = 'ext: { diff --git a/apps/src/lib/node/ledger/shell/process_proposal.rs b/apps/src/lib/node/ledger/shell/process_proposal.rs index 531e4edb24..7fad385eda 100644 --- a/apps/src/lib/node/ledger/shell/process_proposal.rs +++ b/apps/src/lib/node/ledger/shell/process_proposal.rs @@ -2136,7 +2136,7 @@ mod test_process_proposal { // sent transfers to namada nonce to 5 .transfers_to_namada = InnerEthEventsQueue::new_at(5.into()); - let (protocol_key, _, _) = wallet::defaults::validator_keys(); + let (protocol_key, _) = wallet::defaults::validator_keys(); // only bad events { From dacad96a28a4f23082676203398395df0a05fb84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 28 Nov 2023 16:36:00 +0100 Subject: [PATCH 082/175] deps: upgrade ledger-namada version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a760f39701..fa028678e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3253,7 +3253,7 @@ dependencies = [ [[package]] name = "ledger-namada-rs" version = "0.0.1" -source = "git+https://github.com/heliaxdev/ledger-namada?rev=7e861c440de0fdabaf51e30d97f5c8736be348f3#7e861c440de0fdabaf51e30d97f5c8736be348f3" +source = "git+https://github.com/Zondax/ledger-namada?tag=v0.0.11#4fd882b84af7c93a1332c32a4e3d705fd63f09ab" dependencies = [ "bincode", "byteorder", diff --git a/Cargo.toml b/Cargo.toml index c1fa8f6d03..bab96fb846 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,7 +86,7 @@ index-set = {git = "https://github.com/heliaxdev/index-set", tag = "v0.8.0", fea itertools = "0.10.0" k256 = { version = "0.13.0", default-features = false, features = ["ecdsa", "pkcs8", "precomputed-tables", "serde", "std"]} lazy_static = "1.4.0" -ledger-namada-rs = { git = "https://github.com/heliaxdev/ledger-namada", rev = "7e861c440de0fdabaf51e30d97f5c8736be348f3" } +ledger-namada-rs = { git = "https://github.com/Zondax/ledger-namada", tag = "v0.0.11" } ledger-transport-hid = "0.10.0" libc = "0.2.97" libloading = "0.7.2" From e0d1dd1d10970721b825a111a9486abc2d2fdc7b Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 27 Nov 2023 17:21:09 -0500 Subject: [PATCH 083/175] query for available rewards from a bond --- apps/src/lib/cli.rs | 66 +++++++++++++- apps/src/lib/cli/client.rs | 11 +++ apps/src/lib/client/rpc.rs | 25 ++++++ .../lib/node/ledger/shell/finalize_block.rs | 53 +++++++++++- proof_of_stake/src/lib.rs | 85 ++++++++++++++++--- sdk/src/args.rs | 11 +++ sdk/src/queries/vp/pos.rs | 23 ++++- tests/src/e2e/ledger_tests.rs | 63 +++++++++++++- 8 files changed, 319 insertions(+), 18 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 3bb7f5c7ad..cb935ad7ef 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -260,6 +260,7 @@ pub mod cmds { .subcommand(QueryPgf::def().display_order(5)) .subcommand(QueryValidatorState::def().display_order(5)) .subcommand(QueryCommissionRate::def().display_order(5)) + .subcommand(QueryRewards::def().display_order(5)) .subcommand(QueryMetaData::def().display_order(5)) // Actions .subcommand(SignTx::def().display_order(6)) @@ -315,6 +316,7 @@ pub mod cmds { let query_bonded_stake = Self::parse_with_ctx(matches, QueryBondedStake); let query_slashes = Self::parse_with_ctx(matches, QuerySlashes); + let query_rewards = Self::parse_with_ctx(matches, QueryRewards); let query_delegations = Self::parse_with_ctx(matches, QueryDelegations); let query_find_validator = @@ -369,6 +371,7 @@ pub mod cmds { .or(query_bonds) .or(query_bonded_stake) .or(query_slashes) + .or(query_rewards) .or(query_delegations) .or(query_find_validator) .or(query_result) @@ -463,6 +466,7 @@ pub mod cmds { QueryProtocolParameters(QueryProtocolParameters), QueryPgf(QueryPgf), QueryValidatorState(QueryValidatorState), + QueryRewards(QueryRewards), SignTx(SignTx), GenIbcShieldedTransafer(GenIbcShieldedTransafer), } @@ -1844,6 +1848,28 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct QueryRewards(pub args::QueryRewards); + + impl SubCmd for QueryRewards { + const CMD: &'static str = "rewards"; + + fn parse(matches: &ArgMatches) -> Option { + matches + .subcommand_matches(Self::CMD) + .map(|matches| QueryRewards(args::QueryRewards::parse(matches))) + } + + fn def() -> App { + App::new(Self::CMD) + .about( + "Query the latest rewards available to claim for a given \ + delegation (or self-bond).", + ) + .add_args::>() + } + } + #[derive(Clone, Debug)] pub struct QueryDelegations(pub args::QueryDelegations); @@ -4826,8 +4852,8 @@ pub mod args { .arg(VALIDATOR.def().help("Validator address.")) .arg(SOURCE_OPT.def().help( "Source address for withdrawing from delegations. For \ - withdrawing from self-bonds, the validator is also the \ - source.", + withdrawing from self-bonds, this arg does not need to \ + be supplied.", )) } } @@ -5552,6 +5578,42 @@ pub mod args { } } + impl CliToSdk> for QueryRewards { + fn to_sdk(self, ctx: &mut Context) -> QueryRewards { + QueryRewards:: { + query: self.query.to_sdk(ctx), + validator: ctx.borrow_chain_or_exit().get(&self.validator), + source: self.source.map(|x| ctx.borrow_chain_or_exit().get(&x)), + } + } + } + + impl Args for QueryRewards { + fn parse(matches: &ArgMatches) -> Self { + let query = Query::parse(matches); + let source = SOURCE_OPT.parse(matches); + let validator = VALIDATOR.parse(matches); + Self { + query, + source, + validator, + } + } + + fn def(app: App) -> App { + app.add_args::>() + .arg(SOURCE_OPT.def().help( + "Source address for the rewards query. For self-bonds, \ + this arg does not need to be supplied.", + )) + .arg( + VALIDATOR + .def() + .help("Validator address for the rewards query."), + ) + } + } + impl Args for QueryDelegations { fn parse(matches: &ArgMatches) -> Self { let query = Query::parse(matches); diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index d4f81483fb..273407c0af 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -469,6 +469,17 @@ impl CliApi { let namada = ctx.to_sdk(&client, io); rpc::query_slashes(&namada, args).await; } + Sub::QueryRewards(QueryRewards(mut args)) => { + let client = client.unwrap_or_else(|| { + C::from_tendermint_address( + &mut args.query.ledger_address, + ) + }); + client.wait_until_node_is_synced(io).await?; + let args = args.to_sdk(&mut ctx); + let namada = ctx.to_sdk(&client, io); + rpc::query_and_print_rewards(&namada, args).await; + } Sub::QueryDelegations(QueryDelegations(mut args)) => { let client = client.unwrap_or_else(|| { C::from_tendermint_address( diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index f696a0602b..d07c53e487 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -1895,6 +1895,17 @@ pub async fn query_validator_state< ) } +/// Query and return the available reward tokens corresponding to the bond +pub async fn query_rewards( + client: &C, + source: &Option
      , + validator: &Address, +) -> token::Amount { + unwrap_client_response::( + RPC.vp().pos().rewards(client, validator, source).await, + ) +} + /// Query a validator's state information pub async fn query_and_print_validator_state<'a>( context: &impl Namada<'a>, @@ -2206,6 +2217,20 @@ pub async fn query_slashes<'a, N: Namada<'a>>( } } +pub async fn query_and_print_rewards<'a, N: Namada<'a>>( + context: &N, + args: args::QueryRewards, +) { + let (source, validator) = (args.source, args.validator); + + let rewards = query_rewards(context.client(), &source, &validator).await; + display_line!( + context.io(), + "Current rewards available for claim: {} NAM", + rewards.to_string_native() + ); +} + pub async fn query_delegations<'a, N: Namada<'a>>( context: &N, args: args::QueryDelegations, diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 257b766a03..a603a8b76d 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -2176,7 +2176,7 @@ mod test_finalize_block { assert!(rp3 > rp4); } - /// A unit test for PoS inflationary rewards claiming + /// A unit test for PoS inflationary rewards claiming and querying #[test] fn test_claim_rewards() { let (mut shell, _recv, _, _) = setup_with_cfg(SetupCfg { @@ -2252,6 +2252,15 @@ mod test_finalize_block { advance_epoch(&mut shell, &pkh1, &votes, None); total_rewards += inflation; + // Query the available rewards + let query_rewards = namada_proof_of_stake::query_reward_tokens( + &shell.wl_storage, + None, + &validator.address, + current_epoch, + ) + .unwrap(); + // Claim the rewards from the initial epoch let reward_1 = namada_proof_of_stake::claim_reward_tokens( &mut shell.wl_storage, @@ -2261,8 +2270,20 @@ mod test_finalize_block { ) .unwrap(); total_claimed += reward_1; + assert_eq!(reward_1, query_rewards); assert!(is_reward_equal_enough(total_rewards, total_claimed, 1)); + // Query the available rewards again and check that it is 0 now after + // the claim + let query_rewards = namada_proof_of_stake::query_reward_tokens( + &shell.wl_storage, + None, + &validator.address, + current_epoch, + ) + .unwrap(); + assert_eq!(query_rewards, token::Amount::zero()); + // Try a claim the next block and ensure we get 0 tokens back next_block_for_inflation( &mut shell, @@ -2297,6 +2318,15 @@ mod test_finalize_block { .unwrap(); assert_eq!(unbond_res.sum, unbond_amount); + // Query the available rewards + let query_rewards = namada_proof_of_stake::query_reward_tokens( + &shell.wl_storage, + None, + &validator.address, + current_epoch, + ) + .unwrap(); + let rew = namada_proof_of_stake::claim_reward_tokens( &mut shell.wl_storage, None, @@ -2306,6 +2336,7 @@ mod test_finalize_block { .unwrap(); total_claimed += rew; assert!(is_reward_equal_enough(total_rewards, total_claimed, 3)); + assert_eq!(query_rewards, rew); // Check the bond amounts for rewards up thru the withdrawable epoch let withdraw_epoch = current_epoch + params.withdrawable_epoch_offset(); @@ -2365,6 +2396,15 @@ mod test_finalize_block { .unwrap(); assert_eq!(withdraw_amount, unbond_amount); + // Query the available rewards + let query_rewards = namada_proof_of_stake::query_reward_tokens( + &shell.wl_storage, + None, + &validator.address, + current_epoch, + ) + .unwrap(); + // Claim tokens let reward_2 = namada_proof_of_stake::claim_reward_tokens( &mut shell.wl_storage, @@ -2374,6 +2414,7 @@ mod test_finalize_block { ) .unwrap(); total_claimed += reward_2; + assert_eq!(query_rewards, reward_2); // The total rewards claimed should be approximately equal to the total // minted inflation, minus (unbond_amount / initial_stake) * rewards @@ -2384,6 +2425,16 @@ mod test_finalize_block { let token_uncertainty = uncertainty * lost_rewards; let token_diff = total_claimed + lost_rewards - total_rewards; assert!(token_diff < token_uncertainty); + + // Query the available rewards to check that they are 0 + let query_rewards = namada_proof_of_stake::query_reward_tokens( + &shell.wl_storage, + None, + &validator.address, + current_epoch, + ) + .unwrap(); + assert_eq!(query_rewards, token::Amount::zero()); } /// A unit test for PoS inflationary rewards claiming diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 9253368634..c373e05354 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -6089,29 +6089,25 @@ where Ok(()) } -/// Claim rewards -pub fn claim_reward_tokens( - storage: &mut S, - source: Option<&Address>, +/// Compute the current available rewards amount due only to existing bonds. +/// This does not include pending rewards held in the rewards counter due to +/// unbonds and redelegations. +pub fn compute_current_rewards_from_bonds( + storage: &S, + source: &Address, validator: &Address, current_epoch: Epoch, ) -> storage_api::Result where - S: StorageRead + StorageWrite, + S: StorageRead, { - tracing::debug!("Claiming rewards in epoch {current_epoch}"); - - let rewards_products = validator_rewards_products_handle(validator); - let source = source.cloned().unwrap_or_else(|| validator.clone()); - tracing::debug!("Source {} --> Validator {}", source, validator); - if current_epoch == Epoch::default() { // Nothing to claim in the first epoch return Ok(token::Amount::zero()); } let last_claim_epoch = - get_last_reward_claim_epoch(storage, &source, validator)?; + get_last_reward_claim_epoch(storage, source, validator)?; if let Some(last_epoch) = last_claim_epoch { if last_epoch == current_epoch { // Already claimed in this epoch @@ -6137,6 +6133,8 @@ where claim_start, claim_end, )?; + + let rewards_products = validator_rewards_products_handle(validator); for (ep, bond_amount) in bond_amounts { debug_assert!(ep >= claim_start); debug_assert!(ep <= claim_end); @@ -6145,6 +6143,32 @@ where reward_tokens += reward; } + Ok(reward_tokens) +} + +/// Claim available rewards, triggering an immediate transfer of tokens from the +/// PoS account to the source address. +pub fn claim_reward_tokens( + storage: &mut S, + source: Option<&Address>, + validator: &Address, + current_epoch: Epoch, +) -> storage_api::Result +where + S: StorageRead + StorageWrite, +{ + tracing::debug!("Claiming rewards in epoch {current_epoch}"); + + let source = source.cloned().unwrap_or_else(|| validator.clone()); + tracing::debug!("Source {} --> Validator {}", source, validator); + + let mut reward_tokens = compute_current_rewards_from_bonds( + storage, + &source, + validator, + current_epoch, + )?; + // Add reward tokens tallied during previous withdrawals reward_tokens += take_rewards_from_counter(storage, &source, validator)?; @@ -6158,6 +6182,30 @@ where Ok(reward_tokens) } +/// Query the amount of available reward tokens for a given bond. +pub fn query_reward_tokens( + storage: &S, + source: Option<&Address>, + validator: &Address, + current_epoch: Epoch, +) -> storage_api::Result +where + S: StorageRead, +{ + let source = source.cloned().unwrap_or_else(|| validator.clone()); + let rewards_from_bonds = compute_current_rewards_from_bonds( + storage, + &source, + validator, + current_epoch, + )?; + + let rewards_from_counter = + read_rewards_counter(storage, &source, validator)?; + + Ok(rewards_from_bonds + rewards_from_counter) +} + /// Get the last epoch in which rewards were claimed from storage, if any pub fn get_last_reward_claim_epoch( storage: &S, @@ -6184,6 +6232,19 @@ where storage.write(&key, epoch) } +/// Read the current token value in the rewards counter. +fn read_rewards_counter( + storage: &S, + source: &Address, + validator: &Address, +) -> storage_api::Result +where + S: StorageRead, +{ + let key = rewards_counter_key(source, validator); + Ok(storage.read::(&key)?.unwrap_or_default()) +} + /// Add tokens to a rewards counter. fn add_rewards_to_counter( storage: &mut S, diff --git a/sdk/src/args.rs b/sdk/src/args.rs index 3359c08ec4..c1a39e44a2 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -1764,6 +1764,17 @@ pub struct QuerySlashes { pub validator: Option, } +/// Query PoS rewards +#[derive(Clone, Debug)] +pub struct QueryRewards { + /// Common query args + pub query: Query, + /// Address of the source + pub source: Option, + /// Address of the validator + pub validator: C::Address, +} + /// Query PoS delegations #[derive(Clone, Debug)] pub struct QueryDelegations { diff --git a/sdk/src/queries/vp/pos.rs b/sdk/src/queries/vp/pos.rs index 8a464179f1..e5af46acd9 100644 --- a/sdk/src/queries/vp/pos.rs +++ b/sdk/src/queries/vp/pos.rs @@ -19,7 +19,7 @@ use namada_proof_of_stake::types::{ use namada_proof_of_stake::{ self, bond_amount, bond_handle, find_all_enqueued_slashes, find_all_slashes, find_delegation_validators, find_delegations, - read_all_validator_addresses, + query_reward_tokens, read_all_validator_addresses, read_below_capacity_validator_set_addresses_with_stake, read_consensus_validator_set_addresses_with_stake, read_pos_params, read_total_stake, read_validator_description, @@ -86,6 +86,9 @@ router! {POS, ( "bond" / [source: Address] / [validator: Address] / [epoch: opt Epoch] ) -> token::Amount = bond, + ( "rewards" / [validator: Address] / [source: opt Address] ) + -> token::Amount = rewards, + ( "bond_with_slashing" / [source: Address] / [validator: Address] / [epoch: opt Epoch] ) -> token::Amount = bond_with_slashing, @@ -498,6 +501,24 @@ where Ok(total) } +fn rewards( + ctx: RequestCtx<'_, D, H, V, T>, + validator: Address, + source: Option
      , +) -> storage_api::Result +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + let current_epoch = ctx.wl_storage.storage.last_epoch; + query_reward_tokens( + ctx.wl_storage, + source.as_ref(), + &validator, + current_epoch, + ) +} + fn bonds_and_unbonds( ctx: RequestCtx<'_, D, H, V, T>, source: Option
      , diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 9f584e2b24..a8ffd1a1a3 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -1220,9 +1220,31 @@ fn pos_rewards() -> Result<()> { client.exp_string("Transaction is valid.")?; client.assert_success(); + // Query the current rewards for the validator self-bond + let tx_args = vec![ + "rewards", + "--validator", + "validator-0", + "--node", + &validator_0_rpc, + ]; + let mut client = + run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; + let (_, res) = client + .exp_regex(r"Current rewards available for claim: [0-9\.]+ NAM") + .unwrap(); + let words = res.split(' ').collect::>(); + let res = words[words.len() - 2]; + let mut last_amount = token::Amount::from_str( + res.split(' ').last().unwrap(), + NATIVE_MAX_DECIMAL_PLACES, + ) + .unwrap(); + client.assert_success(); + // Wait some epochs - let epoch = get_epoch(&test, &validator_0_rpc)?; - let wait_epoch = epoch + 4_u64; + let mut last_epoch = get_epoch(&test, &validator_0_rpc)?; + let wait_epoch = last_epoch + 4_u64; let start = Instant::now(); let loop_timeout = Duration::new(40, 0); @@ -1230,12 +1252,46 @@ fn pos_rewards() -> Result<()> { if Instant::now().duration_since(start) > loop_timeout { panic!("Timed out waiting for epoch: {}", wait_epoch); } + let epoch = epoch_sleep(&test, &validator_0_rpc, 40)?; if dbg!(epoch) >= wait_epoch { break; } + + // Query the current rewards for the validator self-bond and see that it + // grows + let tx_args = vec![ + "rewards", + "--validator", + "validator-0", + "--node", + &validator_0_rpc, + ]; + let mut client = + run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; + let (_, res) = client + .exp_regex(r"Current rewards available for claim: [0-9\.]+ NAM") + .unwrap(); + let words = res.split(' ').collect::>(); + let res = words[words.len() - 2]; + let amount = token::Amount::from_str( + res.split(' ').last().unwrap(), + NATIVE_MAX_DECIMAL_PLACES, + ) + .unwrap(); + client.assert_success(); + + if epoch > last_epoch { + assert!(amount > last_amount); + } else { + assert_eq!(amount, last_amount); + } + + last_amount = amount; + last_epoch = epoch; } + // Query the balance of the validator account let query_balance_args = vec![ "balance", "--owner", @@ -1254,6 +1310,7 @@ fn pos_rewards() -> Result<()> { .unwrap(); client.assert_success(); + // Claim rewards let tx_args = vec![ "claim-rewards", "--validator", @@ -1269,6 +1326,8 @@ fn pos_rewards() -> Result<()> { client.exp_string("Transaction is valid.")?; client.assert_success(); + // Query the validator balance again and check that the balance has grown + // after claiming let query_balance_args = vec![ "balance", "--owner", From e21b5dcaee49adc440a431bb8c18ee01aa479c74 Mon Sep 17 00:00:00 2001 From: brentstone Date: Tue, 28 Nov 2023 14:30:16 -0500 Subject: [PATCH 084/175] improve RPC error logging --- apps/src/lib/client/rpc.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index d07c53e487..c23fc5fe2c 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -2653,8 +2653,8 @@ pub async fn query_governance_parameters< fn unwrap_client_response( response: Result, ) -> T { - response.unwrap_or_else(|_err| { - eprintln!("Error in the query"); + response.unwrap_or_else(|err| { + eprintln!("Error in the query: {:?}", err); cli::safe_exit(1) }) } From 4c94f61a0f3b393769e3af317bb8c21c87290cd6 Mon Sep 17 00:00:00 2001 From: brentstone Date: Tue, 28 Nov 2023 14:32:41 -0500 Subject: [PATCH 085/175] changelog: add #2217 --- .changelog/unreleased/improvements/2217-upgrade-pos-rewards.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/unreleased/improvements/2217-upgrade-pos-rewards.md diff --git a/.changelog/unreleased/improvements/2217-upgrade-pos-rewards.md b/.changelog/unreleased/improvements/2217-upgrade-pos-rewards.md new file mode 100644 index 0000000000..b198a23962 --- /dev/null +++ b/.changelog/unreleased/improvements/2217-upgrade-pos-rewards.md @@ -0,0 +1,3 @@ +- Implement a CLI query for available rewards from a bond, + and improve the bond amount for rewards computation + ([\#2217](https://github.com/anoma/namada/pull/2217)) \ No newline at end of file From 7453f412637e0f2d0512df0ad6fe9e250b3a17a1 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Tue, 28 Nov 2023 19:23:01 +0200 Subject: [PATCH 086/175] Removed uses of lifetimes in the SDKs Namada trait and NamadaImpl implementation. --- apps/src/bin/namada-client/main.rs | 2 +- apps/src/bin/namada-relayer/main.rs | 2 +- apps/src/lib/bench_utils.rs | 33 ++- apps/src/lib/cli/client.rs | 206 +++++++++--------- apps/src/lib/cli/context.rs | 14 +- apps/src/lib/cli/relayer.rs | 42 ++-- apps/src/lib/client/rpc.rs | 131 +++++------ apps/src/lib/client/tx.rs | 86 ++++---- .../lib/node/ledger/shell/testing/client.rs | 4 +- benches/native_vps.rs | 4 +- benches/txs.rs | 13 +- sdk/src/args.rs | 88 ++++---- sdk/src/eth_bridge/bridge_pool.rs | 20 +- sdk/src/eth_bridge/validator_set.rs | 6 +- sdk/src/lib.rs | 82 ++++--- sdk/src/masp.rs | 12 +- sdk/src/rpc.rs | 22 +- sdk/src/signing.rs | 42 ++-- sdk/src/tx.rs | 156 ++++++------- 19 files changed, 476 insertions(+), 489 deletions(-) diff --git a/apps/src/bin/namada-client/main.rs b/apps/src/bin/namada-client/main.rs index 770dcf5367..9fdea9c51d 100644 --- a/apps/src/bin/namada-client/main.rs +++ b/apps/src/bin/namada-client/main.rs @@ -16,7 +16,7 @@ async fn main() -> Result<()> { CliApi::handle_client_command::( None, cli::namada_client_cli()?, - &CliIo, + CliIo, ) .await } diff --git a/apps/src/bin/namada-relayer/main.rs b/apps/src/bin/namada-relayer/main.rs index f9d98a2a4e..1eb2679e28 100644 --- a/apps/src/bin/namada-relayer/main.rs +++ b/apps/src/bin/namada-relayer/main.rs @@ -14,5 +14,5 @@ async fn main() -> Result<()> { let cmd = cli::namada_relayer_cli()?; // run the CLI - CliApi::handle_relayer_command::(None, cmd, &CliIo).await + CliApi::handle_relayer_command::(None, cmd, CliIo).await } diff --git a/apps/src/lib/bench_utils.rs b/apps/src/lib/bench_utils.rs index 551bf49abd..59c6c5cbdb 100644 --- a/apps/src/lib/bench_utils.rs +++ b/apps/src/lib/bench_utils.rs @@ -93,7 +93,7 @@ pub use namada_sdk::tx::{ TX_WITHDRAW_WASM, VP_USER_WASM, VP_VALIDATOR_WASM, }; use namada_sdk::wallet::Wallet; -use namada_sdk::NamadaImpl; +use namada_sdk::{Namada, NamadaImpl}; use namada_test_utils::tx_data::TxWriteData; use rand_core::OsRng; use sha2::{Digest, Sha256}; @@ -819,11 +819,11 @@ impl Default for BenchShieldedCtx { impl BenchShieldedCtx { pub fn generate_masp_tx( - &mut self, + mut self, amount: Amount, source: TransferSource, target: TransferTarget, - ) -> Tx { + ) -> (Self, Tx) { let denominated_amount = DenominatedAmount { amount, denom: 0.into(), @@ -840,12 +840,13 @@ impl BenchShieldedCtx { &[], )) .unwrap(); + let native_token = self.shell.wl_storage.storage.native_token.clone(); let namada = NamadaImpl::native_new( - &self.shell, - &mut self.wallet, - &mut self.shielded, - &StdIo, - self.shell.wl_storage.storage.native_token.clone(), + self.shell, + self.wallet, + self.shielded, + StdIo, + native_token, ); let shielded = async_runtime .block_on( @@ -877,7 +878,7 @@ impl BenchShieldedCtx { ) }); - self.shell.generate_tx( + let tx = namada.client().generate_tx( TX_TRANSFER_WASM, Transfer { source: source.effective_address(), @@ -890,6 +891,18 @@ impl BenchShieldedCtx { shielded, None, vec![&defaults::albert_keypair()], - ) + ); + let NamadaImpl { + client, + wallet, + shielded, + .. + } = namada; + let ctx = Self { + shielded: shielded.into_inner(), + shell: client, + wallet: wallet.into_inner(), + }; + (ctx, tx) } } diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index d4f81483fb..45a58d8132 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -12,7 +12,7 @@ impl CliApi { pub async fn handle_client_command( client: Option, cmd: cli::NamadaClient, - io: &IO, + io: IO, ) -> Result<()> where C: CliClient, @@ -29,9 +29,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); let dry_run = args.tx.dry_run || args.tx.dry_run_wrapper; tx::submit_custom(&namada, args).await?; @@ -42,7 +42,7 @@ impl CliApi { .save() .unwrap_or_else(|err| eprintln!("{}", err)); } else { - io.println( + namada.io().println( "Transaction dry run. No addresses have been \ saved.", ) @@ -54,9 +54,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_transfer(&namada, args).await?; } Sub::TxIbcTransfer(TxIbcTransfer(mut args)) => { @@ -65,9 +65,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_ibc_transfer(&namada, args).await?; } Sub::TxUpdateAccount(TxUpdateAccount(mut args)) => { @@ -76,9 +76,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_update_account(&namada, args).await?; } Sub::TxInitAccount(TxInitAccount(mut args)) => { @@ -87,9 +87,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); let dry_run = args.tx.dry_run || args.tx.dry_run_wrapper; tx::submit_init_account(&namada, args).await?; @@ -100,7 +100,7 @@ impl CliApi { .save() .unwrap_or_else(|err| eprintln!("{}", err)); } else { - io.println( + namada.io().println( "Transaction dry run. No addresses have been \ saved.", ) @@ -112,18 +112,18 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); let cli::context::ChainContext { - mut wallet, + wallet, mut config, - mut shielded, + shielded, native_token, } = ctx.take_chain_or_exit(); let namada = NamadaImpl::native_new( - &client, - &mut wallet, - &mut shielded, + client, + wallet, + shielded, io, native_token, ); @@ -136,9 +136,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_init_proposal(&namada, args).await?; } Sub::TxVoteProposal(TxVoteProposal(mut args)) => { @@ -147,9 +147,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_vote_proposal(&namada, args).await?; } Sub::TxRevealPk(TxRevealPk(mut args)) => { @@ -158,9 +158,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_reveal_pk(&namada, args).await?; } Sub::Bond(Bond(mut args)) => { @@ -169,9 +169,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_bond(&namada, args).await?; } Sub::Unbond(Unbond(mut args)) => { @@ -180,9 +180,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_unbond(&namada, args).await?; } Sub::Withdraw(Withdraw(mut args)) => { @@ -191,9 +191,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_withdraw(&namada, args).await?; } Sub::ClaimRewards(ClaimRewards(mut args)) => { @@ -202,9 +202,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_claim_rewards(&namada, args).await?; } Sub::Redelegate(Redelegate(mut args)) => { @@ -213,9 +213,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_redelegate(&namada, args).await?; } Sub::TxCommissionRateChange(TxCommissionRateChange( @@ -226,9 +226,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_validator_commission_change(&namada, args) .await?; } @@ -240,18 +240,18 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); let cli::context::ChainContext { - mut wallet, + wallet, mut config, - mut shielded, + shielded, native_token, } = ctx.take_chain_or_exit(); let namada = NamadaImpl::native_new( - &client, - &mut wallet, - &mut shielded, + client, + wallet, + shielded, io, native_token, ); @@ -268,9 +268,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_validator_metadata_change(&namada, args) .await?; } @@ -282,9 +282,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_bridge_pool_tx(&namada, args).await?; } Sub::TxUnjailValidator(TxUnjailValidator(mut args)) => { @@ -293,9 +293,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_unjail_validator(&namada, args).await?; } Sub::TxDeactivateValidator(TxDeactivateValidator( @@ -306,9 +306,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_deactivate_validator(&namada, args).await?; } Sub::TxReactivateValidator(TxReactivateValidator( @@ -319,9 +319,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_reactivate_validator(&namada, args).await?; } Sub::TxUpdateStewardCommission( @@ -332,9 +332,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_update_steward_commission(&namada, args) .await?; } @@ -344,9 +344,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::submit_resign_steward(&namada, args).await?; } // Ledger queries @@ -354,8 +354,8 @@ impl CliApi { let client = client.unwrap_or_else(|| { C::from_tendermint_address(&mut args.ledger_address) }); - client.wait_until_node_is_synced(io).await?; - let namada = ctx.to_sdk(&client, io); + client.wait_until_node_is_synced(&io).await?; + let namada = ctx.to_sdk(client, io); rpc::query_and_print_epoch(&namada).await; } Sub::QueryValidatorState(QueryValidatorState(mut args)) => { @@ -364,9 +364,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_and_print_validator_state(&namada, args) .await; } @@ -376,9 +376,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_transfers(&namada, args).await; } Sub::QueryConversions(QueryConversions(mut args)) => { @@ -387,17 +387,17 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_conversions(&namada, args).await; } Sub::QueryBlock(QueryBlock(mut args)) => { let client = client.unwrap_or_else(|| { C::from_tendermint_address(&mut args.ledger_address) }); - client.wait_until_node_is_synced(io).await?; - let namada = ctx.to_sdk(&client, io); + client.wait_until_node_is_synced(&io).await?; + let namada = ctx.to_sdk(client, io); rpc::query_block(&namada).await; } Sub::QueryBalance(QueryBalance(mut args)) => { @@ -406,9 +406,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_balance(&namada, args).await; } Sub::QueryBonds(QueryBonds(mut args)) => { @@ -417,9 +417,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_bonds(&namada, args) .await .expect("expected successful query of bonds"); @@ -430,9 +430,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_bonded_stake(&namada, args).await; } Sub::QueryCommissionRate(QueryCommissionRate(mut args)) => { @@ -441,9 +441,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_and_print_commission_rate(&namada, args) .await; } @@ -453,9 +453,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_and_print_metadata(&namada, args).await; } Sub::QuerySlashes(QuerySlashes(mut args)) => { @@ -464,9 +464,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_slashes(&namada, args).await; } Sub::QueryDelegations(QueryDelegations(mut args)) => { @@ -475,9 +475,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_delegations(&namada, args).await; } Sub::QueryFindValidator(QueryFindValidator(mut args)) => { @@ -486,9 +486,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_find_validator(&namada, args).await; } Sub::QueryResult(QueryResult(mut args)) => { @@ -497,9 +497,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_result(&namada, args).await; } Sub::QueryRawBytes(QueryRawBytes(mut args)) => { @@ -508,9 +508,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_raw_bytes(&namada, args).await; } Sub::QueryProposal(QueryProposal(mut args)) => { @@ -519,9 +519,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_proposal(&namada, args).await; } Sub::QueryProposalResult(QueryProposalResult(mut args)) => { @@ -530,9 +530,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_proposal_result(&namada, args).await; } Sub::QueryProtocolParameters(QueryProtocolParameters( @@ -543,9 +543,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_protocol_parameters(&namada, args).await; } Sub::QueryPgf(QueryPgf(mut args)) => { @@ -554,9 +554,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_pgf(&namada, args).await; } Sub::QueryAccount(QueryAccount(mut args)) => { @@ -565,9 +565,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_account(&namada, args).await; } Sub::SignTx(SignTx(mut args)) => { @@ -576,9 +576,9 @@ impl CliApi { &mut args.tx.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::sign_tx(&namada, args).await?; } Sub::GenIbcShieldedTransafer(GenIbcShieldedTransafer( @@ -589,9 +589,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); tx::gen_ibc_shielded_transfer(&namada, args).await?; } } @@ -625,9 +625,9 @@ impl CliApi { let mut ledger_address = args.ledger_address.clone(); let client = C::from_tendermint_address(&mut ledger_address); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::epoch_sleep(&namada, args).await; } Utils::ValidateGenesisTemplates(ValidateGenesisTemplates( diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 51c8ba4eac..92a1d2eaa1 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -165,22 +165,18 @@ impl Context { } /// Make an implementation of Namada from this object and parameters. - pub fn to_sdk<'a, C, IO>( - &'a mut self, - client: &'a C, - io: &'a IO, - ) -> impl Namada + pub fn to_sdk(self, client: C, io: IO) -> impl Namada where C: namada::ledger::queries::Client + Sync, IO: Io, { - let chain_ctx = self.borrow_mut_chain_or_exit(); + let chain_ctx = self.take_chain_or_exit(); NamadaImpl::native_new( client, - &mut chain_ctx.wallet, - &mut chain_ctx.shielded, + chain_ctx.wallet, + chain_ctx.shielded, io, - chain_ctx.native_token.clone(), + chain_ctx.native_token, ) } } diff --git a/apps/src/lib/cli/relayer.rs b/apps/src/lib/cli/relayer.rs index 1dee9b784e..7dc360db4f 100644 --- a/apps/src/lib/cli/relayer.rs +++ b/apps/src/lib/cli/relayer.rs @@ -12,7 +12,7 @@ impl CliApi { pub async fn handle_relayer_command( client: Option, cmd: cli::NamadaRelayer, - io: &impl Io, + io: impl Io, ) -> Result<()> where C: CliClient, @@ -29,9 +29,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); bridge_pool::recommend_batch(&namada, args).await?; } } @@ -45,9 +45,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk_ctxless(); - bridge_pool::construct_proof(&client, io, args).await?; + bridge_pool::construct_proof(&client, &io, args).await?; } EthBridgePoolWithoutCtx::RelayProof(RelayProof(mut args)) => { let client = client.unwrap_or_else(|| { @@ -55,12 +55,12 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let eth_client = get_eth_rpc_client(&args.eth_rpc_endpoint).await; let args = args.to_sdk_ctxless(); bridge_pool::relay_bridge_pool_proof( - eth_client, &client, io, args, + eth_client, &client, &io, args, ) .await?; } @@ -70,8 +70,8 @@ impl CliApi { let client = client.unwrap_or_else(|| { C::from_tendermint_address(&mut query.ledger_address) }); - client.wait_until_node_is_synced(io).await?; - bridge_pool::query_bridge_pool(&client, io).await?; + client.wait_until_node_is_synced(&io).await?; + bridge_pool::query_bridge_pool(&client, &io).await?; } EthBridgePoolWithoutCtx::QuerySigned( QuerySignedBridgePool(mut query), @@ -79,8 +79,8 @@ impl CliApi { let client = client.unwrap_or_else(|| { C::from_tendermint_address(&mut query.ledger_address) }); - client.wait_until_node_is_synced(io).await?; - bridge_pool::query_signed_bridge_pool(&client, io).await?; + client.wait_until_node_is_synced(&io).await?; + bridge_pool::query_signed_bridge_pool(&client, &io).await?; } EthBridgePoolWithoutCtx::QueryRelays(QueryRelayProgress( mut query, @@ -88,8 +88,8 @@ impl CliApi { let client = client.unwrap_or_else(|| { C::from_tendermint_address(&mut query.ledger_address) }); - client.wait_until_node_is_synced(io).await?; - bridge_pool::query_relay_progress(&client, io).await?; + client.wait_until_node_is_synced(&io).await?; + bridge_pool::query_relay_progress(&client, &io).await?; } }, cli::NamadaRelayer::ValidatorSet(sub) => match sub { @@ -101,10 +101,10 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk_ctxless(); validator_set::query_bridge_validator_set( - &client, io, args, + &client, &io, args, ) .await?; } @@ -116,10 +116,10 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk_ctxless(); validator_set::query_governnace_validator_set( - &client, io, args, + &client, &io, args, ) .await?; } @@ -131,10 +131,10 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk_ctxless(); validator_set::query_validator_set_update_proof( - &client, io, args, + &client, &io, args, ) .await?; } @@ -146,12 +146,12 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let eth_client = get_eth_rpc_client(&args.eth_rpc_endpoint).await; let args = args.to_sdk_ctxless(); validator_set::relay_validator_set_update( - eth_client, &client, io, args, + eth_client, &client, &io, args, ) .await?; } diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index f696a0602b..d0e97bc234 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -65,8 +65,8 @@ use crate::facade::tendermint_rpc::error::Error as TError; /// /// If a response is not delivered until `deadline`, we exit the cli with an /// error. -pub async fn query_tx_status<'a>( - namada: &impl Namada<'a>, +pub async fn query_tx_status( + namada: &impl Namada, status: namada_sdk::rpc::TxEventQuery<'_>, deadline: Instant, ) -> Event { @@ -76,14 +76,14 @@ pub async fn query_tx_status<'a>( } /// Query and print the epoch of the last committed block -pub async fn query_and_print_epoch<'a>(context: &impl Namada<'a>) -> Epoch { +pub async fn query_and_print_epoch(context: &impl Namada) -> Epoch { let epoch = rpc::query_epoch(context.client()).await.unwrap(); display_line!(context.io(), "Last committed epoch: {}", epoch); epoch } /// Query the last committed block -pub async fn query_block<'a>(context: &impl Namada<'a>) { +pub async fn query_block(context: &impl Namada) { let block = namada_sdk::rpc::query_block(context.client()) .await .unwrap(); @@ -114,8 +114,8 @@ pub async fn query_results( } /// Query the specified accepted transfers from the ledger -pub async fn query_transfers<'a>( - context: &impl Namada<'a>, +pub async fn query_transfers( + context: &impl Namada, args: args::QueryTransfers, ) { let query_token = args.token; @@ -250,7 +250,7 @@ pub async fn query_transfers<'a>( } /// Query the raw bytes of given storage key -pub async fn query_raw_bytes<'a, N: Namada<'a>>( +pub async fn query_raw_bytes( context: &N, args: args::QueryRawBytes, ) { @@ -281,10 +281,7 @@ pub async fn query_raw_bytes<'a, N: Namada<'a>>( } /// Query token balance(s) -pub async fn query_balance<'a>( - context: &impl Namada<'a>, - args: args::QueryBalance, -) { +pub async fn query_balance(context: &impl Namada, args: args::QueryBalance) { // Query the balances of shielded or transparent account types depending on // the CLI arguments match &args.owner { @@ -309,8 +306,8 @@ pub async fn query_balance<'a>( } /// Query token balance(s) -pub async fn query_transparent_balance<'a>( - context: &impl Namada<'a>, +pub async fn query_transparent_balance( + context: &impl Namada, args: args::QueryBalance, ) { let prefix = Key::from( @@ -386,8 +383,8 @@ pub async fn query_transparent_balance<'a>( } /// Query the token pinned balance(s) -pub async fn query_pinned_balance<'a>( - context: &impl Namada<'a>, +pub async fn query_pinned_balance( + context: &impl Namada, args: args::QueryBalance, ) { // Map addresses to token names @@ -549,8 +546,8 @@ pub async fn query_pinned_balance<'a>( } } -async fn print_balances<'a>( - context: &impl Namada<'a>, +async fn print_balances( + context: &impl Namada, balances: impl Iterator, token: Option<&Address>, target: Option<&Address>, @@ -629,8 +626,8 @@ async fn print_balances<'a>( } } -async fn lookup_token_alias<'a>( - context: &impl Namada<'a>, +async fn lookup_token_alias( + context: &impl Namada, token: &Address, owner: &Address, ) -> String { @@ -649,8 +646,8 @@ async fn lookup_token_alias<'a>( } /// Returns pairs of token alias and token address -async fn query_tokens<'a>( - context: &impl Namada<'a>, +async fn query_tokens( + context: &impl Namada, base_token: Option<&Address>, owner: Option<&Address>, ) -> BTreeMap { @@ -708,8 +705,8 @@ async fn query_tokens<'a>( tokens } -async fn get_ibc_denom_alias<'a>( - context: &impl Namada<'a>, +async fn get_ibc_denom_alias( + context: &impl Namada, ibc_denom: impl AsRef, ) -> String { let wallet = context.wallet().await; @@ -729,10 +726,7 @@ async fn get_ibc_denom_alias<'a>( } /// Query Proposals -pub async fn query_proposal<'a>( - context: &impl Namada<'a>, - args: args::QueryProposal, -) { +pub async fn query_proposal(context: &impl Namada, args: args::QueryProposal) { let current_epoch = query_and_print_epoch(context).await; if let Some(id) = args.proposal_id { @@ -781,8 +775,8 @@ pub async fn query_proposal_by_id( } /// Query token shielded balance(s) -pub async fn query_shielded_balance<'a>( - context: &impl Namada<'a>, +pub async fn query_shielded_balance( + context: &impl Namada, args: args::QueryBalance, ) { // Used to control whether balances for all keys or a specific key are @@ -1050,8 +1044,8 @@ pub async fn query_shielded_balance<'a>( } } -pub async fn print_decoded_balance<'a>( - context: &impl Namada<'a>, +pub async fn print_decoded_balance( + context: &impl Namada, decoded_balance: MaspAmount, epoch: Epoch, ) { @@ -1072,8 +1066,8 @@ pub async fn print_decoded_balance<'a>( } } -pub async fn print_decoded_balance_with_epoch<'a>( - context: &impl Namada<'a>, +pub async fn print_decoded_balance_with_epoch( + context: &impl Namada, decoded_balance: MaspAmount, ) { let tokens = context @@ -1110,8 +1104,8 @@ pub async fn get_token_balance( .unwrap() } -pub async fn query_proposal_result<'a>( - context: &impl Namada<'a>, +pub async fn query_proposal_result( + context: &impl Namada, args: args::QueryProposalResult, ) { if args.proposal_id.is_some() { @@ -1250,10 +1244,7 @@ pub async fn query_proposal_result<'a>( } } -pub async fn query_account<'a>( - context: &impl Namada<'a>, - args: args::QueryAccount, -) { +pub async fn query_account(context: &impl Namada, args: args::QueryAccount) { let account = rpc::get_account_info(context.client(), &args.owner) .await .unwrap(); @@ -1269,7 +1260,7 @@ pub async fn query_account<'a>( } } -pub async fn query_pgf<'a>(context: &impl Namada<'a>, _args: args::QueryPgf) { +pub async fn query_pgf(context: &impl Namada, _args: args::QueryPgf) { let stewards = query_pgf_stewards(context.client()).await; let fundings = query_pgf_fundings(context.client()).await; @@ -1320,8 +1311,8 @@ pub async fn query_pgf<'a>(context: &impl Namada<'a>, _args: args::QueryPgf) { } } -pub async fn query_protocol_parameters<'a>( - context: &impl Namada<'a>, +pub async fn query_protocol_parameters( + context: &impl Namada, _args: args::QueryProtocolParameters, ) { let governance_parameters = @@ -1578,8 +1569,8 @@ pub async fn query_pgf_parameters( unwrap_client_response::(RPC.vp().pgf().parameters(client).await) } -pub async fn query_and_print_unbonds<'a>( - context: &impl Namada<'a>, +pub async fn query_and_print_unbonds( + context: &impl Namada, source: &Address, validator: &Address, ) { @@ -1634,8 +1625,8 @@ pub async fn query_withdrawable_tokens< } /// Query PoS bond(s) and unbond(s) -pub async fn query_bonds<'a>( - context: &impl Namada<'a>, +pub async fn query_bonds( + context: &impl Namada, args: args::QueryBonds, ) -> std::io::Result<()> { let epoch = query_and_print_epoch(context).await; @@ -1758,7 +1749,7 @@ pub async fn query_bonds<'a>( } /// Query PoS bonded stake -pub async fn query_bonded_stake<'a, N: Namada<'a>>( +pub async fn query_bonded_stake( context: &N, args: args::QueryBondedStake, ) { @@ -1896,8 +1887,8 @@ pub async fn query_validator_state< } /// Query a validator's state information -pub async fn query_and_print_validator_state<'a>( - context: &impl Namada<'a>, +pub async fn query_and_print_validator_state( + context: &impl Namada, args: args::QueryValidatorState, ) { let validator = args.validator; @@ -1941,8 +1932,8 @@ pub async fn query_and_print_validator_state<'a>( } /// Query PoS validator's commission rate information -pub async fn query_and_print_commission_rate<'a>( - context: &impl Namada<'a>, +pub async fn query_and_print_commission_rate( + context: &impl Namada, args: args::QueryCommissionRate, ) { let validator = args.validator; @@ -1974,8 +1965,8 @@ pub async fn query_and_print_commission_rate<'a>( } /// Query PoS validator's metadata -pub async fn query_and_print_metadata<'a>( - context: &impl Namada<'a>, +pub async fn query_and_print_metadata( + context: &impl Namada, args: args::QueryMetaData, ) { let validator = args.validator; @@ -2051,10 +2042,7 @@ pub async fn query_and_print_metadata<'a>( } /// Query PoS slashes -pub async fn query_slashes<'a, N: Namada<'a>>( - context: &N, - args: args::QuerySlashes, -) { +pub async fn query_slashes(context: &N, args: args::QuerySlashes) { match args.validator { Some(validator) => { let validator = validator; @@ -2206,7 +2194,7 @@ pub async fn query_slashes<'a, N: Namada<'a>>( } } -pub async fn query_delegations<'a, N: Namada<'a>>( +pub async fn query_delegations( context: &N, args: args::QueryDelegations, ) { @@ -2227,7 +2215,7 @@ pub async fn query_delegations<'a, N: Namada<'a>>( } } -pub async fn query_find_validator<'a, N: Namada<'a>>( +pub async fn query_find_validator( context: &N, args: args::QueryFindValidator, ) { @@ -2264,7 +2252,7 @@ pub async fn query_find_validator<'a, N: Namada<'a>>( } /// Dry run a transaction -pub async fn dry_run_tx<'a, N: Namada<'a>>( +pub async fn dry_run_tx( context: &N, tx_bytes: Vec, ) -> Result<(), error::Error> @@ -2331,8 +2319,8 @@ pub async fn known_address( } /// Query for all conversions. -pub async fn query_conversions<'a>( - context: &impl Namada<'a>, +pub async fn query_conversions( + context: &impl Namada, args: args::QueryConversions, ) { // The chosen token type of the conversions @@ -2408,8 +2396,8 @@ pub async fn query_conversion( } /// Query a wasm code hash -pub async fn query_wasm_code_hash<'a>( - context: &impl Namada<'a>, +pub async fn query_wasm_code_hash( + context: &impl Namada, code_path: impl AsRef, ) -> Result { rpc::query_wasm_code_hash(context, code_path).await @@ -2443,8 +2431,8 @@ pub async fn query_storage_value_bytes< /// Query a range of storage values with a matching prefix and decode them with /// [`BorshDeserialize`]. Returns an iterator of the storage keys paired with /// their associated values. -pub async fn query_storage_prefix<'a, 'b, T>( - context: &'b impl Namada<'a>, +pub async fn query_storage_prefix<'b, T>( + context: &'b impl Namada, key: &storage::Key, ) -> Option> where @@ -2488,10 +2476,7 @@ pub async fn query_tx_response( /// Lookup the results of applying the specified transaction to the /// blockchain. -pub async fn query_result<'a>( - context: &impl Namada<'a>, - args: args::QueryResult, -) { +pub async fn query_result(context: &impl Namada, args: args::QueryResult) { // First try looking up application event pertaining to given hash. let tx_response = query_tx_response( context.client(), @@ -2529,7 +2514,7 @@ pub async fn query_result<'a>( } } -pub async fn epoch_sleep<'a>(context: &impl Namada<'a>, _args: args::Query) { +pub async fn epoch_sleep(context: &impl Namada, _args: args::Query) { let start_epoch = query_and_print_epoch(context).await; loop { tokio::time::sleep(core::time::Duration::from_secs(1)).await; @@ -2634,8 +2619,8 @@ fn unwrap_client_response( }) } -pub async fn compute_offline_proposal_votes<'a>( - context: &impl Namada<'a>, +pub async fn compute_offline_proposal_votes( + context: &impl Namada, proposal: &OfflineSignedProposal, votes: Vec, ) -> ProposalVotes { diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 0317ec43f3..a3610f9b7b 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -39,8 +39,8 @@ use crate::wallet::{gen_validator_keys, read_and_confirm_encryption_password}; /// Wrapper around `signing::aux_signing_data` that stores the optional /// disposable address to the wallet -pub async fn aux_signing_data<'a>( - context: &impl Namada<'a>, +pub async fn aux_signing_data( + context: &impl Namada, args: &args::Tx, owner: Option
      , default_signer: Option
      , @@ -69,8 +69,8 @@ pub async fn aux_signing_data<'a>( } // Sign the given transaction using a hardware wallet as a backup -pub async fn sign<'a>( - context: &impl Namada<'a>, +pub async fn sign( + context: &impl Namada, tx: &mut Tx, args: &args::Tx, signing_data: SigningTxData, @@ -200,8 +200,8 @@ pub async fn sign<'a>( } // Build a transaction to reveal the signer of the given transaction. -pub async fn submit_reveal_aux<'a>( - context: &impl Namada<'a>, +pub async fn submit_reveal_aux( + context: &impl Namada, args: args::Tx, address: &Address, ) -> Result<(), error::Error> { @@ -239,7 +239,7 @@ pub async fn submit_reveal_aux<'a>( Ok(()) } -pub async fn submit_bridge_pool_tx<'a, N: Namada<'a>>( +pub async fn submit_bridge_pool_tx( namada: &N, args: args::EthereumBridgePool, ) -> Result<(), error::Error> { @@ -263,7 +263,7 @@ pub async fn submit_bridge_pool_tx<'a, N: Namada<'a>>( Ok(()) } -pub async fn submit_custom<'a, N: Namada<'a>>( +pub async fn submit_custom( namada: &N, args: args::TxCustom, ) -> Result<(), error::Error> @@ -289,7 +289,7 @@ where Ok(()) } -pub async fn submit_update_account<'a, N: Namada<'a>>( +pub async fn submit_update_account( namada: &N, args: args::TxUpdateAccount, ) -> Result<(), error::Error> @@ -313,7 +313,7 @@ where Ok(()) } -pub async fn submit_init_account<'a, N: Namada<'a>>( +pub async fn submit_init_account( namada: &N, args: args::TxInitAccount, ) -> Result<(), error::Error> @@ -338,8 +338,8 @@ where Ok(()) } -pub async fn submit_change_consensus_key<'a>( - namada: &impl Namada<'a>, +pub async fn submit_change_consensus_key( + namada: &impl Namada, config: &mut crate::config::Config, args::ConsensusKeyChange { tx: tx_args, @@ -482,8 +482,8 @@ pub async fn submit_change_consensus_key<'a>( Ok(()) } -pub async fn submit_init_validator<'a>( - namada: &impl Namada<'a>, +pub async fn submit_init_validator( + namada: &impl Namada, config: &mut crate::config::Config, args::TxInitValidator { tx: tx_args, @@ -629,7 +629,7 @@ pub async fn submit_init_validator<'a>( } // Generate the validator keys let validator_keys = gen_validator_keys( - *namada.wallet_mut().await, + &mut *namada.wallet_mut().await, Some(eth_hot_pk.clone()), protocol_key, scheme, @@ -857,8 +857,8 @@ pub async fn submit_init_validator<'a>( Ok(()) } -pub async fn submit_transfer<'a>( - namada: &impl Namada<'a>, +pub async fn submit_transfer( + namada: &impl Namada, args: args::TxTransfer, ) -> Result<(), error::Error> { for _ in 0..2 { @@ -911,7 +911,7 @@ pub async fn submit_transfer<'a>( Ok(()) } -pub async fn submit_ibc_transfer<'a, N: Namada<'a>>( +pub async fn submit_ibc_transfer( namada: &N, args: args::TxIbcTransfer, ) -> Result<(), error::Error> @@ -935,7 +935,7 @@ where Ok(()) } -pub async fn submit_init_proposal<'a, N: Namada<'a>>( +pub async fn submit_init_proposal( namada: &N, args: args::InitProposal, ) -> Result<(), error::Error> @@ -1064,7 +1064,7 @@ where Ok(()) } -pub async fn submit_vote_proposal<'a, N: Namada<'a>>( +pub async fn submit_vote_proposal( namada: &N, args: args::VoteProposal, ) -> Result<(), error::Error> @@ -1144,7 +1144,7 @@ where Ok(()) } -pub async fn sign_tx<'a, N: Namada<'a>>( +pub async fn sign_tx( namada: &N, args::SignTx { tx: tx_args, @@ -1225,7 +1225,7 @@ where Ok(()) } -pub async fn submit_reveal_pk<'a, N: Namada<'a>>( +pub async fn submit_reveal_pk( namada: &N, args: args::RevealPk, ) -> Result<(), error::Error> @@ -1237,7 +1237,7 @@ where Ok(()) } -pub async fn submit_bond<'a, N: Namada<'a>>( +pub async fn submit_bond( namada: &N, args: args::Bond, ) -> Result<(), error::Error> @@ -1264,7 +1264,7 @@ where Ok(()) } -pub async fn submit_unbond<'a, N: Namada<'a>>( +pub async fn submit_unbond( namada: &N, args: args::Unbond, ) -> Result<(), error::Error> @@ -1290,7 +1290,7 @@ where Ok(()) } -pub async fn submit_withdraw<'a, N: Namada<'a>>( +pub async fn submit_withdraw( namada: &N, args: args::Withdraw, ) -> Result<(), error::Error> @@ -1314,7 +1314,7 @@ where Ok(()) } -pub async fn submit_claim_rewards<'a, N: Namada<'a>>( +pub async fn submit_claim_rewards( namada: &N, args: args::ClaimRewards, ) -> Result<(), error::Error> @@ -1338,7 +1338,7 @@ where Ok(()) } -pub async fn submit_redelegate<'a, N: Namada<'a>>( +pub async fn submit_redelegate( namada: &N, args: args::Redelegate, ) -> Result<(), error::Error> @@ -1361,7 +1361,7 @@ where Ok(()) } -pub async fn submit_validator_commission_change<'a, N: Namada<'a>>( +pub async fn submit_validator_commission_change( namada: &N, args: args::CommissionRateChange, ) -> Result<(), error::Error> @@ -1385,7 +1385,7 @@ where Ok(()) } -pub async fn submit_validator_metadata_change<'a, N: Namada<'a>>( +pub async fn submit_validator_metadata_change( namada: &N, args: args::MetaDataChange, ) -> Result<(), error::Error> @@ -1409,7 +1409,7 @@ where Ok(()) } -// pub async fn submit_change_consensus_key<'a, N: Namada<'a>>( +// pub async fn submit_change_consensus_key( // namada: &N, // args: args::ConsensusKeyChange, // ) -> Result<(), error::Error> @@ -1431,7 +1431,7 @@ where // Ok(()) // } -pub async fn submit_unjail_validator<'a, N: Namada<'a>>( +pub async fn submit_unjail_validator( namada: &N, args: args::TxUnjailValidator, ) -> Result<(), error::Error> @@ -1455,7 +1455,7 @@ where Ok(()) } -pub async fn submit_deactivate_validator<'a, N: Namada<'a>>( +pub async fn submit_deactivate_validator( namada: &N, args: args::TxDeactivateValidator, ) -> Result<(), error::Error> @@ -1479,7 +1479,7 @@ where Ok(()) } -pub async fn submit_reactivate_validator<'a, N: Namada<'a>>( +pub async fn submit_reactivate_validator( namada: &N, args: args::TxReactivateValidator, ) -> Result<(), error::Error> @@ -1503,7 +1503,7 @@ where Ok(()) } -pub async fn submit_update_steward_commission<'a, N: Namada<'a>>( +pub async fn submit_update_steward_commission( namada: &N, args: args::UpdateStewardCommission, ) -> Result<(), error::Error> @@ -1528,7 +1528,7 @@ where Ok(()) } -pub async fn submit_resign_steward<'a, N: Namada<'a>>( +pub async fn submit_resign_steward( namada: &N, args: args::ResignSteward, ) -> Result<(), error::Error> @@ -1553,8 +1553,8 @@ where } /// Save accounts initialized from a tx into the wallet, if any. -pub async fn save_initialized_accounts<'a>( - namada: &impl Namada<'a>, +pub async fn save_initialized_accounts( + namada: &impl Namada, args: &args::Tx, initialized_accounts: Vec
      , ) { @@ -1565,8 +1565,8 @@ pub async fn save_initialized_accounts<'a>( /// the tx has been successfully included into the mempool of a validator /// /// In the case of errors in any of those stages, an error message is returned -pub async fn broadcast_tx<'a>( - namada: &impl Namada<'a>, +pub async fn broadcast_tx( + namada: &impl Namada, to_broadcast: &TxBroadcastData, ) -> Result { tx::broadcast_tx(namada, to_broadcast).await @@ -1580,15 +1580,15 @@ pub async fn broadcast_tx<'a>( /// 3. The decrypted payload of the tx has been included on the blockchain. /// /// In the case of errors in any of those stages, an error message is returned -pub async fn submit_tx<'a>( - namada: &impl Namada<'a>, +pub async fn submit_tx( + namada: &impl Namada, to_broadcast: TxBroadcastData, ) -> Result { tx::submit_tx(namada, to_broadcast).await } -pub async fn gen_ibc_shielded_transfer<'a>( - context: &impl Namada<'a>, +pub async fn gen_ibc_shielded_transfer( + context: &impl Namada, args: args::GenIbcShieldedTransafer, ) -> Result<(), error::Error> { if let Some(shielded_transfer) = diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 5e4c04b07f..4343cf6a7d 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -48,7 +48,7 @@ pub fn run( rt.block_on(CliApi::handle_client_command( Some(node), cmd, - &TestingIo, + TestingIo, )) } Bin::Wallet => { @@ -84,7 +84,7 @@ pub fn run( rt.block_on(CliApi::handle_relayer_command( Some(node), cmd, - &TestingIo, + TestingIo, )) } } diff --git a/benches/native_vps.rs b/benches/native_vps.rs index fdaed5d1f9..448caa9b9c 100644 --- a/benches/native_vps.rs +++ b/benches/native_vps.rs @@ -495,7 +495,7 @@ fn setup_storage_for_masp_verification( .to_owned(); // Shield some tokens for Albert - let shield_tx = shielded_ctx.generate_masp_tx( + let (mut shielded_ctx, shield_tx) = shielded_ctx.generate_masp_tx( amount, TransferSource::Address(defaults::albert_address()), TransferTarget::PaymentAddress(albert_payment_addr), @@ -504,7 +504,7 @@ fn setup_storage_for_masp_verification( shielded_ctx.shell.wl_storage.commit_tx(); shielded_ctx.shell.commit(); - let signed_tx = match bench_name { + let (mut shielded_ctx, signed_tx) = match bench_name { "shielding" => shielded_ctx.generate_masp_tx( amount, TransferSource::Address(defaults::albert_address()), diff --git a/benches/txs.rs b/benches/txs.rs index 02d6c9c22d..b369aff3d7 100644 --- a/benches/txs.rs +++ b/benches/txs.rs @@ -83,16 +83,17 @@ fn transfer(c: &mut Criterion) { .to_owned(); // Shield some tokens for Albert - let shield_tx = shielded_ctx.generate_masp_tx( - amount, - TransferSource::Address(defaults::albert_address()), - TransferTarget::PaymentAddress(albert_payment_addr), - ); + let (mut shielded_ctx, shield_tx) = shielded_ctx + .generate_masp_tx( + amount, + TransferSource::Address(defaults::albert_address()), + TransferTarget::PaymentAddress(albert_payment_addr), + ); shielded_ctx.shell.execute_tx(&shield_tx); shielded_ctx.shell.wl_storage.commit_tx(); shielded_ctx.shell.commit(); - let signed_tx = match bench_name { + let (shielded_ctx, signed_tx) = match bench_name { "transparent" => shielded_ctx.generate_masp_tx( amount, TransferSource::Address(defaults::albert_address()), diff --git a/sdk/src/args.rs b/sdk/src/args.rs index 3359c08ec4..2eec2ee88a 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -175,9 +175,9 @@ impl TxCustom { impl TxCustom { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_custom(context, self).await @@ -281,9 +281,9 @@ impl TxTransfer { impl TxTransfer { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &mut self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_transfer(context, self).await @@ -395,9 +395,9 @@ impl TxIbcTransfer { impl TxIbcTransfer { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_ibc_transfer(context, self).await @@ -484,9 +484,9 @@ impl InitProposal { impl InitProposal { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { let current_epoch = rpc::query_epoch(context.client()).await?; @@ -641,9 +641,9 @@ impl VoteProposal { impl VoteProposal { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { let current_epoch = rpc::query_epoch(context.client()).await?; @@ -714,9 +714,9 @@ impl TxInitAccount { impl TxInitAccount { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_init_account(context, self).await @@ -832,9 +832,9 @@ impl TxUpdateAccount { impl TxUpdateAccount { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_update_account(context, self).await @@ -910,9 +910,9 @@ impl Bond { impl Bond { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_bond(context, self).await @@ -937,9 +937,9 @@ pub struct Unbond { impl Unbond { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<( crate::proto::Tx, SigningTxData, @@ -1010,9 +1010,9 @@ pub struct Redelegate { impl Redelegate { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData)> { tx::build_redelegation(context, self).await } @@ -1091,9 +1091,9 @@ impl RevealPk { impl RevealPk { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_reveal_pk(context, &self.tx, &self.public_key).await @@ -1175,9 +1175,9 @@ impl Withdraw { impl Withdraw { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_withdraw(context, self).await @@ -1212,9 +1212,9 @@ impl TxBuilder for ClaimRewards { impl ClaimRewards { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_claim_rewards(context, self).await @@ -1345,9 +1345,9 @@ impl CommissionRateChange { impl CommissionRateChange { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_validator_commission_change(context, self).await @@ -1404,9 +1404,9 @@ pub struct ConsensusKeyChange { // impl ConsensusKeyChange { // /// Build a transaction from this builder -// pub async fn build<'a>( +// pub async fn build( // &self, -// context: &impl Namada<'a>, +// context: &impl Namada, // ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, // Option)> { // tx::build_change_consensus_key(context, self).await @@ -1463,9 +1463,9 @@ impl MetaDataChange { impl MetaDataChange { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_validator_metadata_change(context, self).await @@ -1519,9 +1519,9 @@ impl UpdateStewardCommission { impl UpdateStewardCommission { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_update_steward_commission(context, self).await @@ -1568,9 +1568,9 @@ impl ResignSteward { impl ResignSteward { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_resign_steward(context, self).await @@ -1617,9 +1617,9 @@ impl TxUnjailValidator { impl TxUnjailValidator { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_unjail_validator(context, self).await @@ -1666,9 +1666,9 @@ impl TxDeactivateValidator { impl TxDeactivateValidator { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_deactivate_validator(context, self).await @@ -1715,9 +1715,9 @@ impl TxReactivateValidator { impl TxReactivateValidator { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( &self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { tx::build_reactivate_validator(context, self).await @@ -2288,9 +2288,9 @@ impl EthereumBridgePool { impl EthereumBridgePool { /// Build a transaction from this builder - pub async fn build<'a>( + pub async fn build( self, - context: &impl Namada<'a>, + context: &impl Namada, ) -> crate::error::Result<(crate::proto::Tx, SigningTxData, Option)> { bridge_pool::build_bridge_pool_tx(context, self).await diff --git a/sdk/src/eth_bridge/bridge_pool.rs b/sdk/src/eth_bridge/bridge_pool.rs index e682521987..efd2989d58 100644 --- a/sdk/src/eth_bridge/bridge_pool.rs +++ b/sdk/src/eth_bridge/bridge_pool.rs @@ -47,7 +47,7 @@ use crate::{ /// Craft a transaction that adds a transfer to the Ethereum bridge pool. pub async fn build_bridge_pool_tx( - context: &impl Namada<'_>, + context: &impl Namada, args::EthereumBridgePool { tx: tx_args, nut, @@ -113,7 +113,7 @@ pub async fn build_bridge_pool_tx( /// Perform client validation checks on a Bridge pool transfer. #[allow(clippy::too_many_arguments)] async fn validate_bridge_pool_tx( - context: &impl Namada<'_>, + context: &impl Namada, force: bool, nut: bool, asset: EthAddress, @@ -316,7 +316,7 @@ struct BridgePoolResponse<'pool> { /// Query the contents of the Ethereum bridge pool. /// Prints out a json payload. -pub async fn query_bridge_pool<'a>( +pub async fn query_bridge_pool( client: &(impl Client + Sync), io: &impl Io, ) -> Result, Error> { @@ -353,7 +353,7 @@ pub async fn query_bridge_pool<'a>( /// Query the contents of the Ethereum bridge pool that /// is covered by the latest signed root. /// Prints out a json payload. -pub async fn query_signed_bridge_pool<'a>( +pub async fn query_signed_bridge_pool( client: &(impl Client + Sync), io: &impl Io, ) -> Result, Error> { @@ -392,7 +392,7 @@ pub async fn query_signed_bridge_pool<'a>( /// backing each `TransferToEthereum` event. /// /// Prints a json payload. -pub async fn query_relay_progress<'a>( +pub async fn query_relay_progress( client: &(impl Client + Sync), io: &impl Io, ) -> Result<(), Error> { @@ -417,7 +417,7 @@ pub async fn query_relay_progress<'a>( /// Internal methdod to construct a proof that a set of transfers are in the /// bridge pool. -async fn construct_bridge_pool_proof<'a>( +async fn construct_bridge_pool_proof( client: &(impl Client + Sync), io: &impl Io, args: GenBridgePoolProofReq<'_, '_>, @@ -513,7 +513,7 @@ struct BridgePoolProofResponse { /// Construct a merkle proof of a batch of transfers in /// the bridge pool and return it to the user (as opposed /// to relaying it to ethereum). -pub async fn construct_proof<'a>( +pub async fn construct_proof( client: &(impl Client + Sync), io: &impl Io, args: args::BridgePoolProof, @@ -562,7 +562,7 @@ pub async fn construct_proof<'a>( } /// Relay a validator set update, signed off for a given epoch. -pub async fn relay_bridge_pool_proof<'a, E>( +pub async fn relay_bridge_pool_proof( eth_client: Arc, client: &(impl Client + Sync), io: &impl Io, @@ -794,8 +794,8 @@ mod recommendations { /// Recommend the most economical batch of transfers to relay based /// on a conversion rate estimates from NAM to ETH and gas usage /// heuristics. - pub async fn recommend_batch<'a>( - context: &impl Namada<'a>, + pub async fn recommend_batch( + context: &impl Namada, args: args::RecommendBatch, ) -> Result<(), Error> { // get transfers that can already been relayed but are awaiting a quorum diff --git a/sdk/src/eth_bridge/validator_set.rs b/sdk/src/eth_bridge/validator_set.rs index 1b7a77466d..e92e5c545e 100644 --- a/sdk/src/eth_bridge/validator_set.rs +++ b/sdk/src/eth_bridge/validator_set.rs @@ -270,7 +270,7 @@ impl From> for RelayResult { /// Query an ABI encoding of the validator set to be installed /// at the given epoch, and its associated proof. -pub async fn query_validator_set_update_proof<'a>( +pub async fn query_validator_set_update_proof( client: &(impl Client + Sync), io: &impl Io, args: args::ValidatorSetProof, @@ -298,7 +298,7 @@ pub async fn query_validator_set_update_proof<'a>( } /// Query an ABI encoding of the Bridge validator set at a given epoch. -pub async fn query_bridge_validator_set<'a>( +pub async fn query_bridge_validator_set( client: &(impl Client + Sync), io: &impl Io, args: args::BridgeValidatorSet, @@ -326,7 +326,7 @@ pub async fn query_bridge_validator_set<'a>( } /// Query an ABI encoding of the Governance validator set at a given epoch. -pub async fn query_governnace_validator_set<'a>( +pub async fn query_governnace_validator_set( client: &(impl Client + Sync), io: &impl Io, args: args::GovernanceValidatorSet, diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index f5c0ae37fa..719b12d8e7 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -66,42 +66,38 @@ use crate::wallet::{Wallet, WalletIo, WalletStorage}; #[async_trait::async_trait(?Send)] /// An interface for high-level interaction with the Namada SDK -pub trait Namada<'a>: Sized { +pub trait Namada: Sized { /// A client with async request dispatcher method - type Client: 'a + queries::Client + Sync; + type Client: queries::Client + Sync; /// Captures the interactive parts of the wallet's functioning - type WalletUtils: 'a + WalletIo + WalletStorage; + type WalletUtils: WalletIo + WalletStorage; /// Abstracts platform specific details away from the logic of shielded pool /// operations. - type ShieldedUtils: 'a + ShieldedUtils; + type ShieldedUtils: ShieldedUtils; /// Captures the input/output streams used by this object - type Io: 'a + Io; + type Io: Io; /// Obtain the client for communicating with the ledger - fn client(&self) -> &'a Self::Client; + fn client(&self) -> &Self::Client; /// Obtain the input/output handle for this context - fn io(&self) -> &'a Self::Io; + fn io(&self) -> &Self::Io; /// Obtain read guard on the wallet - async fn wallet( - &self, - ) -> RwLockReadGuard<&'a mut Wallet>; + async fn wallet(&self) -> RwLockReadGuard>; /// Obtain write guard on the wallet - async fn wallet_mut( - &self, - ) -> RwLockWriteGuard<&'a mut Wallet>; + async fn wallet_mut(&self) -> RwLockWriteGuard>; /// Obtain read guard on the shielded context async fn shielded( &self, - ) -> RwLockReadGuard<&'a mut ShieldedContext>; + ) -> RwLockReadGuard>; /// Obtain write guard on the shielded context async fn shielded_mut( &self, - ) -> RwLockWriteGuard<&'a mut ShieldedContext>; + ) -> RwLockWriteGuard>; /// Return the native token fn native_token(&self) -> Address; @@ -537,7 +533,7 @@ pub trait Namada<'a>: Sized { } /// Provides convenience methods for common Namada interactions -pub struct NamadaImpl<'a, C, U, V, I> +pub struct NamadaImpl where C: queries::Client + Sync, U: WalletIo, @@ -545,20 +541,20 @@ where I: Io, { /// Used to send and receive messages from the ledger - pub client: &'a C, + pub client: C, /// Stores the addresses and keys required for ledger interactions - pub wallet: RwLock<&'a mut Wallet>, + pub wallet: RwLock>, /// Stores the current state of the shielded pool - pub shielded: RwLock<&'a mut ShieldedContext>, + pub shielded: RwLock>, /// Captures the input/output streams used by this object - pub io: &'a I, + pub io: I, /// The address of the native token native_token: Address, /// The default builder for a Tx prototype: args::Tx, } -impl<'a, C, U, V, I> NamadaImpl<'a, C, U, V, I> +impl NamadaImpl where C: queries::Client + Sync, U: WalletIo, @@ -567,10 +563,10 @@ where { /// Construct a new Namada context with the given native token address pub fn native_new( - client: &'a C, - wallet: &'a mut Wallet, - shielded: &'a mut ShieldedContext, - io: &'a I, + client: C, + wallet: Wallet, + shielded: ShieldedContext, + io: I, native_token: Address, ) -> Self { NamadaImpl { @@ -609,12 +605,12 @@ where /// Construct a new Namada context looking up the native token address pub async fn new( - client: &'a C, - wallet: &'a mut Wallet, - shielded: &'a mut ShieldedContext, - io: &'a I, - ) -> crate::error::Result> { - let native_token = query_native_token(client).await?; + client: C, + wallet: Wallet, + shielded: ShieldedContext, + io: I, + ) -> crate::error::Result> { + let native_token = query_native_token(&client).await?; Ok(NamadaImpl::native_new( client, wallet, @@ -626,7 +622,7 @@ where } #[async_trait::async_trait(?Send)] -impl<'a, C, U, V, I> Namada<'a> for NamadaImpl<'a, C, U, V, I> +impl Namada for NamadaImpl where C: queries::Client + Sync, U: WalletIo + WalletStorage, @@ -647,41 +643,37 @@ where self.native_token.clone() } - fn io(&self) -> &'a Self::Io { - self.io + fn io(&self) -> &Self::Io { + &self.io } - fn client(&self) -> &'a Self::Client { - self.client + fn client(&self) -> &Self::Client { + &self.client } - async fn wallet( - &self, - ) -> RwLockReadGuard<&'a mut Wallet> { + async fn wallet(&self) -> RwLockReadGuard> { self.wallet.read().await } - async fn wallet_mut( - &self, - ) -> RwLockWriteGuard<&'a mut Wallet> { + async fn wallet_mut(&self) -> RwLockWriteGuard> { self.wallet.write().await } async fn shielded( &self, - ) -> RwLockReadGuard<&'a mut ShieldedContext> { + ) -> RwLockReadGuard> { self.shielded.read().await } async fn shielded_mut( &self, - ) -> RwLockWriteGuard<&'a mut ShieldedContext> { + ) -> RwLockWriteGuard> { self.shielded.write().await } } /// Allow the prototypical Tx builder to be modified -impl<'a, C, U, V, I> args::TxBuilder for NamadaImpl<'a, C, U, V, I> +impl args::TxBuilder for NamadaImpl where C: queries::Client + Sync, U: WalletIo, diff --git a/sdk/src/masp.rs b/sdk/src/masp.rs index 68459688e0..9a18f2200d 100644 --- a/sdk/src/masp.rs +++ b/sdk/src/masp.rs @@ -1220,9 +1220,9 @@ impl ShieldedContext { /// of the specified asset type. Return the total value accumulated plus /// notes and the corresponding diversifiers/merkle paths that were used to /// achieve the total value. - pub async fn collect_unspent_notes<'a>( + pub async fn collect_unspent_notes( &mut self, - context: &impl Namada<'a>, + context: &impl Namada, vk: &ViewingKey, target: I128Sum, target_epoch: Epoch, @@ -1407,9 +1407,9 @@ impl ShieldedContext { /// the epoch of the transaction or even before, so exchange all these /// amounts to the epoch of the transaction in order to get the value that /// would have been displayed in the epoch of the transaction. - pub async fn compute_exchanged_pinned_balance<'a>( + pub async fn compute_exchanged_pinned_balance( &mut self, - context: &impl Namada<'a>, + context: &impl Namada, owner: PaymentAddress, viewing_key: &ViewingKey, ) -> Result<(MaspAmount, Epoch), Error> { @@ -1497,8 +1497,8 @@ impl ShieldedContext { /// UTXOs are sometimes used to make transactions balanced, but it is /// understood that transparent account changes are effected only by the /// amounts and signatures specified by the containing Transfer object. - pub async fn gen_shielded_transfer<'a>( - context: &impl Namada<'a>, + pub async fn gen_shielded_transfer( + context: &impl Namada, source: &TransferSource, target: &TransferTarget, token: &Address, diff --git a/sdk/src/rpc.rs b/sdk/src/rpc.rs index 0d0d69a79b..8d29992b72 100644 --- a/sdk/src/rpc.rs +++ b/sdk/src/rpc.rs @@ -52,8 +52,8 @@ use crate::{display_line, edisplay_line, error, Namada}; /// /// If a response is not delivered until `deadline`, we exit the cli with an /// error. -pub async fn query_tx_status<'a>( - context: &impl Namada<'a>, +pub async fn query_tx_status( + context: &impl Namada, status: TxEventQuery<'_>, deadline: time::Instant, ) -> Result { @@ -276,8 +276,8 @@ pub async fn query_conversions( } /// Query a wasm code hash -pub async fn query_wasm_code_hash<'a>( - context: &impl Namada<'a>, +pub async fn query_wasm_code_hash( + context: &impl Namada, code_path: impl AsRef, ) -> Result { let hash_key = Key::wasm_hash(code_path.as_ref()); @@ -360,7 +360,7 @@ pub async fn query_storage_value_bytes( /// Query a range of storage values with a matching prefix and decode them with /// [`BorshDeserialize`]. Returns an iterator of the storage keys paired with /// their associated values. -pub async fn query_storage_prefix<'a, 'b, N: Namada<'a>, T>( +pub async fn query_storage_prefix<'a, 'b, N: Namada, T>( context: &'b N, key: &storage::Key, ) -> Result>, error::Error> @@ -464,7 +464,7 @@ pub async fn query_tx_events( } /// Dry run a transaction -pub async fn dry_run_tx<'a, N: Namada<'a>>( +pub async fn dry_run_tx( context: &N, tx_bytes: Vec, ) -> Result { @@ -842,8 +842,8 @@ pub async fn get_public_key_at( } /// Query a validator's unbonds for a given epoch -pub async fn query_and_print_unbonds<'a>( - context: &impl Namada<'a>, +pub async fn query_and_print_unbonds( + context: &impl Namada, source: &Address, validator: &Address, ) -> Result<(), error::Error> { @@ -982,7 +982,7 @@ pub async fn enriched_bonds_and_unbonds( } /// Get the correct representation of the amount given the token type. -pub async fn validate_amount<'a, N: Namada<'a>>( +pub async fn validate_amount( context: &N, amount: InputAmount, token: &Address, @@ -1043,7 +1043,7 @@ pub async fn validate_amount<'a, N: Namada<'a>>( } /// Wait for a first block and node to be synced. -pub async fn wait_until_node_is_synched<'a>( +pub async fn wait_until_node_is_synched( client: &(impl Client + Sync), io: &impl Io, ) -> Result<(), Error> { @@ -1140,7 +1140,7 @@ pub async fn format_denominated_amount( } /// Look up the IBC denomination from a IbcToken. -pub async fn query_ibc_denom<'a, N: Namada<'a>>( +pub async fn query_ibc_denom( context: &N, token: &Address, owner: Option<&Address>, diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index 6784be92ba..3fb44a5100 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -86,8 +86,8 @@ pub struct SigningTxData { /// for it from the wallet. If the keypair is encrypted but a password is not /// supplied, then it is interactively prompted. Errors if the key cannot be /// found or loaded. -pub async fn find_pk<'a>( - context: &impl Namada<'a>, +pub async fn find_pk( + context: &impl Namada, addr: &Address, ) -> Result { match addr { @@ -167,8 +167,8 @@ pub fn find_key_by_pk( /// signer. Return the given signing key or public key of the given signer if /// possible. If no explicit signer given, use the `default`. If no `default` /// is given, an `Error` is returned. -pub async fn tx_signers<'a>( - context: &impl Namada<'a>, +pub async fn tx_signers( + context: &impl Namada, args: &args::Tx, default: Option
      , ) -> Result, Error> { @@ -226,8 +226,8 @@ pub async fn default_sign( /// hashes needed for monitoring the tx on chain. /// /// If it is a dry run, it is not put in a wrapper, but returned as is. -pub async fn sign_tx<'a, F: std::future::Future>>( - context: &impl Namada<'a>, +pub async fn sign_tx>>( + context: &impl Namada, args: &args::Tx, tx: &mut Tx, signing_data: SigningTxData, @@ -260,7 +260,7 @@ pub async fn sign_tx<'a, F: std::future::Future>>( if used_pubkeys.contains(public_key) { None } else { - match find_key_by_pk(*wallet, args, public_key) { + match find_key_by_pk(&mut wallet, args, public_key) { Ok(secret_key) => { used_pubkeys.insert(public_key.clone()); Some(secret_key) @@ -301,7 +301,7 @@ pub async fn sign_tx<'a, F: std::future::Future>>( // Lock the wallet just long enough to extract a key from it without // interfering with the sign closure call let mut wallet = context.wallet_mut().await; - find_key_by_pk(*wallet, args, &signing_data.fee_payer) + find_key_by_pk(&mut wallet, args, &signing_data.fee_payer) }; match key { Ok(fee_payer_keypair) => { @@ -321,8 +321,8 @@ pub async fn sign_tx<'a, F: std::future::Future>>( /// Return the necessary data regarding an account to be able to generate a /// multisignature section -pub async fn aux_signing_data<'a>( - context: &impl Namada<'a>, +pub async fn aux_signing_data( + context: &impl Namada, args: &args::Tx, owner: Option
      , default_signer: Option
      , @@ -390,8 +390,8 @@ pub async fn aux_signing_data<'a>( }) } -pub async fn init_validator_signing_data<'a>( - context: &impl Namada<'a>, +pub async fn init_validator_signing_data( + context: &impl Namada, args: &args::Tx, validator_keys: Vec, ) -> Result { @@ -450,7 +450,7 @@ pub struct TxSourcePostBalance { /// wrapper and its payload which is needed for monitoring its /// progress on chain. #[allow(clippy::too_many_arguments)] -pub async fn wrap_tx<'a, N: Namada<'a>>( +pub async fn wrap_tx( context: &N, tx: &mut Tx, args: &args::Tx, @@ -734,8 +734,8 @@ fn make_ledger_amount_addr( /// Adds a Ledger output line describing a given transaction amount and asset /// type -async fn make_ledger_amount_asset<'a>( - context: &impl Namada<'a>, +async fn make_ledger_amount_asset( + context: &impl Namada, tokens: &HashMap, output: &mut Vec, amount: u64, @@ -829,8 +829,8 @@ fn format_outputs(output: &mut Vec) { /// Adds a Ledger output for the sender and destination for transparent and MASP /// transactions -pub async fn make_ledger_masp_endpoints<'a>( - context: &impl Namada<'a>, +pub async fn make_ledger_masp_endpoints( + context: &impl Namada, tokens: &HashMap, output: &mut Vec, transfer: &Transfer, @@ -904,8 +904,8 @@ pub async fn make_ledger_masp_endpoints<'a>( /// Internal method used to generate transaction test vectors #[cfg(feature = "std")] -pub async fn generate_test_vector<'a>( - context: &impl Namada<'a>, +pub async fn generate_test_vector( + context: &impl Namada, tx: &Tx, ) -> Result<(), Error> { use std::env; @@ -1014,8 +1014,8 @@ impl<'a> Display for LedgerProposalType<'a> { /// Converts the given transaction to the form that is displayed on the Ledger /// device -pub async fn to_ledger_vector<'a>( - context: &impl Namada<'a>, +pub async fn to_ledger_vector( + context: &impl Namada, tx: &Tx, ) -> Result { // To facilitate lookups of human-readable token names diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index 9378615890..fc710c9847 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -173,8 +173,8 @@ pub fn dump_tx(io: &IO, args: &args::Tx, tx: Tx) { /// Prepare a transaction for signing and submission by adding a wrapper header /// to it. #[allow(clippy::too_many_arguments)] -pub async fn prepare_tx<'a>( - context: &impl Namada<'a>, +pub async fn prepare_tx( + context: &impl Namada, args: &args::Tx, tx: &mut Tx, fee_payer: common::PublicKey, @@ -192,8 +192,8 @@ pub async fn prepare_tx<'a>( /// Submit transaction and wait for result. Returns a list of addresses /// initialized in the transaction if any. In dry run, this is always empty. -pub async fn process_tx<'a>( - context: &impl Namada<'a>, +pub async fn process_tx( + context: &impl Namada, args: &args::Tx, tx: Tx, ) -> Result { @@ -266,8 +266,8 @@ pub async fn has_revealed_pk( } /// Submit transaction to reveal the given public key -pub async fn build_reveal_pk<'a>( - context: &impl Namada<'a>, +pub async fn build_reveal_pk( + context: &impl Namada, args: &args::Tx, public_key: &common::PublicKey, ) -> Result<(Tx, SigningTxData, Option)> { @@ -292,8 +292,8 @@ pub async fn build_reveal_pk<'a>( /// the tx has been successfully included into the mempool of a node /// /// In the case of errors in any of those stages, an error message is returned -pub async fn broadcast_tx<'a>( - context: &impl Namada<'a>, +pub async fn broadcast_tx( + context: &impl Namada, to_broadcast: &TxBroadcastData, ) -> Result { let (tx, wrapper_tx_hash, decrypted_tx_hash) = match to_broadcast { @@ -355,8 +355,8 @@ pub async fn broadcast_tx<'a>( /// 3. The decrypted payload of the tx has been included on the blockchain. /// /// In the case of errors in any of those stages, an error message is returned -pub async fn submit_tx<'a>( - context: &impl Namada<'a>, +pub async fn submit_tx( + context: &impl Namada, to_broadcast: TxBroadcastData, ) -> Result { let (_, wrapper_hash, decrypted_hash) = match &to_broadcast { @@ -446,7 +446,7 @@ pub fn decode_component( } /// Save accounts initialized from a tx into the wallet, if any. -pub async fn save_initialized_accounts<'a, N: Namada<'a>>( +pub async fn save_initialized_accounts( context: &N, args: &args::Tx, initialized_accounts: Vec
      , @@ -506,8 +506,8 @@ pub async fn save_initialized_accounts<'a, N: Namada<'a>>( } /// Submit validator comission rate change -pub async fn build_validator_commission_change<'a>( - context: &impl Namada<'a>, +pub async fn build_validator_commission_change( + context: &impl Namada, args::CommissionRateChange { tx: tx_args, validator, @@ -618,8 +618,8 @@ pub async fn build_validator_commission_change<'a>( } /// Submit validator metadata change -pub async fn build_validator_metadata_change<'a>( - context: &impl Namada<'a>, +pub async fn build_validator_metadata_change( + context: &impl Namada, args::MetaDataChange { tx: tx_args, validator, @@ -747,8 +747,8 @@ pub async fn build_validator_metadata_change<'a>( } /// Craft transaction to update a steward commission -pub async fn build_update_steward_commission<'a>( - context: &impl Namada<'a>, +pub async fn build_update_steward_commission( + context: &impl Namada, args::UpdateStewardCommission { tx: tx_args, steward, @@ -806,8 +806,8 @@ pub async fn build_update_steward_commission<'a>( } /// Craft transaction to resign as a steward -pub async fn build_resign_steward<'a>( - context: &impl Namada<'a>, +pub async fn build_resign_steward( + context: &impl Namada, args::ResignSteward { tx: tx_args, steward, @@ -846,8 +846,8 @@ pub async fn build_resign_steward<'a>( } /// Submit transaction to unjail a jailed validator -pub async fn build_unjail_validator<'a>( - context: &impl Namada<'a>, +pub async fn build_unjail_validator( + context: &impl Namada, args::TxUnjailValidator { tx: tx_args, validator, @@ -953,8 +953,8 @@ pub async fn build_unjail_validator<'a>( } /// Submit transaction to deactivate a validator -pub async fn build_deactivate_validator<'a>( - context: &impl Namada<'a>, +pub async fn build_deactivate_validator( + context: &impl Namada, args::TxDeactivateValidator { tx: tx_args, validator, @@ -1024,8 +1024,8 @@ pub async fn build_deactivate_validator<'a>( } /// Submit transaction to deactivate a validator -pub async fn build_reactivate_validator<'a>( - context: &impl Namada<'a>, +pub async fn build_reactivate_validator( + context: &impl Namada, args::TxReactivateValidator { tx: tx_args, validator, @@ -1094,8 +1094,8 @@ pub async fn build_reactivate_validator<'a>( } /// Redelegate bonded tokens from one validator to another -pub async fn build_redelegation<'a>( - context: &impl Namada<'a>, +pub async fn build_redelegation( + context: &impl Namada, args::Redelegate { tx: tx_args, src_validator, @@ -1274,8 +1274,8 @@ pub async fn build_redelegation<'a>( } /// Submit transaction to withdraw an unbond -pub async fn build_withdraw<'a>( - context: &impl Namada<'a>, +pub async fn build_withdraw( + context: &impl Namada, args::Withdraw { tx: tx_args, validator, @@ -1357,8 +1357,8 @@ pub async fn build_withdraw<'a>( } /// Submit transaction to withdraw an unbond -pub async fn build_claim_rewards<'a>( - context: &impl Namada<'a>, +pub async fn build_claim_rewards( + context: &impl Namada, args::ClaimRewards { tx: tx_args, validator, @@ -1405,8 +1405,8 @@ pub async fn build_claim_rewards<'a>( } /// Submit a transaction to unbond -pub async fn build_unbond<'a>( - context: &impl Namada<'a>, +pub async fn build_unbond( + context: &impl Namada, args::Unbond { tx: tx_args, validator, @@ -1512,8 +1512,8 @@ pub async fn build_unbond<'a>( } /// Query the unbonds post-tx -pub async fn query_unbonds<'a>( - context: &impl Namada<'a>, +pub async fn query_unbonds( + context: &impl Namada, args: args::Unbond, latest_withdrawal_pre: Option<(Epoch, token::Amount)>, ) -> Result<()> { @@ -1583,8 +1583,8 @@ pub async fn query_unbonds<'a>( } /// Submit a transaction to bond -pub async fn build_bond<'a>( - context: &impl Namada<'a>, +pub async fn build_bond( + context: &impl Namada, args::Bond { tx: tx_args, validator, @@ -1697,8 +1697,8 @@ pub async fn build_bond<'a>( } /// Build a default proposal governance -pub async fn build_default_proposal<'a>( - context: &impl Namada<'a>, +pub async fn build_default_proposal( + context: &impl Namada, args::InitProposal { tx, proposal_data: _, @@ -1750,8 +1750,8 @@ pub async fn build_default_proposal<'a>( } /// Build a proposal vote -pub async fn build_vote_proposal<'a>( - context: &impl Namada<'a>, +pub async fn build_vote_proposal( + context: &impl Namada, args::VoteProposal { tx, proposal_id, @@ -1837,8 +1837,8 @@ pub async fn build_vote_proposal<'a>( } /// Build a pgf funding proposal governance -pub async fn build_pgf_funding_proposal<'a>( - context: &impl Namada<'a>, +pub async fn build_pgf_funding_proposal( + context: &impl Namada, args::InitProposal { tx, proposal_data: _, @@ -1882,8 +1882,8 @@ pub async fn build_pgf_funding_proposal<'a>( } /// Build a pgf funding proposal governance -pub async fn build_pgf_stewards_proposal<'a>( - context: &impl Namada<'a>, +pub async fn build_pgf_stewards_proposal( + context: &impl Namada, args::InitProposal { tx, proposal_data: _, @@ -1928,8 +1928,8 @@ pub async fn build_pgf_stewards_proposal<'a>( } /// Submit an IBC transfer -pub async fn build_ibc_transfer<'a>( - context: &impl Namada<'a>, +pub async fn build_ibc_transfer( + context: &impl Namada, args: &args::TxIbcTransfer, ) -> Result<(Tx, SigningTxData, Option)> { let default_signer = Some(args.source.clone()); @@ -2057,8 +2057,8 @@ pub async fn build_ibc_transfer<'a>( /// Abstraction for helping build transactions #[allow(clippy::too_many_arguments)] -pub async fn build<'a, F, D>( - context: &impl Namada<'a>, +pub async fn build( + context: &impl Namada, tx_args: &crate::args::Tx, path: PathBuf, data: D, @@ -2083,8 +2083,8 @@ where } #[allow(clippy::too_many_arguments)] -async fn build_pow_flag<'a, F, D>( - context: &impl Namada<'a>, +async fn build_pow_flag( + context: &impl Namada, tx_args: &crate::args::Tx, path: PathBuf, mut data: D, @@ -2126,9 +2126,9 @@ where /// Try to decode the given asset type and add its decoding to the supplied set. /// Returns true only if a new decoding has been added to the given set. -async fn add_asset_type<'a>( +async fn add_asset_type( asset_types: &mut HashSet<(Address, MaspDenom, Epoch)>, - context: &impl Namada<'a>, + context: &impl Namada, asset_type: AssetType, ) -> bool { if let Some(asset_type) = context @@ -2146,8 +2146,8 @@ async fn add_asset_type<'a>( /// Collect the asset types used in the given Builder and decode them. This /// function provides the data necessary for offline wallets to present asset /// type information. -async fn used_asset_types<'a, P, R, K, N>( - context: &impl Namada<'a>, +async fn used_asset_types( + context: &impl Namada, builder: &Builder, ) -> std::result::Result, RpcError> { let mut asset_types = HashSet::new(); @@ -2180,7 +2180,7 @@ async fn used_asset_types<'a, P, R, K, N>( } /// Submit an ordinary transfer -pub async fn build_transfer<'a, N: Namada<'a>>( +pub async fn build_transfer( context: &N, args: &mut args::TxTransfer, ) -> Result<(Tx, SigningTxData, Option)> { @@ -2351,8 +2351,8 @@ pub async fn build_transfer<'a, N: Namada<'a>>( } /// Submit a transaction to initialize an account -pub async fn build_init_account<'a>( - context: &impl Namada<'a>, +pub async fn build_init_account( + context: &impl Namada, args::TxInitAccount { tx: tx_args, vp_code_path, @@ -2406,8 +2406,8 @@ pub async fn build_init_account<'a>( } /// Submit a transaction to update a VP -pub async fn build_update_account<'a>( - context: &impl Namada<'a>, +pub async fn build_update_account( + context: &impl Namada, args::TxUpdateAccount { tx: tx_args, vp_code_path, @@ -2488,8 +2488,8 @@ pub async fn build_update_account<'a>( } /// Submit a custom transaction -pub async fn build_custom<'a>( - context: &impl Namada<'a>, +pub async fn build_custom( + context: &impl Namada, args::TxCustom { tx: tx_args, code_path, @@ -2539,7 +2539,7 @@ pub async fn build_custom<'a>( } /// Generate IBC shielded transfer -pub async fn gen_ibc_shielded_transfer<'a, N: Namada<'a>>( +pub async fn gen_ibc_shielded_transfer( context: &N, args: args::GenIbcShieldedTransafer, ) -> Result> { @@ -2612,8 +2612,8 @@ pub async fn gen_ibc_shielded_transfer<'a, N: Namada<'a>>( } } -async fn get_ibc_src_port_channel<'a>( - context: &impl Namada<'a>, +async fn get_ibc_src_port_channel( + context: &impl Namada, dest_port_id: &PortId, dest_channel_id: &ChannelId, ) -> Result<(PortId, ChannelId)> { @@ -2654,9 +2654,9 @@ async fn get_ibc_src_port_channel<'a>( }) } -async fn expect_dry_broadcast<'a>( +async fn expect_dry_broadcast( to_broadcast: TxBroadcastData, - context: &impl Namada<'a>, + context: &impl Namada, ) -> Result { match to_broadcast { TxBroadcastData::DryRun(tx) => { @@ -2678,10 +2678,10 @@ fn lift_rpc_error(res: std::result::Result) -> Result { /// Returns the given validator if the given address is a validator, /// otherwise returns an error, force forces the address through even /// if it isn't a validator -async fn known_validator_or_err<'a>( +async fn known_validator_or_err( validator: Address, force: bool, - context: &impl Namada<'a>, + context: &impl Namada, ) -> Result
      { // Check that the validator address exists on chain let is_validator = rpc::is_validator(context.client(), &validator).await?; @@ -2704,10 +2704,10 @@ async fn known_validator_or_err<'a>( /// general pattern for checking if an address exists on the chain, or /// throwing an error if it's not forced. Takes a generic error /// message and the error type. -async fn address_exists_or_err<'a, F>( +async fn address_exists_or_err( addr: Address, force: bool, - context: &impl Namada<'a>, + context: &impl Namada, message: String, err: F, ) -> Result
      @@ -2730,10 +2730,10 @@ where /// Returns the given source address if the given address exists on chain /// otherwise returns an error, force forces the address through even /// if it isn't on chain -async fn source_exists_or_err<'a>( +async fn source_exists_or_err( token: Address, force: bool, - context: &impl Namada<'a>, + context: &impl Namada, ) -> Result
      { let message = format!("The source address {} doesn't exist on chain.", token); @@ -2746,10 +2746,10 @@ async fn source_exists_or_err<'a>( /// Returns the given target address if the given address exists on chain /// otherwise returns an error, force forces the address through even /// if it isn't on chain -async fn target_exists_or_err<'a>( +async fn target_exists_or_err( token: Address, force: bool, - context: &impl Namada<'a>, + context: &impl Namada, ) -> Result
      { let message = format!("The target address {} doesn't exist on chain.", token); @@ -2762,7 +2762,7 @@ async fn target_exists_or_err<'a>( /// Checks the balance at the given address is enough to transfer the /// given amount, along with the balance even existing. Force /// overrides this. Returns the updated balance for fee check if necessary -async fn check_balance_too_low_err<'a, N: Namada<'a>>( +async fn check_balance_too_low_err( token: &Address, source: &Address, amount: token::Amount, @@ -2825,8 +2825,8 @@ async fn check_balance_too_low_err<'a, N: Namada<'a>>( } } -async fn query_wasm_code_hash_buf<'a>( - context: &impl Namada<'a>, +async fn query_wasm_code_hash_buf( + context: &impl Namada, path: &Path, ) -> Result { query_wasm_code_hash(context, path.to_string_lossy()).await From 8afe908fc7adda9e28efca842e0de20cde8d1c22 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Tue, 28 Nov 2023 20:50:27 +0200 Subject: [PATCH 087/175] Added changelog entry. --- .changelog/unreleased/SDK/2225-remove-sdk-lifetimes.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/SDK/2225-remove-sdk-lifetimes.md diff --git a/.changelog/unreleased/SDK/2225-remove-sdk-lifetimes.md b/.changelog/unreleased/SDK/2225-remove-sdk-lifetimes.md new file mode 100644 index 0000000000..e02e6f8880 --- /dev/null +++ b/.changelog/unreleased/SDK/2225-remove-sdk-lifetimes.md @@ -0,0 +1,2 @@ +- Removed uses of lifetimes in the SDKs Namada trait and implementation + ([\#2225](https://github.com/anoma/namada/pull/2225)) \ No newline at end of file From 06f27a931b47652429d8a1fa0d717dabee410ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 29 Nov 2023 11:04:14 +0100 Subject: [PATCH 088/175] masp: log inflation amount for each token address --- core/src/ledger/masp_conversions.rs | 30 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/core/src/ledger/masp_conversions.rs b/core/src/ledger/masp_conversions.rs index 371e8a5ec9..6e1f731a0f 100644 --- a/core/src/ledger/masp_conversions.rs +++ b/core/src/ledger/masp_conversions.rs @@ -17,8 +17,7 @@ use crate::ledger::storage_api::{StorageRead, StorageWrite}; use crate::types::address::{Address, MASP}; use crate::types::dec::Dec; use crate::types::storage::Epoch; -use crate::types::token; -use crate::types::token::MaspDenom; +use crate::types::token::{self, DenominatedAmount, MaspDenom}; use crate::types::uint::Uint; /// A representation of the conversion state @@ -149,6 +148,17 @@ where 0u128 }) }; + let inflation_amount = token::Amount::from_uint( + (total_token_in_masp.raw_amount() / precision) + * Uint::from(noterized_inflation), + 0, + ) + .unwrap(); + let denom_amount = DenominatedAmount { + amount: inflation_amount, + denom: denomination, + }; + tracing::info!("MASP inflation for {addr} is {denom_amount}"); tracing::debug!( "Controller, call: total_in_masp {:?}, total_tokens {:?}, \ @@ -166,25 +176,19 @@ where kd_gain_nom, epochs_per_year, ); - tracing::debug!("Please give me: {:?}", addr); + tracing::debug!("Token address: {:?}", addr); tracing::debug!("Ratio {:?}", locked_ratio); tracing::debug!("inflation from the pd controller {:?}", inflation); tracing::debug!("total in the masp {:?}", total_token_in_masp); - tracing::debug!("Please give me inflation: {:?}", noterized_inflation); + tracing::debug!("precision {}", precision); + tracing::debug!("Noterized inflation: {}", noterized_inflation); // Is it fine to write the inflation rate, this is accurate, // but we should make sure the return value's ratio matches // this new inflation rate in 'update_allowed_conversions', // otherwise we will have an inaccurate view of inflation - wl_storage.write( - &token::masp_last_inflation_key(addr), - token::Amount::from_uint( - (total_token_in_masp.raw_amount() / precision) - * Uint::from(noterized_inflation), - 0, - ) - .unwrap(), - )?; + wl_storage + .write(&token::masp_last_inflation_key(addr), inflation_amount)?; wl_storage.write(&token::masp_last_locked_ratio_key(addr), locked_ratio)?; From 8cc59dda84e27218179315ef510cbe941df5edbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 29 Nov 2023 12:13:16 +0100 Subject: [PATCH 089/175] dec: add a proptest helper to gen arb non-negative dec --- core/src/types/dec.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/src/types/dec.rs b/core/src/types/dec.rs index 406144a0df..3a77b991e8 100644 --- a/core/src/types/dec.rs +++ b/core/src/types/dec.rs @@ -478,6 +478,21 @@ impl Debug for Dec { } } +/// Helpers for testing. +#[cfg(any(test, feature = "testing"))] +pub mod testing { + use proptest::prelude::*; + + use super::*; + + /// Generate an arbitrary non-negative `Dec` + pub fn arb_non_negative_dec() -> impl Strategy { + (any::(), 0_u8..POS_DECIMAL_PRECISION).prop_map( + |(mantissa, scale)| Dec::new(mantissa.into(), scale).unwrap(), + ) + } +} + #[cfg(test)] mod test_dec { use super::*; From d150a200e400b38b629ede2ce4a6c645278eba62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 29 Nov 2023 12:12:34 +0100 Subject: [PATCH 090/175] masp: test update_allowed_conversions --- core/Cargo.toml | 1 + core/src/ledger/masp_conversions.rs | 128 +++++++++++++++++++++++++++- 2 files changed, 128 insertions(+), 1 deletion(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 53ee824077..5e35d2ae07 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -80,6 +80,7 @@ pretty_assertions.workspace = true proptest.workspace = true rand.workspace = true rand_core.workspace = true +rayon = {version = "=1.5.3"} test-log.workspace = true toml.workspace = true tracing-subscriber.workspace = true diff --git a/core/src/ledger/masp_conversions.rs b/core/src/ledger/masp_conversions.rs index 6e1f731a0f..4b6ca128b6 100644 --- a/core/src/ledger/masp_conversions.rs +++ b/core/src/ledger/masp_conversions.rs @@ -196,7 +196,7 @@ where } // This is only enabled when "wasm-runtime" is on, because we're using rayon -#[cfg(feature = "wasm-runtime")] +#[cfg(any(feature = "wasm-runtime", test))] /// Update the MASP's allowed conversions pub fn update_allowed_conversions( wl_storage: &mut WlStorage, @@ -495,3 +495,129 @@ pub fn encode_asset_type( AssetType::new(new_asset_bytes.as_ref()) .expect("unable to derive asset identifier") } + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + use std::str::FromStr; + + use proptest::prelude::*; + use proptest::test_runner::Config; + use test_log::test; + + use super::*; + use crate::ledger::parameters::{EpochDuration, Parameters}; + use crate::ledger::storage::testing::TestWlStorage; + use crate::ledger::storage_api::token::write_denom; + use crate::types::address; + use crate::types::dec::testing::arb_non_negative_dec; + use crate::types::time::DurationSecs; + use crate::types::token::testing::arb_amount; + + proptest! { + #![proptest_config(Config { + cases: 10, + .. Config::default() + })] + #[test] + fn test_updated_allowed_conversions( + initial_balance in arb_amount(), + masp_locked_ratio in arb_non_negative_dec(), + ) { + test_updated_allowed_conversions_aux(initial_balance, masp_locked_ratio) + } + } + + fn test_updated_allowed_conversions_aux( + initial_balance: token::Amount, + masp_locked_ratio: Dec, + ) { + const ROUNDS: usize = 10; + + let mut s = TestWlStorage::default(); + let params = Parameters { + max_tx_bytes: 1024 * 1024, + epoch_duration: EpochDuration { + min_num_of_blocks: 1, + min_duration: DurationSecs(3600), + }, + max_expected_time_per_block: DurationSecs(3600), + max_proposal_bytes: Default::default(), + max_block_gas: 100, + vp_whitelist: vec![], + tx_whitelist: vec![], + implicit_vp_code_hash: Default::default(), + epochs_per_year: 365, + max_signatures_per_transaction: 10, + pos_gain_p: Default::default(), + pos_gain_d: Default::default(), + staked_ratio: Default::default(), + pos_inflation_amount: Default::default(), + fee_unshielding_gas_limit: 0, + fee_unshielding_descriptions_limit: 0, + minimum_gas_price: Default::default(), + }; + + // Initialize the state + { + // Parameters + params.init_storage(&mut s).unwrap(); + + // Tokens + let token_params = token::Parameters { + max_reward_rate: Dec::from_str("0.1").unwrap(), + kp_gain_nom: Dec::from_str("0.1").unwrap(), + kd_gain_nom: Dec::from_str("0.1").unwrap(), + locked_ratio_target: Dec::from_str("0.6667").unwrap(), + }; + + for (token_addr, (alias, denom)) in tokens() { + token_params.init_storage(&token_addr, &mut s); + + write_denom(&mut s, &token_addr, denom).unwrap(); + + // Write a minted token balance + let total_token_balance = initial_balance; + s.write( + &token::minted_balance_key(&token_addr), + total_token_balance, + ) + .unwrap(); + + // Put the locked ratio into MASP + s.write( + &token::balance_key(&token_addr, &address::MASP), + masp_locked_ratio * total_token_balance, + ) + .unwrap(); + + // Insert tokens into MASP conversion state + s.storage + .conversion_state + .tokens + .insert(alias.to_string(), token_addr.clone()); + } + } + + for i in 0..ROUNDS { + println!("Round {i}"); + update_allowed_conversions(&mut s).unwrap(); + println!(); + println!(); + } + } + + pub fn tokens() -> HashMap { + vec![ + (address::nam(), ("nam", 6.into())), + (address::btc(), ("btc", 8.into())), + (address::eth(), ("eth", 18.into())), + (address::dot(), ("dot", 10.into())), + (address::schnitzel(), ("schnitzel", 6.into())), + (address::apfel(), ("apfel", 6.into())), + (address::kartoffel(), ("kartoffel", 6.into())), + ] + .into_iter() + .collect() + } +} From b41393ea59634eb199949e77c29052d7f571c0f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 29 Nov 2023 12:12:58 +0100 Subject: [PATCH 091/175] masp: fix possible underflow --- core/src/ledger/masp_conversions.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/ledger/masp_conversions.rs b/core/src/ledger/masp_conversions.rs index 4b6ca128b6..ab915c22e2 100644 --- a/core/src/ledger/masp_conversions.rs +++ b/core/src/ledger/masp_conversions.rs @@ -344,7 +344,8 @@ where total_reward += (addr_bal * (new_normed_inflation, *normed_inflation)) .0 - - addr_bal; + .checked_sub(addr_bal) + .unwrap_or_default(); // Save the new normed inflation *normed_inflation = new_normed_inflation; } From 1e13831312d09c7c93cb5437a28b17d949257770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 29 Nov 2023 12:34:59 +0100 Subject: [PATCH 092/175] changelog: add #2230 --- .changelog/unreleased/bug-fixes/2230-masp-rewards.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/bug-fixes/2230-masp-rewards.md diff --git a/.changelog/unreleased/bug-fixes/2230-masp-rewards.md b/.changelog/unreleased/bug-fixes/2230-masp-rewards.md new file mode 100644 index 0000000000..b50a828064 --- /dev/null +++ b/.changelog/unreleased/bug-fixes/2230-masp-rewards.md @@ -0,0 +1,2 @@ +- Fix possible underflow in MASP rewards calculation. + ([\#2230](https://github.com/anoma/namada/pull/2230)) \ No newline at end of file From a91d224169311b4aa2f9f2846b8f38bd8cd821fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 29 Nov 2023 12:45:24 +0100 Subject: [PATCH 093/175] fixup! Merge branch 'brent/upgrade-pos-rewards' (#2217) --- apps/src/lib/cli/client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 1f46bb7d36..2ed5ba456b 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -499,9 +499,9 @@ impl CliApi { &mut args.query.ledger_address, ) }); - client.wait_until_node_is_synced(io).await?; + client.wait_until_node_is_synced(&io).await?; let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); + let namada = ctx.to_sdk(client, io); rpc::query_and_print_rewards(&namada, args).await; } Sub::QueryDelegations(QueryDelegations(mut args)) => { From 8a141312966081d0b27e7cb60cb982071cc4d306 Mon Sep 17 00:00:00 2001 From: Adrian Brink Date: Wed, 29 Nov 2023 14:09:15 +0100 Subject: [PATCH 094/175] Upgrade borsh to v1.2.0 --- Cargo.lock | 2115 +++++++++++++------------ Cargo.toml | 14 +- core/src/types/key/ed25519.rs | 30 +- core/src/types/key/secp256k1.rs | 20 +- encoding_spec/src/main.rs | 26 +- wasm/Cargo.lock | 1664 +++++++++---------- wasm/tx_template/Cargo.toml | 2 +- wasm/vp_template/Cargo.toml | 2 +- wasm/wasm_source/Cargo.toml | 4 +- wasm_for_tests/wasm_source/Cargo.lock | 120 +- 10 files changed, 2074 insertions(+), 1923 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a760f39701..2ee7646863 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,11 +14,11 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.27.2", + "gimli 0.28.1", ] [[package]] @@ -50,24 +50,30 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", "once_cell", "version_check", ] [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -85,30 +91,29 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] @@ -124,9 +129,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", "windows-sys 0.48.0", @@ -134,9 +139,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ark-bls12-381" @@ -159,7 +164,7 @@ dependencies = [ "ark-serialize", "ark-std", "derivative", - "num-traits 0.2.15", + "num-traits 0.2.17", "zeroize", ] @@ -174,8 +179,8 @@ dependencies = [ "ark-serialize", "ark-std", "derivative", - "num-bigint 0.4.3", - "num-traits 0.2.15", + "num-bigint 0.4.4", + "num-traits 0.2.17", "paste", "rustc_version 0.3.3", "zeroize", @@ -197,8 +202,8 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint 0.4.3", - "num-traits 0.2.15", + "num-bigint 0.4.4", + "num-traits 0.2.17", "quote", "syn 1.0.109", ] @@ -219,7 +224,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ - "num-traits 0.2.15", + "num-traits 0.2.17", "rand 0.8.5", ] @@ -237,9 +242,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "assert_cmd" @@ -280,18 +285,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -325,13 +330,13 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", - "bitflags 1.2.1", + "bitflags 1.3.2", "bytes", "futures-util", "http", @@ -344,7 +349,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustversion", - "serde 1.0.190", + "serde 1.0.193", "sync_wrapper", "tower", "tower-layer", @@ -370,16 +375,16 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", "cfg-if 1.0.0", "libc", - "miniz_oxide 0.6.2", - "object 0.30.3", + "miniz_oxide", + "object 0.32.1", "rustc-demangle", ] @@ -409,9 +414,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -421,15 +426,15 @@ checksum = "8a32fd6af2b5827bce66c29053ba0e7c42b9dcab01835835058558c10851a46b" [[package]] name = "bech32" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" +checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" [[package]] name = "bech32" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bellman" @@ -437,7 +442,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afceed28bac7f9f5a508bca8aeeff51cdfa4770c0b967ac55c621e2ddfd6171" dependencies = [ - "bitvec 1.0.1", + "bitvec", "blake2s_simd", "byteorder", "crossbeam-channel 0.5.8", @@ -458,7 +463,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -467,7 +472,7 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -476,19 +481,19 @@ version = "0.65.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", "cexpr", "clang-sys", "lazy_static", "lazycell", "peeking_take_while", - "prettyplease 0.2.4", + "prettyplease 0.2.15", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -500,7 +505,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.10.1", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "unicode-normalization", "zeroize", ] @@ -522,25 +527,15 @@ checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" - -[[package]] -name = "bitvec" -version = "0.17.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium 0.3.0", -] +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "bitvec" @@ -549,7 +544,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", - "radium 0.7.0", + "radium", "tap", "wyz", ] @@ -566,38 +561,37 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", - "arrayvec 0.7.2", + "arrayvec 0.7.4", "constant_time_eq", ] [[package]] name = "blake2s_simd" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" +checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" dependencies = [ "arrayref", - "arrayvec 0.7.2", + "arrayvec 0.7.4", "constant_time_eq", ] [[package]] name = "blake3" -version = "1.3.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" dependencies = [ "arrayref", - "arrayvec 0.7.2", + "arrayvec 0.7.4", "cc", "cfg-if 1.0.0", "constant_time_eq", - "digest 0.10.6", ] [[package]] @@ -654,9 +648,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.0.0-alpha.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41898277107b0d3f027593697912977397eba6ac39a55bdd2eb02c1d5d5013b5" +checksum = "bf617fabf5cdbdc92f774bfe5062d870f228b80056d41180797abf48bed4056e" dependencies = [ "borsh-derive", "cfg_aliases", @@ -664,33 +658,34 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.0.0-alpha.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413cb435569fe499e89235f758304e0e7198016baa351d8f5827ea0f40526ce0" +checksum = "f404657a7ea7b5249e36808dff544bc88a28f26e0ac40009f674b7a009d14be3" dependencies = [ "once_cell", - "proc-macro-crate", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "syn_derive", ] [[package]] name = "borsh-ext" -version = "1.0.0-alpha.4" -source = "git+https://github.com/heliaxdev/borsh-ext?tag=v1.0.0-alpha.4#6bebf357002f96574ac37a28f547b6c88e91b799" +version = "1.2.0" +source = "git+https://github.com/heliaxdev/borsh-ext?tag=v1.2.0#a62fee3e847e512cad9ac0f1fd5a900e5db9ba37" dependencies = [ "borsh", ] [[package]] name = "bs58" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2 0.9.9", + "sha2 0.10.8", + "tinyvec", ] [[package]] @@ -701,14 +696,14 @@ checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "lazy_static", "memchr", - "regex-automata", + "regex-automata 0.1.10", ] [[package]] name = "bumpalo" -version = "3.12.2" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-slice-cast" @@ -728,7 +723,7 @@ version = "4.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da78b32057b8fdfc352504708feeba7216dcd65a2c9ab02978cbd288d1279b6c" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", "utf8-width", ] @@ -756,17 +751,17 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -782,32 +777,32 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.4" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "cargo-platform" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "cargo_metadata" -version = "0.15.4" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.17", - "serde 1.0.190", + "semver 1.0.20", + "serde 1.0.193", "serde_json", "thiserror", ] @@ -890,14 +885,14 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ + "android-tzdata", "iana-time-zone", - "num-integer", - "num-traits 0.2.15", - "winapi", + "num-traits 0.2.17", + "windows-targets 0.48.5", ] [[package]] @@ -908,7 +903,7 @@ checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -960,31 +955,30 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.5" +version = "4.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2686c4115cb0810d9a984776e197823d08ec94f176549a89a9efded477c456dc" +checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.3.5" +version = "4.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e53afce1efce6ed1f633cf0e57612fe51db54a1ee4fd8f8503d078fe02d69ae" +checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" dependencies = [ "anstream", "anstyle", - "bitflags 1.2.1", "clap_lex", "strsim", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "clru" @@ -993,56 +987,52 @@ source = "git+https://github.com/marmeladema/clru-rs.git?rev=71ca566#71ca566915f [[package]] name = "coins-bip32" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30a84aab436fcb256a2ab3c80663d8aec686e6bae12827bb05fef3e1e439c9f" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ - "bincode", "bs58", "coins-core", - "digest 0.10.6", - "getrandom 0.2.10", + "digest 0.10.7", "hmac 0.12.1", "k256", - "lazy_static", - "serde 1.0.190", - "sha2 0.10.6", + "serde 1.0.193", + "sha2 0.10.8", "thiserror", ] [[package]] name = "coins-bip39" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f4d04ee18e58356accd644896aeb2094ddeafb6a713e056cef0c0a8e468c15" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "bitvec 0.17.4", + "bitvec", "coins-bip32", - "getrandom 0.2.10", "hmac 0.12.1", "once_cell", - "pbkdf2 0.12.1", + "pbkdf2 0.12.2", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] [[package]] name = "coins-core" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b949a1c63fb7eb591eb7ba438746326aedf0ae843e51ec92ba6bec5bb382c4f" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" dependencies = [ - "base64 0.21.0", - "bech32 0.7.3", + "base64 0.21.5", + "bech32 0.9.1", "bs58", - "digest 0.10.6", + "digest 0.10.7", "generic-array 0.14.7", "hex", "ripemd", - "serde 1.0.190", + "serde 1.0.193", "serde_derive", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -1064,9 +1054,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" dependencies = [ "once_cell", "owo-colors", @@ -1082,12 +1072,12 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "concat-idents" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe0e1d9f7de897d18e590a7496b5facbe87813f746cf4b8db596ba77e07e832" +checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] @@ -1099,10 +1089,10 @@ dependencies = [ "lazy_static", "nom 5.1.3", "rust-ini", - "serde 1.0.190", + "serde 1.0.193", "serde-hjson", "serde_json", - "toml 0.5.9", + "toml 0.5.11", "yaml-rust", ] @@ -1112,20 +1102,33 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b72b06487a0d4683349ad74d62e87ad639b09667082b3c495c5b6bab7d84b3da" dependencies = [ - "windows 0.44.0", + "windows", +] + +[[package]] +name = "const-hex" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "hex", + "proptest", + "serde 1.0.193", ] [[package]] name = "const-oid" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "constant_time_eq" -version = "0.2.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "contracts" @@ -1165,9 +1168,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "corosensei" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9847f90f32a50b0dcbd68bc23ff242798b13080b97b0569f6ed96a45ce4cf2cd" +checksum = "80128832c58ea9cbd041d2a759ec449224487b2c1e400453d99d244eead87a8e" dependencies = [ "autocfg", "cfg-if 1.0.0", @@ -1178,9 +1181,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -1266,13 +1269,13 @@ dependencies = [ "criterion-plot", "is-terminal", "itertools 0.10.5", - "num-traits 0.2.15", + "num-traits 0.2.17", "once_cell", "oorandom", "plotters", "rayon", "regex", - "serde 1.0.190", + "serde 1.0.193", "serde_derive", "serde_json", "tinytemplate", @@ -1306,7 +1309,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.15", + "crossbeam-utils 0.8.16", ] [[package]] @@ -1317,19 +1320,19 @@ checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", - "crossbeam-utils 0.8.15", + "crossbeam-utils 0.8.16", ] [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if 1.0.0", - "crossbeam-utils 0.8.15", - "memoffset 0.8.0", + "crossbeam-utils 0.8.16", + "memoffset 0.9.0", "scopeguard", ] @@ -1346,9 +1349,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if 1.0.0", ] @@ -1361,9 +1364,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", @@ -1450,9 +1453,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -1460,45 +1463,54 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "darling_macro" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivation-path" version = "0.2.0" @@ -1559,9 +1571,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid", @@ -1597,7 +1609,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1624,7 +1636,7 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", "byteorder", "lazy_static", "proc-macro-error", @@ -1646,16 +1658,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.16.7" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest 0.10.6", + "digest 0.10.7", "elliptic-curve", "rfc6979", "serdect", - "signature 2.1.0", + "signature 2.2.0", "spki", ] @@ -1670,12 +1682,12 @@ dependencies = [ [[package]] name = "ed25519" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "pkcs8", - "signature 2.1.0", + "signature 2.2.0", ] [[package]] @@ -1687,7 +1699,7 @@ dependencies = [ "curve25519-dalek-ng", "hex", "rand_core 0.6.4", - "serde 1.0.190", + "serde 1.0.193", "sha2 0.9.9", "thiserror", "zeroize", @@ -1715,26 +1727,26 @@ dependencies = [ "curve25519-dalek", "ed25519 1.5.3", "rand 0.7.3", - "serde 1.0.190", + "serde 1.0.193", "sha2 0.9.9", "zeroize", ] [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.6", + "digest 0.10.7", "ff", "generic-array 0.14.7", "group", @@ -1748,27 +1760,27 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "enr" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf56acd72bb22d2824e66ae8e9e5ada4d0de17a69c7fd35569dde2ada8ec9116" +checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" dependencies = [ - "base64 0.13.1", + "base64 0.21.5", "bytes", "hex", "k256", "log", "rand 0.8.5", "rlp", - "serde 1.0.190", + "serde 1.0.193", "sha3", "zeroize", ] @@ -1795,9 +1807,9 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" +checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d" dependencies = [ "enumset_derive", ] @@ -1811,7 +1823,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1822,34 +1834,23 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] name = "escargot" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5584ba17d7ab26a8a7284f13e5bd196294dd2f2d79773cff29b9e9edef601a6" +checksum = "768064bd3a0e2bedcba91dc87ace90beea91acc41b6a01a3ca8e9aa8827461bf" dependencies = [ "log", "once_cell", - "serde 1.0.190", + "serde 1.0.193", "serde_json", ] @@ -1861,15 +1862,15 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest 0.10.6", + "digest 0.10.7", "hex", "hmac 0.12.1", "pbkdf2 0.11.0", "rand 0.8.5", "scrypt", - "serde 1.0.190", + "serde 1.0.193", "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", "uuid 0.8.2", @@ -1885,7 +1886,7 @@ dependencies = [ "hex", "once_cell", "regex", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "sha3", "thiserror", @@ -1981,97 +1982,97 @@ dependencies = [ [[package]] name = "ethers-addressbook" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b856b7b8ff5c961093cb8efe151fbcce724b451941ce20781de11a531ccd578" +checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09" dependencies = [ "ethers-core", "once_cell", - "serde 1.0.190", + "serde 1.0.193", "serde_json", ] [[package]] name = "ethers-contract" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e066a0d9cfc70c454672bf16bb433b0243427420076dc5b2f49c448fb5a10628" +checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" dependencies = [ + "const-hex", "ethers-contract-abigen", "ethers-contract-derive", "ethers-core", "ethers-providers", "futures-util", - "hex", "once_cell", "pin-project", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "thiserror", ] [[package]] name = "ethers-contract-abigen" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c113e3e86b6bc16d98484b2c3bb2d01d6fed9f489fe2e592e5cc87c3024d616b" +checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" dependencies = [ "Inflector", + "const-hex", "dunce", "ethers-core", "eyre", - "hex", - "prettyplease 0.2.4", + "prettyplease 0.2.15", "proc-macro2", "quote", "regex", - "serde 1.0.190", + "serde 1.0.193", "serde_json", - "syn 2.0.38", - "toml 0.7.6", + "syn 2.0.39", + "toml 0.8.8", "walkdir", ] [[package]] name = "ethers-contract-derive" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3fb5adee25701c79ec58fcf2c63594cd8829bc9ad6037ff862d5a111101ed2" +checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" dependencies = [ "Inflector", + "const-hex", "ethers-contract-abigen", "ethers-core", - "hex", "proc-macro2", "quote", "serde_json", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "ethers-core" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" +checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" dependencies = [ - "arrayvec 0.7.2", + "arrayvec 0.7.4", "bytes", "cargo_metadata", "chrono", + "const-hex", "elliptic-curve", "ethabi", "generic-array 0.14.7", - "hex", "k256", - "num_enum 0.6.1", + "num_enum", "once_cell", "open-fastrlp", "rand 0.8.5", "rlp", - "serde 1.0.190", + "serde 1.0.193", "serde_json", - "strum", - "syn 2.0.38", + "strum 0.25.0", + "syn 2.0.39", "tempfile", "thiserror", "tiny-keccak", @@ -2080,14 +2081,15 @@ dependencies = [ [[package]] name = "ethers-etherscan" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84ebb401ba97c6f5af278c2c9936c4546cad75dec464b439ae6df249906f4caa" +checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" dependencies = [ + "chrono", "ethers-core", "reqwest", - "semver 1.0.17", - "serde 1.0.190", + "semver 1.0.20", + "serde 1.0.193", "serde_json", "thiserror", "tracing", @@ -2095,15 +2097,14 @@ dependencies = [ [[package]] name = "ethers-middleware" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740f4a773c19dd6d6a68c8c2e0996c096488d38997d524e21dc612c55da3bd24" +checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93" dependencies = [ "async-trait", "auto_impl", "ethers-contract", "ethers-core", - "ethers-etherscan", "ethers-providers", "ethers-signers", "futures-channel", @@ -2111,7 +2112,7 @@ dependencies = [ "futures-util", "instant", "reqwest", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "thiserror", "tokio", @@ -2122,27 +2123,28 @@ dependencies = [ [[package]] name = "ethers-providers" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b498fd2a6c019d023e43e83488cd1fb0721f299055975aa6bac8dbf1e95f2c" +checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" dependencies = [ "async-trait", "auto_impl", - "base64 0.21.0", + "base64 0.21.5", "bytes", + "const-hex", "enr", "ethers-core", "futures-core", "futures-timer", "futures-util", "hashers", - "hex", "http", "instant", + "jsonwebtoken", "once_cell", "pin-project", "reqwest", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "thiserror", "tokio", @@ -2157,28 +2159,28 @@ dependencies = [ [[package]] name = "ethers-signers" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c4b7e15f212fa7cc2e1251868320221d4ff77a3d48068e69f47ce1c491df2d" +checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532" dependencies = [ "async-trait", "coins-bip32", "coins-bip39", + "const-hex", "elliptic-curve", "eth-keystore", "ethers-core", - "hex", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", "tracing", ] [[package]] name = "expectrl" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b36f34b0325008d05b0e9be8361bfa8a0fb905f10de0d951c2621c59e811cb91" +checksum = "ede784925953fcab9a3351d5009bcb8d2b0c13e940924c88087e8e2ce0c4717a" dependencies = [ "conpty", "nix", @@ -2188,9 +2190,9 @@ dependencies = [ [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" dependencies = [ "indenter", "once_cell", @@ -2210,12 +2212,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fd-lock" @@ -2224,7 +2223,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" dependencies = [ "cfg-if 1.0.0", - "rustix 0.38.4", + "rustix", "windows-sys 0.48.0", ] @@ -2234,20 +2233,20 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec 1.0.1", + "bitvec", "rand_core 0.6.4", "subtle 2.4.1", ] [[package]] name = "filetime" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.16", + "redox_syscall 0.3.5", "windows-sys 0.48.0", ] @@ -2271,12 +2270,12 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", - "miniz_oxide 0.7.1", + "miniz_oxide", ] [[package]] @@ -2312,9 +2311,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -2328,9 +2327,9 @@ dependencies = [ "cbc", "cipher", "libm", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-integer", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] @@ -2347,9 +2346,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -2362,9 +2361,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -2372,15 +2371,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -2389,9 +2388,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-locks" @@ -2405,26 +2404,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-timer" @@ -2438,9 +2437,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -2498,9 +2497,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -2522,17 +2521,17 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.2" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "git2" -version = "0.13.25" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29229cc1b24c0e6062f6e742aa3e256492a5323365e5ed3413599f8a5eff7d6" +checksum = "fbf97ba92db08df386e10c8ede66a2a0369bd277090afd8710e19e38de9ec0cd" dependencies = [ - "bitflags 1.2.1", + "bitflags 2.4.1", "libc", "libgit2-sys", "log", @@ -2593,9 +2592,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -2603,10 +2602,10 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.1.0", "slab", "tokio", - "tokio-util 0.7.8", + "tokio-util 0.7.10", "tracing", ] @@ -2636,9 +2635,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hashers" @@ -2651,22 +2650,21 @@ dependencies = [ [[package]] name = "hdrhistogram" -version = "7.5.2" +version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ "byteorder", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] name = "headers" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.13.1", - "bitflags 1.2.1", + "base64 0.21.5", "bytes", "headers-core", "http", @@ -2692,18 +2690,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -2749,7 +2738,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2769,11 +2758,20 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77e806677ce663d0a199541030c816847b36e8dc095f70dae4a4f4ad63da5383" +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -2799,15 +2797,15 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -2820,7 +2818,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2836,7 +2834,7 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.8", + "rustls", "tokio", "tokio-rustls", ] @@ -2868,16 +2866,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.56" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows 0.48.0", + "windows-core", ] [[package]] @@ -2901,14 +2899,14 @@ dependencies = [ "ibc-derive", "ibc-proto", "ics23", - "num-traits 0.2.15", + "num-traits 0.2.17", "parking_lot", "primitive-types", - "prost 0.12.1", - "serde 1.0.190", + "prost 0.12.3", + "serde 1.0.193", "serde-json-wasm", "serde_derive", - "sha2 0.10.6", + "sha2 0.10.8", "subtle-encoding", "tendermint", "tendermint-light-client-verifier", @@ -2929,7 +2927,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -2938,12 +2936,12 @@ version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63042806bb2f662ca1c68026231900cfe13361136ddfd0dd09bcb315056a22b8" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "bytes", "flex-error", "ics23", - "prost 0.12.1", - "serde 1.0.190", + "prost 0.12.3", + "serde 1.0.193", "subtle-encoding", "tendermint-proto", ] @@ -2958,10 +2956,10 @@ dependencies = [ "bytes", "hex", "informalsystems-pbjson", - "prost 0.12.1", + "prost 0.12.3", "ripemd", - "serde 1.0.190", - "sha2 0.10.6", + "serde 1.0.193", + "sha2 0.10.8", "sha3", ] @@ -2973,9 +2971,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2997,7 +2995,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" dependencies = [ "integer-sqrt", - "num-traits 0.2.15", + "num-traits 0.2.17", "uint", ] @@ -3016,7 +3014,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -3036,7 +3034,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5ad43a3f5795945459d577f6589cf62a476e92c79b75e70cd954364e14ce17b" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -3048,10 +3046,10 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "index-set" version = "0.8.0" -source = "git+https://github.com/heliaxdev/index-set?tag=v0.8.0#0c218cc300c1bb7a1acf34f21b6e9d489df5fda8" +source = "git+https://github.com/heliaxdev/index-set?tag=v0.8.1#b0d928f83cf0d465ccda299d131e8df2859b5184" dependencies = [ "borsh", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -3062,17 +3060,17 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "indexmap" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.3", ] [[package]] @@ -3082,7 +3080,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4eecd90f87bea412eac91c6ef94f6b1e390128290898cbe14f2b926787ae1fb" dependencies = [ "base64 0.13.1", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -3109,35 +3107,23 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" dependencies = [ - "num-traits 0.2.15", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", + "num-traits 0.2.17", ] [[package]] name = "ipnet" -version = "2.7.2" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix 0.37.1", + "hermit-abi", + "rustix", "windows-sys 0.48.0", ] @@ -3161,35 +3147,49 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.62" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.5", + "pem", + "ring 0.16.20", + "serde 1.0.193", + "serde_json", + "simple_asn1", +] + [[package]] name = "jubjub" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8499f7a74008aafbecb2a2e608a3e13e4dd3e84df198b604451efe93f2de6e61" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bls12_381", "ff", "group", @@ -3199,17 +3199,17 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.6", - "signature 2.1.0", + "sha2 0.10.8", + "signature 2.2.0", ] [[package]] @@ -3263,7 +3263,7 @@ dependencies = [ "ledger-zondax-generic", "prost 0.11.9", "prost-types 0.11.9", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] @@ -3301,7 +3301,7 @@ checksum = "02036c84eab9c48e85bc568d269221ba4f5e1cfbc785c3c2c2f6bb8c131f9287" dependencies = [ "async-trait", "ledger-transport", - "serde 1.0.190", + "serde 1.0.193", "thiserror", ] @@ -3312,7 +3312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" dependencies = [ "arrayvec 0.5.2", - "bitflags 1.2.1", + "bitflags 1.3.2", "cfg-if 1.0.0", "ryu", "static_assertions", @@ -3320,15 +3320,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libgit2-sys" -version = "0.12.26+1.3.0" +version = "0.16.1+1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e1c899248e606fbfe68dcb31d8b0176ebab833b103824af31bddf4b7457494" +checksum = "f2a2bb3680b094add03bb3732ec520ece34da31a8cd2d633d1389d0f0fb60d0c" dependencies = [ "cc", "libc", @@ -3350,9 +3350,20 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.6" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall 0.4.1", +] [[package]] name = "librocksdb-sys" @@ -3388,9 +3399,9 @@ dependencies = [ [[package]] name = "libssh2-sys" -version = "0.2.23" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" dependencies = [ "cc", "libc", @@ -3402,9 +3413,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.9" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" +checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" dependencies = [ "cc", "libc", @@ -3418,26 +3429,20 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "linux-raw-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" - -[[package]] -name = "linux-raw-sys" -version = "0.4.3" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -3445,9 +3450,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "loupe" @@ -3488,15 +3493,15 @@ dependencies = [ "indexmap 1.9.3", "linked-hash-map", "regex", - "serde 1.0.190", + "serde 1.0.193", "serde_derive", "serde_yaml", ] [[package]] name = "masp_note_encryption" -version = "0.2.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "borsh", "chacha20", @@ -3508,12 +3513,12 @@ dependencies = [ [[package]] name = "masp_primitives" -version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "aes", "bip0039", - "bitvec 1.0.1", + "bitvec", "blake2b_simd", "blake2s_simd", "bls12_381", @@ -3529,24 +3534,24 @@ dependencies = [ "masp_note_encryption", "memuse", "nonempty", - "num-traits 0.2.15", + "num-traits 0.2.17", "rand 0.8.5", "rand_core 0.6.4", - "sha2 0.10.6", + "sha2 0.10.8", "subtle 2.4.1", "zcash_encoding", ] [[package]] name = "masp_proofs" -version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "bellman", "blake2b_simd", "bls12_381", "directories", - "getrandom 0.2.10", + "getrandom 0.2.11", "group", "itertools 0.11.0", "jubjub", @@ -3564,14 +3569,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "maybe-uninit" @@ -3581,9 +3586,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" @@ -3614,9 +3619,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -3655,15 +3660,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -3675,25 +3671,24 @@ dependencies = [ [[package]] name = "minreq" -version = "2.8.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6c6973f78ef55d0e5fc04fdb8f9ad67c87c9e86bca0ff77b6a3102b0eb36b7" +checksum = "cb3371dfc7b772c540da1380123674a8e20583aca99907087d990ca58cf44203" dependencies = [ "log", "once_cell", - "rustls 0.20.8", - "webpki", + "rustls", + "rustls-webpki", "webpki-roots", ] [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -3767,12 +3762,12 @@ dependencies = [ "paste", "pretty_assertions", "proptest", - "prost 0.12.1", + "prost 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "rayon", "ripemd", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "sha2 0.9.9", "slip10_ed25519", @@ -3783,7 +3778,7 @@ dependencies = [ "tiny-bip39", "tiny-hderive", "tokio", - "toml 0.5.9", + "toml 0.5.11", "tracing", "tracing-subscriber", "wasm-instrument", @@ -3844,15 +3839,15 @@ dependencies = [ "namada_test_utils", "num-derive", "num-rational 0.4.1", - "num-traits 0.2.15", + "num-traits 0.2.17", "num256", "num_cpus", "once_cell", "orion", "pretty_assertions", "proptest", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "rayon", @@ -3862,7 +3857,7 @@ dependencies = [ "rlimit", "rocksdb", "rpassword", - "serde 1.0.190", + "serde 1.0.193", "serde_bytes", "serde_json", "sha2 0.9.9", @@ -3876,13 +3871,13 @@ dependencies = [ "thiserror", "tokio", "tokio-test", - "toml 0.5.9", + "toml 0.5.11", "tonic", "tower", "tower-abci", "tracing", "tracing-appender", - "tracing-log", + "tracing-log 0.1.4", "tracing-subscriber", "warp", "winapi", @@ -3933,18 +3928,18 @@ dependencies = [ "namada_macros", "num-integer", "num-rational 0.4.1", - "num-traits 0.2.15", + "num-traits 0.2.17", "num256", - "num_enum 0.7.0", + "num_enum", "pretty_assertions", "primitive-types", "proptest", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "rayon", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "sha2 0.9.9", "sparse-merkle-tree", @@ -3953,7 +3948,7 @@ dependencies = [ "test-log", "thiserror", "tiny-keccak", - "toml 0.5.9", + "toml 0.5.11", "tonic-build", "tracing", "tracing-subscriber", @@ -3988,12 +3983,12 @@ dependencies = [ "namada_macros", "namada_proof_of_stake", "rand 0.8.5", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "tendermint", "tendermint-proto", "tendermint-rpc", - "toml 0.5.9", + "toml 0.5.11", "tracing", ] @@ -4056,11 +4051,11 @@ dependencies = [ "owo-colors", "parse_duration", "paste", - "prost 0.12.1", + "prost 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "ripemd", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "sha2 0.9.9", "slip10_ed25519", @@ -4070,7 +4065,7 @@ dependencies = [ "tiny-bip39", "tiny-hderive", "tokio", - "toml 0.5.9", + "toml 0.5.11", "tracing", "wasmtimer", "zeroize", @@ -4082,7 +4077,7 @@ version = "0.27.0" dependencies = [ "borsh", "namada_core", - "strum", + "strum 0.24.1", ] [[package]] @@ -4114,22 +4109,22 @@ dependencies = [ "namada_test_utils", "namada_tx_prelude", "namada_vp_prelude", - "num-traits 0.2.15", + "num-traits 0.2.17", "once_cell", "pretty_assertions", "proptest", "proptest-state-machine", - "prost 0.12.1", + "prost 0.12.3", "rand 0.8.5", "regex", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "sha2 0.9.9", "tempfile", "tendermint-light-client", "test-log", "tokio", - "toml 0.5.9", + "toml 0.5.11", "tracing", "tracing-subscriber", ] @@ -4192,16 +4187,15 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", "cfg-if 1.0.0", "libc", "memoffset 0.7.1", "pin-utils", - "static_assertions", ] [[package]] @@ -4267,21 +4261,21 @@ dependencies = [ "num-integer", "num-iter", "num-rational 0.2.4", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] name = "num" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" dependencies = [ - "num-bigint 0.4.3", - "num-complex 0.4.3", + "num-bigint 0.4.4", + "num-complex 0.4.4", "num-integer", "num-iter", "num-rational 0.4.1", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] @@ -4292,18 +4286,18 @@ checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] @@ -4313,16 +4307,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ "autocfg", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] name = "num-complex" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] @@ -4343,7 +4337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] @@ -4354,7 +4348,7 @@ checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] @@ -4366,7 +4360,7 @@ dependencies = [ "autocfg", "num-bigint 0.2.6", "num-integer", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] @@ -4376,9 +4370,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-integer", - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] @@ -4387,14 +4381,14 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" dependencies = [ - "num-traits 0.2.15", + "num-traits 0.2.17", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -4407,63 +4401,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9b5179e82f0867b23e0b9b822493821f9345561f271364f409c8e4a058367d" dependencies = [ "lazy_static", - "num 0.4.0", + "num 0.4.1", "num-derive", - "num-traits 0.2.15", - "serde 1.0.190", + "num-traits 0.2.17", + "serde 1.0.193", "serde_derive", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] [[package]] name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb" -dependencies = [ - "num_enum_derive 0.7.0", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.38", + "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4480,9 +4453,9 @@ dependencies = [ [[package]] name = "object" -version = "0.30.3" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -4517,7 +4490,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec 0.7.2", + "arrayvec 0.7.4", "auto_impl", "bytes", "ethereum-types", @@ -4538,11 +4511,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" dependencies = [ - "bitflags 1.2.1", + "bitflags 2.4.1", "cfg-if 1.0.0", "foreign-types", "libc", @@ -4559,7 +4532,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4570,9 +4543,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" dependencies = [ "cc", "libc", @@ -4587,7 +4560,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6624905ddd92e460ff0685567539ed1ac985b2dee4c92c7edcd64fce905b00c" dependencies = [ "ct-codecs", - "getrandom 0.2.10", + "getrandom 0.2.11", "subtle 2.4.1", "zeroize", ] @@ -4615,25 +4588,25 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.5.0" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ddb756ca205bd108aee3c62c6d3c994e1df84a59b9d6d4a5ea42ee1fd5a9a28" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ - "arrayvec 0.7.2", - "bitvec 1.0.1", + "arrayvec 0.7.4", + "bitvec", "byte-slice-cast", "impl-trait-for-tuples", "parity-scale-codec-derive", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "parity-scale-codec-derive" -version = "3.1.4" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", "syn 1.0.109", @@ -4657,15 +4630,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.16", + "redox_syscall 0.4.1", "smallvec", - "windows-sys 0.45.0", + "windows-targets 0.48.5", ] [[package]] @@ -4705,9 +4678,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pbkdf2" @@ -4724,7 +4697,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "password-hash", ] @@ -4734,16 +4707,16 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] name = "pbkdf2" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0ca0b5a68607598bf3bad68f32227a8164f6254833f84eafaac409cd6746c31" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "hmac 0.12.1", ] @@ -4781,29 +4754,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" [[package]] -name = "percent-encoding" -version = "2.3.0" +name = "pem" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] name = "pest" -version = "2.6.0" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 1.9.3", + "indexmap 2.1.0", ] [[package]] @@ -4818,29 +4801,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -4870,7 +4853,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ - "num-traits 0.2.15", + "num-traits 0.2.17", "plotters-backend", "plotters-svg", "wasm-bindgen", @@ -4903,6 +4886,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -4958,19 +4947,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.4" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "primitive-types" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", @@ -4987,7 +4976,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", ] [[package]] @@ -5016,28 +5014,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", - "bitflags 1.2.1", - "byteorder", + "bit-vec", + "bitflags 2.4.1", "lazy_static", - "num-traits 0.2.15", + "num-traits 0.2.17", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax 0.8.2", "rusty-fork", "tempfile", "unarray", @@ -5064,12 +5062,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive 0.12.1", + "prost-derive 0.12.3", ] [[package]] @@ -5109,15 +5107,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5131,11 +5129,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" dependencies = [ - "prost 0.12.1", + "prost 0.12.3", ] [[package]] @@ -5182,12 +5180,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - [[package]] name = "radium" version = "0.7.0" @@ -5253,7 +5245,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", ] [[package]] @@ -5288,14 +5280,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel 0.5.8", "crossbeam-deque", - "crossbeam-utils 0.8.15", - "num_cpus", + "crossbeam-utils 0.8.16", ] [[package]] @@ -5311,7 +5301,7 @@ dependencies = [ "jubjub", "pasta_curves", "rand_core 0.6.4", - "serde 1.0.190", + "serde 1.0.193", "thiserror", "zeroize", ] @@ -5324,37 +5314,37 @@ checksum = "7a60db2c3bc9c6fd1e8631fee75abc008841d27144be744951d6b9b75f9b569c" dependencies = [ "rand_core 0.6.4", "reddsa", - "serde 1.0.190", + "serde 1.0.193", "thiserror", "zeroize", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", + "getrandom 0.2.11", + "libredox", "thiserror", ] @@ -5371,13 +5361,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -5389,6 +5380,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -5397,9 +5399,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "region" @@ -5407,7 +5409,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", "libc", "mach", "winapi", @@ -5415,9 +5417,9 @@ dependencies = [ [[package]] name = "rend" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" +checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" dependencies = [ "bytecheck", ] @@ -5428,7 +5430,7 @@ version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -5447,10 +5449,10 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.8", + "rustls", "rustls-native-certs", "rustls-pemfile", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "serde_urlencoded", "system-configuration", @@ -5492,12 +5494,12 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866" dependencies = [ "cc", - "getrandom 0.2.10", + "getrandom 0.2.11", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -5510,7 +5512,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -5519,7 +5521,7 @@ version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bytecheck", "hashbrown 0.12.3", "ptr_meta", @@ -5527,7 +5529,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.3.2", + "uuid 1.6.1", ] [[package]] @@ -5631,56 +5633,30 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.17", + "semver 1.0.20", ] [[package]] name = "rustix" -version = "0.37.1" +version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4790277f605573dd24b6751701e0823582a63c7cafc095e427e6c66e45dd75e" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ - "bitflags 1.2.1", + "bitflags 2.4.1", "errno", - "io-lifetimes", "libc", - "linux-raw-sys 0.3.7", - "windows-sys 0.45.0", -] - -[[package]] -name = "rustix" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" -dependencies = [ - "bitflags 2.3.3", - "errno", - "libc", - "linux-raw-sys 0.4.3", + "linux-raw-sys", "windows-sys 0.48.0", ] [[package]] name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", -] - -[[package]] -name = "rustls" -version = "0.21.8" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring 0.17.5", + "ring 0.17.6", "rustls-webpki", "sct", ] @@ -5699,11 +5675,11 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", ] [[package]] @@ -5712,15 +5688,15 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", + "ring 0.17.6", "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "rusty-fork" @@ -5736,9 +5712,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "salsa20" @@ -5760,9 +5736,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" dependencies = [ "cfg-if 1.0.0", "derive_more", @@ -5772,11 +5748,11 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -5784,11 +5760,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] @@ -5799,9 +5775,9 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scrypt" @@ -5812,17 +5788,17 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.6", + "sha2 0.10.8", ] [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", + "ring 0.17.6", + "untrusted 0.9.0", ] [[package]] @@ -5833,9 +5809,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -5848,11 +5824,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.3.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -5861,9 +5837,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -5880,11 +5856,11 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -5916,9 +5892,9 @@ checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -5941,16 +5917,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83c37d03f3b0f6b5f77c11af1e7c772de1c9af83e50bef7bb6069601900ba67b" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "serde_bytes" -version = "0.11.9" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -5960,49 +5936,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ "half", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "serde_repr" -version = "0.1.12" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -6014,7 +5990,7 @@ dependencies = [ "form_urlencoded", "itoa", "ryu", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] @@ -6025,7 +6001,7 @@ checksum = "ef8099d3df28273c99a1728190c7a9f19d444c941044f64adf986bee7ec53051" dependencies = [ "dtoa", "linked-hash-map", - "serde 1.0.190", + "serde 1.0.193", "yaml-rust", ] @@ -6036,18 +6012,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" dependencies = [ "base16ct", - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -6077,13 +6053,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -6092,30 +6068,30 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "shlex" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" [[package]] name = "signal-hook" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", @@ -6138,11 +6114,11 @@ checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -6158,11 +6134,23 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc47a29ce97772ca5c927f75bac34866b16d64e07f330c3248e2d7226623901b" +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint 0.4.4", + "num-traits 0.2.17", + "thiserror", + "time", +] + [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -6178,9 +6166,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "snafu" @@ -6206,18 +6194,28 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "sparse-merkle-tree" version = "0.3.1-pre" -source = "git+https://github.com/heliaxdev/sparse-merkle-tree?rev=aed81070ce2c83a41e1c6bada757347f33ef8eb6#aed81070ce2c83a41e1c6bada757347f33ef8eb6" +source = "git+https://github.com/heliaxdev/sparse-merkle-tree?rev=515687fe7884cb365067ac86c66ac3613de176bb#515687fe7884cb365067ac86c66ac3613de176bb" dependencies = [ "blake2b-rs", "borsh", @@ -6240,9 +6238,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -6272,7 +6270,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros 0.25.3", ] [[package]] @@ -6288,6 +6295,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.39", +] + [[package]] name = "subtle" version = "1.0.0" @@ -6328,9 +6348,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -6346,7 +6366,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -6375,7 +6395,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] @@ -6398,9 +6418,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.38" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" dependencies = [ "filetime", "libc", @@ -6409,21 +6429,21 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.7" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tempfile" -version = "3.5.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if 1.0.0", "fastrand", - "redox_syscall 0.3.5", - "rustix 0.37.1", - "windows-sys 0.45.0", + "redox_syscall 0.4.1", + "rustix", + "windows-sys 0.48.0", ] [[package]] @@ -6433,23 +6453,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" dependencies = [ "bytes", - "digest 0.10.6", - "ed25519 2.2.2", + "digest 0.10.7", + "ed25519 2.2.3", "ed25519-consensus 2.1.0", "flex-error", "futures", "k256", - "num-traits 0.2.15", + "num-traits 0.2.17", "once_cell", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "ripemd", - "serde 1.0.190", + "serde 1.0.193", "serde_bytes", "serde_json", "serde_repr", - "sha2 0.10.6", - "signature 2.1.0", + "sha2 0.10.8", + "signature 2.2.0", "subtle 2.4.1", "subtle-encoding", "tendermint-proto", @@ -6464,10 +6484,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a25dbe8b953e80f3d61789fbdb83bf9ad6c0ef16df5ca6546f49912542cc137" dependencies = [ "flex-error", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "tendermint", - "toml 0.5.9", + "toml 0.5.11", "url", ] @@ -6483,7 +6503,7 @@ dependencies = [ "flex-error", "futures", "regex", - "serde 1.0.190", + "serde 1.0.193", "serde_cbor", "serde_derive", "serde_json", @@ -6504,7 +6524,7 @@ checksum = "74994da9de4b1144837a367ca2c60c650f5526a7c1a54760a3020959b522e474" dependencies = [ "derive_more", "flex-error", - "serde 1.0.190", + "serde 1.0.193", "tendermint", "time", ] @@ -6518,10 +6538,10 @@ dependencies = [ "bytes", "flex-error", "num-derive", - "num-traits 0.2.15", - "prost 0.12.1", - "prost-types 0.12.1", - "serde 1.0.190", + "num-traits 0.2.17", + "prost 0.12.3", + "prost-types 0.12.3", + "serde 1.0.193", "serde_bytes", "subtle-encoding", "time", @@ -6537,12 +6557,12 @@ dependencies = [ "bytes", "flex-error", "futures", - "getrandom 0.2.10", + "getrandom 0.2.11", "peg", "pin-project", "reqwest", - "semver 1.0.17", - "serde 1.0.190", + "semver 1.0.20", + "serde 1.0.193", "serde_bytes", "serde_json", "subtle 2.4.1", @@ -6567,7 +6587,7 @@ checksum = "a19d4f02b7e38ce790da973fdc9edc71a0e35340ac57737bf278c8379037c1f5" dependencies = [ "ed25519-consensus 2.1.0", "gumdrop", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "simple-error", "tempfile", @@ -6583,33 +6603,33 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "test-log" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f0c854faeb68a048f0f2dc410c5ddae3bf83854ef0e4977d58306a5edef50e" +checksum = "f66edd6b6cd810743c0c71e1d085e92b01ce6a72782032e3f794c8284fe4bcdd" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -6624,9 +6644,9 @@ dependencies = [ [[package]] name = "tikv-jemalloc-sys" -version = "0.5.3+5.3.0-patched" +version = "0.5.4+5.3.0-patched" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a678df20055b43e57ef8cddde41cdfda9a3c1a060b67f4c5836dfb1d78543ba8" +checksum = "9402443cb8fd499b6f327e40565234ff34dbda27460c5b47db0db77443dd85d1" dependencies = [ "cc", "libc", @@ -6634,27 +6654,29 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", "itoa", - "serde 1.0.190", + "powerfmt", + "serde 1.0.193", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] @@ -6705,7 +6727,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", "serde_json", ] @@ -6726,11 +6748,11 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.1" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -6738,7 +6760,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] @@ -6755,13 +6777,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -6780,7 +6802,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.8", + "rustls", "tokio", ] @@ -6797,9 +6819,9 @@ dependencies = [ [[package]] name = "tokio-test" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53474327ae5e166530d17f2d956afcb4f8a004de581b3cae10f12006bc8163e3" +checksum = "e89b3cbabd3ae862100094ae433e1def582cf86451b4e9bf83aa7ac1d8a7d719" dependencies = [ "async-stream", "bytes", @@ -6810,9 +6832,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.18.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54319c93411147bced34cb5609a80e0a8e44c5999c93903a81cd866630ec0bfd" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", @@ -6836,9 +6858,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -6850,42 +6872,64 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", ] [[package]] name = "toml" -version = "0.7.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.21.0", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde 1.0.193", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "serde 1.0.190", + "indexmap 2.1.0", + "toml_datetime", + "winnow", ] [[package]] name = "toml_edit" -version = "0.19.12" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.0.0", - "serde 1.0.190", + "indexmap 2.1.0", + "serde 1.0.193", "serde_spanned", "toml_datetime", "winnow", @@ -6915,7 +6959,7 @@ dependencies = [ "prost-derive 0.11.9", "tokio", "tokio-stream", - "tokio-util 0.7.8", + "tokio-util 0.7.10", "tower", "tower-layer", "tower-service", @@ -6951,7 +6995,7 @@ dependencies = [ "rand 0.8.5", "slab", "tokio", - "tokio-util 0.7.8", + "tokio-util 0.7.10", "tower-layer", "tower-service", "tracing", @@ -6965,7 +7009,7 @@ dependencies = [ "bytes", "futures", "pin-project", - "prost 0.12.1", + "prost 0.12.3", "tendermint", "tendermint-proto", "tokio", @@ -6989,11 +7033,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -7002,31 +7045,32 @@ dependencies = [ [[package]] name = "tracing-appender" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel 0.5.8", + "thiserror", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -7054,12 +7098,23 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] @@ -7069,27 +7124,27 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" dependencies = [ - "serde 1.0.190", + "serde 1.0.193", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", "once_cell", "regex", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "sharded-slab", "thread_local", "tracing", "tracing-core", - "tracing-log", + "tracing-log 0.2.0", "tracing-serde", ] @@ -7101,13 +7156,13 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "tungstenite" -version = "0.18.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ee6ab729cd4cf0fd55218530c4522ed30b7b6081752839b68fcec8d0960788" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" dependencies = [ - "base64 0.13.1", "byteorder", "bytes", + "data-encoding", "http", "httparse", "log", @@ -7135,20 +7190,20 @@ checksum = "8fa054ee5e2346187d631d2f1d1fd3b33676772d6d03a2d84e1c5213b31674ee" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uint" @@ -7170,9 +7225,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] @@ -7185,9 +7240,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -7200,9 +7255,9 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -7234,9 +7289,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -7251,9 +7306,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8-width" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[package]] name = "utf8parse" @@ -7267,15 +7322,15 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.10", - "serde 1.0.190", + "getrandom 0.2.11", + "serde 1.0.193", ] [[package]] name = "uuid" -version = "1.3.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" [[package]] name = "valuable" @@ -7306,9 +7361,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -7316,19 +7371,18 @@ dependencies = [ [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] [[package]] name = "warp" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba431ef570df1287f7f8b07e376491ad54f84d26ac473489427231e1718e1f69" +checksum = "c1e92e22e03ff1230c03a1a8ee37d2f89cd489e2e541b7550d6afad96faed169" dependencies = [ "bytes", "futures-channel", @@ -7344,13 +7398,13 @@ dependencies = [ "pin-project", "rustls-pemfile", "scoped-tls", - "serde 1.0.190", + "serde 1.0.193", "serde_json", "serde_urlencoded", "tokio", "tokio-stream", "tokio-tungstenite", - "tokio-util 0.7.8", + "tokio-util 0.7.10", "tower-service", "tracing", ] @@ -7369,9 +7423,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -7379,24 +7433,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.35" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -7406,9 +7460,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7416,28 +7470,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.26.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05d0b6fcd0aeb98adf16e7975331b3c17222aa815148f5b976370ce589d80ef" +checksum = "7b09bc5df933a3dabbdb72ae4b6b71be8ae07f58774d5aa41bd20adcd41a235a" dependencies = [ "leb128", ] @@ -7508,7 +7562,7 @@ dependencies = [ "enumset", "loupe", "rkyv", - "serde 1.0.190", + "serde 1.0.193", "serde_bytes", "smallvec", "target-lexicon", @@ -7577,7 +7631,7 @@ dependencies = [ "memmap2", "more-asserts", "rustc-demangle", - "serde 1.0.190", + "serde 1.0.193", "serde_bytes", "target-lexicon", "thiserror", @@ -7600,7 +7654,7 @@ dependencies = [ "loupe", "object 0.28.4", "rkyv", - "serde 1.0.190", + "serde 1.0.193", "tempfile", "tracing", "wasmer-artifact", @@ -7668,7 +7722,7 @@ dependencies = [ "loupe", "more-asserts", "rkyv", - "serde 1.0.190", + "serde 1.0.193", "thiserror", ] @@ -7692,7 +7746,7 @@ dependencies = [ "region", "rkyv", "scopeguard", - "serde 1.0.190", + "serde 1.0.193", "thiserror", "wasmer-artifact", "wasmer-types", @@ -7712,7 +7766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29e3ac9b780c7dda0cac7a52a5d6d2d6707cc6e3451c9db209b6c758f40d7acb" dependencies = [ "indexmap 1.9.3", - "semver 1.0.17", + "semver 1.0.20", ] [[package]] @@ -7731,9 +7785,9 @@ dependencies = [ [[package]] name = "wast" -version = "57.0.0" +version = "69.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb0f5ed17ac4421193c7477da05892c2edafd67f9639e3c11a82086416662dc" +checksum = "efa51b5ad1391943d1bfad537e50f28fe938199ee76b115be6bae83802cd5185" dependencies = [ "leb128", "memchr", @@ -7743,51 +7797,39 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.63" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9ab0d87337c3be2bb6fc5cd331c4ba9fd6bcb4ee85048a0dd59ed9ecf92e53" +checksum = "74a4c2488d058326466e086a43f5d4ea448241a8d0975e3eb0642c0828be1eb3" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.62" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] @@ -7808,9 +7850,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -7831,12 +7873,12 @@ dependencies = [ ] [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.5", ] [[package]] @@ -7854,35 +7896,20 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.52.0", ] [[package]] @@ -7902,17 +7929,32 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -7923,9 +7965,15 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" @@ -7941,9 +7989,15 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" @@ -7959,9 +8013,15 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" @@ -7977,9 +8037,15 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" @@ -7995,9 +8061,15 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" @@ -8007,9 +8079,15 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" @@ -8025,15 +8103,21 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.4.6" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" dependencies = [ "memchr", ] @@ -8078,9 +8162,9 @@ dependencies = [ [[package]] name = "xattr" -version = "0.2.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" dependencies = [ "libc", ] @@ -8111,9 +8195,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -8126,16 +8210,15 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index c1fa8f6d03..58f3f0f5e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ ark-bls12-381 = {version = "0.3"} ark-serialize = {version = "0.3"} ark-std = "0.3.0" # branch = "bat/arse-merkle-tree" -arse-merkle-tree = {package = "sparse-merkle-tree", git = "https://github.com/heliaxdev/sparse-merkle-tree", rev = "aed81070ce2c83a41e1c6bada757347f33ef8eb6", default-features = false, features = ["std", "borsh"]} +arse-merkle-tree = {package = "sparse-merkle-tree", git = "https://github.com/heliaxdev/sparse-merkle-tree", rev = "515687fe7884cb365067ac86c66ac3613de176bb", default-features = false, features = ["std", "borsh"]} assert_cmd = "1.0.7" assert_matches = "1.5.0" async-trait = {version = "0.1.51"} @@ -53,8 +53,8 @@ bit-set = "0.5.2" blake2b-rs = "0.2.0" byte-unit = "4.0.13" byteorder = "1.4.2" -borsh = {version = "1.0.0-alpha.4", features = ["schema", "derive"]} -borsh-ext = {tag = "v1.0.0-alpha.4", git = "https://github.com/heliaxdev/borsh-ext"} +borsh = {version = "1.2.0", features = ["unstable__schema", "derive"]} +borsh-ext = { git = "https://github.com/heliaxdev/borsh-ext", tag = "v1.2.0" } chrono = {version = "0.4.22", default-features = false, features = ["clock", "std"]} circular-queue = "0.2.6" clap = "4.3.4" @@ -80,9 +80,9 @@ fd-lock = "3.0.12" flate2 = "1.0.22" fs_extra = "1.2.0" futures = "0.3" -git2 = "0.13.25" +git2 = "0.18.1" ics23 = "0.11.0" -index-set = {git = "https://github.com/heliaxdev/index-set", tag = "v0.8.0", features = ["serialize-borsh", "serialize-serde"]} +index-set = { git = "https://github.com/heliaxdev/index-set", tag = "v0.8.1", features = ["serialize-borsh", "serialize-serde"] } itertools = "0.10.0" k256 = { version = "0.13.0", default-features = false, features = ["ecdsa", "pkcs8", "precomputed-tables", "serde", "std"]} lazy_static = "1.4.0" @@ -91,8 +91,8 @@ ledger-transport-hid = "0.10.0" libc = "0.2.97" libloading = "0.7.2" # branch = "murisi/namada-integration" -masp_primitives = { git = "https://github.com/anoma/masp", rev = "77e009626f3f52fe83c81ec6ee38fc2547d38da3" } -masp_proofs = { git = "https://github.com/anoma/masp", rev = "77e009626f3f52fe83c81ec6ee38fc2547d38da3", default-features = false, features = ["local-prover"] } +masp_primitives = { git = "https://github.com/anoma/masp", tag = "v1.0.0" } +masp_proofs = { git = "https://github.com/anoma/masp", tag = "v1.0.0", default-features = false, features = ["local-prover"] } num256 = "0.3.5" num_cpus = "1.13.0" num-derive = "0.3.3" diff --git a/core/src/types/key/ed25519.rs b/core/src/types/key/ed25519.rs index 48460a2d2f..7096ba21cc 100644 --- a/core/src/types/key/ed25519.rs +++ b/core/src/types/key/ed25519.rs @@ -80,8 +80,14 @@ impl BorshSchema for PublicKey { ) { // Encoded as `[u8; PUBLIC_KEY_LENGTH]` let elements = "u8".into(); - let length = PUBLIC_KEY_LENGTH as u32; - let definition = borsh::schema::Definition::Array { elements, length }; + let length = PUBLIC_KEY_LENGTH as u64; + // let definition = borsh::schema::Definition::Array { elements, length + // }; + let definition = borsh::schema::Definition::Sequence { + length_width: 0, + length_range: 0..=length, + elements, + }; definitions.insert(Self::declaration(), definition); } @@ -198,8 +204,14 @@ impl BorshSchema for SecretKey { ) { // Encoded as `[u8; SECRET_KEY_LENGTH]` let elements = "u8".into(); - let length = SECRET_KEY_LENGTH as u32; - let definition = borsh::schema::Definition::Array { elements, length }; + let length = SECRET_KEY_LENGTH as u64; + // let definition = borsh::schema::Definition::Array { elements, length + // }; + let definition = borsh::schema::Definition::Sequence { + length_width: 0, + length_range: 0..=length, + elements, + }; definitions.insert(Self::declaration(), definition); } @@ -279,8 +291,14 @@ impl BorshSchema for Signature { ) { // Encoded as `[u8; SIGNATURE_LENGTH]` let elements = "u8".into(); - let length = SIGNATURE_LENGTH as u32; - let definition = borsh::schema::Definition::Array { elements, length }; + let length = SIGNATURE_LENGTH as u64; + // let definition = borsh::schema::Definition::Array { elements, length + // }; + let definition = borsh::schema::Definition::Sequence { + length_width: 0, + length_range: 0..=length, + elements, + }; definitions.insert(Self::declaration(), definition); } diff --git a/core/src/types/key/secp256k1.rs b/core/src/types/key/secp256k1.rs index 7d823d5305..29407b9191 100644 --- a/core/src/types/key/secp256k1.rs +++ b/core/src/types/key/secp256k1.rs @@ -93,8 +93,14 @@ impl BorshSchema for PublicKey { ) { // Encoded as `[u8; COMPRESSED_PUBLIC_KEY_SIZE]` let elements = "u8".into(); - let length = COMPRESSED_PUBLIC_KEY_SIZE as u32; - let definition = borsh::schema::Definition::Array { elements, length }; + let length = COMPRESSED_PUBLIC_KEY_SIZE as u64; + // let definition = borsh::schema::Definition::Array { elements, length + // }; + let definition = borsh::schema::Definition::Sequence { + length_width: 0, + length_range: 0..=length, + elements, + }; definitions.insert(Self::declaration(), definition); } @@ -241,8 +247,14 @@ impl BorshSchema for SecretKey { ) { // Encoded as `[u8; SECRET_KEY_SIZE]` let elements = "u8".into(); - let length = SECRET_KEY_SIZE as u32; - let definition = borsh::schema::Definition::Array { elements, length }; + let length = SECRET_KEY_SIZE as u64; + // let definition = borsh::schema::Definition::Array { elements, length + // }; + let definition = borsh::schema::Definition::Sequence { + length_width: 0, + length_range: 0..=length, + elements, + }; definitions.insert(Self::declaration(), definition); } diff --git a/encoding_spec/src/main.rs b/encoding_spec/src/main.rs index 4365fd4a01..8ec6f79945 100644 --- a/encoding_spec/src/main.rs +++ b/encoding_spec/src/main.rs @@ -284,16 +284,29 @@ struct Table { fn definition_to_table(name: &Declaration, def: schema::Definition) -> Table { let (desc, rows) = match def { - schema::Definition::Array { length, elements } => { + schema::Definition::Primitive(t) => { + let rows = None; + let desc = format!("Primitive type {}", md_fmt_type(t.to_string())); + (desc, rows) + } + schema::Definition::Sequence { + length_width, + length_range, + elements, + } if length_width == 0 => { let rows = None; let desc = format!( "Fixed-size array with {} elements of {}", - length, + length_range.end(), md_fmt_type(elements) ); (desc, rows) } - schema::Definition::Sequence { elements } => { + schema::Definition::Sequence { + length_width: _, + length_range: _, + elements, + } => { let rows = None; let desc = format!("Dynamic-size array of {}", md_fmt_type(elements)); @@ -313,10 +326,13 @@ fn definition_to_table(name: &Declaration, def: schema::Definition) -> Table { ); (desc, rows) } - schema::Definition::Enum { variants } => { + schema::Definition::Enum { + tag_width: _, + variants, + } => { let mut rows = madato::types::Table::default(); // build rows for: Variant, Name, Type - for (variant, (name, type_name)) in variants.iter().enumerate() { + for (_, (variant, name, type_name)) in variants.iter().enumerate() { rows.push(TableRow::from_iter([ ("Prefix byte".into(), variant.to_string()), ("Name".into(), name.clone()), diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 66a3bb5817..1d30fa4a74 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -14,11 +14,11 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.27.2", + "gimli 0.28.1", ] [[package]] @@ -50,24 +50,30 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", "once_cell", "version_check", ] [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -79,30 +85,29 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] @@ -118,9 +123,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", "windows-sys 0.48.0", @@ -128,9 +133,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ark-bls12-381" @@ -168,7 +173,7 @@ dependencies = [ "ark-serialize", "ark-std", "derivative", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-traits", "paste", "rustc_version 0.3.3", @@ -191,7 +196,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-traits", "quote", "syn 1.0.109", @@ -225,19 +230,19 @@ checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -271,16 +276,16 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.30.3", + "object 0.32.1", "rustc-demangle", ] @@ -304,9 +309,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -316,15 +321,15 @@ checksum = "8a32fd6af2b5827bce66c29053ba0e7c42b9dcab01835835058558c10851a46b" [[package]] name = "bech32" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" +checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" [[package]] name = "bech32" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bellman" @@ -332,7 +337,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afceed28bac7f9f5a508bca8aeeff51cdfa4770c0b967ac55c621e2ddfd6171" dependencies = [ - "bitvec 1.0.1", + "bitvec", "blake2s_simd", "byteorder", "ff", @@ -351,15 +356,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bip0039" version = "0.10.1" @@ -369,7 +365,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.10.1", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "unicode-normalization", "zeroize", ] @@ -396,14 +392,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bitvec" -version = "0.17.4" +name = "bitflags" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium 0.3.0", -] +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "bitvec" @@ -412,16 +404,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", - "radium 0.7.0", + "radium", "tap", "wyz", ] [[package]] name = "blake2b_simd" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", "arrayvec", @@ -430,9 +422,9 @@ dependencies = [ [[package]] name = "blake2s_simd" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" +checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" dependencies = [ "arrayref", "arrayvec", @@ -441,16 +433,15 @@ dependencies = [ [[package]] name = "blake3" -version = "1.3.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if 1.0.0", "constant_time_eq", - "digest 0.10.6", ] [[package]] @@ -507,9 +498,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.0.0-alpha.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41898277107b0d3f027593697912977397eba6ac39a55bdd2eb02c1d5d5013b5" +checksum = "bf617fabf5cdbdc92f774bfe5062d870f228b80056d41180797abf48bed4056e" dependencies = [ "borsh-derive", "cfg_aliases", @@ -517,40 +508,41 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.0.0-alpha.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413cb435569fe499e89235f758304e0e7198016baa351d8f5827ea0f40526ce0" +checksum = "f404657a7ea7b5249e36808dff544bc88a28f26e0ac40009f674b7a009d14be3" dependencies = [ "once_cell", - "proc-macro-crate", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "syn_derive", ] [[package]] name = "borsh-ext" -version = "1.0.0-alpha.4" -source = "git+https://github.com/heliaxdev/borsh-ext?tag=v1.0.0-alpha.4#6bebf357002f96574ac37a28f547b6c88e91b799" +version = "1.2.0" +source = "git+https://github.com/heliaxdev/borsh-ext?tag=v1.2.0#a62fee3e847e512cad9ac0f1fd5a900e5db9ba37" dependencies = [ "borsh", ] [[package]] name = "bs58" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2 0.9.9", + "sha2 0.10.8", + "tinyvec", ] [[package]] name = "bumpalo" -version = "3.12.2" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-slice-cast" @@ -566,9 +558,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "bytecheck" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -577,9 +569,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" dependencies = [ "proc-macro2", "quote", @@ -588,46 +580,46 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ "serde", ] [[package]] name = "camino" -version = "1.1.4" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" dependencies = [ "serde", ] [[package]] name = "cargo-platform" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" -version = "0.15.4" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.17", + "semver 1.0.20", "serde", "serde_json", "thiserror", @@ -695,14 +687,14 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ + "android-tzdata", "iana-time-zone", - "num-integer", "num-traits", - "winapi", + "windows-targets 0.48.5", ] [[package]] @@ -727,18 +719,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.19" +version = "4.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd304a20bff958a57f04c4e96a2e7594cc4490a0e809cbd48bb6437edaa452d" +checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.3.19" +version = "4.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c6a3f08f1fe5662a35cfe393aec09c4df95f60ee93b7556505260f75eee9e1" +checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" dependencies = [ "anstream", "anstyle", @@ -748,9 +740,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "clru" @@ -759,56 +751,52 @@ source = "git+https://github.com/marmeladema/clru-rs.git?rev=71ca566#71ca566915f [[package]] name = "coins-bip32" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30a84aab436fcb256a2ab3c80663d8aec686e6bae12827bb05fef3e1e439c9f" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ - "bincode", "bs58", "coins-core", - "digest 0.10.6", - "getrandom 0.2.10", + "digest 0.10.7", "hmac 0.12.1", "k256", - "lazy_static", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] [[package]] name = "coins-bip39" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f4d04ee18e58356accd644896aeb2094ddeafb6a713e056cef0c0a8e468c15" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "bitvec 0.17.4", + "bitvec", "coins-bip32", - "getrandom 0.2.10", "hmac 0.12.1", "once_cell", - "pbkdf2 0.12.1", + "pbkdf2 0.12.2", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", ] [[package]] name = "coins-core" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b949a1c63fb7eb591eb7ba438746326aedf0ae843e51ec92ba6bec5bb382c4f" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" dependencies = [ - "base64 0.21.0", - "bech32 0.7.3", + "base64 0.21.5", + "bech32 0.9.1", "bs58", - "digest 0.10.6", + "digest 0.10.7", "generic-array 0.14.7", "hex", "ripemd", "serde", "serde_derive", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -821,25 +809,38 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "concat-idents" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe0e1d9f7de897d18e590a7496b5facbe87813f746cf4b8db596ba77e07e832" +checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.39", +] + +[[package]] +name = "const-hex" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "hex", + "proptest", + "serde", ] [[package]] name = "const-oid" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6340df57935414636969091153f35f68d9f00bbc8fb4a9c6054706c213e6c6bc" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "constant_time_eq" -version = "0.2.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "contracts" @@ -879,9 +880,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "corosensei" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9847f90f32a50b0dcbd68bc23ff242798b13080b97b0569f6ed96a45ce4cf2cd" +checksum = "80128832c58ea9cbd041d2a759ec449224487b2c1e400453d99d244eead87a8e" dependencies = [ "autocfg", "cfg-if 1.0.0", @@ -892,9 +893,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -977,16 +978,6 @@ dependencies = [ "maybe-uninit", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils 0.8.15", -] - [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -995,19 +986,19 @@ checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", - "crossbeam-utils 0.8.15", + "crossbeam-utils 0.8.16", ] [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if 1.0.0", - "crossbeam-utils 0.8.15", - "memoffset 0.8.0", + "crossbeam-utils 0.8.16", + "memoffset 0.9.0", "scopeguard", ] @@ -1024,9 +1015,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if 1.0.0", ] @@ -1039,9 +1030,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", @@ -1109,9 +1100,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -1119,45 +1110,54 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "darling_macro" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivation-path" version = "0.2.0" @@ -1206,9 +1206,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid", @@ -1244,7 +1244,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1259,7 +1259,7 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "byteorder", "lazy_static", "proc-macro-error", @@ -1281,12 +1281,12 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.16.7" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest 0.10.6", + "digest 0.10.7", "elliptic-curve", "rfc6979", "serdect", @@ -1334,19 +1334,19 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.6", + "digest 0.10.7", "ff", "generic-array 0.14.7", "group", @@ -1360,20 +1360,20 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "enr" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf56acd72bb22d2824e66ae8e9e5ada4d0de17a69c7fd35569dde2ada8ec9116" +checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" dependencies = [ - "base64 0.13.1", + "base64 0.21.5", "bytes", "hex", "k256", @@ -1407,9 +1407,9 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" +checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d" dependencies = [ "enumset_derive", ] @@ -1423,34 +1423,23 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "equivalent" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.1" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1461,7 +1450,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest 0.10.6", + "digest 0.10.7", "hex", "hmac 0.12.1", "pbkdf2 0.11.0", @@ -1469,10 +1458,10 @@ dependencies = [ "scrypt", "serde", "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", "thiserror", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -1572,9 +1561,9 @@ dependencies = [ [[package]] name = "ethers-addressbook" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b856b7b8ff5c961093cb8efe151fbcce724b451941ce20781de11a531ccd578" +checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09" dependencies = [ "ethers-core", "once_cell", @@ -1584,16 +1573,16 @@ dependencies = [ [[package]] name = "ethers-contract" -version = "2.0.4" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa43e2e69632492d7b38e59465d125a0066cf4c477390ece00d3acbd11b338b" +checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" dependencies = [ + "const-hex", "ethers-contract-abigen", "ethers-contract-derive", "ethers-core", "ethers-providers", "futures-util", - "hex", "once_cell", "pin-project", "serde", @@ -1603,70 +1592,66 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c113e3e86b6bc16d98484b2c3bb2d01d6fed9f489fe2e592e5cc87c3024d616b" +checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" dependencies = [ "Inflector", + "const-hex", "dunce", "ethers-core", - "ethers-etherscan", "eyre", - "hex", - "prettyplease 0.2.9", + "prettyplease 0.2.15", "proc-macro2", "quote", "regex", - "reqwest", "serde", "serde_json", - "syn 2.0.38", - "tokio", - "toml 0.7.5", - "url", + "syn 2.0.39", + "toml 0.8.8", "walkdir", ] [[package]] name = "ethers-contract-derive" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3fb5adee25701c79ec58fcf2c63594cd8829bc9ad6037ff862d5a111101ed2" +checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" dependencies = [ "Inflector", + "const-hex", "ethers-contract-abigen", "ethers-core", - "hex", "proc-macro2", "quote", "serde_json", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "ethers-core" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" +checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" dependencies = [ "arrayvec", "bytes", "cargo_metadata", "chrono", + "const-hex", "elliptic-curve", "ethabi", "generic-array 0.14.7", - "hex", "k256", - "num_enum 0.6.1", + "num_enum", "once_cell", "open-fastrlp", "rand 0.8.5", "rlp", "serde", "serde_json", - "strum", - "syn 2.0.38", + "strum 0.25.0", + "syn 2.0.39", "tempfile", "thiserror", "tiny-keccak", @@ -1675,13 +1660,14 @@ dependencies = [ [[package]] name = "ethers-etherscan" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84ebb401ba97c6f5af278c2c9936c4546cad75dec464b439ae6df249906f4caa" +checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" dependencies = [ + "chrono", "ethers-core", "reqwest", - "semver 1.0.17", + "semver 1.0.20", "serde", "serde_json", "thiserror", @@ -1690,15 +1676,14 @@ dependencies = [ [[package]] name = "ethers-middleware" -version = "2.0.3" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6f3543b4f6679b2558901c4b323cecb06b19239439d2588fa8b489bac9675d" +checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93" dependencies = [ "async-trait", "auto_impl", "ethers-contract", "ethers-core", - "ethers-etherscan", "ethers-providers", "ethers-signers", "futures-channel", @@ -1717,24 +1702,24 @@ dependencies = [ [[package]] name = "ethers-providers" -version = "2.0.4" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1009041f40476b972b5d79346cc512e97c662b1a0a2f78285eabe9a122909783" +checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" dependencies = [ "async-trait", "auto_impl", - "base64 0.21.0", + "base64 0.21.5", "bytes", + "const-hex", "enr", "ethers-core", "futures-core", "futures-timer", "futures-util", - "getrandom 0.2.10", "hashers", - "hex", "http", "instant", + "jsonwebtoken", "once_cell", "pin-project", "reqwest", @@ -1753,28 +1738,28 @@ dependencies = [ [[package]] name = "ethers-signers" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c4b7e15f212fa7cc2e1251868320221d4ff77a3d48068e69f47ce1c491df2d" +checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532" dependencies = [ "async-trait", "coins-bip32", "coins-bip39", + "const-hex", "elliptic-curve", "eth-keystore", "ethers-core", - "hex", "rand 0.8.5", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", "tracing", ] [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" dependencies = [ "indenter", "once_cell", @@ -1794,12 +1779,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "ff" @@ -1807,7 +1789,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec 1.0.1", + "bitvec", "rand_core 0.6.4", "subtle 2.4.1", ] @@ -1848,9 +1830,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1864,7 +1846,7 @@ dependencies = [ "cbc", "cipher", "libm", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-integer", "num-traits", ] @@ -1877,9 +1859,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1892,9 +1874,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1902,15 +1884,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1919,9 +1901,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-locks" @@ -1935,26 +1917,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-timer" @@ -1968,9 +1950,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -2028,9 +2010,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -2052,9 +2034,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.2" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gloo-timers" @@ -2102,9 +2084,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.18" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -2112,7 +2094,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -2145,9 +2127,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hashers" @@ -2166,18 +2148,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -2211,7 +2184,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2231,11 +2204,20 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77e806677ce663d0a199541030c816847b36e8dc095f70dae4a4f4ad63da5383" +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -2261,15 +2243,15 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -2282,7 +2264,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2298,23 +2280,23 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.8", + "rustls", "tokio", "tokio-rustls", ] [[package]] name = "iana-time-zone" -version = "0.1.56" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -2341,11 +2323,11 @@ dependencies = [ "num-traits", "parking_lot", "primitive-types", - "prost 0.12.1", + "prost 0.12.3", "serde", "serde-json-wasm", "serde_derive", - "sha2 0.10.6", + "sha2 0.10.8", "subtle-encoding", "tendermint", "tendermint-light-client-verifier", @@ -2366,7 +2348,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -2375,11 +2357,11 @@ version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63042806bb2f662ca1c68026231900cfe13361136ddfd0dd09bcb315056a22b8" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "bytes", "flex-error", "ics23", - "prost 0.12.1", + "prost 0.12.3", "serde", "subtle-encoding", "tendermint-proto", @@ -2395,10 +2377,10 @@ dependencies = [ "bytes", "hex", "informalsystems-pbjson", - "prost 0.12.1", + "prost 0.12.3", "ripemd", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", ] @@ -2410,9 +2392,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2485,7 +2467,7 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "index-set" version = "0.8.0" -source = "git+https://github.com/heliaxdev/index-set?tag=v0.8.0#0c218cc300c1bb7a1acf34f21b6e9d489df5fda8" +source = "git+https://github.com/heliaxdev/index-set?tag=v0.8.1#b0d928f83cf0d465ccda299d131e8df2859b5184" dependencies = [ "borsh", "serde", @@ -2504,12 +2486,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.3", ] [[package]] @@ -2549,34 +2531,11 @@ dependencies = [ "num-traits", ] -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "is-terminal" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" -dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix", - "windows-sys 0.48.0", -] +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itertools" @@ -2598,26 +2557,40 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.62" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.5", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "jubjub" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8499f7a74008aafbecb2a2e608a3e13e4dd3e84df198b604451efe93f2de6e61" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bls12_381", "ff", "group", @@ -2627,16 +2600,16 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.6", + "sha2 0.10.8", "signature", ] @@ -2663,9 +2636,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libloading" @@ -2679,9 +2652,20 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] [[package]] name = "libsecp256k1" @@ -2701,15 +2685,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.3.7" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -2717,9 +2701,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "loupe" @@ -2753,8 +2737,8 @@ dependencies = [ [[package]] name = "masp_note_encryption" -version = "0.2.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "borsh", "chacha20", @@ -2766,12 +2750,12 @@ dependencies = [ [[package]] name = "masp_primitives" -version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "aes", "bip0039", - "bitvec 1.0.1", + "bitvec", "blake2b_simd", "blake2s_simd", "bls12_381", @@ -2790,21 +2774,21 @@ dependencies = [ "num-traits", "rand 0.8.5", "rand_core 0.6.4", - "sha2 0.10.6", + "sha2 0.10.8", "subtle 2.4.1", "zcash_encoding", ] [[package]] name = "masp_proofs" -version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "bellman", "blake2b_simd", "bls12_381", "directories", - "getrandom 0.2.10", + "getrandom 0.2.11", "group", "itertools 0.11.0", "jubjub", @@ -2822,7 +2806,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -2833,9 +2817,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" @@ -2857,9 +2841,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -2890,36 +2874,35 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "minreq" -version = "2.8.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de406eeb24aba36ed3829532fa01649129677186b44a49debec0ec574ca7da7" +checksum = "cb3371dfc7b772c540da1380123674a8e20583aca99907087d990ca58cf44203" dependencies = [ "log", "once_cell", - "rustls 0.20.8", - "webpki", + "rustls", + "rustls-webpki", "webpki-roots", ] [[package]] name = "mio" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -2966,7 +2949,7 @@ dependencies = [ "parse_duration", "paste", "proptest", - "prost 0.12.1", + "prost 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "rayon", @@ -3025,11 +3008,11 @@ dependencies = [ "num-rational 0.4.1", "num-traits", "num256", - "num_enum 0.7.0", + "num_enum", "primitive-types", "proptest", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "rayon", @@ -3116,7 +3099,7 @@ dependencies = [ "owo-colors", "parse_duration", "paste", - "prost 0.12.1", + "prost 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "ripemd", @@ -3141,7 +3124,7 @@ version = "0.27.0" dependencies = [ "borsh", "namada_core", - "strum", + "strum 0.24.1", ] [[package]] @@ -3163,7 +3146,7 @@ dependencies = [ "namada_tx_prelude", "namada_vp_prelude", "num-traits", - "prost 0.12.1", + "prost 0.12.3", "regex", "serde", "serde_json", @@ -3219,7 +3202,7 @@ name = "namada_wasm" version = "0.27.0" dependencies = [ "borsh", - "getrandom 0.2.10", + "getrandom 0.2.11", "masp_primitives", "namada", "namada_test_utils", @@ -3256,12 +3239,12 @@ dependencies = [ [[package]] name = "num" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" dependencies = [ - "num-bigint 0.4.3", - "num-complex 0.4.3", + "num-bigint 0.4.4", + "num-complex 0.4.4", "num-integer", "num-iter", "num-rational 0.4.1", @@ -3281,9 +3264,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -3302,9 +3285,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ "num-traits", ] @@ -3360,16 +3343,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -3382,7 +3365,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9b5179e82f0867b23e0b9b822493821f9345561f271364f409c8e4a058367d" dependencies = [ "lazy_static", - "num 0.4.0", + "num 0.4.1", "num-derive", "num-traits", "serde", @@ -3391,54 +3374,33 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] [[package]] name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb" -dependencies = [ - "num_enum_derive 0.7.0", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.38", + "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3455,9 +3417,9 @@ dependencies = [ [[package]] name = "object" -version = "0.30.3" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -3518,7 +3480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6624905ddd92e460ff0685567539ed1ac985b2dee4c92c7edcd64fce905b00c" dependencies = [ "ct-codecs", - "getrandom 0.2.10", + "getrandom 0.2.11", "subtle 2.4.1", "zeroize", ] @@ -3540,12 +3502,12 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.5.0" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ddb756ca205bd108aee3c62c6d3c994e1df84a59b9d6d4a5ea42ee1fd5a9a28" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec", - "bitvec 1.0.1", + "bitvec", "byte-slice-cast", "impl-trait-for-tuples", "parity-scale-codec-derive", @@ -3554,11 +3516,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.1.4" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", "syn 1.0.109", @@ -3582,15 +3544,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.16", + "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets 0.48.5", ] [[package]] @@ -3630,9 +3592,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pbkdf2" @@ -3649,7 +3611,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "password-hash", ] @@ -3659,16 +3621,16 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] name = "pbkdf2" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0ca0b5a68607598bf3bad68f32227a8164f6254833f84eafaac409cd6746c31" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "hmac 0.12.1", ] @@ -3699,30 +3661,40 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.6.0" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 1.9.3", + "indexmap 2.1.0", ] [[package]] @@ -3737,29 +3709,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -3788,6 +3760,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -3806,19 +3784,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.9" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "primitive-types" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", @@ -3835,7 +3813,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", ] [[package]] @@ -3864,28 +3851,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", - "bitflags", - "byteorder", + "bit-vec", + "bitflags 2.4.1", "lazy_static", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax 0.8.2", "rusty-fork", "tempfile", "unarray", @@ -3903,12 +3890,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive 0.12.1", + "prost-derive 0.12.3", ] [[package]] @@ -3948,15 +3935,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3970,11 +3957,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" dependencies = [ - "prost 0.12.1", + "prost 0.12.3", ] [[package]] @@ -4012,12 +3999,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - [[package]] name = "radium" version = "0.7.0" @@ -4083,7 +4064,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", ] [[package]] @@ -4118,14 +4099,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel 0.5.8", "crossbeam-deque", - "crossbeam-utils 0.8.15", - "num_cpus", + "crossbeam-utils 0.8.16", ] [[package]] @@ -4161,30 +4140,21 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", + "getrandom 0.2.11", + "libredox", "thiserror", ] @@ -4201,13 +4171,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -4219,6 +4190,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -4227,9 +4209,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "region" @@ -4237,7 +4219,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" dependencies = [ - "bitflags", + "bitflags 1.3.2", "libc", "mach", "winapi", @@ -4245,9 +4227,9 @@ dependencies = [ [[package]] name = "rend" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" +checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" dependencies = [ "bytecheck", ] @@ -4258,7 +4240,7 @@ version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -4275,7 +4257,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.8", + "rustls", "rustls-native-certs", "rustls-pemfile", "serde", @@ -4319,12 +4301,12 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866" dependencies = [ "cc", - "getrandom 0.2.10", + "getrandom 0.2.11", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -4337,28 +4319,31 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] name = "rkyv" -version = "0.7.41" +version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" dependencies = [ + "bitvec", "bytecheck", "hashbrown 0.12.3", "ptr_meta", "rend", "rkyv_derive", "seahash", + "tinyvec", + "uuid 1.6.1", ] [[package]] name = "rkyv_derive" -version = "0.7.41" +version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" dependencies = [ "proc-macro2", "quote", @@ -4420,18 +4405,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.17", + "semver 1.0.20", ] [[package]] name = "rustix" -version = "0.37.19" +version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ - "bitflags", + "bitflags 2.4.1", "errno", - "io-lifetimes", "libc", "linux-raw-sys", "windows-sys 0.48.0", @@ -4439,24 +4423,12 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring 0.16.20", - "sct", - "webpki", -] - -[[package]] -name = "rustls" -version = "0.21.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" -dependencies = [ - "log", - "ring 0.17.5", + "ring 0.17.6", "rustls-webpki", "sct", ] @@ -4475,11 +4447,11 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", ] [[package]] @@ -4488,15 +4460,15 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", + "ring 0.17.6", "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "rusty-fork" @@ -4512,9 +4484,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "salsa20" @@ -4536,9 +4508,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.8.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad560913365790f17cbf12479491169f01b9d46d29cfc7422bf8c64bdc61b731" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" dependencies = [ "cfg-if 1.0.0", "derive_more", @@ -4548,11 +4520,11 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.8.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19df9bd9ace6cc2fe19387c96ce677e823e07d017ceed253e7bb3d1d1bd9c73b" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -4560,18 +4532,18 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scrypt" @@ -4582,17 +4554,17 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.6", + "sha2 0.10.8", ] [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", + "ring 0.17.6", + "untrusted 0.9.0", ] [[package]] @@ -4603,9 +4575,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -4618,11 +4590,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -4631,9 +4603,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -4650,9 +4622,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" dependencies = [ "serde", ] @@ -4680,9 +4652,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -4698,9 +4670,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.9" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" dependencies = [ "serde", ] @@ -4717,20 +4689,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -4739,20 +4711,20 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.12" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] @@ -4806,13 +4778,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -4821,15 +4793,15 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] @@ -4845,11 +4817,11 @@ dependencies = [ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -4865,11 +4837,23 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc47a29ce97772ca5c927f75bac34866b16d64e07f330c3248e2d7226623901b" +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "thiserror", + "time", +] + [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -4885,24 +4869,34 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "sparse-merkle-tree" version = "0.3.1-pre" -source = "git+https://github.com/heliaxdev/sparse-merkle-tree?rev=aed81070ce2c83a41e1c6bada757347f33ef8eb6#aed81070ce2c83a41e1c6bada757347f33ef8eb6" +source = "git+https://github.com/heliaxdev/sparse-merkle-tree?rev=515687fe7884cb365067ac86c66ac3613de176bb#515687fe7884cb365067ac86c66ac3613de176bb" dependencies = [ "borsh", "cfg-if 1.0.0", @@ -4924,9 +4918,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -4956,7 +4950,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros 0.25.3", ] [[package]] @@ -4972,6 +4975,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.39", +] + [[package]] name = "subtle" version = "1.0.0" @@ -5012,9 +5028,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -5023,14 +5039,14 @@ dependencies = [ [[package]] name = "syn_derive" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6eef0000c4a12ecdfd7873ea84a8b5aab5e44db72e38e07b028a25386f29a5" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5039,7 +5055,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] @@ -5062,21 +5078,21 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.7" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tempfile" -version = "3.5.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if 1.0.0", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -5086,7 +5102,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" dependencies = [ "bytes", - "digest 0.10.6", + "digest 0.10.7", "ed25519", "ed25519-consensus 2.1.0", "flex-error", @@ -5094,14 +5110,14 @@ dependencies = [ "k256", "num-traits", "once_cell", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "ripemd", "serde", "serde_bytes", "serde_json", "serde_repr", - "sha2 0.10.6", + "sha2 0.10.8", "signature", "subtle 2.4.1", "subtle-encoding", @@ -5131,7 +5147,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94aecbdccbc4b557649b2d1b1a4bfc27ec85205e00fb8020fce044245a4c9e3f" dependencies = [ "contracts", - "crossbeam-channel 0.4.4", + "crossbeam-channel", "derive_more", "flex-error", "futures", @@ -5172,8 +5188,8 @@ dependencies = [ "flex-error", "num-derive", "num-traits", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "serde", "serde_bytes", "subtle-encoding", @@ -5190,11 +5206,11 @@ dependencies = [ "bytes", "flex-error", "futures", - "getrandom 0.2.10", + "getrandom 0.2.11", "peg", "pin-project", "reqwest", - "semver 1.0.17", + "semver 1.0.20", "serde", "serde_bytes", "serde_json", @@ -5208,7 +5224,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid", + "uuid 0.8.2", "walkdir", ] @@ -5230,33 +5246,33 @@ dependencies = [ [[package]] name = "test-log" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f0c854faeb68a048f0f2dc410c5ddae3bf83854ef0e4977d58306a5edef50e" +checksum = "f66edd6b6cd810743c0c71e1d085e92b01ce6a72782032e3f794c8284fe4bcdd" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5271,10 +5287,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", + "itoa", + "powerfmt", "serde", "time-core", "time-macros", @@ -5282,15 +5301,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] @@ -5352,11 +5371,11 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.1" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -5364,20 +5383,20 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5386,15 +5405,15 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.8", + "rustls", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -5415,32 +5434,54 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebafdf5ad1220cb59e7d17cf4d2c72015297b75b19a10472f99b89225089240" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.21.0", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.11" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", @@ -5468,11 +5509,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -5481,20 +5521,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -5511,9 +5551,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "once_cell", @@ -5535,7 +5575,7 @@ name = "tx_template" version = "0.27.0" dependencies = [ "borsh", - "getrandom 0.2.10", + "getrandom 0.2.11", "namada_tests", "namada_tx_prelude", "wee_alloc", @@ -5558,20 +5598,20 @@ checksum = "8fa054ee5e2346187d631d2f1d1fd3b33676772d6d03a2d84e1c5213b31674ee" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uint" @@ -5599,9 +5639,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -5614,9 +5654,9 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -5626,9 +5666,9 @@ checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle 2.4.1", @@ -5648,9 +5688,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -5669,10 +5709,16 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", "serde", ] +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" + [[package]] name = "version_check" version = "0.9.4" @@ -5684,7 +5730,7 @@ name = "vp_template" version = "0.27.0" dependencies = [ "borsh", - "getrandom 0.2.10", + "getrandom 0.2.11", "namada_tests", "namada_vp_prelude", "wee_alloc", @@ -5701,9 +5747,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -5711,11 +5757,10 @@ dependencies = [ [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -5733,9 +5778,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -5743,24 +5788,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.35" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -5770,9 +5815,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5780,28 +5825,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.26.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05d0b6fcd0aeb98adf16e7975331b3c17222aa815148f5b976370ce589d80ef" +checksum = "7b09bc5df933a3dabbdb72ae4b6b71be8ae07f58774d5aa41bd20adcd41a235a" dependencies = [ "leb128", ] @@ -6076,7 +6121,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29e3ac9b780c7dda0cac7a52a5d6d2d6707cc6e3451c9db209b6c758f40d7acb" dependencies = [ "indexmap 1.9.3", - "semver 1.0.17", + "semver 1.0.20", ] [[package]] @@ -6095,9 +6140,9 @@ dependencies = [ [[package]] name = "wast" -version = "57.0.0" +version = "69.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb0f5ed17ac4421193c7477da05892c2edafd67f9639e3c11a82086416662dc" +checksum = "efa51b5ad1391943d1bfad537e50f28fe938199ee76b115be6bae83802cd5185" dependencies = [ "leb128", "memchr", @@ -6107,41 +6152,28 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.63" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9ab0d87337c3be2bb6fc5cd331c4ba9fd6bcb4ee85048a0dd59ed9ecf92e53" +checksum = "74a4c2488d058326466e086a43f5d4ea448241a8d0975e3eb0642c0828be1eb3" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.62" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "wee_alloc" @@ -6157,13 +6189,14 @@ dependencies = [ [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] @@ -6184,9 +6217,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -6198,12 +6231,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.5", ] [[package]] @@ -6221,78 +6254,63 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.52.0", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" @@ -6302,15 +6320,15 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" @@ -6320,15 +6338,15 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" @@ -6338,15 +6356,15 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" @@ -6356,27 +6374,27 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" @@ -6386,21 +6404,21 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.4.6" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" dependencies = [ "memchr", ] @@ -6454,9 +6472,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -6469,5 +6487,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] diff --git a/wasm/tx_template/Cargo.toml b/wasm/tx_template/Cargo.toml index 091647f3dc..9b224ef197 100644 --- a/wasm/tx_template/Cargo.toml +++ b/wasm/tx_template/Cargo.toml @@ -11,7 +11,7 @@ crate-type = ["cdylib"] [dependencies] namada_tx_prelude = {path = "../../tx_prelude"} -borsh = "1.0.0-alpha.4" +borsh = "1.2.0" wee_alloc = "0.4.5" getrandom = { version = "0.2", features = ["custom"] } diff --git a/wasm/vp_template/Cargo.toml b/wasm/vp_template/Cargo.toml index 154b56d939..5ad9aa58e6 100644 --- a/wasm/vp_template/Cargo.toml +++ b/wasm/vp_template/Cargo.toml @@ -11,7 +11,7 @@ crate-type = ["cdylib"] [dependencies] namada_vp_prelude = {path = "../../vp_prelude"} -borsh = "1.0.0-alpha.4" +borsh = "1.2.0" wee_alloc = "0.4.5" getrandom = { version = "0.2", features = ["custom"] } diff --git a/wasm/wasm_source/Cargo.toml b/wasm/wasm_source/Cargo.toml index 8e8e3efe4e..96c371ea39 100644 --- a/wasm/wasm_source/Cargo.toml +++ b/wasm/wasm_source/Cargo.toml @@ -43,12 +43,12 @@ vp_validator = ["namada_vp_prelude", "once_cell"] [dependencies] namada_tx_prelude = {path = "../../tx_prelude", optional = true} namada_vp_prelude = {path = "../../vp_prelude", optional = true} -borsh = "1.0.0-alpha.4" +borsh = "1.2.0" once_cell = {version = "1.8.0", optional = true} wee_alloc = "0.4.5" getrandom = { version = "0.2", features = ["custom"] } # branch = "murisi/namada-integration" -masp_primitives = { git = "https://github.com/anoma/masp", rev = "77e009626f3f52fe83c81ec6ee38fc2547d38da3", optional = true } +masp_primitives = { git = "https://github.com/anoma/masp", tag = "v1.0.0", optional = true } ripemd = "0.1" [dev-dependencies] diff --git a/wasm_for_tests/wasm_source/Cargo.lock b/wasm_for_tests/wasm_source/Cargo.lock index 133935e7f0..34461378f1 100644 --- a/wasm_for_tests/wasm_source/Cargo.lock +++ b/wasm_for_tests/wasm_source/Cargo.lock @@ -507,9 +507,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.0.0-alpha.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41898277107b0d3f027593697912977397eba6ac39a55bdd2eb02c1d5d5013b5" +checksum = "bf617fabf5cdbdc92f774bfe5062d870f228b80056d41180797abf48bed4056e" dependencies = [ "borsh-derive", "cfg_aliases", @@ -517,12 +517,12 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.0.0-alpha.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413cb435569fe499e89235f758304e0e7198016baa351d8f5827ea0f40526ce0" +checksum = "f404657a7ea7b5249e36808dff544bc88a28f26e0ac40009f674b7a009d14be3" dependencies = [ "once_cell", - "proc-macro-crate", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", "syn 2.0.38", @@ -531,8 +531,8 @@ dependencies = [ [[package]] name = "borsh-ext" -version = "1.0.0-alpha.4" -source = "git+https://github.com/heliaxdev/borsh-ext?tag=v1.0.0-alpha.4#6bebf357002f96574ac37a28f547b6c88e91b799" +version = "1.2.0" +source = "git+https://github.com/heliaxdev/borsh-ext?tag=v1.2.0#a62fee3e847e512cad9ac0f1fd5a900e5db9ba37" dependencies = [ "borsh", ] @@ -2298,7 +2298,7 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.8", + "rustls", "tokio", "tokio-rustls", ] @@ -2485,7 +2485,7 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "index-set" version = "0.8.0" -source = "git+https://github.com/heliaxdev/index-set?tag=v0.8.0#0c218cc300c1bb7a1acf34f21b6e9d489df5fda8" +source = "git+https://github.com/heliaxdev/index-set?tag=v0.8.1#b0d928f83cf0d465ccda299d131e8df2859b5184" dependencies = [ "borsh", "serde", @@ -2753,8 +2753,8 @@ dependencies = [ [[package]] name = "masp_note_encryption" -version = "0.2.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "borsh", "chacha20", @@ -2766,8 +2766,8 @@ dependencies = [ [[package]] name = "masp_primitives" -version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "aes", "bip0039", @@ -2797,8 +2797,8 @@ dependencies = [ [[package]] name = "masp_proofs" -version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=77e009626f3f52fe83c81ec6ee38fc2547d38da3#77e009626f3f52fe83c81ec6ee38fc2547d38da3" +version = "1.0.0" +source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc71219b913ac9f79e48b" dependencies = [ "bellman", "blake2b_simd", @@ -2899,14 +2899,14 @@ dependencies = [ [[package]] name = "minreq" -version = "2.8.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de406eeb24aba36ed3829532fa01649129677186b44a49debec0ec574ca7da7" +checksum = "cb3371dfc7b772c540da1380123674a8e20583aca99907087d990ca58cf44203" dependencies = [ "log", "once_cell", - "rustls 0.20.8", - "webpki", + "rustls", + "rustls-webpki", "webpki-roots", ] @@ -3416,7 +3416,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 2.0.38", @@ -3428,7 +3428,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 2.0.38", @@ -3551,7 +3551,7 @@ version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -3828,7 +3828,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.11", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", ] [[package]] @@ -4268,7 +4277,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.8", + "rustls", "rustls-native-certs", "rustls-pemfile", "serde", @@ -4430,18 +4439,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.21.8" @@ -4545,7 +4542,7 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19df9bd9ace6cc2fe19387c96ce677e823e07d017ceed253e7bb3d1d1bd9c73b" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -4895,7 +4892,7 @@ dependencies = [ [[package]] name = "sparse-merkle-tree" version = "0.3.1-pre" -source = "git+https://github.com/heliaxdev/sparse-merkle-tree?rev=aed81070ce2c83a41e1c6bada757347f33ef8eb6#aed81070ce2c83a41e1c6bada757347f33ef8eb6" +source = "git+https://github.com/heliaxdev/sparse-merkle-tree?rev=515687fe7884cb365067ac86c66ac3613de176bb#515687fe7884cb365067ac86c66ac3613de176bb" dependencies = [ "borsh", "cfg-if 1.0.0", @@ -5379,7 +5376,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.8", + "rustls", "tokio", ] @@ -5415,14 +5412,14 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.19.11", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] @@ -5437,7 +5434,18 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.4.6", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.0.0", + "toml_datetime", + "winnow 0.5.19", ] [[package]] @@ -6095,24 +6103,11 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "wee_alloc" @@ -6376,6 +6371,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" From 440b07bffc0566c1f16baf26951b1c5c29a1d353 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Thu, 30 Nov 2023 10:14:48 +0200 Subject: [PATCH 095/175] Added an async-send flag to the SDK --- sdk/Cargo.toml | 2 + sdk/src/eth_bridge/bridge_pool.rs | 9 ++-- sdk/src/io.rs | 20 ++++++--- sdk/src/lib.rs | 49 +++++++++++++++------- sdk/src/masp.rs | 17 ++++---- sdk/src/queries/mod.rs | 5 ++- wasm/checksums.json | 50 +++++++++++------------ wasm_for_tests/tx_fail.wasm | Bin 387383 -> 369591 bytes wasm_for_tests/tx_memory_limit.wasm | Bin 438268 -> 420689 bytes wasm_for_tests/tx_mint_tokens.wasm | Bin 594890 -> 594890 bytes wasm_for_tests/tx_no_op.wasm | Bin 387544 -> 369602 bytes wasm_for_tests/tx_proposal_code.wasm | Bin 440466 -> 418158 bytes wasm_for_tests/tx_read_storage_key.wasm | Bin 442958 -> 426327 bytes wasm_for_tests/tx_write.wasm | Bin 449600 -> 431030 bytes wasm_for_tests/tx_write_storage_key.wasm | Bin 465107 -> 465107 bytes wasm_for_tests/vp_always_false.wasm | Bin 409829 -> 392260 bytes wasm_for_tests/vp_always_true.wasm | Bin 409795 -> 392414 bytes wasm_for_tests/vp_eval.wasm | Bin 483964 -> 466354 bytes wasm_for_tests/vp_memory_limit.wasm | Bin 462210 -> 444449 bytes wasm_for_tests/vp_read_storage_key.wasm | Bin 469245 -> 448693 bytes 20 files changed, 93 insertions(+), 59 deletions(-) diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 713f99e035..ec94efa765 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -41,6 +41,8 @@ async-client = [ "async-trait", ] +async-send = [] + ibc-mocks = [ "namada_core/ibc-mocks", ] diff --git a/sdk/src/eth_bridge/bridge_pool.rs b/sdk/src/eth_bridge/bridge_pool.rs index efd2989d58..639257fc70 100644 --- a/sdk/src/eth_bridge/bridge_pool.rs +++ b/sdk/src/eth_bridge/bridge_pool.rs @@ -42,7 +42,8 @@ use crate::rpc::{query_storage_value, query_wasm_code_hash, validate_amount}; use crate::signing::aux_signing_data; use crate::tx::prepare_tx; use crate::{ - args, display, display_line, edisplay_line, Namada, SigningTxData, + args, display, display_line, edisplay_line, MaybeSync, Namada, + SigningTxData, }; /// Craft a transaction that adds a transfer to the Ethereum bridge pool. @@ -419,7 +420,7 @@ pub async fn query_relay_progress( /// bridge pool. async fn construct_bridge_pool_proof( client: &(impl Client + Sync), - io: &impl Io, + io: &(impl Io + MaybeSync), args: GenBridgePoolProofReq<'_, '_>, ) -> Result { let in_progress = RPC @@ -515,7 +516,7 @@ struct BridgePoolProofResponse { /// to relaying it to ethereum). pub async fn construct_proof( client: &(impl Client + Sync), - io: &impl Io, + io: &(impl Io + MaybeSync), args: args::BridgePoolProof, ) -> Result<(), Error> { let GenBridgePoolProofRsp { @@ -565,7 +566,7 @@ pub async fn construct_proof( pub async fn relay_bridge_pool_proof( eth_client: Arc, client: &(impl Client + Sync), - io: &impl Io, + io: &(impl Io + MaybeSync), args: args::RelayBridgePoolProof, ) -> Result<(), Error> where diff --git a/sdk/src/io.rs b/sdk/src/io.rs index 248f6f91d9..7dae730b29 100644 --- a/sdk/src/io.rs +++ b/sdk/src/io.rs @@ -1,9 +1,11 @@ //! Traits for implementing IO handlers. This is to enable //! generic IO. The defaults are the obvious Rust native //! functions. +use crate::{MaybeSend, MaybeSync}; /// A trait that abstracts out I/O operations -#[async_trait::async_trait(?Send)] +#[cfg_attr(feature = "async-send", async_trait::async_trait)] +#[cfg_attr(not(feature = "async-send"), async_trait::async_trait(?Send))] pub trait Io { /// Print the given string fn print(&self, output: impl AsRef) { @@ -57,7 +59,10 @@ pub trait Io { } /// Display the given prompt and return the string input - async fn prompt(&self, question: impl AsRef) -> String { + async fn prompt( + &self, + question: impl AsRef + MaybeSync + MaybeSend, + ) -> String { #[cfg(not(target_family = "wasm"))] { prompt_aux( @@ -81,13 +86,15 @@ pub trait Io { /// Rust native I/O handling. pub struct StdIo; -#[async_trait::async_trait(?Send)] +#[cfg_attr(feature = "async-send", async_trait::async_trait)] +#[cfg_attr(not(feature = "async-send"), async_trait::async_trait(?Send))] impl Io for StdIo {} /// Ignores all I/O operations. pub struct NullIo; -#[async_trait::async_trait(?Send)] +#[cfg_attr(feature = "async-send", async_trait::async_trait)] +#[cfg_attr(not(feature = "async-send"), async_trait::async_trait(?Send))] impl Io for NullIo { fn print(&self, _output: impl AsRef) {} @@ -117,7 +124,10 @@ impl Io for NullIo { panic!("Unsupported operation") } - async fn prompt(&self, _question: impl AsRef) -> String { + async fn prompt( + &self, + _question: impl AsRef + MaybeSend + MaybeSync, + ) -> String { panic!("Unsupported operation") } } diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 719b12d8e7..76c5bafefc 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -28,6 +28,10 @@ pub mod queries; pub mod wallet; use std::collections::HashSet; +#[cfg(feature = "async-send")] +pub use std::marker::Send as MaybeSend; +#[cfg(feature = "async-send")] +pub use std::marker::Sync as MaybeSync; use std::path::PathBuf; use std::str::FromStr; @@ -64,18 +68,28 @@ use crate::tx::{ }; use crate::wallet::{Wallet, WalletIo, WalletStorage}; -#[async_trait::async_trait(?Send)] +#[cfg(not(feature = "async-send"))] +pub trait MaybeSync {} +#[cfg(not(feature = "async-send"))] +impl MaybeSync for T where T: ?Sized {} +#[cfg(not(feature = "async-send"))] +pub trait MaybeSend {} +#[cfg(not(feature = "async-send"))] +impl MaybeSend for T where T: ?Sized {} + +#[cfg_attr(feature = "async-send", async_trait::async_trait)] +#[cfg_attr(not(feature = "async-send"), async_trait::async_trait(?Send))] /// An interface for high-level interaction with the Namada SDK -pub trait Namada: Sized { +pub trait Namada: Sized + MaybeSync + MaybeSend { /// A client with async request dispatcher method - type Client: queries::Client + Sync; + type Client: queries::Client + MaybeSend + Sync; /// Captures the interactive parts of the wallet's functioning - type WalletUtils: WalletIo + WalletStorage; + type WalletUtils: WalletIo + WalletStorage + MaybeSend + MaybeSync; /// Abstracts platform specific details away from the logic of shielded pool /// operations. - type ShieldedUtils: ShieldedUtils; + type ShieldedUtils: ShieldedUtils + MaybeSend + MaybeSync; /// Captures the input/output streams used by this object - type Io: Io; + type Io: Io + MaybeSend + MaybeSync; /// Obtain the client for communicating with the ledger fn client(&self) -> &Self::Client; @@ -492,12 +506,18 @@ pub trait Namada: Sized { } /// Sign the given transaction using the given signing data - async fn sign>>( + async fn sign< + F: MaybeSend + + MaybeSync + + std::future::Future>, + >( &self, tx: &mut Tx, args: &args::Tx, signing_data: SigningTxData, - with: impl Fn(Tx, common::PublicKey, HashSet) -> F, + with: impl MaybeSend + + MaybeSync + + Fn(Tx, common::PublicKey, HashSet) -> F, ) -> crate::error::Result<()> { signing::sign_tx(self, args, tx, signing_data, with).await } @@ -535,7 +555,7 @@ pub trait Namada: Sized { /// Provides convenience methods for common Namada interactions pub struct NamadaImpl where - C: queries::Client + Sync, + C: queries::Client, U: WalletIo, V: ShieldedUtils, I: Io, @@ -621,13 +641,14 @@ where } } -#[async_trait::async_trait(?Send)] +#[cfg_attr(feature = "async-send", async_trait::async_trait)] +#[cfg_attr(not(feature = "async-send"), async_trait::async_trait(?Send))] impl Namada for NamadaImpl where - C: queries::Client + Sync, - U: WalletIo + WalletStorage, - V: ShieldedUtils, - I: Io, + C: queries::Client + MaybeSend + Sync, + U: WalletIo + WalletStorage + MaybeSync + MaybeSend, + V: ShieldedUtils + MaybeSend + MaybeSync, + I: Io + MaybeSend + MaybeSync, { type Client = C; type Io = I; diff --git a/sdk/src/masp.rs b/sdk/src/masp.rs index 9a18f2200d..8337d40a38 100644 --- a/sdk/src/masp.rs +++ b/sdk/src/masp.rs @@ -74,7 +74,7 @@ use crate::rpc::{query_conversion, query_storage_value}; use crate::tendermint_rpc::query::Query; use crate::tendermint_rpc::Order; use crate::tx::decode_component; -use crate::{display_line, edisplay_line, rpc, Namada}; +use crate::{display_line, edisplay_line, rpc, MaybeSend, MaybeSync, Namada}; /// Env var to point to a dir with MASP parameters. When not specified, /// the default OS specific path is used. @@ -394,13 +394,13 @@ pub trait ShieldedUtils: fn local_tx_prover(&self) -> LocalTxProver; /// Load up the currently saved ShieldedContext - async fn load( + async fn load( &self, ctx: &mut ShieldedContext, ) -> std::io::Result<()>; /// Save the given ShieldedContext for future loads - async fn save( + async fn save( &self, ctx: &ShieldedContext, ) -> std::io::Result<()>; @@ -619,7 +619,7 @@ impl Default for ShieldedContext { } } -impl ShieldedContext { +impl ShieldedContext { /// Try to load the last saved shielded context from the given context /// directory. If this fails, then leave the current context unchanged. pub async fn load(&mut self) -> std::io::Result<()> { @@ -2115,8 +2115,6 @@ pub mod fs { use std::fs::{File, OpenOptions}; use std::io::{Read, Write}; - use async_trait::async_trait; - use super::*; /// Shielded context file name @@ -2168,7 +2166,8 @@ pub mod fs { } } - #[async_trait(?Send)] + #[cfg_attr(feature = "async-send", async_trait::async_trait)] + #[cfg_attr(not(feature = "async-send"), async_trait::async_trait(?Send))] impl ShieldedUtils for FsShieldedUtils { fn local_tx_prover(&self) -> LocalTxProver { if let Ok(params_dir) = env::var(ENV_VAR_MASP_PARAMS_DIR) { @@ -2185,7 +2184,7 @@ pub mod fs { /// Try to load the last saved shielded context from the given context /// directory. If this fails, then leave the current context unchanged. - async fn load( + async fn load( &self, ctx: &mut ShieldedContext, ) -> std::io::Result<()> { @@ -2202,7 +2201,7 @@ pub mod fs { } /// Save this shielded context into its associated context directory - async fn save( + async fn save( &self, ctx: &ShieldedContext, ) -> std::io::Result<()> { diff --git a/sdk/src/queries/mod.rs b/sdk/src/queries/mod.rs index eaf6bc2dbf..354cd5b6d0 100644 --- a/sdk/src/queries/mod.rs +++ b/sdk/src/queries/mod.rs @@ -18,6 +18,7 @@ pub use self::shell::eth_bridge::{ Erc20FlowControl, GenBridgePoolProofReq, GenBridgePoolProofRsp, TransferToErcArgs, }; +use crate::{MaybeSend, MaybeSync}; #[macro_use] mod router; @@ -157,7 +158,7 @@ mod testing { #[cfg_attr(not(feature = "async-send"), async_trait::async_trait(?Send))] impl Client for TestClient where - RPC: Router + Sync, + RPC: Router + MaybeSync, { type Error = std::io::Error; @@ -257,7 +258,7 @@ pub trait Client { /// from `CheckTx`. async fn broadcast_tx_sync( &self, - tx: impl Into>, + tx: impl Into> + MaybeSend, ) -> Result { self.perform( diff --git a/wasm/checksums.json b/wasm/checksums.json index 8c94ff7a0d..36e9aca5e6 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,27 +1,27 @@ { - "tx_bond.wasm": "tx_bond.a660b13a79bd5c50c75a055ab4fed8eddb1cc2ae6d93e5505fbeb876b307fc49.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.9564137202b291bd8930410700a5b0e08a1949bb4f79da5ee3e3dc9654266f4d.wasm", - "tx_change_consensus_key.wasm": "tx_change_consensus_key.4d2de1a762b4575925222fdeacadada429896a93fe3586f41657f247480161d9.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.457abeb00c021822e54674b77ae97535620555707efd2029e52b0d4335a32b55.wasm", - "tx_change_validator_metadata.wasm": "tx_change_validator_metadata.b56e2fbaefe19800d8a6d989883ab0ceac439bdeac96fb1299f6aa2ce424e521.wasm", - "tx_claim_rewards.wasm": "tx_claim_rewards.c4fc5d2ace6b0ee785f12f90a6cc600e3a0a8f19f7237ecf9374a32ba27eb99e.wasm", - "tx_deactivate_validator.wasm": "tx_deactivate_validator.c7cb406926241ffaa5df56e43c8cc43854bdcb0ea565144f63b6a3e2eb697a96.wasm", - "tx_ibc.wasm": "tx_ibc.14568fef2ec08752b87ec97cb2c87b76adec72e6eeea771274948d7c7ddb92a8.wasm", - "tx_init_account.wasm": "tx_init_account.0017279b252083d2d337d943bf84251d3f8223756ecfd9648e7ce66305c45796.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.cb9d7a33dd9a37675dd1d9cb761f3f87a48728eae38f377a623c0b8f9a97b612.wasm", - "tx_init_validator.wasm": "tx_init_validator.53fefa66ce6351d6b3e7de7a2c993bd4435fbd478b66caecf5c588b5efdcf669.wasm", - "tx_reactivate_validator.wasm": "tx_reactivate_validator.6a40f8daebdd6b9f6bcc9ab88686b40bb7a7882443cd07443c0795a3fae27cb5.wasm", - "tx_redelegate.wasm": "tx_redelegate.ded70e2609371fc9d81de875cf44b0ec60757fb46f61f23a26418cfa9f437b0f.wasm", - "tx_resign_steward.wasm": "tx_resign_steward.a881ed70174b53a15402cbbe6e64200f72431ec73604f7b173fd77ea80b5aedb.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.fbe760707aa0559c898cee47c91a5c7d0bc4b2f545cb47cc459ddcb8f97c455e.wasm", - "tx_transfer.wasm": "tx_transfer.aef75ec63198e4e6f95307a55e53fd0440448caf46617047f7a7557a7a2f1f4e.wasm", - "tx_unbond.wasm": "tx_unbond.1fd257addac3d91d77e1ae334b9394085335075581a6500ce2364cd403d028e9.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.ba0e378bb48d5ba577dd898e618478c917e80ee11e46f79b00bb72fea4f91c28.wasm", - "tx_update_account.wasm": "tx_update_account.aa4ef57619b8b7c7c3849fa71873448808f7342fcc8d612e4b5e688a708a174a.wasm", - "tx_update_steward_commission.wasm": "tx_update_steward_commission.e7bf45b9039a5b4ef399fe926a4b56e035e9a7eedc4fdd59fc89210b4a8bbf74.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.4b39fd9c6ccc8a9537a295d154a8b9e60b8d135fe995276a01d714bc8097be6a.wasm", - "tx_withdraw.wasm": "tx_withdraw.2f6bf8c3cafbd5d987849db1583bd63e10bbe06193f619859caa80ab10f2e2a9.wasm", - "vp_implicit.wasm": "vp_implicit.262b8660014cd140bcbbef2d187863160678cb0034903257815dc08d947b03fa.wasm", - "vp_user.wasm": "vp_user.d66a3a289c9c9e6353a2741335775eab1487e2e7ee4b8baa69d32e73083363d3.wasm", - "vp_validator.wasm": "vp_validator.d89911d9c27b2e0926499623cc88ee35c4396c8ef0563f897386ff431c8148e7.wasm" + "tx_bond.wasm": "tx_bond.8738a65235424fee316bcdcb778630e23427c9fbc2c478e8e19a45035d02d0b9.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.47c47662a9dc5ddcd0c2c257f9670d450f2ffe34e6afca16b978b3b1a13900d5.wasm", + "tx_change_consensus_key.wasm": "tx_change_consensus_key.72bae3002ed1d0b308cf465ca18e683eae91b314b7e8ac8f5ce15a6345dd6952.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.ad86c86385047e2574f6491fdefef2fa058631e73fb7f2b5894620bf13b427fb.wasm", + "tx_change_validator_metadata.wasm": "tx_change_validator_metadata.09570fa077eedf6b50c4cdcfb20d77e45c6a27876741dfbce0f26b8f4e42affd.wasm", + "tx_claim_rewards.wasm": "tx_claim_rewards.9b7d89bd7ce07b299115da6c9e4e38f6aa14562bf58508885f23c5d6829ca920.wasm", + "tx_deactivate_validator.wasm": "tx_deactivate_validator.f3b39bb8f7b52ec0d20c0ee7f1853ddf916959a1e29fe3d4705645cd52f44c5a.wasm", + "tx_ibc.wasm": "tx_ibc.cdc79f1e9dfedbacf06a0db0471f86d4ee78b78e63cc349c4d346bd2c0046c79.wasm", + "tx_init_account.wasm": "tx_init_account.7abb77505300309f0c7d9c25e0a4e0576075d70ca1de52e9fe52d47a3ccf6489.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.9b63a3f70537a41bee82add2154586db3eac0b1f9f5e02f34e6521f7f841dd5f.wasm", + "tx_init_validator.wasm": "tx_init_validator.401575bb26daf0efb4526286816260e140c6673b85f9ae4e34ffb53e42676027.wasm", + "tx_reactivate_validator.wasm": "tx_reactivate_validator.78774e67aa69990d4344c43542ef0d966a2eeb0b602e046a710851b65ed577af.wasm", + "tx_redelegate.wasm": "tx_redelegate.2070c97cb4c7fefb4c53479effdcadd8e966d4710ee7e2bf52180799757e36f2.wasm", + "tx_resign_steward.wasm": "tx_resign_steward.b0097f8e9e44f684415d2dbb6094d3ff79f442114cc750494523f4513b9836fe.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.8d4e200830a9f603d647799fafdbf1946e07a038a67cfa09d4eeb31c80c774ce.wasm", + "tx_transfer.wasm": "tx_transfer.db70a50989adbee063033f431d751d191a1547b6879f4912a6bb73a61d53518e.wasm", + "tx_unbond.wasm": "tx_unbond.e88109da453c72395f22386de59f7525202df99f0c6de287df4df27a10938753.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.90a48e8c5dac021bda49b31c4101d92f162eb27d9e6e24390460ef20033e1066.wasm", + "tx_update_account.wasm": "tx_update_account.240313672ed1fac1c01767f5099c8b7b6431591046b264f184f41eb0445cf343.wasm", + "tx_update_steward_commission.wasm": "tx_update_steward_commission.d7c9c4ebe58d11943ec1f3f410f7031f447a3396c5c3d40c90a1211f03899a3b.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.75715379f4efb91872542fbf0fc7ea5c1f329a1b0fad357fd67580b51019497f.wasm", + "tx_withdraw.wasm": "tx_withdraw.6e4a75619277da40b3a5e569c5bb0905691f3d1c8e0c5997a4d652a852bfefd7.wasm", + "vp_implicit.wasm": "vp_implicit.83b85caa5ff2030587e0e6f39863414c34414bf661146fa2e319bfc8bbf4241d.wasm", + "vp_user.wasm": "vp_user.845bb56a3ad3b388e7c1d4fc57f7bb72d0844aae2c725e08ea0d747243e1100d.wasm", + "vp_validator.wasm": "vp_validator.1e624e89b31c319a2ceafc775f32ebcb3b904f60459fa128cd2a2c5c266c643c.wasm" } \ No newline at end of file diff --git a/wasm_for_tests/tx_fail.wasm b/wasm_for_tests/tx_fail.wasm index f6406827b4d0415e3378f6e2d576e8eb29d2a2d0..06c7475a6041d16e4d564b8f4ecda73c76fea32d 100755 GIT binary patch delta 51514 zcmce931Ae((*Jb#?9R?^j?H~1n~)O{2=^&4;Z(UrK|uu()S!TXilQbeAV^Sf!A3#A z6Ht(7kVQodii&^|2m&e!`VfPHq9URO`2Tv2%_PA4;Jxqr56t#-cXf4jb#--hbB#PV^RcVlu|{ZZkZ4#;0Tc-#jlG*MH5+dDMVa=#($?XMvnnZ;Iv<{l=?@J*tj_0 zbLcpMR)hqBC*J=!iFYs+&;Hj))699BBu|N?Rf$k(E<5iSeaHBT_fko{apZ&vx8Hl? z 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 Y0>r3Haorx-nb|bBUls@VXZLjf2ZJye!2kdN delta 69266 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 vgxDeTo#x%D^Tz)8u`KWB}%7G#aLo67$m+x41M diff --git a/wasm_for_tests/tx_memory_limit.wasm b/wasm_for_tests/tx_memory_limit.wasm index efc2fb7bd7ec79a7353bec78d6205845e00e2686..77c8164050898f8c1e6542e988c52765786c5cf8 100755 GIT binary patch delta 56168 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 z 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 delta 73450 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 IH8}kL0AUP|IRF3v diff --git a/wasm_for_tests/tx_mint_tokens.wasm b/wasm_for_tests/tx_mint_tokens.wasm index e79d206dfd61c87bbf7707ac7a33db09682c92f7..761e1a14e90d92dd9527555320a3569913e76ea7 100755 GIT binary patch delta 95 zcmX@LT; o7V)x3DX>jWNS||V*+AkAZ7t#Rv-q6v2RZ^<4Cy+0H5F(2LJ#7 delta 95 zcmX@LT;m=Fk@0>WNl9~V*+AkAZ7t#5T6Z**|(>eairV@0H6OD2LJ#7 diff --git a/wasm_for_tests/tx_no_op.wasm b/wasm_for_tests/tx_no_op.wasm index cf752705ea14e2ec079c5c2bbb65a335545b7849..fdc961842134be3440731aad78827345fd541478 100755 GIT binary patch delta 47927 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
        !YI#D9 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 LS$u!iHRJvlnUoc| diff --git a/wasm_for_tests/tx_proposal_code.wasm b/wasm_for_tests/tx_proposal_code.wasm index 022b5cef965c155190aed222f232fa0431985465..d5cc51093b5c1014ff3682243276c2c8370ccbe3 100755 GIT binary patch delta 78113 zcmd44349dA(?2}jz1bt1gw1`DY?dPd5(oj3a0P}NK@J540l7iKeTt$a2r3FnV1Y(O z0YyOp2?SUW)PTsXfTDmR1TRpopeQJ)|8LFgZYCVRL!ak)-{muzsqX6P>gww1>gt|h z-sQN9J7NnTo;x>k?v$vxua4;{IA^%<7gqp11cnG9OqGzLFo$AM1VdgxfQ2y@8YUPs z^8h7WC=r~B2@AKIIAZ|}Sj-+t$jr)2HmiFCYhyyHaC=xSvx(b4&;32itoCie4#l3Y zsAY7wWSYz)2ag;*?h&ro`t~0)X2c_XCrnn}b~okK^3!*)y)39lpW5~6biVJw5%ovc znf&mhQyzPKY5^N{Z{M+#7PFVxBIbO7y~0Y_Y4$byhOK71S>nj)>=Zl69?9=nwR-A+ z!z|JH3Hy{)ZqfaLfrADQ8T!yyOtK|x%mMZhdzHP&USglKqwF>I8SB{T6ZQqWyTuc1 z8au=S53*w{@W5Xo7g+J-j8~ZX{8!r*hj1^*%#LMQTyY9@+u9N(i#zayn-w?a{w}iy zd)0lOKj&^0J@BpoC$Aw^vKGoc!CVbfnZxX2t%HS=sg68#+p+CR9YtxZD1fbb>IT3y z6eU}OSNj1qNHsak?#t0h)%~R-8!1*4y7BdPRBUoGrvO7OL=dy9*De%i#SCKn+6DLG z*a3kSJMf5trMR27i#O0I<} zZX{PXYgI70wWf%bwev)%`ySVPa}o7HZt;0nD-N`})kZRxdr7reR>i%gT5qBsUHz1o zaG}r%&!oG_9hgGAH%h6_%yLsrQN=wY677uld25=}@OrBcu&2}YKQL+>=5-=K@0sD;vj7E_W zUg-zCMq_MRlCH8utz2baO`9r+4_C%WgMi#GWb`NwsV8CM-D<;_;`i!5VPfWDwP8=_ zT=7edXRw~v4x@|76a=cUG(I2%waxrQ&rw%j!l19EUilbs42F8)A;1}G32quZ;~-$C zddLSCnN%yx+vKJ%+DbrBO;yhxE{@L~%K42A?itN%@|9QJMa>@rPw8qV_~@s)z+mz8 z7EwIMTUS8=2FHI=m$&YM;=`?8fYB&$k7#qfj%G9h$q;cnTBbPZS+`K6Tz01jR_u0P zyJou=wr$TW?$Wl+h_mE&&4aGJO|w7{MjH}Fwo9~m*(xk^&u`Z;xD63a<)(DS;b>EQ zq1|#T8|I$ZwHeDR{-osaM_pFKUA^Z;pw(U~(%mf{ zC}a)fSMRbm&0RE(tElJ9>Wn=lih5-i{@kEHF7+C2j&sbep+u=$xw_{dGR}WYc=RVy zE&JHrv)A0(MVm{MWD6wb3~<8WM&JhS9Gb~TI!rq0tD^qFV6)STV|stVqD_z{*gpY_ z;e9-UN9MLY7#}u&3pFxFZ)65;%$@b1C&-KUEfsP9_FzKT*<0~a`VOyZpyz!&1_o~; zxT$abg^i$=dLMx~=ne7e#I#4Oy6yd9Lo+mC)>RahL7W-(z4DxyW!wD;L0lFb zXZN@}4K>GXSO>Xa)^eI)2w9#A=?-_)4Pt~5CxgCV*@V{o_GtEGl%rx*QLGZpg9S`o z4vLOUuw{hgH#XLvZIZ16Su$=z16d#3J`7|jxLpWjsgc?QO9Hm#IYpkD;uPS+Q`62~ z;0X?pNBg*XVgqRZ$n16`=*m*x-K^iU(8zuL8bKoi`iC?3m))|enq8diHHTbGj=WnJ4 zPf~9vW7QkC$+G&g+=+wZ;%|eHG?u)A8#CPZ4jyFw10zCx+Wqd}O!lO^Y;Zb1QRGe< zGL~O2a?cx*QapXw*qAEYX6ha7tU=-hzghxJmtPb`?&v38h9|V~iM#PvOs|ztK$9$# z12RMf8l<^Bn6(PscTK;qk{`jOAr!Bjej*~Y>=|#VRJHkVR8&^Hc+u4e*3>-yRoCh$Sq~72=FT?&E9wA^qgq zep>occx6?c@ksAb)Dr1)ir&TFyVnuU+v~<_&sE)R);Gn|jP)bEa8xnD-HM0eZ_$RT z?$YAUc*@w2ufe@+xlXe)0aSC{5gY3wtT2J>_01>@PAtz3_JeI8c`(lzbs-Dk^T%K)RF%{&XxXF zanzgscMGz=Rq)of-ilEkf4gb7@^hyYR8ix9g3q|WMFh21`&$L?)SNq|qoSC< zRS^n?{Fen$r1pPV#K`vFs8KKef7wQVjsLB1{&~Uwvwr-qScUMN|3RmF(f&HSz`gE= z{#a$f!$D+$R$1rI_(L(AR$1Qy_O7xh?x3D9!bkjoca_!a$D~j{HEo3o&&@sS#~xvb zz9@S1r4rT_cA+r$^&dx?OP_A$$wwyZgrtA-Cnb_h@u zDhNbf9PFB}Wojuvz4D@---EGywG`18{Bgg0F*^AKJ<}h!Zz?lR9)T zR8gV2;J_d&`K1T6^2s(8elo~A;S4)8E}X4{O~gf29~bV)KR08o-J5?-iUn1Rk8x1- zKeu<6{al-WyUgvp@*1@+z=zb{edx+WYJA&YwA*{Xq!V=EmtMi3MP9g92;G1E5gEnm z)#i-vyy~8QZ6nAPH~KAt1)um-Tkakxq^_59b6H#%HJ=uFT-6p;T>aJ^dOezAJ-^4_ znz@rQg)1n)z3lhcTeIhTvrV_pE_Ih`rN!;DH+Zx8?X%~5vl(TF-@^BeLig$GQDD63 zjo66u^Jp!m*u$Ve=%GOTTj0*Skq}&P&D+~hzN>Ecjkc_-`^y^>NyqQ`V;J4u{o~)L z`n5mqA;EY2^S*NZW;7Ih`i%+;g{qH+;+=nnF{^iZe!zY5uONUywjODRzatUM2aVur4CS%ghSt8pkYjWtFOLhcQ zQ?m0+^Fcmt6x`JbOZp#ErkXMm`(B;`pm;@h z1gZ5UFHB90dc8=#Xk&ND4}w`E84?152iD5gAuKm+wHDUtha%909=Mt0f)F+#Z04=$ z@s(IpUizbapc1PoT=xC)xJP8z8jyLW@PsU>#2$>hebbYbAVCtmS6sL#;+84+DEY_tj54( znpquMT*DrskNW~5@B=FkRAH7FDBq4|-{jm8{em|bm8>2OP-lJ$jVbs9e`eAjr#eIK zjbU?RUM&HXrv6U1olJdi2ktwBW4Ig_%c{oA*a|RJJwmr7T>bf7+}CpCz8%ZdmQqTxyg&RQ%5neA$^@%*!5`ED&1mw50twjkO&-ajaoztmz?*=sT`jio28A=DsEfNH4Y zesv4MfnX7vN?|ZN%WA`H<)@*In%N4sML}W7?mQv4rD3~q8R2uewlb?N!XcK#bk;V} zD;D5+?M>_8@Sq4U19Ro{bXEf_uSsX=l|F*a*UTj9i}2OQYqJDjec}H48rNnu%zu$t z43fEZSnBP{l8J!@plI8`XiyEhE~bR^TPl$IJ6| z{JhBb>M(1gCvHO#@kGs-exY$^&|m_eqjde{O^(mrQ!-Kck#(|DCQC~yr9zf+RXRg3 z?dpMuUzOHpYN}K|jivBI>-13-t*cMGe5fAFfQG+NkJU8qAtC{H?C)3^Ti@TB>cZEW z+jJ3`U1}+Y%;@^)2i#}XXLW;T{95i9UGeO#&(1P_WRon;VzuC0oXTR|_=(lBK{nWS z$@{W(YtX+Ti;^#9GrQj;M1c7d+3c>0BQrtv&0*Ep7WrfjOHbIb3)TW`sPX8Uj|kBA zJoD59i1_0imK8sp7>AMY4;(GLuXj*VL)M%u5$dk$uQu!s)i!IyM)D6g$+sJ^nE3ZL zX&qB;rGg^8%CteAZp32QN_ic(_~nFWGN@e;Mvi_MyI3xdOo@Fe9JwK>Q) zB(86iQya6Gte-am13T&EO$+vxEu$Rl36$pqd2_zmC=Z})!V$u#WW?}|hTR(%HeoRh zwh%&y5rGycB)1~Uu^Dq{o1Svsly^5lqhGv*c7PY*IXMjoY=(TP39A{bZFV3=uZjuk zQhB5)%Vy_gP%cZxssQ${DT}!s%1#XhnzN=Ui@Oa1zfvrNb2Z(noy(Gfi^|>frPt&G zxvcB04*#Cb^1WOZg?hF1#H|QR{RrBM;#P!f9v_7}tSL_D2r({uGHqoz$+=+mSo|T$ z9op>K3K!bOW_XUaV@WK5;_Wo0;g1%3$2I`s@C@O2M^jJOU2HL9O+9NnFjqhTg73~? zxo!#^&9W{mmF3FVuB;7i{kpQ9+1?#-mpNNFF-}tbTjDNTwos6g;olQ?1?nj|nAJVK z?qT~Go9RjE#)>$G;IaF#Gd#hkB!4pyqdC`8dk|ZI_$lfxRp4-{E8oHHYOd$g!K{pLETs{ImQZ7ArL(;lYtg9T0^9e}mJ*qsZ(I~Xun1p=`LdcPQMzeu< z-aeW=olAV}!FGpJJ&Vm4KVKzCN>)paNt==6QjZyv4#}s+uw1nN!!gW8y?byh>p-H7 zAJ2|}wX*T-0YDul;N%awcp`g}HS;W)2(KPu`QTxe!e{&_&p*ssMxG_nk^iQ8pWyQJ zmaQhkkIR)GPiB*_F9W@EG$V)4(M)!I1jmSGc`iJ{dh+0BnKRfKuI`~edD?UDV=Oj= z&Gn3Y7L!xp9OevytH~U5Wd1B1KPr@=b0C5TW-|wyBZtpM?|PFi&Srr~`b|$_b6F$g zcyClDtW4y&LP0Ccp%D#r6iU>gm<|Gb8bTULnG8S2BZ0;8Nj3lQ%%N2{+Q@xKcZ zQ}#pXl@Kr$j0R@R`yZtKce%Q4Ibzjzjpu>U5HRYNtcNc4Ea_T=nR||Gwg|(oP_A3V z21LzaYFaWA&7qpKl_=CjraXwU#tUpx2t==?x*%tyt$6_huTZ|XROZ|6jK(d3^~Bv}(*!lgisd%-#vgl6lLRLoXGHQco9fGT}>07LQi0)jP z^r);|e()A+&7PLFRV=>p(yJQtzz{tVqaMW(=t>3xQe9- z`O|ipw~EyjHaI?auV!r<-?9X29n7_DbDF8yF?#+|w`9 zN(M8r-wjFDR_fZ^$L+PfbKi}pKymuha`{`#DXXku5Ict`Mt%2Dm-tg>q@R$V^+Hfv!1b}v{7(ic^UXlT(|7B5X} z;o#q9Wn~NUIYWo{%6r$c>U`&3Ic2RTIus<)-B`;~&0C15UFL%fgsPF8RHQlDD~izQ zReR;(B443+nY`}ywecXcSAMVUm1EYi>gM@Gw^9YVNt;Bd{B0deM&0r2S!^S(Y|H)H zWJZ1Db;vcjSIF}@@^I2et=IeLS?~Rg^=zzp@quyyIU%4<#acUGEJiyEZ_SIB5gW9Y zw%&l2{;^+<-oWYy=D=&g(j-YQA20XlIKORRY3A?uqk?F?2V6kFYCm2+ybbO6d!cwV?lq6{S313!H zo>~oAI3Y);T3iYpe8EyTPd$z$Z>pjlzN3Mm9tP~)7E;u`SLBo}%vq_F$XGzunWrXW z&Ggn5misT)OyV7^;w-YxJ1ml)xg^`XqxIO7ceD=avPneClkcz~3ay=ghovQW+0+;S zo2s`yMXip?{@jX4$lY7f5!2}hA^bWM=sx3SSRwKJL&0Yg|@J29k%w{c>Kx*EYOPRm9(?hdmI zdY2t!OXZ1oS=(r@8K3bHY&3#{K2UaepDomJcJrl-PPoY$C78{ZdbXCZaFM(GQ?w#Q zJ%F3GamIs%UG;9M%s8Sas->R*sh&FDi=_Hb7n=0 zT{%QKMU=Ags{D8tn;P{dwHj~^`2c5eBu#Nz9dF42yV>B%D}d;7b*2 zfmj$-#i=&ck0_fQ$KobKK6ae-j`GH$Z#p<9FCJ&Td~xcV@(|2M2N+MqRe(HGzhKQx zY>VgpldL_9DmeABHCq(X$?*~kb|lpz_+Y9hu@s&GGkbcTX1nOzwoLwpg)>z)_=YWI z@5s-;VcYcEQ!@5Dmc_QpF5j^^pj!GJ8|0%plVT)A!9;bY4OHa=XIO!^#uBmxdLHUU zUfCIRu30ue%j)2)-k7s&$el3HpJl!I%(F7#O`af!{J_#tZ2k|7j-3Y}T8T{pZFe~U z=bz<)AJ}tupyL_+Ble;&c-Gb9Ida!I_9Oam-FbF*pFP;t#insbzmt=3ixz^7$)xon*PE@h>cdp@O@9MSR*KNB_!({|iceK%~=E zACc`SuU=y=YCa0qaZG2X=FS$*=}a|Gz_DkGeC;>Zi?2530~iJwiJUtO`U&Qb{0G%b33#1<~T?g)&>nTt0w9_ zO-Tlg}TWvTqm%scn=TDN1AM~5Mzu#8@Q zx}1ylIEf89VHEBnEeUmIkQ6b)_>O09_7#l-Kf%s8HD`n-=jSXuE)dMB`f+p5It#}L zvB*PK?ydxji=2X^Xj!bf_^4-`jgJ!$@pnO7#VsY6SH)p*d3P|6cF-mez0<;60^&mI zgkavKsy{VZ=qJbVZp%ze2Z*V(4vr-1B?X?d!F)Tj%{T}GbpBnguf#i{@0kNHUU_?K zbFkB*9ylfK9hc-03 z%&miIBRDuuedeU!QPDPrXBgodc#lc9u$he`qt6Y$K}#fAf*D&(ptPO-ujcDr14X5Y}Tjqnz((H&a=W0{nF}!QLt)C{IsW9 zZ5~a*%cdD%ELT30fpLH^TwRW%$+EaEKWyx-B2nI5FJ^KV`&ho4$$!=@*43PC?~`9v zf*6zbt^r=rqDLfcru*iQJas2990@q$|IB+BX&LG^+#L7F()zqcl*Sy8Tme9aSn#r& z+3}1_YQWPme!TA(Vf+;NyA~Y@sjM=>ulWIQzdzYP8$T#cq4EFUAwSdNwzsdT0BvJpAW^eK8JIk zIurytL)0>;Lx@^H>LB+u`3LSopYZ>(eCh)82;X@YKQB1bpjGwVLZ zkWuO&@o6s%hNvq8NrnOR!XRE3WOR%Ru6~GmEF#aD;&@)BHs$qTr+PPqf-LYn-IOQ! zSXoJ|lxVDg2w2&c3qxS`L^tEjXjI?doDamN*EzXO<*n;(M$I+E*`Q>VTtMx7{!)Z~ zwev9{)cvIqI%|5}js-Ha1s?#hEoi}0aeJ=?Z-<+uC8tR|ttGg!$bK5+d9o!>pt<1H zR?s$!{IC_DQ3o!`lormJE6B<_De|ZLC3YtUq4R!cTR*HjDxS%$c>(jC8`x7SSz8`M z7AC$ee*q=|-djAlhH8BIt^cH909lw%0edYBorP2P8{rT9fLGK0Xv^t^E)$V6=|VY6{^9^Y`)wnPx;Gi&$UJrHxAIy$o)P&vIuk29^fIQg z4Z(RXvwC8yY}%eDy1s>mc-b`*`{#{tbe{V2R{3~)9t)L}?YRrAVo)SNeA>Hb^xmG_ z-=4q5HptO;VLyF?eB~}aFb&o+Ih0&I61ExGx^rY#mE;D_P&!VBsov)?rFY<&tXTHz zzy~`boZ&S@moC9fEwF2L@v{zmB)qwn9r>#;7~gl~lhC1k?&g1@MDI>~0yBFKcj6B6 zf4=UlW%lf%W%lT*Wq#C^Oz2X1>K@AU+;=ax&5DR#6ApSc8IPw9X0i-uP|8YBxJ;0r@W>+lP(^%~dPiL&IL9wJkp}lx#>v_ED zs5%`xIBp~I0YoHg+_&j^aQ+MSV_Au%I82JRJfTT5-OE)B)<80O6X zHkw-Uot%@$V`a04cqwQ)hmk3Soyy};u^^PDmRN5ta!4z34%kzM^Q|n#UmuO7aP)?k z4Ns?${8=J)d=zii7+4tEi-I-thNs2Bz$_4&uS~-ZOW0Jt+@HOYvX5D{Y|p);aTJKp zXL9aX-bx<&o}1*SV|hB8FWESrhFk4%FuC*P{rat79N!Q#AFn*CwP3Q&TJWBG34jAT zF)LS*9miu<#e~p&!Be(irIpt8Q`d&0tL=N=UQW;&k*H5@&Ie`sq+CDWDD z7FlTlA0(GO$s^f(kLO8V%ydP8s_DwDE6U?f^Jq=8Zc2aSX*m21<>C`Nalrn~c>gO@X3di2{D&+&Mjk&=oUYkeM0=zLk@ zd8{zz%MQ=;n&tZI7w>@&jD1>y&Vs!By#VJ{~ zyW^<2Q9*z2$lUn~)b6MuH+EFe-#g;Xt|*c_DdyseXm^s_Y6DuEf1$tI40yUBv6c%M zMpHAnvp>`cKy5s`{C_VU+k!!yOozS{m&UuNa-c>$}w848H+W5Vr=AHMcing%0 zK|9g3_w0ovTg=0o`8o5;=zImC-%-JC=%T!LF@GN|2!9zKDq1k@6-<2dJ*!^f>u4vu z&r&S%=F96#`CIAdef5_co!iX{Cv?etvJA6rLwS7}pHe_sbA8lrF> zsp<_Mg&+zJ`gx1500pTfz^vqBJX!;1dQ7kJ$5}p{jVN;BgPc*S&-)3ZgcwBf{9Y1X zj>a-D&hE^mtoqJeb&*B)N1SPt;(+_J6fPCweRe0JNO;Evaimi2O`)hX;>6Adl!Hj7 z6DtR*&FX;9!(PW?*&-uf=V^wZ@cpmzyRcAs^>x178-OSXhErG&M1j--3cq=Jzd`=- zQaNM={~iSHUde|T2<%oKy z7XJ=Zx3A(ourUy~nh!J(cdzE7P=c@FJq)R1*6=#zpl9P6e%`mBE}$<^Y_@C62NCn0 zwY-WUsO%}jDKy4*$)DC?t-njQThCYU`CrP*>owLI7jxQYz0Y}#ReV+MiVz^<+0KY!@w!ur?_te?=(!KTM2Yi5uf?ezl0RD zXS&S@W9_iP2xE!4+6coeEH}c7{eY@{CP@Zw)K6rJuhzNqeOWmJlI*ABH_{7Dn!D&ZNs8@j}{3Jb>2sj@KA3gT)wak zePHptyNwUxe2?ID$0^cObC>Dx~;ZM?a96dMSn90=@SHv%Uav`;u;F+zCq z`c9q@ybqhesod&Ks`??%4kV;x9IX0lyJzr+JkJ;*$~5(qiWY{%|?+uiX^;b6K!6hP7uHy+dZ9wW>*nu>2&MQ&64gYU9C-)hk6W zO$c&WXmcP(#Zs!dGe_nfd0pf z!9&|D-#WyTbASwSEak2Mr~tiH=`BIaVua+@;MjvjwN6@NPmXlv1LY;=%%^3j6o+|J zRIDE6xxq_M5p#QJY-7v&;9(wFduA!L0kKph9l(U3y$Z_JBX|TR?fTtXhA%3W-yi0a znwVYbt#O(<9g)Vy42N-OW$hYIN#j)z_+_`>42)MV`T;eD#O7J_2_K1NwKRW5K|$I7 zGhU1J^E~$%pTh1syNCEpbq0DPz!`W#f)h8GlQQILEC)IRYX~P?Qs$f00x{d=n%sGc-@{9f$(T~!j(>Yh4k+cBbxsuNNBUu5 zq4_^3$w3s!G^?fF^yDCCdn7wjobA#3De{9-SdJ8Vrj%DtPD2ko;Owa?&IW4XbYe}h z2LA%q0UF!X7CHC_EkOM2 z4~R}$CBEb0O1GDf4Xl5Z~XUhH+*>>_UwxRz{_74$7~) z8!qx{#94$^tp(YlO)!(qF2OOuCiNvADeGL~!FX%D|Z3`IOJhu)fO;N0sOlc>$wX+(uKR`V{LmQZj%J?{_p8Ybv7b@rJcNwM-Dm?8cK0v=k$=`p%Sk#iz z<cenP;(OGVls-N=n=Q3co`4X20-vov4EjK{`Id=}FX$?;bT$ z24M*So81r4VwvzOk4eZzf3ajUIYk;qf{qcRVRZSGM<-^J^``@@jyy*;o`PWetl0a# z@gy1{K*D%CimkX{TBxaEve$#Yd!f!m8 z;)!@2-f43jV9D6BgY;=njFk87-*{tk+O<6Z1sU+IDTCTsrfB^Gf5E>VqLWY?c7da% z& zAN+ch_T9G-3>>n<_~?R)EuNBVa?78*POO$k`}dGSg|EL!_7`sqicSC02tV+bR_UYq z?Zv+|hhvitef}3jZ&?s8((t#PXoWrTmGB*0|+x@ibd6OStF+eW@hG6hO0tpp$mJ zOd=lw_|hZ>un1J={Uj*rZQ}nRnv>gt!pe=D|z6DqnL;2bV2n}1}+E+^rTjET; zWlMa8MXc1x1^iEtTVxe3>{Ea{6UbHEr_i`DY}7LKmW|q{7nP?)2({%a2^_f`DrV!Cj+ue$B2>M>8Y~v99BJ^W(U7&-_hvN@E_=%nxUPd06>tc{8ne#SM9SeMNu<1vu^Af;a(TC`cz6fT(6_1<~omny;mR z5>er|ik1m6<12nh(8Yj)E}S%@f)1yPipV7y8eWeMDK~~NCmDiH5<(OmDMY)Lb4-(uqTt_L(5Zur;|K7ioQ^zt^bo=9q~9dQVR zdidi^_01cQr?>j?q;i2PE*4DgNS9HmZuL-bftq22J;1g3va55jesdcB6F5QtFqsSZSG0zj0E#NF1EgDcLW0Bk!g;HjOrkqx6Sd~)j^mU ziRPY;n#b^5N1w+)gWl^ge9=(^;{^ZNj-t>@1*;jah$p^+bT7V*{3d+4h$P9)$KgUODJ z8pW&3s-cJs=^`3Lk;CM(Re0!4RImc;*+n!VQOho(AtZmei*G2Bf%kW~w00GFh=mG+ zY&peC&VnR;S5jKT7(24{EVvcN)Z$BuSp{9!uiqj0A!|E#%al6!4 zG%bfZ_7jOgYsgb%d3LxUYdn+siDyi4I{$RyNKPDCd0tK$o~hKq_t~@ zX%on~VWO(;(`rrxx$u$n9~vz7TE~Y_u2d_1Rrk@_xJf+r?#Zwr22PT(~y?Kv_KDwtwlfXY6 zdot%yO+@e%>2$j$BJBj`ut!B@bmY^IYEH+RM@0{Bf0BZhYBM8gsEnNgmu8vlFa`Wt zr_NK#9s86RxN- zc!XX#XpWJM)-_C~J}zA37+ro$BnKIB9WH#u~UC8(X%(0m(E6jDNW9rE*|!N zol{z8h%&SO8BY1<4AG7ic-lTG+Awq3bHEkS{gjwyF4W3-;+_^SF>}EjjmXxS;`jcg z&(pIWJ*1D2kmW8bPs7v;Q;+MAKMgIz5=ULC5ut(rsJVr{1X`UChF(NQJ&U=ht*7O) z;t!uZ+yIC&pa&l zTg&V7M5CDPD@qi#ntEs@T7yud?=_p9@@}_imPsa7<;lXXqA>_u!MnWJ4ygr0Bn2d2l znL8i4@Vb0(zUao6G4208cwMG16?Ns21!5a}-7|Ng*vf!$_agBsa|egW|p zF8975HbF}ZUKFFDP-QQQ7xEWL(=*79k()1vy&~rG)o0|D z_gJbf_v$iW3C8*|*?5V#j3fv@2N<5AOEE5OhrfDZ-#*W#gS({qs^90LFP*N$!87^@ zFK9-;CZ3_Tz51Fs;q_EkVo9f#YX9935P>s)xmb!7GgcFM7<#6GN+t}gzY{LBBAO5wA^b3$%iSKxK1aLr}mdKN(+I@_^H z{RGO3U8J>*)@MC0^if%sflq$Ew17b{DLfkiVCRc;_+gnQVv3#@c)7 zUuJX;cZsUxuj7M64YtEd_m+=uM@g6bWIJqhj;yl-5sC8eEiT$2Dkp8Y$}HFgEGSXz ze*~`_;!qw?6y-Nu&2X(8;yJQIJkMnEE|DrTb_uI&ze{wL>uZ>@<=SQew&3v-#?=`) zdQk0g<1t6eqMhRTfK~$?N>ADHL(!p{_6R!1afRUW!84hn#QI=a{Gk{UROg}5BL~+R zIdR;u@xx?^)6_)1=`w}NqTM2>_fg?c1_6B`u1H)*`Z|=pxW5H5HUs=I;4lOH9bl@~ zhu?`SN+95y>$;n&u{WJ<(yN&V6sjisLA{z+z18^OUEXSZ@K;og{A;%uT6Ii-LurVj zn9JzDXw#mX;9jA|L;FN$d2)}iR##R7e<1Sr<4VEhgFnYJ(Xj_Rlp)f-SESmF@*xVH z#t-a2isY{JHanC7K(3A}0GAKW#&cx@tm2uP@5}Fu=XgbZ2F`@tBTwxW?YjH2JjkkQ zK)r-#W6@u4f^86iv8qJCHGSpfWBWwCgzv*0$}l9=GV7e)ERr4pXDtq;zf9XNYQ^@p zIus|6CyeVqY{alpL!HA$jhQ$>QD(?7`!QoLmW9B=TjSgIi+cR5RbJkY?Xd*uJb=uO zp5_O{3Q<8|{f>!F^@oj`FnHXk{v*a~QqyINI!ONUxHMVgJ_J`aAMBZYNOUsaLMv@h z{|SR93?q%zmEYI8_s{{<4>z~2om_lWR5C05BGBQo=%}bwfhIb%U5(Kr1`$b}yPtvh zAPAw+O7P7D(VSkDl|hjXWiYZ7s5SL%g*pq4i@REm7&ZXZP5`er@>k-bPV77&Z}7kg z?FS7WHDTD0VS~q|BCTDNL&2ApmCHRH3i?i|jcWwbm~?(2?y5LCLAq6Qo z?}zJ7IH|xPPFGHG;IE=Adsue=QgmX^c$R-DDzVT-u@0?USHeOhB7c$Gc|z24eU4-& zz_GY!#QES^c#hLx8T*xJQ6n`@XQ>hHE~Jm^KWgY;=ipI;po)VAPj-$#I#t|A&iG2y za?A!81@Kkesk`L%uf)_q#_)AnM0V`;WY?2eTl70A0_aZyFY(B!Cq-Re5--=C6q&Xw z@eZx}5PANjs1w>C!J*heraA6JHdUsb!mtjgx()HXxal z@C)3nxPOg1Mjg-&oWka>LzbNq*`ZA;J2X8fl}NzV#FJAhz6l6bsyOKQh|+~h;8Hwk z-;1mD`Pm{_E#B0fubkp}EZ)?JHTVv?Lgx1(?$ld8-5E1(*vMfMhD{ngaP%n54-*GY z7(6KG0Ub9|o=Y&rH_8A=9e#6BwM&vqMyNOpFb`d1i=n0vZaR_cN%NtiBbV}-GG+GT1dA5S(ltE{ZV9MK>7Q*cqw+=^Gt zWlE^}7G^AJZ%5o|RQJS1ieCZUH|s@LR@xwsdXB1Zdov!Y@0G8#>gP~~B8#RP>TDm} z5zl1#eem6Q&M?58@NC2<^Ot4FCySD4fQR6@fdQsEQ6%=<+ zb<>D|BDj6I^0Vru#;%+}4qC}5UB)|<4!AeMq(}~x&s4*LWTu$REVSKVhtduiMYzb! zwUg~rO^3}haDdIeRXS^!rukjc4HiXdBTwxRjpgGtOi6)tFnf)A1hZR&46A9H#g`A2 zOKO^O!1p4y#2FOckrUZF^nkkGjho_mc{F%Q6$hEahG4g{nlZ!IXAk)v8 z&8*MpNUxJ_devX(r2y&JD`Mo&>83a;RH?S9Cfys?HjN5fJzV!id!kv?ljyFkNDs{& z;ZSIV@5e=h3ZH_lW11583zA)ghI@P5GohX&jnyOM!8)caYx9x1?Z?*@OjQHM0IDhj zGfeg5ung>{m5#(GxlJ!u(1p`v^9t&kLIR#01$R>}tZQM{%8n_Z-fF~ipK-b$y%jo6 zR@DdZ0NfR@Nj}@av=t$*Hd&^WfNv*~CpRw3)GXp6^qksMVNk%O%UYOiaz)ZeuTRBs zwZ`R`KkhW8!h95s3Z91ADhu@QrYjhfVd#IQk5MfnM+G!3v@D9b;x zO)+LA08I3haXF?Wn{RMUlr3^hZ4>4rCkaK1z4rbQhn+4HLKHSh05zu3j zLzy7wH8iF06O-iDhNibT+^eCDOnLnB!=6tYnSSE=>Z1;&E-ojoP+S~W*&`0+6s}Kk z?ZfpBuC=&c$F&I8^SGwrnuu!W9mT>t0;#aJ9shC5Pl;+zc{kU`1NqY zBY)YBKh1%d&$r>PxYSZnW(lOtVNCRdaqNqM%=g1V6$4_u@o2x0i}y=ydfd%hKN>d8Gc!Sn}rtYEd2b5J^?Lia$&pvW3WQ&Sk;ZX%RM`6+MJYL; zD3-^VDYQ^g=KrESEBp_jnA{^2Wj0dqxo%VHAlTnuk=q-6I1pvUp%;{v%6C-YUi7rW zqeuguBdX2jDau}CBz{5Z)ZwDta77vL8LS_0g$HxbVdPi+j>C(c_OdA||8Dpo-+c|g zaFvY-6$Z+F1VCXh6C*JrO#2DIH7gSwOTBMS0oWVJct2`O6*Nl>7_2B;N|Agh5H%vz zjLzYicrul)f`4-q9axv~KhZ&^FQOIY?az_WfKYi$*l)f#pPIV}n)~I?ijw>t6RW3T zX>bP50~zCe{S}!yqVQQH=TVcXJehRfAB6R$pMme?`U)P-WQb`R%9*y#!4N!wlx`@& z2a=FJ!;@*nN=4a>8d6&U%I90qt2zmFjG`n#6t0?#4<&SJqG{)B1PD$ewGJ~K9fBp^ zG3^;SvsNg|IkXV?8b|Y}MUPWKl05&M#6M~cLKt8&aEsPeGmtB6aO)?d7XmjR!bVML zMNR2|KSE;ht9}HHbC^JrbCTwMJc+`sic$*tp&ucG??Nfz7=iU8n2(vwnYect20sD6 zqnmf4PbF%Pxkg5W4}^?)clx7g1eJad)rTDeYJT>8UKVX<gW%^*mWiug2*{HHMsg=vla;Tmxa} z_Z71$79u%SM@6FL2FzSQ4{sdEDgX*^3PJNkLb|`bqI_}#{^0@~%+Olh?ICZ93TaK9 z1f{3!C*v>>DqxErn3q=Vl>&eH%TMWT;CErCLy(xiG26>m#5rD9n+@(Uz2Wu~*3YPRan z3a>$>4Q(x&#BhLv8Xv1v>#st(}|G^An z@&&62-~#VJ+8X$BaK{%@0~Edw_@-KJMS1ujl1{QaJ|D>S<#dIK z?**$-g8=*&0OB*a9i0j77t|Vvfz_6BoG9bV$=9;(SgW@qFQ+VgVgvb`$rdZ~|I{SVBdx264`{VnWs#ub3Z-O=7&y;Ejwk$CeF{M}% zZ0C(dG}q-tW0{nEOAXs|h7`?rQ7jV-%mnN+Wmx7I5+a}GHEmBA6V{t6!CNr+Zwd;9 z{U`35)_%PSe*X=Y^q=}~exdw3_YL*`7yg?#(qB=6FrEVL#vm~EH2gQzDW>No+Lqfn&Yl7uC)#U4ct?tS<*Zu6R zbvs@)$OUwWYDL-l8vZ~{FE`&?E%zHL7iYjtU2lRu{!UrrEZ-X{*SM)^NYEs)@K$a} z7O0=53e%HVOw)tCH{<6~*3=0JZSi2oj-T!t?t2d`VLGw@h?FhRlhFLPTOyEzC;KCq zh(ZU$wWV}B{_hBdlPviw_~VzfW=B4Ps&MdP?$0eSM*g390FSZEg&p$!_yJbc@|7XM zx**tQ?tsb5_p{|^hMH#>FhU-)g`J0{($BiiR@vGI*iHi0+akj+0u%EVTwY8k^t0p{ z1Zy71<1DQVQVaN*MO(5B38qubW_jBv#{8u`!u+Zsg*{<2|6<^ft##T?8{oiA3@hzf zeu-cT+?;OK$Aiw3{hTfEAw#}>ZF|USl_7<_8*h18hjsn4=d+NI(!P3m`fH!UfM1iu}E2nK`zd{2Iu4$QeHv!=k?L*13I9Huh(HNCJ4yo zn&KM;NAFVws^$Fgwi7WB&^8h_E_dAM~opdw^Z4_U9FKlTuS&WWJT zDFyJq(=qvX>={&ve)wk{WBJI?4be~X7M4wh1ShOnzO89_H!4vq09|8k2c&DLJ-U#` zhcyP^z=(*s!J-ulW%+)TZKG`8PeTb?1A?h2fb2+()EFJmNzL?;(z2H38}l|-$U9`r zI$I%2!8r6Y7Xv`6S)-U?%xYI5tDiAzvYwS6jRkWT=!fqYJ((q13t)l@3HwnN9WemF zN&pG7VZ6)-a78ZUDEFHsheD#pPPYpth&kPGc2e^##8it2o#j_P7I9{z5c*=-Z z+d=lSFuC06P~U;Dev#Z8XLA1KniHbKt}G!_aMPo@hvLHMW`a!wm_k?Q9l{0Ztyx zZ0338%qq#}E1QJ@PUse9#=EorUwpR+bCdzLWHvA}gUBs|uxD#z{9L}qc|{@*M*o*Y zG#Y_8C*c3Z_p?@{IWYeAG+}?V->sbKMB|M_2M1Lo`cTsCiT)d!DF&MP@x#Ib>lqT_ z^TGm~8Q~EjfgOzSD0uwln#Nwb5NUbM2oGlwfh7h_aAjb%sr{_KfKm}~qZhG^hzMBL z{5^n@a?$Sqe7~f}y!u^AnZ3OFeGPz5za8kr+v~R_*+}R?R@qYDm@t-AHOCt?B0uTV z1Y3w9!Kcg6<}VFx0K<`%cfo=0r)l#lgRViFEw310>t}&B%P527tbbW6o5_IqelQ|| z`D8_WzdKnH3fuZD3Hd~~wIr4u#>y32q-CvvUF+e%h`^5w4f1vh^v}}AX#QTn5zz_@ znZF;0?g3W+T^t(qdjruB!v9poWB!ARz4iLWU*wUdiZT=BqNlTH$3j{vdw*5#;vpfI zTKhmnsd6_D4!L1SsCv?t60)>yIY!k5EG}w%$MS^4%L$Gl2H2})A>TLk)el^diFRD* zTwbb5CteS}<~v>fUv=LB9#ygSKd0_s%)9nN6|~iuZf|^E}C! zcgowRoij5lB@yi(!Kw(6KdZ?xWn%;g?#8G-Up*4mLl^)BQLX`vxt;cDz9{Rg#)Qco z#;K=9J=B!>Yb9oh`9%`k*g{y;!($s!br_*0#jKYSk^-A2;tja{z2y(Q8T$|pDZaOC zOUKMF_`OBN8w8g4;5}F#fNkY*>`YVNN83q!I|DO8N_x;x5Lx~Kou*8ILA{xQdnC&T-yF#X|%2HRnHLXz` zrmS!!n>U}agUUca(S#s}5fzcp&WJM)i<(GJ+J&XTjS|aA6>1x#TQ{8|)gm-+#YzcJx?^l`=czcg5mVCkGy=@IQX%C*+>Fvg;;G%WT7uPIPPk6P z+o&Z{9l!FBE5kZlE<=?rloNO*QjG}8rsGvlvsI0M-OFW-m|mfQ|Ig1$xheyh*^B zmT4K!OYW3*TDDazH3|J-WP29cVGi>(?=U5|3D;jX(ht{R=7AsTFul}ajs}3v(o3CX z8O6tqjiZio5#n|y$=uXOuBJ-pAHCE+?goIq(Mx?Jy%0dZ7*G9T4#o~Y?-b*yQ=9-W zMZ6AbDqa3@Nhj>jS`aRdyn8vlwIt~{*Bc24a?RPXx!#Ak;F{hOHZq+9sF7)Jubvop zslYjLW{%VoXFlUfH6x`2^CsPG{nl5qzj-S9MrM8>nLYDaS3C1nDM24*B$`i4y@-CF zak{lxN)Ww>_X|{;K%9)~8iG?#(K}m>IAMQ63hPaTb*ibt`Kg`_Qo~Ohootj!?J#X( zoaa)>+td6}EdF6sSWT6SQ{rn-cn8I&ry7^b6-yI5%bHX){2`->! zO;g^XVc2E(_!Q+k0%(dtGn5#-&kW8`{CNbmc8bE1F6_b>y{cAzRucPP#n?d=@okvv zJ}?vuaLRZZK*DqO2N&fgL(xWI@$koP0rVQ4Z-x4BCeF41Qt*})`=SEt zOEI;db`d^wGrYI&rX+29l(Cl%Q$%Mbrr&45Ox9r#7a=x9@v+2m z3_CRSk4*#(%;oIBKNGz%0$VSL$Q$uDVQhGZN`3D$PLro0vETQ#x;5=k;y0i;eN~VB z!DpN=<;MQd*BU0ly!-L4#fU)fv}1oC7PkuVbi}#q8I@Am*x&nFMGnk|AzsGnW+qmdl0~Afz4blV>6Y$)&ePkW3!%;v6+g`{W>s|5jst27xy;+iwK>c zCiv!807Zz6R(f0imJ;l?!@s^XGsP?LRqOH?Q5V>`Dc;&5nSy^!PVD=Tl*I5WI`HHJ zLof_*lidn~?^n?!KZm8&CBFjCV0_a5D`Tsi_|gTS@w1&icQ`h(+i|9zh4iG`us)>~ zd+ajcd5BQ|af?HaF#D*?*R@ia6-a^j&NPsJ66!VAsquv80@=5o^m?Yr@YAUVIiLu! z+kMS_(fbqhvKpeqKIQY8XbxK_ep_t(RRx$8P<*t{<0dR(8WKAu$8!b>iV!;{&2!rj z0inW}1kb(FL@0Kg*ZV&5_YkrYulpZ8P!@LRG+D8{Hv>oqV8mPIos{7Ok$u1wF7`7mFV)2(7Zotb;AWw>?7g-@lQ+*);xqx9y18I zgB8(1&r6Cv=kj%MmwXojYY?xB)b&+t+$PT0?x1vK!+Z&%>CkE$p0#3 zeT}TYA&WL0@+?1%)6vK|sHd3M5a0wQ!sRo6?kYf($iS*{eD}r#9k0ucx1>ps@qL>0 zcL{cyL)=;)^q)jTGF%BPlu8@CtUYN|SYD8b-mQ^QCEn$4Zx%OY{X2+gCecNI`f1we0Mj0F-tV-0cH=s^zET-jT-H42f0?m zX*;h~dc_TbM{EHAx$wsH5p3oWq4S+ere|hP0b=WYw-{!2k(ArHK^bfj0ugK^Pl$0A z$(^?;{xtJF39b20SET3fQbLy$tYnz=q0IOKnnM~5rwhc`pqZ6rULZ-5UaDK>ASt2q zP&L==Cv*29j${1TBiQ~SqsMAzZ0^yBlzPagWtck1QIbH$UUZOt*}61etC13fw=i?3 zBsM6;3#sk?Cydyf7yO6<%)A1Obo?@9sPy#fx!LB&Z zh0@#1+>}mWDHQpV5acX(X%l!E5VNF*7voq5)R+5j>{n7hGoZCy3vtXDU2m=rs-LsKi=N$=0BR5Oegy>XX!6K*jqj zep}%a2x^_eL(vW316<<3IgUng3WaIUO~=J08ZgFVm-pIoY?UYA0%(d(S%J76XyEs+ zdj#XM(HBlDf^vU~xlMvq+MfHMoWQr|^6Lb69m2EjS)kFE0{1U3!&k5eJ#{u-gHT+Y z~n;@{{s8uAKWFH2*M&I}wyut>a?UUfdEEj{Thmhp{(2&!*Y! zpHooi;FFq$rkfbO*xqTYOrj5`Pa`|%J%V}b0cT{m!?NbJ?@F(<3 zJsu=2ecc%>`G~T?O0-5x3Hb5&e&!T8VV%;;+UJ+%n(7iI9XmkfGI!$j%Ymjvm^o~) zr11N!7$d1;V?y`(cIF`oN!P__vwP))9=y@GhxUj6#l(}lTJ5~4fN}t246wY>h!;@& z%V;ls`k6rS`(yZ*pK8R#m!IW`)0~5Ontu7=)z(wB2kdIwq-w7=R+HtYFGfZ-NQ;oM zIn!7p4QCnHTXT&B2Zy(iJ^|9iy0f5=eITRUZ>6|hq#ZAgIxWJdtbPEJ2*_1VGnV*e zz3fQ#oFgex-G>H&!9T>kAFzDxxu}!}6v{&u-kt#%4nU2)Q2`OcsXN%T!^BZ>;m?m)a{&6+pMm}o;%Z#jWBBt6+D4@cPybVCm$gdK>jeGp#bdrZg`rs)#eqKQv z15Y}KEH?>fgv7x)bt#S?&Au8p@My@n8L!+IpMznMcC)CLK2ODIzTo*hbt?dI&X4C1;HOi61lh0m6EA;);TLaV zINWAtPk6MHWq5S}qFuWyn4Z+zN8!4*qx^|bN8$$La*c+IW;lfKr<&n~1_S8x{4_bWZDaJm8 z-nCK4=8>;4^Wu>)bXt$;*UtsjLntvoQ9pqt^y_8-po9^MzV%AnWAiiO;}!jIF7&_4 z$@peFV~^5zklD5{Li+>>!5d z(=NgJD=L5=qS`3+YucIER4}$1FKoAeZA6AS)K1{3dS~o4ER++lCCywWEiCyO`(>$L zp_Szh33mD!b9N|}MDq!W6TP$F)4}+mz~-C&Ya>Q`{wBeBy)a|8{w1$oI(w)!dDJW_ zZwGC3igyhNz2gOjG5z9h1gGC2Zug)eCC6HxO{a=_@IP&QoKf7bF+m$|nSYa5v_|M{ zJy9~P@n~S)zC*B3!7@;r6vaQyr6V40Hxl^RG#_s`$%t@?*U-*V1wp?s*5G>`W9=~- zXkFn1?IX*0SyCZcYKH`KOT8;6kfqi&wN!q-KnTZzrE&yJ_7|qQJQPi$`I@8$5b9w3 zr=SrHS?YBOZoQ>G2c13809nfaAXq&Fpk-6-mP|#K+S3lY zXx6Aw!Ce6<52kt^@d=2xY^gV!SnAm(mikHJP_mRmU*nBxG)z@3nQD26sT=`7|G*2M(S*R0 z=A8^=Wr)*@pmM}TFxKKlkdiMz6rlG$2U_BXmP?B`x-hF8L7y0EzSol(k4kFknb5XX zyZM5QIco8KG8pglh>N6TFLAU5@m@I=t-Az$bg8Y{eabx5l4Ai0 z8xHW#YWo@w9oKkh_hGg`7kudBP;9&ZX53Ig(3iNuWAG}*22rIom?}M4#n^MN0~ico z!d;9#hE7RO#H4QPnT%}~ghGH~j2!P00>b?@fG^%_30RfQ*pELU$7SKX`j?Aw6z)qv zBt$PX(_P;J$im6+aXT5i*&(EE!(2*hSix8YWp_sQTTkK+!tWelXF6loe{Ta!`yO8j zmr_k)jV8?_Z6~;_TsZJf)l=`v_sMLS%cNr*G`=U*D|)B$R4qd zeCNu)df|>NaAV-4|F2^~|EjlaV9{;%Wh}ktUR=JQ?T-QTSIz& z{M+d5Vhlw4x|-L21p@({VmAhd*57*rV?WXNS7RhckVgp4YXQOi+hB4+Fewzl{hb)2 z11v@{uRkvu(doFcVJFzs&Yg|hJ76Q@TiAaecGma)2EZo(UR;k0E8%-Qr~Fjtzx1G; zWlz`j?x45#T_nXRA@QDQd#A#kDP4~L?8QbqCw+WArut4i3?64u@dc<5Pkv(#m}pZI_w6Tj^B|%c#LfiZ8tr zr<&2MDgJgB=zkmBjDRsv%=s_c@huo?cm2lWTGe(OaNUh~S6b2V>xN#L#n>H$8|#Tz z?zgWV%EZ+}j||6YXH=uOuL8H45(<<#_bK~IA}?J@bO3y6BMWUVGW}1`w|Rbn$f?)B za%dQt$w=WB7x|{a6hsHD7{a||pq)Mc7%pA#;CoBHqF>t^6FG|GR`@f{KrcdZZ%8~9 zIC&8Mygre!zqUcS;ohDYvHbgD5FeKi$2ayu^R9mQ6ldf^Vax*)@GgrnmC4uSRmtlXK0sqgY4Q>;#PO~q2srf5o3x8&; z%UEHUC$Rdcp%fSfrTFzgjd%DA-2#)rY%YFn&xN=-g8;g=XW1jTqXcfpbI!j7{Qv=! zb9-0&svp-&SSD+4{EvOtPm`=aH)q~eID7Lt^v}6_?;Nxc3|yQAFO>XGvvQp^Qr~t!ln^GH)buu=)MEp zG0&;_3uAK#pqv{q(vjCh*3erk-f(+isiBT0jQelHA_;BTTt@w>kCOJF@+ciimr_!1 zN-De+6Fn-G;TKz@wDX{<^U*-fH$X!M>`jc?p8hgseszvGjD|G4#WW_-EY>%3;pbZ*?+>+EoCBOzy2?P)4-uI z6Pr2&uzNBFn7=zY=c5~3;{Z%WAH=lMKA54PLAw8n<8&dwslF7(E*4ob5OPhFYu!$C ztRF%q_bo;oO?ajTHr#+s*uTYN*a3sqP)IQlv(9z|d<1ddI}5KgA-gpmtp5(1eL=ut z0M}2zc4agsp0n`=#;zuSau&USYqHUcST6#>^h8|f49=`kn1JuD!3Cw?0w6k%+|Ae| zII?w>AM$KRrFY>E)}yH8s>T=qAL2lG7V;m)?gLD9IlB7u@Rjy^8winFTi5Yy?2m!e z);`mm1Y?R|?KfS36?K)1&%+i$Pf@o(T&B8JsQ#Pz_Wn5RTY`_+H`MJ!Ztyxf zk9-}SN4}2EgX`#mcheET?7QtY6kwJW34QEU(0yz_AMWF~hC>D|<1NMAN*Fo)9G^XU66p9D7-lV7aFS*fvAs#WCL`+9^ z(&`2*K;R~6S1J0Y(J(#|(^3?b()0%}wcqEaVTW+i*O)ZXWdv!R6g}fnY)29bE;bjEyw9RY0!mX`zog3oL2rsU4Yr6s|??83h_ct*%5?<4G z7W8rTO2#fDU<542x8-Ob&SNZ#k_J#ix39Ak*U%*-`4zo#v3<8)f^@fCf^@fCf^@eX zrHgCmDBf)ZW@PA$5@5`4x?w$LAs&e@=ULCy?d~7-_HB0*AG!id9`M{Gy~!TmjGaLco6eW>5unc1kdn#52Iii;u*NEL_U$2f$K_4`h4mHKR=e(>=QJhqf(0q z-2xx~#JZZ|&auTUh`0QS)k`w$rlJcI+!5e^55>W|_c9U&;{vAmR_4GUeIyK3qvGg= zT{`6s#iw8#Vrwe-_@2-%^1Z#3EN?o1G7jW>Q(=jf6rbKJE(-B&h`YYzH+FD!?V&uO zE_V{BaCKQvL3`x?Jfs^+7W0-vfq7KIAH}~v4@W%g_vfjUDLy~Xqgsw`RwCZAZa~WW z@M-v1O{M*vXh(;iy$YbUM`aJ8tk~5N1Al7qsBHX-erOiRP4{;*RtB97@Sk_Qu zt2^e9G$R;J#jmhO!7_@^c1A>sSHK|ZLF!PpQInwK7U-?)AiVow^!UAg!$#s?4SInr zLYrS**2OT22ugv{j^Zla)rH@SgZ$d$u)$_Mnpt3o!Lc6xItD*@g3ZqEDkZo!$%rb{vSmgb3>OXx`ew z9q?d4y>}9GZvsb9bp8?h_vu*DzmEJ#p5b6qgx*siA8D{hlY?gt& zxw%TxtIuJL5&{2uBEW*Ekb>H}aSy^pz(~{`+{oLg&YiB1LVj&s-%fZx3O=JM<3EL@qoWY5k7gYO zX3#X&^-BjsU@+KN&Lh&* z&Obt5*Z&g$UG4nv5X}9-l5afxj=0S=9F)6o;4kP)4%a2Zg4(x31fplL_$8d zLN%nP*ttKz8M-U_=y{l# zzRlyvezFbR$S(9TlzHyYXp7mLJMPHDm$tJ6lMFa&5~fMcfYqhaevy^56Emk11N?;a z6Y#5_y9tv_cyH1(oPiE#Q`(gnwku!3`eHd|JHJoF#NkC7P{-vi_7V#|YX{!C8W!0T;!al@@==9OS9;9wClx@S z9qFioL*P$4sSsGTUQfUe#?fv1<@lcswWpv}Qka?v6}5*+)O$$VZIGn~;IEy|d>XGz z04eQYJQw;ky{stk#dAh2C1Lvw`(1v{zn>YjL&d&>H8h+BJ|(9C=OlCxrps1 z4C}Ry-uEr^?*L+>(%gSX{1D<19X%HAn?#R<#uPEp6XB(U={W#mUhD2&ig*Fy(Whup z?s)(vw1xXcuUDenrGTm_>j|74ya>Q@0;();D&p%YerK|q7A@Nlk6Mol4POHADgX;N zP2P^U2o~;8M=dwD)>HvUWNlOae~RW7FwGMfRqyTh@?Ujr42J2pxC|SQAVZMeafsk2C$xil2Kv2V zZziV4cdd3hw9Pr>6FW$b%~+VAi=_Eou2Y$b^3;%1K2^1-oJx^}guQBVbgGn)nuSiA z6ld!n!Xy6(s z`530n^D(o{qT61P$bWPof@Jpy;UH~GfUO<39t?CfNRjhlt+=i1^TLs*+Pi(B>5 zKqNvGU9dAP)gjd^b0TA^)ZY+kA9s-U~TFUwEWi{U~>{)XNsIHrHp+*Irw12RGJ3zW9{1H z_Aosh1EWFXj~NJwFF}ub7#NUgEp;S@SJ-0*CdEz=#fM=Xc-Koj*Lko11vsSU!vkLk zeE+!JXM3NBeh$_Z!TThpC^GzXYV>*8A{TFXw)?W%b-@e6cA)Ql%9mY-%jc^zjj9ysHGIgzqe_QcS>j+={AxT01$7;jaOm;O3hEb5P?zIiP(6a z#y@>Lly^1WYv|}}wcjqls}vYi!GR5xBEddO$X|({@xgtmiZKH$?ZD(gxmt-eX`V;t zR`m+YJ&5ya|I=f9A-^1?j#2tFP4HP~z!^k9iEM^%odO2VIG>CYi=ns{s+f^L@*S~| zY(-2#+}!~ZV%p|zFJae{Q#|KLu)4Wvft1wd1qihWxR|pEj2UQ_)(sz?Vd8Dft84R3zq$Vf^%AD8=#9 z)JKDU`Z=7Nrm~_^UN(4ZY-6-NL+iR7b4IipHBC|JsYPHME2VbW4qv%%XY2ur_f@pd zhT?-T#dDO9GA)(&AE5%%zS@9wGLgJY2_a8uTGl|!REf+YY>9Xl;|0Z6E81^Q;E5hw zU7^TjnAT%3CZts8Bkb=$gAiz_d=Q8@sHK3v%66{({KR00PkXeI{9+hC5Gih2VZ2jQF zxa)<6nOw!aU9zo_k!9Tn+Ue-ojO<9`LW!QbE73e#f^GWN3n*Sd9pTHCH3zM50>!Ur zZoNO+ZU_yc-uL>NrXjR{iG#-%3sE=lu zcSx{P=l#YySS>{wFGxkym04zk1Uprpl_XXF5pQmlVE%E|+DD6)YLfN?m+_&5ff#>H zf*p+SO5&%NEoTfeJ;Va zAJffjB2benmSEdQqa?P>7Fc9l}p&*RPZ5^VG7iIdS9Kzo){M*YcWo+`mMR=R4)4v=5{rM)>W zm>|UW;CoCks2<#BdZ|=~SgDZUuqvBbfMo|Jm()vjkuVy4E$OA9=+lxmF*e>V-E3?- zJO}#+9ZdaXOoJ?@y@6qI5f=Hz@Wx+v5l9bUtSG=}iHk}N`IVfp+%j(ROF|eUbIoNE z%!RUkfb*=U20d~_o4ttdMw~kl2Jk=5!}R)4%Vc*$wa?Hj7-SnTg%-iM#18^d`$H0HT!+(%y(~laQ|33T=?mFKDjxH?GBJT}SDU$~f<^ zj7^e`{YG&&lYa0>1Y7A7L23_?EgscoB;xKYM?Y2_pgcgvlu>PFAU;9lz#MN+!BGk_ zM+*#XOTl|FhoQk3Hl2XuGaD@HIv`p^NI~uj#5W40)#Xewnvx_= zZrwlbWUSm#=Cv}pM=XObL>0mCcQT)nV5ghVJ|2yw3K?pazd7=6@V@mkTXpXJGV;gK z(C?mxw;iPO7P#u4L3ar97U#~CdSBy7RQ&NCTt!RT3#|zMM+?}18EA^FKKCTKCf%1T zFOuk|p>?q>R>QVf{j4gS>wtl^B9{`H)2d?F`YB_;dqASF2yE@a$ZxI#g}-8WBMRnu zeD7%Jk4x*{tg<)g>)4>LYwPU|`Z{*UA0g+{YdD9=XMANMBEQHSq&s?~i9?B8;Zb72J@W1If{)%LD%Lp`SR~bPc59J9? z%BVtov28^DhMnmsXV9ue?iz0 z*p|O31FeOHGMbieeY&jwlcZ8dGR}iwEG$EUz9=Z3VJkQpqMUdhZ+ZHSRvyIjcoB*E z;@L_(^l>3H2v|Htu7Jh!WpbT>hgGI9mP* zFlOujPb9#33y)v2Ka~^(#q$ItI|^YNGwpN<34(Cbrzmu?(}V3l905TvT>c5BAHDtm zxeP%6fK}cp$c_Dv@QwSXVDI^w8kttyDJl1r(UL$?kD+R8T z!oU$3B>G1z(29J)t-vFmtx4zdiwfcyuHuR2w}4mDKXL^D@ob@jNa9aXPCP}XfSW#> z=ZDh&(->$@*hvxekItz;VLwk+`C$8REkaRFup?mcJjQe(|DR|3BQpg0f^+daa)pyz zp5*^OA?(m?)W5{Ye~}@Zz91-`|2-2p@}F$N0-tz>6X=B3|3@Pbj<85?*8W9?KrEgo zE4>N6W1s(rV?-cs`aE)Z*k4pQa=|~ToZS8dBjKLm7(9`5PG1l_Rz#wnc!sMl^2Jjs zXUpG01}}58^b^geO^YFf1VZtYI1MRx($aV-)c^0&Sfgh3S4V7UC2)4Pl0)-lk~_6t2n zZD{+IUah24RUuwW&%oBN^;v=BZ}czXx+}3toKcWe8Kp&?7IC`k%;Z4yw|e`&5#zBd z7S{sxjG_Dq5f`~AA+|efEVxWbPDffC3dLWL$cr>w@~u8ck9oXZgtPf*R(WN~yISD; zAN8_8mF986F5b4wGS-ST}gpz z9ch>Uq*wb(E9$z})RIsYMa4B$wFKzcA6!>bQ&d+~L!gVXqT=HE3MW3RXns{auVf%& z)~u>x2SIUFMMYI50odqYQ&L+$iI2aO zp{$xST~p2eJf$zC_yQ>84x|*g(v&WNg$1tep%3*A7Vr#ot#eXUuhKAekSkG9|FXQH zc8u#rPlIo=>kYNx(8aDk5rMgvxUOu-nCV&=5qK-X=p9&ezsqRIoa^$MfeWv2l{9>O zxoc;9;Latk^BXd5bS1_FuJIUAf#@PvRKvQvTu(#<;%B&$16#gwnGKsZyLOs^(jBh! z`}Q=rP6<3z=Spel@U3fCWW$i(UD57_=Uv9fse$2sqhmvIrctW~9`9%z2)vtRjBU7} zlQBsNbY5@tYv`I|)bz}2ctVMGe66~ET4hm1N$nEs!ne1|(Wbqt;i3!5E2?L8=(Ui& ztOs7a$QaP)E|{sJX#TX4!urbc%JMpX2N*YcQC$h^2@jZFQd3gO-T)r%RO}KfaK=O< zCAu75S5aSASY21cHft;p-QBpX?PA!b(duj~Jg&H`2xdJ4bOIl_jreZ;>-!C0qls)u zU0K!iT2=xgEi9@nE-x>vudXhsDK4rlVRRu+OMKer z>uT9{2v}EBRE}sQ#Hh8!_@q&cz6+TNoz&ILFRTf~)EW5=(H9$Il)?9)B50Cw3a3@o zS57agna?874lXPyX5XR4xxCdf7kIOqCi@gsZ2R?D$W}l%uT6CM{MDc}w+5}J5X9M) zkbhQ5Wnq0?X+L&0HS40eg>!)N0$WB(Z$h*ZXe&$R)v*pJV&m`Gb0JFwrlRT7xwUeT zGqoXe|zg^r4__wNMu z2Cyj_YuM7$h*h-CQ0Tb>jIS~c2u&Q)Z9Zj1mD6XH6mtJ_6n~fPTIGTD=NP>-_K-VJ zz0v4);RKLHFI8Atg=-uGIP_q14zGC~Id+%FHbRDxpt|aUU_ycPeSzI+8Jr_AO z9GwjW3vded9P;KA%_^T>L<0-+@Y({ycg6tL z1LbTMPg%%*fO||YsV%N4=fe~`Bs`h=ug?KEZKWTi`OF>2n`LB1U+Qp3BQcxl4y>JJ zbWiyJWou`Z7niWHjVeGFyovWw9RlBV$L%9~%)pciBdb?ks90VCzoYE*s`_bYN+ocO>8u`&=!$&fdG3=jY!vcs z?(-J1dG0_}m65KFjtH!(G7_{0ff8lk_P+qqb}10*0=_WbqnEBNFRo?tp{cP&bE&iH zgbuN|s-}c3gu?8eh|*rhhdUTu+D?Z>$>(!Gnp}}LE$%Iv z!2;8V7=5)nO%~YG(a27!24=^C3)u)r$C>_#Yp{J_>Rm=euK|pH#EbWBDoPLG8XZas z4LY?N^q5nDMGF)xG&+$j&J0xN8fKtNZ=)gd*KkDv-2BkP-s<1*pL!#!hdQdT zA?qIFVoRM}5m>s(n6Lg=am!|7pxV1K@cR~{L!flCk*F@I4EQ%2r>bu{i63k>64Xvr a4L@x*3`M9)6%h~x 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 delta 119175 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 diff --git a/wasm_for_tests/tx_write.wasm b/wasm_for_tests/tx_write.wasm index 40cdb973717b689aa500da2904cbd198da6c35dc..d02b5159d0fc4ad255b5cab2e5992590db59dba8 100755 GIT binary patch delta 69656 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 delta 88385 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

        ~8_T-o{8~cA2V}lj?Kl5+ z&B2qXzM-r2msr@@=W@VTP@$j8312~PRYN5}27V6P0(TYzaOL!K*Dqi3Z+vQ>8M!Jh z@(<~b%f8FpL0aeRWxWr!?+nqvw|$-@U3L6BOctCdJof{i!4EH%5tY1$IJ5YGTswe; z`Qu<1)xgS5kxy6h>$R(pi>~m#zT~Ndf9f0g^%eejHRKxkBhL}!E;#?Q$6bK!pzdqL z8&Ym}!LPsYX8MtLe!N@Ou{6ig?JoTDa2tT@rn^7%T7MX z1e&LfXMv7S>`H<^mHjrXM6`S>Q6!@K z=M# zcT;L@pd#*XC=%uLmf{Zfi7ag+Lgkk&#dh|VYjG=KVJLfbYmtBJ{ELlT2aw^}Q~|%k zd$Lbku>w6eGlC1eGI1JlijABgJp5 zL|Psa9oaEgpNB-YXM*`ti}58ni*{J=YRSXsYQCKOh`65}mmfTW8FLN}L9L1A_B;iR z5{;`bk`JVt!u~XPo{Qw61_r(JTqGxb2pYJ9D^JP^qeK~w8+&Gpf!LU?%@*Z2-OCv* z8Y9>?TBL?7!re@23Y>-(Z42abzU#-)BAl*d`;Qa7x@FoexU7j*wG}rbZAiKdH4`1HiNg^RkXCFv$YepZ}c$~{y z7s|>>A`Z1#CyOX=KannVUVb8>!B5n4GNzrE+v-1(x;>LcS29HZm@N9BqMlQ*fS-`L zQ^X#F4Hbd*Ag!!!HhwDtX=e0%6f0`|D!kh1Fx!K?J{5Qa<=m-4xTQ7MANeaGtw9<- zg@=i`cAEH*HX)Ozi#wU^!YObC97#8*v;b?m{OmFDFs`t6eq8i~STA~9bZjw?A-&w1 z4c_QiScCL0>A~|!S6Fd@m66uMJDWy>J6fNW*B=+H*b>>|3CQV6dEXN-pWm0KpAat^ zo!dgqD%P8YZ}OpYOJ_jWl7@In;4pHgT$&>~#zsP0nyu(8zH=Dp2-Po5ptYKDQ&xVT zBf?R*Pc9bC6RrcfVk2!+M$Qsnv#(q|pB9g?ChmzyR}}QaB5rS$CSYE*%ChHe4uro} zXJ?GYaq0Dgt}NPlseYggog=0;gB|I1iExUhKaz_UBJm>`ut-nbvB*elump)^a={Yu6axQzJ#l-!$knxV%CqP; z7Lf(dioM=bL2sm&*4Ez{_tM%vq_rnF#i4(kX~Z%yiIvLJ%S0uD!^^P%@0S;s<5QR= z^5hEGd&gYCQZVK{d-dAAX0H#;-WDrs&))y2$v74Xle<@nX2j{QSBm~-jHPC``pNWF zB1Z=Tt>)DPFfM*Tpl z>%`YIO)st!W*^UbvIky39R6N^5f-@zchJB+v_*_oF$+#^7YlK-g^@HjmJ@agyWF-D z#?=b>@lM!nE2Jn8NeG%6!JP$SPlWrvvZ_^>@kP>4Fu_iJj*6mjYg#m7X|7(oV8SEM zzTJ936}zDsSGar&#W04{(R;A&A@%)NVGFI0zrHHEAjsG&UiB%Ti(=ZzU-ydUH>qUL zr+OtFU1A%G`PL=+nUFF4O;K;uQo5T<>OmzpgITj%R{)c&6#LP|Ir?l!1wIx?*TOpC zI_JNl^{=6|>ZQ`zVoj;?tv5yUoEioQHv=|(Ms3q~(JEe@!P{RIX03+I!>46BpZ+b` zrhiSA<0)>>zozq$9sCc;bpCo8S0QfEhf|;C{6~E~SF5(FI7Lu8%fy5t@{E*7+OD=`zKOzi{*9aPILNAa9qhn#al&)%U_7v>|SSj5xh!Vh#P z;-oIxUz{Y-mP0;-S7U`-`61GzOgJU#1L|=~bV4xilxXKQVLXatlhMRaPl=T9YB}<> ze~*zE_mS8Q^?dRpF-*8SpidJ|2W}}}=X5P4ANoXJZDtu+|81XoD_pbA;6)*Dw)Gcc4X`J_ z5ZjWC)ytzlNd#}Y2AnhawDm0dnI=!36;o^aS-qeh)QLQ0-C7sB$!esDO1KKFHXH8| z=_`^Sy~|eJwy0W=pUy>_hmDPEnCkkpTx=rqIOi*|yvC>0=xb4FSme1D_)>BM$#0aa z`!-U}2@_f5t-let3Q+9}TXkLxaJvJW$$A$=1P-2bD_y2v5D7+EH+UH*Uw|=QPkwg+ zn)wCSixm(`I33SlgqO0q;0L~iZ@n67e+g!g2Xf_J5|=z18u}7%QGnh~eOr|KozRbQ z4d1BiweMl`u?zBzAF#in@RS-Np^KoS8PI; zRf+^&_N#ooQgnuY^Uq4dn9sN(9&~q>&|h9L&~ZPCd;4wwwb~LFxa6g6@`kZ>U+oRU zQeWl`W0EcOhG+jO5C16in_T9fV6S^zx31fMf-4F!W9Mc2OT;yO>R<($Lj zy4Hmpz_o5TzItBW!Yt&wOXY`Y^eWfN=eZi!@*BflSGkrBZQQOoc;!H$pDi86*F8=% z>m@klaXTA+J>!_hA#)|?_1zan^!)%hSgv0tfO9FJ6+PMKFx=D?zO^QWUao}3IG?7;DK_#K4hXRvAOu( z0EJcbIX=(bSW!k0{Sg5A8bL8a`mR8kPqy_XW_^`*_62f=P2Gk1QtGM=)g*U)@z_Mu zSMTt}eow9Ox);l&RRV=OwKF2r27Jq6xiLbG_p2%Fc!c`7N}${ssh&fz%c9g5IKs3T z^^jl%^15B^!Vk`sogHdVOt?i3wJqN_N47{&BjZoaAqm=oH%90#NU4etjTU%Avw+@! z71l_(BVBDKTg0o0ZaoAVZ3~Xe^v=QgF*aV^e~ToozB=L-Nw3#eFXDJ`Q-ZqJeZ2W# z12xC{cvE-yc>S#q-Am;4w?c3UW45$3G=wO#rP@GFY^ctO)X(&(L&S5Vsn#$}armxi zrPh`86V*tZc4j83$LX}wlBCjU=Y2`)2)z}pr%IkI<(S`TP_C}fH{o9AAXG0oICwpwO3Q^(zc$HmRmU%+Emb9IlK z#}itp5B_5w|JkCN$1fQ*{hhtCs-;SY$cyR{$YkdRMD8WYCTI8rjG{49W}PIT!s{0^o%^#7LAUSmUcB0jRtX8JGH)1NISW| zo!W}$=EnwtgrbBP5?Ks`mvqw%vM-IKQ7orZ7b(NR+yu4oL` zY65YVt0NF!EwehR9i#T?>c|d-4Xs4iqs_((@!;O`9aRUK@@7Z%A)oE^ohPn;&g;Hc zC{72?SlJp`?{|>4PfAzf?25L=lN6V&HAWKC>S_#sK}P9{{V1B4t*u&iz;icH|C38g z0lPhc_{7#SxucV6ud{)Qq16TkNfUgu=}afJgZD?9QZ=;`-?Btb*Hrq3)ecS7zhU*e zrpDt7e=;^pZ5r)vie3qtqPfe&D|{%hd1p0J=47E0_!QKJELHz< zoF(P*SZB4j_;JAjIkOLIAyV+^x&B>@F0ARI*5j8K$k)55QR!zFpib|vFgf&>AN21a zl~J16j(AO#FgiRH26Y9;z>2Pcr?fCa!Ry_Z( zTEF(ky=2%UYE#xkKJkzm>ALR`b%zNbTJj&KJ{gKte=t7ji)#z^(eWaIZUN%M9;?Tx z-Pv$?Zk#$0gzd(w_hB?wj8|)Yh3~KNYE0|`$$W6-0hb^G)&w@YbMnYZlba2jG;-XO z$y3IU8!5}5Q+vdX9XV@d=(FJU2FO<`gwmo}Hw|k3jN4ZdFDhT!AMP&%mZuh49-@v7Z-w9B_yi{0(3# z-b3G)D~dnhTUX~JS4~!<+kz%n7?m9j2yY4!5SbjTMos17PJ}^a% zu-?FM^y%&f+f}Rb2+BK(ClQYa{uuFgc$x)TmC^FgDQc&i7SONH&)gE_xl3Yki@FM*Iaqq0Z{0;U)-@U7f z1>D$^Up_rmZRP0E%BqY5s)>)HP)l#h`hJ$N<45S?=WDhq56NcJ)F$n65w#=7lu1KJ zjTtrWVf(0Y6CRzSC|iK1L7gyZBZ8C?6?rJe;O9AKwo)v znwsM13EnlyCW!y~CQSLf;KW^q%V_mG)0)VdAykpby&JoWH+ z;D-=z;DKG!W~e=UZeC2&@nc3z88ud)XudY9UJyE@SSa(&q@{k(modk@vE-!bJaR5_+YqIACE0i1+hp! zD3?5gk>?Te;4^BLf9nXN%5D+Tnx}^OPX|l|0dAhBHny$=90vFmgftRzVxIb#%*|8H zs-i6}l;7v6?RZHcj?Z8`mdL^L)K>mVlvRlWZB&$8IZsUq(EtYk?v0Sj8W<+a=BbUN zW&kExosUpOxELYTjr8dGYI>q4Uor4BJI*8YMfg2JOc>DVU6&IdFopUzb5D}!dUExA zH8rG1J*zHvG()5D^r+`LH(&kA6cXq#WW7I-B=dm|S6ROLy_$MwL#wVYA3#W4_Xxy< zNu$P&nlftY$l>G1O`bC8(cx1@j+o)5ozqZWTdqd6TMw9Y>)-Qg{rmUs*;yOdvtM8P zV5FCTj@VdDC;P2XPY3TyG2=5BU0&eA%;mNa5-RFQaue`@i%xSU}C2yeJ$casJ|Mq9tiIS zya3oc!$!a@@OTP%32{S=&^v(rQGay-hX~;Xzl%5tf~SJ_5ceLE zlYqS&^dVqxmY)MmBIe0|{%>#v;C9{w-vZ&yfix(@CSC=!1zepjN3B)sne?*dytQiU zTTGTe*Q$|G9!u;53ZNExlvLk706 zDm_q60UliwwvaEaSJNZ+0go-q%>_P8`fpH^n^%HnAZP;d+;p-w>oRHlgkj^SH+y8{ zm{CKg%Yhs4hja$QD(#3I{e__hr;Hmq_SVxXAdr?vZR2^Uk{?^hpEjrsZ{9~a<^?s> z46RBAjGX(zE!fyYS~jY6OqHN|M8X8 zLJD#<)E^nGz`wCcO>d~CT6LpomX^S+QL0j)dwI!9+ z??p8=-cwdI8fenf-DN|s5Z6Js`9-xG(f{zGnq~3OzYk)Iys}OWmCwJVTI7(IRKMzm z9ic=c^Aj(rS(JJIOSI0o8}8>*oo?O?-yPCl-mIomcww{JINn1y5~4&M{3ye!Jc#ff zbeLrGqYT+Hk!DJ zcswv^mISJ>tK7d4; z8WrLpcnt*j9~tC{9cl-Q2md^9Cb{?(xKD<3l&)9Q^w8BE4bd5jq+xhSL?4jvPEec3 zIy=>?F?%{$l{nx&bcbqJtI`Ybk9aI{=~^{hrWL3w9aA&||2gMN#Bb+k* z!D*95O&M7N*cWiu+i&l8d%E484B9imVNxhx%WJ#TxDcPtR$X!54-^T6PiL9DTaEW` z?#8EgmiO$2jE@3L6DJ2DRRR14(7|zea5uKwWiqf(O>F5YZ6qj&y`#oW9Xe*z2z%Qu zMnl*wI=!M$jY#eZq6d&^1j?tT44*oD?4z~1T%lxGUzT0661&&}qG&d8N})cDZ$ zD5o_Z$d5iK{V+HW$kIJ(qu^UK<|3Pbrj{jZic|$36=*-`(8K}VV&Qz7pe*i$fCV!2Uh4R*{lA9FTLDmRj%~3D&=@S z!1Feq0zB*RIPuKK^EjUIct+wGgr_ea4Nn_933x*AsCd5bVO74ua~jVHJn!Op15W{- zRd^QRnTcmSo`><=)599C^g*Npo+fzgc*%xBziEXq`unf-jb0PzR`3q^=|0D!Hi5rM)ISRnr9 zy@8;%v9YWn0zZK|-UJZ>MO|)=z->=OIRu1>Oh0vnxwGE`D8Rq~QKg0`=4B}12xzDv zko5O^#tUJ)Cc+iJQecjOB)}k{F~UF7!Fdo-L_7>y4#!1rV$ccyQ(({$B!jaGFZEMQ zIbAUkrUO#HQ~0{iI=Y$tq5qx0Nu-f7=adcE(Q1qgnv~E}Q8vML@hLYku_Q@R-XWj_ zBbc!n8U+L5b4&#xZ-6Yqf$g;u^_zcG8Q+Y?if$;_v=5lL9KpOG!4xq9Gf_|bLS?l8 zgl(8QGw+Aiq2B;UUA&q=DV&cv< zFlE=jiUB%chH$kfu102TPl3bW zJB0QnYb$%n+PmZ(QP3#&h&7-Q0c@uR@1TSFm*^8UBfsPL{$A^rz3 zzow%FKcP0Y)hzslG`SdwIWr4j7oZ=uGW6paEQ@1L0{9gyyJZTx&|!H|CP~G+ z_KMOO%nsY-gWkHwCK@9jP=?|M0R@Rt)>$ypH{%xvaFFNFE5 z>gyNkjYtrfCFXuWjX@@`S7A$#skIlPI+KUOY-E}Pnn|8aOIeiPL_$#isTkkA43361 zDx&zuma!&&+mT*`WN?!ZHovV%Jq!ftYJ8dAPcc7@tQUdNTc5)G%qJmTSAalPg;la9 z=7U~{fE*SS)CVHwp$K?_r@9QQxd6ODW-eEqsn5Ub_S00%gU%qXoeZap8&h z5eKkU7>GL5Q&1AO27ZSkpr)wnI1`0Si`HOP<+p1qq)X36f=6LOSMFfWr48lUUIZ8xV+s>0@8; z3pzy+4`jMgUl3|LN)kQCV2Oknn0^E&TCBz#hpd>^2o`vH9+V8Vg;oPgeMRY#Lsh@0 znt#V6zKT=?is`T#;#c8?2+QJ-xEM&|uOP`FlJ`N9jbi@%{Hp~h}zs7 z?}Z3^hBx*Lbt8g65w_b07M*Sk{D4f53(6E?CR@OR@Yn)5)fkU4KooXlsWt|33Gf&L ze;^foP^ygqLQvDaje$DQiaJv~#y~g_IuAUyKs6$#+8Brijm`s)G2lVe7z1%2p$@`c zplJ^wI)NWC_HMZCX^4{puw2`bj>=7~0w52IFxb}p$aV#U74s0kV|qNk6M77liBEjZc?c=p zmzwmcZ?HMj3t`IlYhr#LZS+v6nt!t27z|o9;xwdz{_&5f&7)9KT|l0izJ;b~o&$Pu z*4O+hN+tqwD2Q@YwcL$>?odppeWT5{c_XOqEvTEaQ0w%%r=zTDgi&`L8+tz#L^QxC z22;b$!RxT&;>eNcY0ij5gNx$4ulX?QA_B4?#RatH1vesqiaF~WWxm@RL9KZeHBc6+ zNN>$-w5A&2;RF)h3-3G-hP3H`sh*2i06rF}gtSdj6v78gfx2CX^^?q}fcqGK4SiH& z{vU7e0bfPYJ$~=r+1*>xI|(5PErb?91Y1Px8Z6i&Hn4yqs6Z%EvJw;lTdda_Y*-Py zC}J<5SP&Ia5iFqC6&w0k-tU>+y;+bbKF{y}?uSF>oH^6ZoH^6yLdeIF#?GRasI@xT zYq3>ya$ZNO5aXatfZE?MUL%gop^@nBq_z#7MTkH1gh-oc2HMyM!l#lA-qDU$h6veL zWW=2#LWG=ca~#oM9U?hzvDL?Yk76I*$(zq*o){^KN>W1TL5%kI{Hp6SA%eArPHcxT z;f6@Q(<4MM8{^KUWc>u9Ad`l9PlfJD16+5cP6RQW3WtMy4fBzn&bQQqCV;1X5l^fM z-)h6S7=aBD9p)Q?Iz@`fSVUTDWCEo8*yWzqnGdsH8My<| zx|a(vXxFBnUAoB+8B})7&;ed>Xgqp-2+u&FN}P2eN){S*Y=9>ZcnMKmP3p+VNbla)iT9+i z0eOb`f z5uG7plVet`H9LL$$exfo${}!W;rcY_2)aZXe$t79r4cdSQ-& zFcg9-X?uaBu+t%7c?@&DU*IbsY*OHWkSeecLIpOmU2N=B>M^jU`18X^okI{Qj`^wGIXaJ83J9h9sy@;8w+#`pRF~*sy;=z6pG4wL zqke_p??0ZRRfYj)xcE{)hpWuE>+8GyMq3)mt7sDb&&ZslJ zIt~b_BBuztj-#KVX0H(FX$f?cneDvj6XrrFx}ezEkrD}m#(U%@zS_paMcFeeGZXQ> zVE7$|Xmai=R!7%53&jz?YMBv4Pv3#L4=8ky@$=^!>zOC-bqsyUv2dy_e z=9hL}w5ZZ2Bxk&eVwX?ya$LH;EgbR5?2zQf+TWLpZ^L?-#qHwl@I*ds8qT zDQ+Z3g&pF~s8n57XE?$jkdtfz;Il*)g~C^xiqx)Y8&gkzrqr&i2Uir|~401wPl zfQxz3)+rza)=A^Z#@DPFM;tntW~U?Xt4&`D_u~%mAnpK9#T^iWxHXE(MfhC=-bV1jxru|YLN|e{PA!3y0>ulkOGFhK}= zW@`zja9_d!9!NOAQxXmcfrJA*e@Z;|RdT=OmV0FNR0bzBq@V*!;eHwc9;6ZAsWbvY zkcNjR%iplh+y5I1FrEUK%Bj-b#eR%ZHnE-oA!SO0AniKnF6L9$V}zF6@P;+Oy&0#- zDAhZp2wv}C6b`8}j9pU^aL;pV)>-q?Tg5Co-sv^iDkeBCqlL+&2$5iS2a)RSN zd}?en|D2I5^~-SKyqKB)%87rV8GEDH@!v>WJVd`@C1!zS21Ev^{6dU#}zU8xKZd8~Vj>!%O4Im)^3vbh!{O(fru&{o+sK z72vw9B%VdrFNecPwpn3SRy`6hN6mim_uvi)nmfJ>?k8c1C5NrBy11X?Om#>1aBmxNAPW)-An|pBH{RDbO7SfB7*O)3yDB4JroxnU>Y5WJ`mndgv{@Ib&AiW z#E}jBS2%fBpLh+@f1jGOuEe5#_!bH5VOp2Wvy*wJ`5_)n98N{=jbA=Y zv4#1G6TpXn!)nA9wRJ=rP6W>r{K*2X7=lNWYu~nd_q`G)Cdr5$T$MP4@?4w3OA`(` zy+K&De_`TRdWHEqXzfa?*A5@yl=j6BdlW|-(XJF>o!KLLPWKRDIyF5ZASCZ!Y3>C(GZldbxvfZjx|{5G0%;1PKR(z<85wzQ|zyE4=Wk zR1-5I4i#H6dz@*|#ywd-xMNT|&UWPU&T*{OHzr?y$13XkEPS5uN)r|2c?o!s=kMud zR|WW>g2Vuf)5qXuvfaCsq5b&H%8()iWk?Z%G6aN8%D{uGE>9+kS>QXK`b<4mY z*HGS(Vtza?5n{UEzw%qDi&wG1xR} z!Ge}^#(sve4C$GdA(9AMXtW)Ctf@P+fMxoztb;FvWlVlNeHSFaKTpWk?Tqk}$G>N_ z>3bB!uriMYhfOQ9wCnNUfig=I7d)Dr_a4eTA7{8e9uO}HdT?Pv>SJ+$`}OfEI6u6% z3T6Ho=O#LpA_Vo3A_VoJ3CT&TQ0A%$EeZET5qg4$6W%Sr{e<@gH+R3TSk#cq3Bq#cj9?Zn0b{?bo?_czktW{q@LlZ6{?P}*W+ zetu2+MYl!af50~nsS9uX3@YX4~j)rPv!-hC|4$u?wSzLs$d>bu%i5 znKgRiog$pcV!ux4C0O7zDu@E(V*ft~Iuc9GTcVUc9i;xW$BYOqRPe?ByONRqT`)y>U72glx ze2wQe$*)&i2e@O-^G=_bX?8)hdmlz95M*j%wr9M0Snn1>`4wh~(~o2Wj^gi1<6T3z zU*8!I&_`^P7TMk|G@>_xEhEm35@$M#5t4`yF#LvD9i$RaQmF)lAQg=#*RQeKZJ#|8 zfl25*yF5CCECvJ}co10%2oiXY08iF@V0AnC7(a0Fs(#K0yiz!<$A<8f_G*Jwa@Pr7 zods3XbhlqKCnQAw#JgSc=?|>Dy_e!Vi|hrQr%{Kp$Xi+N6n8d^-|&7J)vc_^jsAk# z2YAu0c077y7sL1yhG)!V$%j^@)9pml7-S~*{?O{}?uHww8dXQ+Mo&kR13Wd4ND=fr zBJm4y9!Qu<33Ftb^E`!n9vl@hs!nJde1fVF0_ z6N>ZV(RheK4>H{A!W6NOYmjj&h}g&FAwo*Sq9qhNhnU5XkW`*7c0foKJ0N()hLu)8 zCuc-tFl|jQ##qXTy>bfu-~=RNb;Hza%7?<$h_$f3si5Tx(|WVyq$5n@9egkm_MG#( zp^C&)IoXL&sWb4q8o$aZMbXF}MiEfu8glgjx@Mg; zhOMk9lmaMkiL?Z>Ru>ybdJ-%VnrsGYVJmlEU$T9%wOZI}|0zD{WJpG&8>Ljco$5>b z4Aaam*xfW{;H53{p~=bXtkN!fL)#8osyjInf|g=GGh25jnvi^AomEnJ34U6LyO}w< zAGr%cS@P?3w7lPNZX%_C;7LidAG3!qh5owR$$xBwFNPDzvD)nzwgBkqEA!ZuSis1u zgCK{K%B6O3jy`y|W8#ub@tv#do zfMKRF8eGToD)Ct3@qXuFDwr+mD^6yeQrypxuAF;l_ayvMX@NC;V>p9+;aF-f$4gFh z5S1I5)8$G(n%5l3-gkI@Ksa+*T<7$6aLH+q(Ev|nR0yGr8ukan&6Wc=zuxR;?2UwE zdfQVxW>XH}M6x3oz5KywmF(Y{N6Q-jBGSq(JDX)Knq83jSkmt_u8+rOqVL_sKe_Z% zYZrSq&S)}YJsR&!Lv;wAIiTFxw-=K3@nG#dh5Kvg0q(DzJF*1%JkgOgBXftgI*tGj z;z;3s905)oZV}-U2V+1l2_o^2b(y@oZ-R z0uBg0$CX7ZLU{M-G?k2ikUZ@(Yp|^vsfXlCpIO`P-$R@vCTo?>L70qQ5SS<#?e6K| z{LA?lxz(rZ4%58_jqXnsC&rL&fOlIj(HOdB4~His zdCTY40Q+8?dn7+2q`L-ZkeBG=jsLD-~fzkncBlB(J-At)iFscpGh; z0z#_I3!$aW>&S;P2Nsg~YMeA8qj0KUl3l*C+PQxsQW=a#Mw3t^8&~1No8iRL7tS!P zhxg-*lMqYHh|sKcr+Ym@AuB0`5ADugqWD&t)*f@XLP!HB9K-%EJ&zLiq*m$vK{r?I zp;dY5=Z`_9H3&7~sMj2TS*7QjD}Q#Z3v=wk#K z7{OmA<*JU-+Cu7YO9?lUjCIp67X8RyW*gVE9-Y8m!D}F$Ol#j+hS4Y6&W)Zk!oLEi-wa+S>6Brf*~~bHXNW&;F}3&Nqw?$Vh3XoJh>5 zFpSYQ*gnd%ex_d-hD=J|;0RMSvzn)IbJ|dy(M)@x9Hl349LPC|UQW1p5FjEBb@_a+ zUP|M-r+%2&^-7CM>`Clk?Fxuw)?FAWgxjtUT#;$?afbC67Qp=-wiRdc4F>YcQF~JB0LgZYF`< zOuN;|ovsUTGg&T~b3CJRvKw?YGf}?WmCQVjEEtC=UqbFWAC=}bcW1~w)SLZhzTY)| zNeI^_C2}s55a?S?cd)XGJSZUeulMS`Q1y8=W!RpxOn7~Uq(Y!^-rvjOkx;>rc z7~R>YGjEh4oV{)Q*8orU{@&WoeSflHoWF>oCmgeFDRM)1QzDvo7Hi+H;`zB5+06;0 zKd7sBE;S)1et*2d(C1PUm(g(ky${Xw-v=_)vy(U_Laucd{-i-I6GXC5$^>iR3g0L9 zP^^Im>M&e#j5BQ!VohK_pNvHQxtYq!W6KPT)F0{-LZ$?e5oMt7Zk|A4=y6 z-~WLeO_iK(7z5t&V=KIXA(9}H)06vR!QS?L{zQY%7sM+A%}tIN|3en;9B&w3Er;zB z8kZ5-F{KK_uJgjD$r0s29XwS?lOxJo>Er%4fi?+q!vS9DbQWBO=TbV!0v5oc9gJ9j z{*J~(Pv4&NDuQq@TFqqaciV%QJMFc@R1R~3X|Lg#UiDdH99qLCn7zokVtGcV(QiF` zls75}3}Ee8HjL3Q^{XT2X~mmApmuyP-H+hXV$A`jOg!n&F;S5lC2zM);j)85WF6Lt z5&KF)O)27-7W^F!kls=Ps2z*1{MjmUjq?oST#VH=9|&_J5m>*~d!$~yrA`hY*~p#= zLiD-IJD1bv1!0wGru{NwiA#x1k6Wf3!x?v)OP`|?`$F4*-~RmVb1YdSj;sv+>njBw zz<<`4dEV315&^~9ClLu%|Liej}rfn!Ay^+3~l1*M*byW%j@ znzTETA(*(`6JR<(;(%%6t(1-?ntlvXtVdjG`y;$uR6NQ!ON+#Misn8+LKj0hQJ5|` zis7WBb0|q87J9R?52=K#kl=o}os;zFUU8QW6Orj9L4~>b2eIHwh~mC^ZzGj&iJ`ck zZIoS0fN%td*KjCaBG{t?@4U1`FzFn_SSR5R(BZSGy5a-57jPjFS$Ch$(lR+KewQ=l zH!;COh{c=`Z*d=ETCerQ&Y=dvBqy;N#SPP1RPyk*JohX*y#2-fE(;UqZw#~`m?j3_00;xoDr{RhGqA79ji zh`9eVkaA5c>^=wkd#O(kyEABF#m{>DcW%SFmhiZn1r9}I=uw|apX=voJlSZz!WY>I zAg?eG(0LM{8!q>Ao7~LDACo>b&iB_tC2x>*;K>X|U!aKP>lnyym|__BJOP5DsKc;E zPYCiw250G~G2kK=S29nBP3A;Wr6$5fN;HbnRpq`#g@1 zMEwBB9>_r>?k1S5W3QL|*c^rLhiw_k(4_ojkh|Nn$-NAuGYxt9z3jRA3GwT7RN&MG z)JMF#B^a+wzQ{0^i@zjScQnWJX%V`NlsHvjBXW~t3^lC7k7uAti>&Hqc08kiB`Qox z)xOLN*4>CL#70&1HLbn2XZ={*`J1>6eE~|JPq3=yv8C|_BhEtt4dJ;XV|cRmcdN{e zqq>Mi*Q$ znvHa>dmchxnvxMIByW+^#jfl-p9`)FnV>Nzh4#F~f7Py7d)?@^$4K9}gvkRNUEY19 z+6$R$*6Rv2cQm;=(z7b9hhXD zkIHLbZCWplB$cPM8}FQStdhs{1}1tpgtToJojcv9NxsyF$1op7t#X)C`lI_DPV~%M z&I@Sg)*(jZV=`quaSis2YRq|Dr_xzg^dp5f{}o7Dw=x*m6}e=W+L=ufM4QK$ zM%5hv1>2gpmMm|A1lI)fxF(poGYG1`YJgHJG%RDR2}4;zv((hq;n+?y=0oLuVqFy;;XJe3bSd=op{@A>kyY(My-sJB@-BC6Pq4Y z9yZQf5$n|G$e#Ph_(?nN)R>6Mmb>6Iww5h-A(TOA*>dkq`@2F|f-U!BA)G2K!H)a! z5QfX?%+wyqWGETLV6uAi+(|ZuHpJ{K&Y@gg4bd0g>ngjt;3QHmR;n=N79qM$!YQa zW@MIh9vd)m8_}0)hO@t+pdX9-NYk*g%aJi0)jOKj(%xK7AdA&~&4>&-vj?AI8V#sQ zFe5v32$d)d{mtlX%+XN%$KzkUD`%Q#^ucgJVASi9PW$LtEd&`J#G{u%mXmv{=o&M-vzIZwONeZY^)KS)Zb$PNg&)4R~yhXlOOjl80S zNAE87;b)r0xRBRt=hFWmx!#s@eJ@_uz#C&>^p3W7o>URTVcj@vnUTA<(+{~H0p+u7+$maNA z0UyN(6z-=N;C_0Eo2bSk2$P*WBW8CRb-`xAQ@9^Iz{A1MCJe(HW812@k+_HW z=0l)^F?!390KNv)P1J_}{Z|@pSk2wdepklrj&~#s`8tYQ_tAh6&vQIU`>11C6sn+&2}+?!&zU?hG!b70d-01QO#?8mkzF zlz=iBF>ail*n)FqkSk}0v=EG_TsfDv4rAD%%UJ!ujlf=(M9fk zUIm-|fXa#1g9t-geC!8RMpRbJ0z%s7rWuA> z`ytg8)tZJg|J7Pwb*^E3P=>6oQTY7zKJ79{vintXXg~Hdkew(gv+xB_#7SJ$UO?dqOkPS70kKp z8~9lX(bye80*xJnJEgIw2qGG*6&55=*sE}-6!u<00)<^7NT9GE2;wX3Msa%z>l)cq zV@hMIKmv_TTWA?!jScWXVN-ZYVVBa@kzYz-13aa$DMFyIOI<%mN@D|-kj6Tqu_ffD z7jdJt@ts5XW{O)28+9KjZst;|ej>CP(4mp#XO1fG ztYYmKf+%C|NBKD{T(;mGIns5w0EP<9u&>5fg3EX__oFWS?==rdx_R8FioNFH6H?8i z4sQ_Gj7j@A)5A>NKCH(qZLXz#=;o0NVUy+&5Q65BIStk7440U5`({;@S%vZi1ncZr zJWG^M2s)#37S-rl0*^bBlqE#hU-!iLf#fnI?pofB3ke`1l*~RLkNR22=7x=I*&*OK#;D#WY5SUnlLCJ)J8CGkpw+Z z{#TS+PC%C&!kGhcsB3QbBd%lQWTY+WY3g@ggLD^M$B>3~!85gm*az9BNS#3-pVGn@lMgpOBDl3U5%7nL2D zc(tjISC!lzDR54~BOr8Mo{{KGOoGE_bjYWjBC#RpWuyU0hbW>HA1xJ1G-sdPSipXp zC8bLf3rR8?|46bdpGo{5%^Xc$giL=jt^OTZSQ7UKh?d(>s8nd!+p9eWb0H>nnfQip z=FfwWK9;?O{2)z|d=~rL=ONU7Ok59M&c+{25uEza_eRtK?HC-4TcC+%`iC^*ickzk zm$DxCwDydTMkRj29~JOoX!|snw6dV)|2Qa>p1)kTnrzu$erOp}ap;zvce7_0@*mCV zgGQSlS+34={zCde2yH*I40w(FMQwB5M5txpodkcfpz0P9>qU<8A1kQ(6~BGOeQi#+ zyLM)*E$%@DIiC>6351cMU;e>WIl@0Yg_q{6rDq-qE(Rq3;KH1hdrLc zmrGeR|cfGi;pqmRZoFD0@5Zgp7{#y`2>>I(}p`)nL`GI2%MJAJYmNWfeB&O z;UPj!aMzpQRqn&(w0KGJ@q#Lczu$`6FIJ4!5ftm)R57Y@4ufY+3NOw1j$*A1N}-E| zkqdB2)sIqDNL-Z4A+G~)`=xRb9#~MUN-A}eVx z!;pIQwnU$(Z`l%MIdmVqBP}OCUO|U5mor=V)gpwFc}(fk-Y{Q%isGLBn2)^3uzl52 zKC<*!%CQJUzev`yN_rO|UV4zjGAv$_Oj~T4dK1%lHEprH3l_}vT3G=`L!FN>UL=x= z`gAkWUX0z3yBNkbw8Dzzae{NW49gbj#DD6OSuA71+g=_xnwiJAMi3qqRPP_cZmb|2 z98%vLN*zDxu@O|S4_l-!+?`kwrgQY(oRgPRQctKvH-ADUdM6#F-s4z(2hU)Uwdm)j zHS%CiRf_uuR%EU{3EM#=(bHj-SJJ$v&z`=>dp0Y^ndG7|Y^goM*m;_19e*zOlxX;F z>>Ja1>p<4e#Df;=ooo7YZ|s6lWVg`>J&U!Zn-@ohym$335y~4`8N89@?^z5wj%Ddb zA@L>^0rgJyPa-v)`yVghT^~$X=8fcdVP6neFv+said37)466y9DbMP?coUm!XhJ5p zbp6@r(>C!0#_Huj5f z_DtSgVi%Qp(VVoJ!;*W_hD34B#R5bkxZ2;5{HVn4u#Lxa%SyBao)05}41iIlJR%ZP`ll~fLghe1tPrgN< zA}@O#2-ForDA}7upwp9?rFI3s#=T9c-PS$(4P=H8)j)K8F2XWdOpb`d*36V8=*YD1 zY||MI?d%FT&o^_TgF&tWu|~yXyW_r+6pHw3Wf$mI2L+e9j~r}nrwKPgkUE1<5Z^@} z`n#!xrHhgH70-!I%{0K{yAUG4iK7cwilE$Efp2j394B|g^8a-5owAwz>)@7eBeLhqo=-o?mZ%tR|TlAFzx_D0I7 zG(CBFnccyE2&s%ft{+J9_-!Y$(W2?HkE;gUX&4t!wn(WNk-zF03Q{Yrq0Cg5UBF2l zarZOTr~y2&E$%9F6P_*cyMGhFP#c=)xFpFb<|fGtP0ibx^JS9E*}OJ*hhfYU_f@89 zcPrydanClxJcfFhzO93Jd}v1GuUdZsy-^RLd~B+rL$NmE{?ZhWfNogdV}okMBa;)) zLm3qoO0~&ej2&BN88uX0(2xqSsv=;stLb3t*|D{Z9{4*Yap!(&wmmp88Ij?=qjNRR z>uN$!C)iwZpaP68ut?CzDRHMi7D;d&q`Y0UcL=xSwI%0kEb2fwFe*l*V^Q?O5N^w; z%c&#GA#jijBhsNbIxvJ2huj!(4#Dpnc<5b?$e0Xg3_MGNFo$%Go*cq;x`soiXS@eX z4+(N+hI0Wd8^Co&dUcGtA>7OAtx$dmBHgBQ^lFV$e#x01YX^Fa1cw84EaUQ`1tHuk z4o@f>qlksTMr1@@^gk3hz&(x;_~a5tPvMwoJ3J$A^a|ocMEs0Y3b(IvMMh5%+xD;o zGI}6{dpW~s?hV7O)NN4L?XE#B=mDtf*pt+y_~(+Q)4p^3HvWE4fxAnFa|G!f8>GLu zD9QuWDcnmx{v7N^d$RjVJT4Cwv=R5T^606!&-v81kOx^si99lP5d={P>mX~Js1qVY z4?>3wr-?v!!lMf_y*N5OgcC;Udl|uhfQ9;IH1>9eb0<9I>-{hfbdFvh!u>E<6JsDO z+wwQ^R)+H&EXM^wnmR`pgm6E|6O{CQk|B@GkMg4Tg>d@|1Rq~d`i9K%BJbPIYGRlZ z#7M?vi$B2q80F#XlaM9NpOXv4(N{vaS5bO_WM5)*I%hcVP%Rh29yGa^L%7%C#*@Br z87x7Q`+*n*51QPkA>7mBGbzOaID#g3VhHy%Fq4cw0f(*unw%NJeMN61*>7PvSkjj! zR|U`ZL9Nl`+J5GhUWpb+jy>fS>3$HRk7 zGa@v(WC-_)BU?M~kXIz3o7~h8?s3o(j78L3cj2JPt%PGGcp##sA>0eGk({iNy4K}K zMqdO3qVTdtllvNuhadz^Zc!6!R1Ag0y#5IN7yRe)*V!hX_@26re&$yk9MMlg1YOyj z#W#!$Sh^5|8zpfkHw*m}imvUo1yLJo65yT)dqC+1hpx*{^P=S;+{i6{H@-N_8j3yYSx?f2UvENMo7M{S(2bxMx$7ojh(E&p-Qz z{KlU~Xg{VMh)Mi+l$dspbMBgMaolo{eN7$k;ZVTUhjR=P^I=|R@)OBkK&e${X56{l zr4SMm5gX0{U8CoPa9ybQ29#$=d+{BZz7F?H+**m~H5ctet9i2}Sus*U$xmj|{euj9 zNp^vsEU4jJ5Ra#m-FtPM?!fdvMLR>0&Yr^!lee}U=>tcw(&k5+Mw5}O>qwj8@k%0< z^=ZjyG43kdK}PKwTF90%O8w9I>^zv6YDi9x4@Y`=JU)Pk|60U_Mr6PxZ9wgK`HxC)6=Aseuf?jW$2DJbdi3B_MqF84BaiO0nUvqN)pik zB9i2$;XWmZG=4i+llYL_wYcvMe5m~&us4rMMQtIu?+#$y%de>WT9PxIx$*cj#Iwv# z&3y=DV-RV46<7shUrFvY+yih2r5n!h%xNXLb13;FzY5D~_kQUN=Z<*%C*m0*aZEbyXqi$^o|mD(NY)vm1k2fA%vO7-}{ywFeXe$nmw535fUNzxmptn zxS))+3Qy*-4p?6i!fFY)kbr|O=Mbb$(o1o@7ZClY1q>X>;ZaX~v7`NvpGwFlP+foB zH+3G;3Jy9d4mw(gp2SP4aH*lTxv9@qv31-u2Jgt0)vlhkF8aIZ98!2b`DAyyo%`i< z?^ce*tsEFp-i<09=3o18h4OC_YCQ}8jn9@c#}!H` z>z2I!$!C)+45QDGTTfOkqHW!0lXT3x8K}Ou$Pe@vuar;g(QV?hm6f+?825jz@lB)K zy4XTtxWc=2`KG<3)|Ra?7!kROW^)_P+OyJATAN#H|Juj>Zvy=vhQUz$HQ(xZPnm44 z(EaNYN#=eyl`b2rq~&w-4Te!Ii1_ro1nZBX(>^DcVW{QmpZ3bk;+k6!=#Pm=I0*FL zh`aSHY~nNOZ*$j@xy|$4;?sJz|LT)`s+Zl>U5yEpPlkvQL$KAmYJyK$bO4uwa>A7U zR7j&o@OhqsGGG&mF$8133FY9wP;L^6y9v|xkWPgMBV<(9ufUVKx$B=FT->PqDnbbd7J-w1@xV0Td>}~QSV{l(6_Cw9rUVE+aaRHSqO7q? zh&~ke2;el}^sS)Z3eP>jy}*JNe%ENl!&m~->%em0ot6Nt(uXjNm;}hW-CQ8}O6lu+ z0~3K4f#6f9T3H6=mri&OAox6wEz`5%+noOzuGZZLJOjK5tN}g)g0Ckx=k^2+2ZjS< zfGL3fME)+#`+VS1;0hr4TBBE;#hN_O3)l$=zQb`J0UQgQ7@|LeTb^)!1$Yfu0ek?+ zr|Vzda!#Mbo+3~I1mCaFO`l$}74%8)^qh*WG@$7~@X1rk>wu!kOmu<%fINZB=joq# zl=&Wec^=yL-_pM$k?(>30KWq^aYcbFK;r5LNaDfw-6YcA;0O5458%Kc0kQ!Jusslb zlED8dzq?ri61kK>G9x9B%t#3&Gg1P{Ot=Ih#=*d7pdOe3%mRXM1a9$b0L1SyAPEGY z8)lHq2*c$ehX2)H;*^9X&Tztyf%CvLKjDkxO(6K>)#-rtPKa(#VS62D5A+3g0S*9; z0EPji=RKOMzE`7>qeUXP^%dd_tG! zP=wy&f1nQ`jiJD)z-hqPsmOmEj;R2-F>VIt0(S%V01JRefu{k<o)_f2Ob8V1AT#inTBAQj zDc=Ux1HS_Haa_6rf^P!uZ-7z9o5my{_!?7m_pcuEruaj^BS7#ygL^3;Z-lP{HjnVX z_NV&w_brhQCx>SP7lv~BpTD8Y8{|EKULpRSaPI-gi{Zxto5#1gzxz)NoBPW{Qrn$i z8Ycjk0Kr$h2Ln=IH{ej7*8Zq4x!90D0;*_*$cPCTx$BT&|Pi2uI|3{FQzykC5I4EC%Gk(%?ISn~ui< zrvmcQXz;a0@4Gv1(E;+f=OlNJmH@*cj0741dCW8T-p0Ke_#CJW@wZ0b`E0|8PowEg z=X4Dad_w;daPSNK-G5@(+rX+iYOCzflsg8 z3i{dbJOq@J$-_b!ZH<1H+e&~qflGjTU}7ku*68wz3P5%1; z2)@U0KL-f?ovom!ol2(z6aqy+@U=!C2+x6lTv~ndRJ}Lr1=-9ah(})+oyAqp7+Xs@ zvc2Sgi=e#$1RTl0LbOca{;-y zc`+bi<$h-H1$?df_dks%>|Opl2p9wm0fqv>ry0Oo^Ora4>VZdqr-9&Wjs7z{nLJgO z2b2NwdHN3$^*!479@@7RdT;2lQM^ot7^_pFq)kJYx9|o5@;u&F_;Z;%6hUhNC9-;8 z7LWwy0SkfGfcJq7z%M}XjlwPbR|3NSC?Nc+0O1e5Q6sVcTgSL{d{c;gDliAQ0eA*@ z7FY*-0t8=*&xQDRjPjmfZ(uj1bZAIYe@8Eazay{>5PaFVi+p-ji0-!LAx{?W2<#3F z17-o&0Y{zAt$ZN(ww6!A&jv05t_J+i)e#OR!lA(MP{fmAItP%%$|CTO4O)_Ny56S@# z0P^YfKN}Cr_n6~*i02i5Lzf>bc?OUlB?-Q_aen~(4Ezd6LgDzf;P3tu!zTVV5lRW> z0znBR@$A2$SK(I!$d8x=-@&*C1EVJ#NFCwWJi-=+f9IdfJlvkSAhXuK!F1)q@r6KJ zxfTh02FMl360&>CkCm{IbzHJtt8$qfcsJ?f$_K}3K0m?<&Ni>Koc+r2);eIXY?4bBecCk^aKBfE?2as0p|dG zUj1JLk_6;t)qTL`5&p0Ki-@xi8QdQ@DwNU1A93n-%N~{?x2}ExeglHfA#fHT7oWNU zn@9Ms{i8%8IZDp2wd-8DQMn%Y0+9QS!PgpnWt8b`jFkxXV@?6&7p12Hza!StvsoHB zhee}vIep!c!G32Kz~Z9iHaz2Y_5edJ2$6d;=htGEe>3N?y1h zH&ErWvIEGa3?PTS7jmfeQ{Xco_=J8TAZNdy2ZAq5zbr&=AncanaY@7dlzYx{T2~TT zP<^Of6ghNiUe~G6YzrC6BqH?D6>(8tOj~`(l;S^nemzn18tB*YO z^pnr0Fjw+-9oDqbnvuwgNPxZpYW7Rqg`4Eet=JDp2W0xeelu(B?&>OYgPo(+H`Kb0I;Ww|&T!Os zW}TxhZm6;I9Cf*>u;O->nx7uaCH6eEd~Cf${pFNuJMO3-BlTk)b-~mo+ji8~3Z8_z zZ%U)1hE~Jf!BO9+3P)WsrQUWNbx)*%pRuO6nPgtfocchEx>G`Z(GYXzSy^@)wPE0|SZih51&+EiH&$WgP{Qe>BDR+^pZsP_$FE>f!v1p9nLz1`MP_nC0K)=+OHL@MPVNP{|b)c0zIm8rfX z(^f=%I3=<@$D`D1PORQ8>W}LpXOZ5PQIKY3b@K9#8T zRvmSpp`MA|(n;Z*ZN!cQD>=F6{TE12Cr)}P`yva)YvG+a~Z>k zs+LN=9u$$Z;#5zLX%>F>i3~|wxUTd6&hZ1PXFZljQykX|hgvd5R02)8B_fSgDy06u zt`Ij>BP$&B*_q9h5k+`8?kj=_RC;`MTb60Hv9lBErO~3t7r6`V0=2=A!rrZ|%cJR$ zZq)aiVtHU2A4acWQmg4FUbDmFV zj#NmZF(Q%yj=C~p+MN^X%7zNe+Xl1V&g5myfJ25pT6c>QDlbxrw61BW!Oq1USG|%y zj|N|$t{oMtwaezyh;!AaCON=c{gz$fh)peXRP(46+V2yyIq=fq=8S5_9!zSMIOo~z z9QBh~ZRg*JxyV(Yp!yQ`^$krL|ClyOWa?UsZNZCn*;|$?$-RvU^HQsK)B~ptgD2ln z(;{A=)qW(m`H{TiM{=vSIJxR&@KESRNr~oq3zckXqhCk9|y>YK!>eUOPMRdc6M)!!I!AY^dI_fPn5sjGy(69T)2iu%>g(++M_rp%L1voNy83GA-R7j##@@yv zwTqGHv-K4sgIm(p^3(7Yc1ev|MIf^NKvpfy_UFkJc5jtYZMRkKDsE&JINZuqUyVg| z95pv>g^s8wh^RYhrEjozaO%~%vBM;m=5(6XM`L5nbUfQR>eoag9Z$OY{wz__40V6B zj*K+B()h@Ul`GkOCTk&{oz#z{owH4>y`vV_$7(FskAY5b#<(RIzd}r#l8!w?z2YFx zrQ=$Xp=2}0HPJ{B#Vv7)uU;_c!MG505;u?SqWsTt4>T^F4tC|Ev472@qb{55%X3b; zTkB=j7aHZiC#^2F>sYAiO*;GP@wAGFq9vgYGG$PgrkQqr;(Nvf^)(`}E7HjP7xl3U zQQBl0F@08FYbP9aRT=_V4^t0Kw-d4UUXv^)Dw%btO4Ft3cl5dtp~@UYZRcBrFSJD{ zMmesW>RW`*BUl8V;#q{xdCSe=^{S6(vD`Dpc(Jv38 zhvG%Q+>d_#R4;lWm-&!-FU_<{_`N{&+eGQz($$P;6F=z^SHF&zt_(b0W4GB&Ta2$K z2&tXAlmS}?EI*1}y?yFD(H=$tza|!HRljKbFj_(eic@dLUUbw^@=J)SH*(EUL+i=r zB3^Z~XMwF;Z@g9sfdQQ*O74N-L-esy|3 zsZc*ORNIwU1GACptdnA)oN6I?%~sPIsL$J`)&_03x+RNuOBNl~huSAYq`fn3YsVlr zs79l0*NEk;rh$g@&=kspOGg&>@?e!pBrCB~#h2rb)81|&XBdf3u#fE!Trc$LbMjIw zjH}E#xbjqbomGb4rR2Pwx^5EL{d{V*Rl80bAFvh$r+QLz)Xy|^3b`?@ z&XvK6x*6?t)X5Bxuor3tBZ=~XRynnJLncYiI!VSIX!^4TWqsVO!O1)boxtFdv3w%Xn`P{l6D|r!rpWmVQ)qY-AL~c&^U2brl^uZ>x#*!r2rG zPK^!mdXeoGN{VXVMw!ao>sE`^{==YU^>LkHcH2hmE++L;j7%Zz?3xK;K#!(99j7Hz zg&u8e5I?f{v9XqPazg2NT9Cg){MFGloB4{~oayDFQ`28rTwPGjPV6} zWKy&usIowt8g)%wotILhpr-zv7E!M*6^qHBUk=h}-n{nzU7W3Odn%+;stKp$O3$BC zv{nNDJF?$49ChQAR12-p0=qM}Zu1u6Zq|}8j)kHfROoVqQlMur+r?OfARS9&Nz z^9yPxHIUhge7n;8{Bch!?3?G1%GwZ&@oIIs-pFe5%QY;BD<>VPT>28{nM zHt9no8h_}cM<$A)kMODIF%g<5$mN=Pg&~Z#_i1am?<+Jb; zsj<`Uqob{-P4|_+>LQ-#kU0x8j)n-oZsE~niXs%o$6rrnB}vu|E?~wezL%R3epk_E z#_(lBY=b4^AEEU~(E>J!M3|Z*J9uL+S#4F{<(l?Bi3+>Fv(P@wo1BwdS%6i~5`R{r zJ^f}gQt&1}_{pNIdOJ?q33bCnh74(HZ8WkC^E+pWx@A1$Kc*~e;<|%pDTxj)v>4M& zoCy5mc;h8@PnttPow{y(tlDPu`U&GtMhohi@v*v~ACzIMt=^2SU|yK1hyAK~0$Sq5 zs5{3cUX0(x8_~&HyTEmh3Sz!UV#X5ANGv3CwKy-)e+!(6b{}=xFuJ&c81wxf$2Ci* zLXV+DSqjxMX9HdJn-iOH&x_We;%`qR)tOV7lrU#V46}=6y#2$tSkvYK7rK8F@&ZEk zd|!g7C(ddjsUr2fQ%#=gB%4EIC2IEg)a*t}PDbDiJ${cj%OFLqnINl0adlIy#x6Nh z$MmL-slB?Jn5ZgOHIAn}MjX|cSkf{MmL+ucE(6%iM28ltEU2rG0%d+YH9USU7{4wG z#;;I3MOx&KU!U{GuX@5P3-am_J@Ix?i?cIhwKC;Y)5gdO!wal+k!eOcSwe2B{v2Il zcUIpq7Sl6pM}0VTp-qFkmZ4e)yQg}IG-7r~_52jZKA#zNbh6b}M~PuYMCQNw>hme} zx;eiZuh$`-JF8yPzn;P%N(6PiqOmkhX@W|yuUTXhsec@aRSQL3Kb3r4>NdBMYPI@2 zoa$Tum}*O+?pCBq4jCPMrx*rYJY|VE`Yse4Gy(}`pLA@5~??O zX1FB{=vtFi5<5N8IgcUrjx~1CO4htsm9<%axF{0az^MNwm*|(lj%rrTXcFqKvKm~)%7aL?!Abj(}d`VV43RI7n3{r`_7i(fBHg^$|`U;#2aV@kD#Wf69 zoyhVL)1{#-ftl16n&jXGJW3t)s03Ur7VI&zQ5HIf*nd`rAc)Nd|~HmcVWavfwcCB-(X51D!xdIsaqWhNrM zmt1w0s#O(!hRS%?BAfH#p#@HDUMU)jW*->kKMXUr4*=tjuX3_s-C1SG599Ij* zVl!;kSAPmRM>U(4?NOT1)n-rAD+w-JbgGP}3t1RauUZjGQB1fRs|&;Iott!<-mBWG zVs7=~)EM$TEH$^P)zm-7)H2yBS8ij5mKuv5WIsaY|aD#CW$ zXKr9lJGtJfbX0p{Ieww2eg`CW+zMt`WOQ~eYTnWDd%DG=>vg2FWfNnr+bH2WS1@xQ z9IIvNKn-U8;W(YKFC{wfOD|DxFL3*>5tL~1V6HlC3&CfoufRsT! ze=#Q3Brd{IqK#u?i0*p{%kb_GnW8jqnm~d29F-@|e6=`EMJ!~Opi%}Vjiz+fl56bj zd{#5!swpBF&PPF)*loty`D37+#Tw@BGX9%Xuin%>DG94@#!3$!SC^z$OGeapW9b@& zaB;e<5Rl0wBEn0|I(1qNgV3US-6jy5Y*MS+SmW-Vh>f$lp{rk|p^TriIl)@XRT(J7 zmbNThx|UWpDndIM!Jfr`vt>cuJd{D+myQu>p&@r*#GF{3x5Vq(5!qE&&w3j>b8IKF zukXeFgZOwGQSEJKowhF&Rkq#z-J;koY$+Z!Z|lpud2!t>ZrA+ZmseHAa=jAU5jidp z>}0ur-O7?iASVgb18gbK2!`uMFoVHkr8<8i-N8cCh-UCG69-X^kJCkIv(@!u5%o)~ zJ!vTi&ET$aGDwZ9w-St#wc=~VI(sZS`^40ks}+2KKRZ~R7=~|wx_O+a{}Sw}p1Qq| zz|N%<{4w?gB*qyGD*su*(QlpLZxj3(k6M`ssj{mcid3kaCAPDFpviK2LS2_f5()LB zyM%Sr6*9nApN}HTvQWSxrK2jDY{g>isQ&9^N^kD^3Jd(1cDk!pO`&n`@(ojKw zQnra|u>ZeIVbzLQRHQqB*Gy?{g;h9*S>2^MuVS1{5=&T>q?>w~y`)mrtKKS}=&f5y zf0C#cPqjNEo|O$OS;~TC#a|XIZ8u%bKa1A6l0i4)F1`Bs?_wFI(@8~=8d|kuZS)*A ze?(QDVt*z_UFKkrR*uAO(TC(wnXiqka7Au+ppQE!hFX~&Ru2Kt_|Z&c!XdhqUIub*c8+V@+GafQ`G1XR-~bmGk2=H<*M<7`k|~Q&!t8CLS=K;*VXS;0kSjvnG3ucl zBi8B>%1!15Sc}zWLOF1yr11>MUg*TBX`$0{QR3!~tyKMTMR;h z9@?u#itzVLndfD&k&#|IH7~6Oou=3E4ZX9=`HdpWA*QGROBto`jbuN%X>Tp_Cj z=ZdKmYrchktQ4kc(v6+V-io3A!=@gLY+gv&o2)*v#`u!o`Tl8n)5F&$NkQE<%=M5v zT)vTAtBe0J)#XXb+nrh{rWiq?i&B6ar>3TN!+idV|BByz!T!HWK*aSx1S9(j)mvbqgTy*^des%1=Z4{HM+ zg<8H?UdXmGb)2n@;7Y{2e($j9Oz-~k#A+FIJ>=43$z#hV z136l(7I}l|Ic`0xw=v>*W~46tlX>$Pe?C1jvb%{8N@M^_uk&w)uQDcG=#5^b%m4eq zs~kW<=1=A|>(Sl^r?V(Y`db?AX*NCFdzujg0%AZz|2t~QzZ~GP)*|D(Q(1)@S)mr^ z`RfdQkc=F*R`0rc5sMi!n-^+X`U=uQ=zSP`j*aYu>Acyc$*-1u_nTNBbYwx!JHkc` za!gw-&4cT~k)DFHOS6(Ad2;^Z$4u`$#`$N+{0p3uTQQ=9udcr#|_+L!V-7#3Rmif8ljeOoal0_UXb&y*|v1>!g zmm@uW)>2mZCOnn`;_A~sO3sozhxDy#4>Okp!`i!1Q5R{yJNWJOg*i`%J1Y<9Y` zJb(Xq&Rig)U=?1v$?p^u?k#hZk*^KCXuHXZJexe#jlrZ*j>!AFQ!IPN)neAgwq{Gg z#b|L_Pqc88J%#_SG@BNN$;&@(DQvo@5Tv?z3L;O*Fub3zB^mzvRAo=|FwSe|%KGC) zqhxrkMNaGYcNl`T3b}Eh<;rCIbBy0%oN(OW4cR)O267QWO+yXJf>qp0(`CMItLZEu zkO~LEGTHOg%XdGYPN~uzwKjshuVWE|igmw?P|uf7ZIpw|>msbp5o85MIkn)I&t6}I z;p{b2YjEiKBn>IO29A7|oe}aio342jsO96t$X(q+MvL{*StscN8X1nK^w^av6nd$; zlD*5)qwLDXc4>P%XLmc3U$XIRsNAjybW8fN&gu!qoKm)RvIk7eYoYGIPKTxEmP~(S zMP_ScFpv2ceZeL&820~E27bM335-cMl8KY-qmm=ev(l4aA8*H#C!S>2Em(GveVFNv zI^(43F=GwI>*!;~oH0h++^HCI@|k0fA9wnhLr*;IWbJSBG|R}5XPhYh4*o+Y96$c# z06X>c`Z1@TKK9fT$BH+%9mWbi+~@UEi1FiGXH4{BBL<&Z#F^Q#BTqf?WS^Ok+Lc^5 z%4LEL5qBq8u|-?@eZT zXeTw-qKSdjX!i;xr?Lq`3;4;F`E9I1pV{WgR7Xy?ca<2bB?g${>g;qGr*kw$N8e36 zyK)|0_S#v{j?&rxf4yCMbd<#vpYNM|lg)Dzl0XbG?*v3%frLj4aH#cI1IK^_N#WGE zB%2T*By2VikmQ2}R34>()=^OeRJ6)bs$wh%13ivHsiF43Vc75$x6#b(fNsY}&?{3A+TLi_pEC6HL^k_Hq|m#UOZ#Jvo& zLtj#Mhb0L_+UL;Z!BaArze-b*=7={2r&tue--wfH5Q|lKc4rn_B>oJCt@*!z#qB|Y zXCQ*cV%PZy7_kFlLR3EK#B@`P{)YMZLM3OS)Am^8{ZQ+m^SfUFx~C2r_~Hd1AnPjE z#^$Dfmr;x2h<#2}+J*A&0@`IPB1N%?1b^?gb`Wfq@a-XXo(rWgP;OpO+s#Iaoq-h+ zj#|ptw2b@k`@N-# zQ=dd&=Q0ggqVM;%Tb<(3iLwAyc!uhvqBG(lJRQ*)YP=Mk5pPFlV*N21D7hd; zqYKuK7!8G$&QumsIBG8eR#4dG1f>qI@ttBc0^7(w|2A@}(P2WBPKPVSuf)UnX*wUB zS%Mp-e>sw3zAqG-YhUA8$_+b+0}}KyKh;Rddf8Up-bScS(#Nlars+v!(GB1`McL0e{==ahMj{T9kn6tAV^R6A-(H| zMBaZ&E#?2jPto@^V$E=VX0g3zP#vY4^4}v-FPTL4EyVO7uDT6(?u3c9$t#(ddLB7O zNk|!anNx5%oNM7U;uHX&JXLr|an}sbf;HMen2OIbj}iDdsy%?MDjCUbAuz<5b?f0x zYvZrOfSY8DLC^}a+<=?Ex`ZrsQT%zb^SyYRvK_aEknsZsG`sEvUZ^_=F@dIpSg3C; zB+W<+=by*XS@8;fyc&6EDB%zHE(}SB#Gad7go7F&s*56O3`jOKwrOfUGUxE~~YhI0gA(G|2mKSaTQ zDvh)dsj&1Evr0dei)IJJxV2X+mN2- z>rq2`j<0LONaPG7tKC99zS{6nDlEOW$5-Je#dRYgoR4o6JCL%9C3Oxy2Ndzo8&v_n z8=`Ohzn&V<|FE{xxjUNQy_iyCqj0e-MVX@%{sW(Y5biW9{q-tk)*cc#plRBV(NXe~ zD#NLmkP1q^>xN|d?Qc91r^yehj6O1Uw($cD_mm0DAJ>UwYq(RlS!f}^Q$G=iK&$W_$;sqGiQw1Ma1T0~t#+8obB}Vc(W7u>UKPl@X z8|ARs5it_j2+?T-%SIxj17G)1_}3J~F2VyrxmlFu1G@eUqqJ%ZOFkNh@x!c@XyM09 z9joGLsB8cdJPmuFJt|6S{E1Of8%#vF;7{s<{W(39N3FOBzJ>EgLkpoq5KXzDUEz5e zL$(>?Kw<@0+|mrh?aaiL@bYo{LS|oHZd=U8q>wL!gdpAI|Ax&v6w-cFtq3PSNujRi z5wc=U-G{sq?GpI*Cb%-7KAmDd=I;$$Y%HmI3QlNSs&=Dc8qywHmB(ubg5@x!PiPRT zHpHkwsJ0^F%`a6rx8TH!V*|v)!f_>k6F8DR#;^UdmV?#{aCYSbcH6+yLi=y$Y>;7fMgvZb_F3 z+CuJvY@h`{qghGX!3}hZEp4E{g_BJ?5WP;<5`^JIOrwGT-~gKy;7!o$>I%4%0%@Ov z9r`s^gwM0|N$h}$2xScRm(!u;WLKniHvgzDppKk;ufp~0+(^Vae4x^2pfuaPg_ zLI3qI{?|j7E`VV>E|u<9XMeT4)aL&l$Ug&yifO}?{A5mV;t?J z<;nCrjSRVSo6*ZTbY$-65yM==M&{BP(kJJR5G$0(V(ut*5N6p?+5G$XTQF^K)J06+=gsS5{P3xN>F0I^(JqEnEyt ziVSWp2W1IY%f2kpn4NNNgXXkZ$~h>b-ocV_uMEFBfbF;;v{=X$l~QRU#hd9KfQpL~8u=%Bj|Q!e#7K zF;+V&CruT}np@W3gP#WE6B**_@J7r{o!7$#3VC3v=-=lYej~+VP;L|Z0F~vlTpl*+ z`I|+q7MXzgg&5ViyzE0cW||lh^)EEPes1kd*IYJP$VJn{0PR!x$TTr3_e<0$S6&%S z4Lb?mSa65op$Yt*=tsiif8gxl!|@*VveA-&irqk&5xB|nqpp31MDUW zB#GBCJRxg|mp7WpnjDcMH!l?f^=qQ#YfD9v{@Ymj=~A&+KNuq`mWlLhU&jMxmgA1) z0Zxs(hPC0-qG@;&n-6&2+Opb(^V}7M4Wq`gTdV?1zxr2;u>{iG4L~#J!edzmp(*Tt z)mYY!l1jI?d{&vOqJqtZQ_zMA8OuQ3cu!SBje8zMwLf6aLRWS#zF6K%b_P_CXkHDb z)Gw-MD^X?jNB1M(B1EdN-dj;nP+eP4;Fe_>B06OgI@!)q_93BAF3G9&)r;M1nN$AJ zC$7>kP#w1#h$Js22bKBS=(^A|NnBrTOc5Es83HudkzbmYmJdxZx@*(M}US7 zUpLDGk~!7$D%ciG&rPm{BrJDgz~!|bH+#fCRcx93@pf@@?{#QY;a1Cp-2gzexOc_K zsyjrg{-{$ea_67`N#IttQ~vc1F-(6qLVk6JXimKe0Icp2_y!L>WIe#iTby$Jonld1 zf6Syc@KHmXSRxwMcg+4V$kQbJR8iVc5Vz1(U&9{4m+D$3ENOu>d&aWKSWus3ifp|c zFjt8_+F1GcDzRAGFEdw*U+L^tnZ8zJ%GIk;HCb+3EeiB)cA2(D^wz#=Nn9gBHO(c{ Q)`|k{nU)!A#f;GZ1MgM(TmS$7 diff --git a/wasm_for_tests/tx_write_storage_key.wasm b/wasm_for_tests/tx_write_storage_key.wasm index 902d297af7161db3146da0ea1cf3c95588a681ee..2f6e3946b4e85269bfeb88312d54a0803d537cdb 100755 GIT binary patch delta 59 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 delta 72531 zcmb@v2Y?jC@&`QKGaE1Mg}og1j^hGHIF1|y79{5&QIMQ7s37Pb`9P491sVm(DiRM5 zSwz4?P?2~j3Mf%QQ9)4=QBb~L&Ccu%itqp4_kFxKH(k}$)zwwi)p6E?cVeziiz}+Z z828p>-MtH0Ws_`EVioUxR@HuM$$lxwBf0aJdhf9$cG4TqE3oa}raZ4{DYKeBVf}{H zsaL;7t>&j$_2caE{=-L%95s5(8TK*zf<3*OtzoaSIK&oD=(Rw3 zoL=868T5)YW%3>Ki|d=-;+8$zQSfUfdYgHb;!Nvm#o~Lq=99x?dtyk)(Q(Y`7(~cxw@|$<9qZ&Kv{mhX}z->oAPM2|)4WOSx?RdiJ~)m{Bt-rGK=t3OqIB*sdGHpM4+ ze~cZ4RPVSEe9s;4;kZd)+$4U8nt9rf%JgnZ=m7M+gk6N#nK%(ZPSPZe!MjOm5aY|F zT+&Kp${&o~EDlY*!6UESE0Nr_T(bL&G~9jWHvo6Mq3IKi+TwrH7I#0WE$)W4wx>VB zO1(d(e-K*=C(7bdO&-h}xfBTkmy~=E3d;cr% zSd&ZMaWQulYV}n8lf2`(y!K#vJg*s9?RZ{>w_f#LB884aU{h~ufdf7T|^9PJYovO3G=2=sFre`#$mB8Qlg_p>Mn8vl8#{?uYTWMvoIHVCp%Y!&G8Z6Mnaf>dcXKlt%O!_MK|$_aGtmcf+&8_&y_c)}i`cS7Pn?3`KYgMrXJ?8l_D?bM zgFkxP4xQw8@)+-hp^4;5_l7>LVT$JulUcc6r-PN+bL_+2`7;0%;*X;W#nZ;q^YL$4 z@tearXP1iK8o5!9+;td1bBZh8mFAe78s$oJ?>byOe(d9%7v3u_9ly*J6<}D%hr17* zLT4$QQ9N~08_rkE^d5eu1uvTEjha#`qVP>M`UW{9G?QHEoVWLs9170!rX(_3{;w!m z*%6r}8p~9o`XOic8f0=PNTGeK# zUz>;sCM_Z;v#P|YS+<9$w7AWzMKa&B*?Xzr6kq*j@y@wBI7RI3^HaSG=BJ_S70oYT zM~mw$=qy9u3ko-@0ifQZQU7xQIK7AhfYVFCXNUJ^3IH1x|3a0$vLuxsz2_}iQWN#9 zSdvCS!qP$PO7XO%MJ9I3o3~;r+vVN1;#ao8`|2xgVewyHLC`qlt-ESAsP?bIV0Oma zf6e{JcRdd^w}dqn^i>R79M7RLoJ=@|XF~vo{tL%<-!UR&Ag<{Mi$<}bc<)*+v(LOG zue$K}@~ciX=eJkeu@8!yy|&yGyJkI1Sl+$kRY=eSF-No6X7BHt#;{Y~VVfJ*JtdHr z1L;ieLfJiYt{-w2%vVbm;iZ-g#NSH)$h_mdy153~J8{b?JKs^{{n^)#9rSkD zb%L$+7TTK^k9ZsXaBXpica+4){8`|WhFY>QL!bud&ng~rI+`UOovme<+~BD~<;d~T zz;oW0&U6h65GX1^@n2`oMTPItOJ%tmjR3bj#oyn!9>w$L_|9@R>Jgg_9!)`05-l6C zQEZp+HDW)-Ek@(qiSA|dP-QwQfy=v0aOe$Uzni@gU-(vulxjh@2NH2P3NNs5z~6l{ z8-teLdP|6=EK?kNlpSJ+#L}kh1-?tewQa_dg68}Dje(xUlg(Hw_JJsAh6&VXqE&O& z7q3mtVQ9@x;>+f&a*ndsn8$q+L#z4+LvtFOW;j}i z@tL`$79o=RI_1(IcVQ_J`pCuIsv^0&M7+?2Rr@D?HR0pL^)4(v@*jn6z91HMVX>m>V-L&S zqvf_<`mo$WEw}KYxi=T6oR@ZeSkW_TW{ijvEW{N_o|H{Pk>ozKkV2po6agF*8|=2b ze-h)mvc!=23-(LHp>_~mpD$kS$_82f+yaHn*(%K4SXDl2tEkhBRb=PH;BIU@yDQFi zW1qkuwsdF1@rvzXaEtamSU0i}UdaJpU`Ag+-D+3$CH7>|%&K+jJ)&+eRzITTbrRAF zNmBe$?-2#P*lk{L#Fzg#GchE@oZhUVW{Vc^f7s|zysr7q^hVW*S2n_nDI#!prn~43 z0MsKD6%ehTV56#?3Q%lm?3x`^OSZai0p$*HnQ4wPa}&~w@y9=g`3rvk1Z&MNY!cgM zvlxM4+{v$P5`+7)W_-q0v9&LY=hL@}!+0luO2ut1mc)BI*_Hq z%EJb-QG`7+kR`&}zYb&{5YN4XfX2JxV3u9RR$DZQL4(;6c2wLQ%o_5|TSWaKY$h*I z-$~-)5SGhs3dd0PnI>F}xIdKj)PR(nz!FRo63V9qnL^<<9ex=U2bU!cel^qg>M*v2 zLDom(n(b1uHZQJ#BIy5*@}Mc8|sWh%Nq zr`JK|Uiq$w8_RMWR}eW7K6dQFYZZ5YBD#!arJ)D4cZa*@Wa*kD;9PL6?lxTyoVh(QXEO(R)k`p8*H@MJ$}bDnW%TaoAc7?~I#J$CxZ+Qu_e}OI33qNLOJJA9 zotZ3K7yjZbxWX$(M8{dI@k6;qmT}t-T6RKwK8sb-ie!i?vsohbxwf;>*QS#+>_KV5 zwT2xKGiS4GzVj$``--eYoSW_Mt*LYTz4Z~i>umJ5^MT$Ps;h?b)O1-e2+{I{s5*m1 z+JiN4!BMdV?2`7*#W?7AP}6peW)5}!NSjRqe_vVv<$Nm=3s`w}Tr@6VRinQ+f*L7) zVxkiVt$#(ZS%l1HX<}0WOMIxpEM*G2S^$NWh^@0(C3aZUpX+b%w7LEUzcQDl^Yur> zfw`<=L=myJpeoJ4z9WLo^G8HIoDG`CGWhBvg-Fd7XnKbNq*m4;aHVK0*GsFwe z`wg@Cd8qYahQZ`Ub(8(%jej#5){Xu=asPRi7gG3q*_bxh*I+)o#`yYDk@W)0XQ#v) zFF+LZncrVvsal`O6YUnVwh!wM75PgC#NCCgV%S=Q5tvhQCquJa4v3nCe)U}VN{*!g z06i#CY%gTxi1%lO(3QVG=84KLK7{v{7um$bC8gkLG1xm8ok5LtFO-T$7O~ibnM7eX zQbcJKcf{C5EUw0_6ChBG1Q8m+SCkWO%+Y=OqS!}8KP7?(cw>#P)_&w4Il5CH5W!v+ zmsmmsvXQs$%Ec#y+sk5Wt|y8xBZcnBf^tHPIl52JJs}pNY>j-PFb<=^a8gyU-;X2b z0fp(q>v!TD1WPzi1P?GrG*^qB5{|{JCPt!`OIR(w=eWR-l_u6MM)%Qhi&b264P*z! zv?a_PvZriV^HNGe9}?8vLkTpZHE5V7KM!yXL5p_^~B?cv`Bv z$cWknRGNE(5w+TP_d}L%sjfAmmfQ#eAHwdR)&}B*T?-(zCioGwKUnJ9c7iQra$){{ z;XcV42k*iT0f-TUcAfGqJjo&yzU-85-KXs7oWw$X-Dak_j|$ObP{w$?TGV8`7Aq8^ z8P7BO3B@-upRW(mH+@qSUYEsa^V9tAF(<*YD-@Ms27BFC#CR-c*TqLNPn1_O$ro?t zbGW_ma*33xxIIH(v#uA_-k1Yuj?q)@L*-n#q-&0lQ1Rl_H2uIEP+o|-eAG9uqN=PB0iDZfi0iNKh4w^ z5-7^@KQCf z2N`acyWom=u?~OT7LZ=J>+*4|*jHSaD-7>l^>{npPSfAH>;D(G2f6RkYJ=g>Vbi5B z>^pvF4)VU(C)!uJF`t6PwtsKZzniA*O{$$p-Cw7zWoLzFZ zM*MDqag!5_xPMy?<9!+z`yb_T6*z5us55-y2B^Am?NT1t02S}Jc~8-&DMGDvA zi2O~OK|5E(rI&e%IMs~LM^3-y{7YVVTQqIKKLi-k65XX_n%LNqpJ&T_1+Dm#EbKPA zZ?=CUSa$y~Lj zs}}vfEq@Q}x3=R4I6pVTH=!fPj_YA@z6(E#m+vv|W0-Vw<;!hFw_)ly_v+gsvKt?0 z0Q0-?6i?C5)Uj!??BAv6fD{mo@M<)|y$iXH3^gv=+&g{(pstu*HuriRpopmgvbbRkb2&eCL`i%9>4g8sL_X) zM@Q(@hrh>T{}%CevYWmd{rLNgZ4`I=^BZiV@7n>qmt65p>|dqIE=#K73Qsj-r$5NO z{sxQ@?k@TPYBB6vF23>l*dhG?hc@mU#z)aX0<~|r$#yvZz?On2Un93$W&|suLC&;SD#1^(p?||6J(zr+EF8<3>(! z?~jb|{+pu9)4a|9%=yIAyeYbqa}s}=9T5vAp=r~ni4Q07*KkfE#!Tiok@Q`gj3FDn zt=trT5ekr}@^6?(n#nuy{Aps`On%ViWAI?^UMyoYq8&!=UQw1Tz@*}_S*YNOI5vw9 z2cz1v`E+@Eu!Byx;)MA*{$ssW%%x<@LmNw-;6f2@<_JoYn}*N^H{66C&SC4}Xpb)SU#U`myZNTi|s3T zwl}$x+4sak4kumj>tBdI5xS1Kf@$ty$AS{mk0meiF%;0vi@0_?Lh}1}on?O<7BOC4 zg=kuMd1rdR;?-$`G+HZ^I4pS+0bLXle59*v;5dz@SE6Y42A_p8N8jLim|2MX8~GnNpc8jD zf%1x&x|#2(eg^yL7-*U*jojC0f1P2-aT8KaHD;-4bToMh2&^Si(;7=46C<}^W_xLg zZ}t{`+T^b+K};^@mGty`#k>hBHt#@`1rF~lUx<(2;B2Sw?%RAQ^}vDeAVw|oef$nQ z7huc1{1bpl`*<73>KpzpAH~@=-`k%yJKm7JNG%e^=}`?oEB^_-Bjh&!qxy=o z)LBbHT~V4d9ik*qyXd_u6c-dgL7w9N@-)WqT=(KLqTX+Os&PnD)n*vdtZocxpZ&(` z|Icc3-=QJRH|Gx4fKZL^cgz&SXqJ@faK&k7=K|RBBJM8#8BGel$G;(W`Sl)ujIj@W zt^eYS7+WbW+~?1*T}yh%ud-!t-Iq6$S8V3;AY4Kb5sKU$%hVByoXA%C3KaPfvt6yj z>E@}i;>GINvijaGPpeXl0i%lla*~}qWmDMzVkcXyGs4S%7t4cWn%|xcl6$lHqE@h6 zFYm9i=%yB#Z7c$oFBoCxaJTn&EQjUBeDkN`TCkj)y5rM8bfiJYy~ha040j(8nIUpp zsO-rQc>!bZ2{{an{6Gu~lb^-wn=p9|T0YkyKTVk|0+|QJkO*WR6jvkE%sG+%%==Nu zJRk-+<>&Ca;#4zdN6RzSt`i(9_oD7NELPrWG^?r@Ll;t8Y3M?B>O$?}^j{+zZJ{m2{^}<3&x86Ri0B1R8)fP&qJm%c>=Aw@}J2(x=wHXXF8p1=6|QG z#SfDGn{eyTryJW^h+SQ4SsQ5HNWJBjuTJL&tQxS%!SlYNF7jFhqhRMA@=Al<^)4~< zqA>N8^U9n^XS(>JuT@XEhM{)`OnC5u@b;0Lm6;}xb4oXjm9Djv%!2T={(lfsJH@}7 z?Lp1_o3~v#U*hZjg#4H(yGXCa&ljqEXlFZkQG7N~-cTlVz@OG%H0t=@d#grPrhnpa z3Rw3QokKG1CkFⅆ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"pE|6EPaO_~PaWY8pQv9)=<)LoxqDf%vGlE@A?c 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 CMHe{$ diff --git a/wasm_for_tests/vp_always_true.wasm b/wasm_for_tests/vp_always_true.wasm index 90ea4c6fc4d86c1a82722295a2d80b396e124b24..573766ea90db5911972e861fa5dccfc4981177ce 100755 GIT binary patch delta 59351 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 delta 77116 zcmd44cVJXS7dL!o?%kSfvMHNhHUUCHuc4O<(mNtWK*61ud$Br|*==8G zon#-d51I4yCy`&Xx4F#x2lxuUbDO`PJc(Y1~WJhk*^|5NVz?5KaPJBw* z@Hr?k*>8=Tj8s`%RsXuUx>~Bg_F2W>J-)A=Dmff)r$R3#CHt=?Oh9T-;yAwVrvIJ9 znPA)|X|$GkN=H@oznI(;=--m}5Mo!#bO6;-X9gL(mYNAME~M50$CBvuUm3er;>!4z z$6WlqR8kwEO{b+i_4LmGZu(u7r<=9N|E5K*R@5R_p~d3LEm)cVYUQ^Q%3z_{97+r4 zt-Xqu!34tdRP^uBD${E3T)JOUt?uj$DNH3oFVE)Txm*foWGaNo<#sRkN-CeOmM!y7 z%=#5ASX(vGKd)*ML| zH1KqdsnNkEay2_oJ({nzFstTAtmvg$Uu#Blx%MJ+bN`jmY^Xy;H`Gh$=VjSk$+WjqT6=k$dHMJ&DzrC}`$Gk= zF?^yk+)gjgkvnE8&u23AFE&M0I=D!eW#}iVDU6x7ks8Sz!!2P@v0Y{3GOhlo`bj=Z zQ_03#oB#7#B4mkiS<|qTmuWGVM^R5Fms8{68JEkc!(`P1Lzlc3q+;`GN_ur(IY$ad zjr5i?6t7%cVi{JiTvG}Q4+~SJ3=2u;Lj~4`479L6UAP2a2K~z)f-_C`e%i)8N8F7nDhmq+* zrpa1og3mS0T5poILd{lC`sB%(wl;sU`E8Wmu5e;^UZa88!jLkVX1QwXab7*;h3X5m zrl8*%$&Jw{Mg*?gOxd+&v2>=de9DDR44&2rA?iJ7A#FmxeHpdBrRnxXf7q9 z{W)?1n&PCo|4;O3)AR`@((&@=gL zWOkeyt955+AZc>ta139xmlTglv8FUI10%k+G$6yOI?!H>YqPdNsU}b@jmvc{CzPw& zMm1Gbbwgd(ZgjPl3h7$WHLS}o!`*7Swy6=Q*5-dTw~@~l2LEi=M)dzIJqdz3sokL# zJN15p!WuWC3cX4rDN*aR#^|&e?a5aV^Fd<2*rZ~xKYs3`|K`LaxYaUTjU1(;GY^TsdQZ0F2 zo5<+MV-l?tdq^1hnkIB5kX8yyRy1zIdD*Ix51Tp|$MklgS)E928l*uV_G@G$^NIcI zc)ZxKj$2BaH-Et9J@h^eemD5h+?mT0sCt?tC7Omep74Lr_8Mm1x9+Ipc$=Ee^1`|Q z{2g&I284!a25NJc`Lo+quSgYw7?lYRmI+g1-EWtyZMRs#^p@TEb9{z(8P!sJXNsf} z^3)Y(7?IXuGYsM8nc-jk#a&ur⁢+Syo)~Uf0Gv?dDZeqz3wHfOCvU?UMNTZjJ&X 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,?m~o6BI){>AcT7L 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

        &x}D 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 Rc{%P=)XnV|=D2_B{{KYQ9v1)r diff --git a/wasm_for_tests/vp_memory_limit.wasm b/wasm_for_tests/vp_memory_limit.wasm index 5c91e6113c678741e0ce50aabdeb9c3af532e830..50f47cf81cbf4d7520c6de0f7489d1bf8fe225ff 100755 GIT binary patch delta 64695 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 z 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̶+=?+~R#A?afkojY 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 diff --git a/wasm_for_tests/vp_read_storage_key.wasm b/wasm_for_tests/vp_read_storage_key.wasm index 7665fa7e39d74c8ff4470db4e9852f229146fcdc..8b1ee071b914dbc384406e3aa51c5342491898ae 100755 GIT binary patch delta 75673 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 delta 95883 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

          Hj&ssW92QsqtD` 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 From 1c5725311493b99e81d45a69f9b411205bd67eb6 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Thu, 30 Nov 2023 12:18:40 +0200 Subject: [PATCH 096/175] Updated ledger-namada-rs dependency to fix compiler errors. --- Cargo.lock | 74 +++++++++++++++++++++++++++++++----------------------- Cargo.toml | 2 +- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a760f39701..efe2326651 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1424,17 +1424,32 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "curve25519-dalek" -version = "3.2.0" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", + "cfg-if 1.0.0", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.6", + "fiat-crypto", + "platforms", + "rustc_version 0.4.0", "subtle 2.4.1", "zeroize", ] +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "curve25519-dalek-ng" version = "4.1.1" @@ -1655,19 +1670,10 @@ dependencies = [ "elliptic-curve", "rfc6979", "serdect", - "signature 2.1.0", + "signature", "spki", ] -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - [[package]] name = "ed25519" version = "2.2.2" @@ -1675,7 +1681,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" dependencies = [ "pkcs8", - "signature 2.1.0", + "signature", ] [[package]] @@ -1708,15 +1714,15 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "1.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ "curve25519-dalek", - "ed25519 1.5.3", - "rand 0.7.3", + "ed25519", "serde 1.0.190", - "sha2 0.9.9", + "sha2 0.10.6", + "subtle 2.4.1", "zeroize", ] @@ -2239,6 +2245,12 @@ dependencies = [ "subtle 2.4.1", ] +[[package]] +name = "fiat-crypto" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" + [[package]] name = "filetime" version = "0.2.21" @@ -3209,7 +3221,7 @@ dependencies = [ "once_cell", "serdect", "sha2 0.10.6", - "signature 2.1.0", + "signature", ] [[package]] @@ -3253,7 +3265,7 @@ dependencies = [ [[package]] name = "ledger-namada-rs" version = "0.0.1" -source = "git+https://github.com/heliaxdev/ledger-namada?rev=7e861c440de0fdabaf51e30d97f5c8736be348f3#7e861c440de0fdabaf51e30d97f5c8736be348f3" +source = "git+https://github.com/Zondax/ledger-namada?tag=v0.0.12#3e7c30bec1d1e135b94c80b48b194aa7341519a4" dependencies = [ "bincode", "byteorder", @@ -4864,6 +4876,12 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +[[package]] +name = "platforms" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" + [[package]] name = "plotters" version = "0.3.5" @@ -6130,12 +6148,6 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - [[package]] name = "signature" version = "2.1.0" @@ -6434,7 +6446,7 @@ checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" dependencies = [ "bytes", "digest 0.10.6", - "ed25519 2.2.2", + "ed25519", "ed25519-consensus 2.1.0", "flex-error", "futures", @@ -6449,7 +6461,7 @@ dependencies = [ "serde_json", "serde_repr", "sha2 0.10.6", - "signature 2.1.0", + "signature", "subtle 2.4.1", "subtle-encoding", "tendermint-proto", diff --git a/Cargo.toml b/Cargo.toml index c1fa8f6d03..1afa81963e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,7 +86,7 @@ index-set = {git = "https://github.com/heliaxdev/index-set", tag = "v0.8.0", fea itertools = "0.10.0" k256 = { version = "0.13.0", default-features = false, features = ["ecdsa", "pkcs8", "precomputed-tables", "serde", "std"]} lazy_static = "1.4.0" -ledger-namada-rs = { git = "https://github.com/heliaxdev/ledger-namada", rev = "7e861c440de0fdabaf51e30d97f5c8736be348f3" } +ledger-namada-rs = { git = "https://github.com/Zondax/ledger-namada", tag = "v0.0.12" } ledger-transport-hid = "0.10.0" libc = "0.2.97" libloading = "0.7.2" From 0451fb494e93c1f5dee952c7b428367842bc3c6a Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Thu, 30 Nov 2023 14:40:26 +0200 Subject: [PATCH 097/175] Added changelog entry. --- .changelog/unreleased/SDK/2235-with-async.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/SDK/2235-with-async.md diff --git a/.changelog/unreleased/SDK/2235-with-async.md b/.changelog/unreleased/SDK/2235-with-async.md new file mode 100644 index 0000000000..1ce8c610db --- /dev/null +++ b/.changelog/unreleased/SDK/2235-with-async.md @@ -0,0 +1,2 @@ +- Added Send trait support to the SDK to allow its use in more multithreaded + contexts. ([\#2235](https://github.com/anoma/namada/pull/2235)) \ No newline at end of file From e44c766db3fddeea39b5e0bc9aaed1d64f8dc0fd Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Thu, 30 Nov 2023 15:36:13 +0200 Subject: [PATCH 098/175] Added changelog entry. --- .changelog/unreleased/improvements/2209-cli-public-keys.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/2209-cli-public-keys.md diff --git a/.changelog/unreleased/improvements/2209-cli-public-keys.md b/.changelog/unreleased/improvements/2209-cli-public-keys.md new file mode 100644 index 0000000000..33486a7c1d --- /dev/null +++ b/.changelog/unreleased/improvements/2209-cli-public-keys.md @@ -0,0 +1,2 @@ +- Increase hardware wallet support in the CLI + ([\#2209](https://github.com/anoma/namada/pull/2209)) \ No newline at end of file From 8df15b08624a779e56ac85dad29a8bd2526436eb Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 4 Dec 2023 15:36:16 -0500 Subject: [PATCH 099/175] fix unjail tx from client to consider liveness jailing --- sdk/src/queries/vp/pos.rs | 23 +++++++++++++++++++---- sdk/src/rpc.rs | 13 +++++++++++++ sdk/src/tx.rs | 33 ++++++++++++++------------------- 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/sdk/src/queries/vp/pos.rs b/sdk/src/queries/vp/pos.rs index 8a464179f1..40cf043ba7 100644 --- a/sdk/src/queries/vp/pos.rs +++ b/sdk/src/queries/vp/pos.rs @@ -24,10 +24,10 @@ use namada_proof_of_stake::{ read_consensus_validator_set_addresses_with_stake, read_pos_params, read_total_stake, read_validator_description, read_validator_discord_handle, read_validator_email, - read_validator_max_commission_rate_change, read_validator_stake, - read_validator_website, unbond_handle, validator_commission_rate_handle, - validator_incoming_redelegations_handle, validator_slashes_handle, - validator_state_handle, + read_validator_last_slash_epoch, read_validator_max_commission_rate_change, + read_validator_stake, read_validator_website, unbond_handle, + validator_commission_rate_handle, validator_incoming_redelegations_handle, + validator_slashes_handle, validator_state_handle, }; use crate::queries::types::RequestCtx; @@ -57,6 +57,9 @@ router! {POS, ( "incoming_redelegation" / [src_validator: Address] / [delegator: Address] ) -> Option = validator_incoming_redelegation, + + ( "last_infraction_epoch" / [validator: Address] ) + -> Option = validator_last_infraction_epoch, }, ( "validator_set" ) = { @@ -285,6 +288,18 @@ where Ok(state) } +/// Get the validator state +fn validator_last_infraction_epoch( + ctx: RequestCtx<'_, D, H, V, T>, + validator: Address, +) -> storage_api::Result> +where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, +{ + read_validator_last_slash_epoch(ctx.wl_storage, &validator) +} + /// Get the total stake of a validator at the given epoch or current when /// `None`. The total stake is a sum of validator's self-bonds and delegations /// to their address. diff --git a/sdk/src/rpc.rs b/sdk/src/rpc.rs index 0d0d69a79b..8a942c514e 100644 --- a/sdk/src/rpc.rs +++ b/sdk/src/rpc.rs @@ -807,6 +807,19 @@ pub async fn query_bond( ) } +/// Query a validator's bonds for a given epoch +pub async fn query_last_infraction_epoch( + client: &C, + validator: &Address, +) -> Result, error::Error> { + convert_response::( + RPC.vp() + .pos() + .validator_last_infraction_epoch(client, validator) + .await, + ) +} + /// Query the accunt substorage space of an address pub async fn get_account_info( client: &C, diff --git a/sdk/src/tx.rs b/sdk/src/tx.rs index 9378615890..6af1f66c96 100644 --- a/sdk/src/tx.rs +++ b/sdk/src/tx.rs @@ -900,23 +900,20 @@ pub async fn build_unjail_validator<'a>( } } - let last_slash_epoch_key = - namada_proof_of_stake::storage::validator_last_slash_key(validator); - let last_slash_epoch = rpc::query_storage_value::<_, Epoch>( - context.client(), - &last_slash_epoch_key, - ) - .await; + let last_slash_epoch = + rpc::query_last_infraction_epoch(context.client(), validator).await; match last_slash_epoch { - Ok(last_slash_epoch) => { + Ok(Some(last_slash_epoch)) => { + // Jailed due to slashing let eligible_epoch = last_slash_epoch + params.slash_processing_epoch_offset(); if current_epoch < eligible_epoch { edisplay_line!( context.io(), "The given validator address {} is currently frozen and \ - not yet eligible to be unjailed.", - &validator + will be eligible to be unjailed starting at epoch {}.", + &validator, + eligible_epoch ); if !tx_args.force { return Err(Error::from( @@ -927,16 +924,14 @@ pub async fn build_unjail_validator<'a>( } } } - Err(Error::Query( - QueryError::NoSuchKey(_) | QueryError::General(_), - )) => { - return Err(Error::from(TxError::Other(format!( - "The given validator address {} is currently frozen and not \ - yet eligible to be unjailed.", - &validator - )))); + Ok(None) => { + // Jailed due to liveness only. No checks needed. + } + Err(err) => { + if !tx_args.force { + return Err(err); + } } - Err(err) => return Err(err), } build( From f48aec454c8a8fac80f8d19405be14eb189f8e93 Mon Sep 17 00:00:00 2001 From: brentstone Date: Tue, 5 Dec 2023 15:28:20 -0500 Subject: [PATCH 100/175] only call jail if validator is not already jailed --- proof_of_stake/src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/proof_of_stake/src/lib.rs b/proof_of_stake/src/lib.rs index 5aa6fb6f07..c8693bcfcb 100644 --- a/proof_of_stake/src/lib.rs +++ b/proof_of_stake/src/lib.rs @@ -5778,6 +5778,12 @@ where .collect::>(); for validator in &validators_to_jail { + let state_jail_epoch = validator_state_handle(validator) + .get(storage, jail_epoch, params)? + .expect("Validator should have a state for the jail epoch"); + if state_jail_epoch == ValidatorState::Jailed { + continue; + } tracing::info!( "Jailing validator {} starting in epoch {} for missing too many \ votes to ensure liveness", From c57e818653726b398516773ca2a68c0beda43c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 6 Dec 2023 17:40:46 +0100 Subject: [PATCH 101/175] feature guard masp "download-params" in the sdk --- apps/Cargo.toml | 2 +- sdk/Cargo.toml | 7 +++++-- sdk/src/masp.rs | 1 + shared/Cargo.toml | 2 +- wasm/Cargo.lock | 20 -------------------- 5 files changed, 8 insertions(+), 24 deletions(-) diff --git a/apps/Cargo.toml b/apps/Cargo.toml index 95cca10154..b0d098665f 100644 --- a/apps/Cargo.toml +++ b/apps/Cargo.toml @@ -63,7 +63,7 @@ integration = [] [dependencies] namada = {path = "../shared", features = ["multicore", "http-client", "tendermint-rpc"]} -namada_sdk = {path = "../sdk", default-features = false, features = ["wasm-runtime"]} +namada_sdk = {path = "../sdk", default-features = false, features = ["wasm-runtime", "download-params"]} namada_test_utils = {path = "../test_utils", optional = true} ark-serialize.workspace = true ark-std.workspace = true diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 713f99e035..c1f7da4816 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -15,7 +15,7 @@ version.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["tendermint-rpc"] +default = ["tendermint-rpc", "download-params"] multicore = ["masp_proofs/multicore"] @@ -53,6 +53,9 @@ testing = [ "async-client", ] +# Download MASP params if they're not present +download-params = ["masp_proofs/download-params"] + [dependencies] async-trait = {version = "0.1.51", optional = true} bimap.workspace = true @@ -67,7 +70,7 @@ fd-lock = { workspace = true, optional = true } futures.workspace = true itertools.workspace = true masp_primitives.workspace = true -masp_proofs = { workspace = true, features = ["download-params"] } +masp_proofs.workspace = true namada_core = {path = "../core", default-features = false, features = ["rand"]} namada_ethereum_bridge = {path = "../ethereum_bridge", default-features = false} namada_proof_of_stake = {path = "../proof_of_stake", default-features = false} diff --git a/sdk/src/masp.rs b/sdk/src/masp.rs index 68459688e0..a81be9ce96 100644 --- a/sdk/src/masp.rs +++ b/sdk/src/masp.rs @@ -146,6 +146,7 @@ fn load_pvks() -> ( let [spend_path, convert_path, output_path] = [SPEND_NAME, CONVERT_NAME, OUTPUT_NAME].map(|p| params_dir.join(p)); + #[cfg(feature = "download-params")] if !spend_path.exists() || !convert_path.exists() || !output_path.exists() { let paths = masp_proofs::download_masp_parameters(None).expect( "MASP parameters were not present, expected the download to \ diff --git a/shared/Cargo.toml b/shared/Cargo.toml index 2d83a73498..d25a0f761d 100644 --- a/shared/Cargo.toml +++ b/shared/Cargo.toml @@ -102,7 +102,7 @@ futures.workspace = true itertools.workspace = true loupe = {version = "0.1.3", optional = true} masp_primitives.workspace = true -masp_proofs = { workspace = true, features = ["download-params"] } +masp_proofs.workspace = true num256.workspace = true orion.workspace = true owo-colors = "3.5.0" diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 1d30fa4a74..08b9172bce 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -2794,7 +2794,6 @@ dependencies = [ "jubjub", "lazy_static", "masp_primitives", - "minreq", "rand_core 0.6.4", "redjubjub", "tracing", @@ -2881,19 +2880,6 @@ dependencies = [ "adler", ] -[[package]] -name = "minreq" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3371dfc7b772c540da1380123674a8e20583aca99907087d990ca58cf44203" -dependencies = [ - "log", - "once_cell", - "rustls", - "rustls-webpki", - "webpki-roots", -] - [[package]] name = "mio" version = "0.8.9" @@ -6169,12 +6155,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" - [[package]] name = "wee_alloc" version = "0.4.5" From 6b2015486bb002eed37b2044aed3a4e24debbf01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 6 Dec 2023 17:53:49 +0100 Subject: [PATCH 102/175] shared: refactor to avoid unused imports --- shared/src/ledger/mod.rs | 208 ++++++++++++++++++++------------------- 1 file changed, 107 insertions(+), 101 deletions(-) diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index 87103c8b79..abd96064bb 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -12,119 +12,124 @@ pub use namada_sdk::queries; pub mod storage; pub mod vp_host_fns; -use namada_core::ledger::storage::{DBIter, StorageHasher, DB}; -use namada_core::ledger::storage_api::ResultExt; +#[cfg(feature = "wasm-runtime")] +pub use dry_run_tx::dry_run_tx; pub use namada_core::ledger::{ gas, parameters, replay_protection, storage_api, tx_env, vp_env, }; -use namada_sdk::queries::{EncodedResponseQuery, RequestCtx, RequestQuery}; #[cfg(feature = "wasm-runtime")] -use crate::vm::wasm::{TxCache, VpCache}; -use crate::vm::WasmCacheAccess; +mod dry_run_tx { + use namada_core::ledger::storage::{DBIter, StorageHasher, DB}; + use namada_core::ledger::storage_api::ResultExt; + use namada_sdk::queries::{EncodedResponseQuery, RequestCtx, RequestQuery}; -/// Dry run a transaction -#[cfg(feature = "wasm-runtime")] -pub fn dry_run_tx( - mut ctx: RequestCtx<'_, D, H, VpCache, TxCache>, - request: &RequestQuery, -) -> storage_api::Result -where - D: 'static + DB + for<'iter> DBIter<'iter> + Sync, - H: 'static + StorageHasher + Sync, - CA: 'static + WasmCacheAccess + Sync, -{ - use borsh_ext::BorshSerializeExt; - use namada_core::ledger::gas::{Gas, GasMetering, TxGasMeter}; - use namada_core::ledger::storage::TempWlStorage; - use namada_core::proto::Tx; - use namada_core::types::transaction::DecryptedTx; + use super::{protocol, storage_api}; + use crate::vm::wasm::{TxCache, VpCache}; + use crate::vm::WasmCacheAccess; - use crate::ledger::protocol::ShellParams; - use crate::types::storage::TxIndex; - use crate::types::transaction::TxType; + /// Dry run a transaction + pub fn dry_run_tx( + mut ctx: RequestCtx<'_, D, H, VpCache, TxCache>, + request: &RequestQuery, + ) -> storage_api::Result + where + D: 'static + DB + for<'iter> DBIter<'iter> + Sync, + H: 'static + StorageHasher + Sync, + CA: 'static + WasmCacheAccess + Sync, + { + use borsh_ext::BorshSerializeExt; + use namada_core::ledger::gas::{Gas, GasMetering, TxGasMeter}; + use namada_core::ledger::storage::TempWlStorage; + use namada_core::proto::Tx; + use namada_core::types::transaction::DecryptedTx; - let mut tx = Tx::try_from(&request.data[..]).into_storage_result()?; - tx.validate_tx().into_storage_result()?; + use crate::ledger::protocol::ShellParams; + use crate::types::storage::TxIndex; + use crate::types::transaction::TxType; - let mut temp_wl_storage = TempWlStorage::new(&ctx.wl_storage.storage); - let mut cumulated_gas = Gas::default(); + let mut tx = Tx::try_from(&request.data[..]).into_storage_result()?; + tx.validate_tx().into_storage_result()?; - // Wrapper dry run to allow estimating the gas cost of a transaction - let mut tx_gas_meter = match tx.header().tx_type { - TxType::Wrapper(wrapper) => { - let mut tx_gas_meter = - TxGasMeter::new(wrapper.gas_limit.to_owned()); - protocol::apply_wrapper_tx( - tx.clone(), - &wrapper, - None, - &request.data, - ShellParams::new( - &mut tx_gas_meter, - &mut temp_wl_storage, - &mut ctx.vp_wasm_cache, - &mut ctx.tx_wasm_cache, - ), - None, - ) - .into_storage_result()?; + let mut temp_wl_storage = TempWlStorage::new(&ctx.wl_storage.storage); + let mut cumulated_gas = Gas::default(); - temp_wl_storage.write_log.commit_tx(); - cumulated_gas = tx_gas_meter.get_tx_consumed_gas(); + // Wrapper dry run to allow estimating the gas cost of a transaction + let mut tx_gas_meter = match tx.header().tx_type { + TxType::Wrapper(wrapper) => { + let mut tx_gas_meter = + TxGasMeter::new(wrapper.gas_limit.to_owned()); + protocol::apply_wrapper_tx( + tx.clone(), + &wrapper, + None, + &request.data, + ShellParams::new( + &mut tx_gas_meter, + &mut temp_wl_storage, + &mut ctx.vp_wasm_cache, + &mut ctx.tx_wasm_cache, + ), + None, + ) + .into_storage_result()?; - tx.update_header(TxType::Decrypted(DecryptedTx::Decrypted)); - TxGasMeter::new_from_sub_limit(tx_gas_meter.get_available_gas()) - } - TxType::Protocol(_) | TxType::Decrypted(_) => { - // If dry run only the inner tx, use the max block gas as the gas - // limit - TxGasMeter::new( - namada_core::ledger::gas::get_max_block_gas(ctx.wl_storage) - .unwrap() - .into(), - ) - } - TxType::Raw => { - // Cast tx to a decrypted for execution - tx.update_header(TxType::Decrypted(DecryptedTx::Decrypted)); + temp_wl_storage.write_log.commit_tx(); + cumulated_gas = tx_gas_meter.get_tx_consumed_gas(); - // If dry run only the inner tx, use the max block gas as the gas - // limit - TxGasMeter::new( - namada_core::ledger::gas::get_max_block_gas(ctx.wl_storage) - .unwrap() - .into(), - ) - } - }; + tx.update_header(TxType::Decrypted(DecryptedTx::Decrypted)); + TxGasMeter::new_from_sub_limit(tx_gas_meter.get_available_gas()) + } + TxType::Protocol(_) | TxType::Decrypted(_) => { + // If dry run only the inner tx, use the max block gas as the + // gas limit + TxGasMeter::new( + namada_core::ledger::gas::get_max_block_gas(ctx.wl_storage) + .unwrap() + .into(), + ) + } + TxType::Raw => { + // Cast tx to a decrypted for execution + tx.update_header(TxType::Decrypted(DecryptedTx::Decrypted)); - let mut data = protocol::apply_wasm_tx( - tx, - &TxIndex(0), - ShellParams::new( - &mut tx_gas_meter, - &mut temp_wl_storage, - &mut ctx.vp_wasm_cache, - &mut ctx.tx_wasm_cache, - ), - ) - .into_storage_result()?; - cumulated_gas = cumulated_gas - .checked_add(tx_gas_meter.get_tx_consumed_gas()) - .ok_or(namada_core::ledger::storage_api::Error::SimpleMessage( - "Overflow in gas", - ))?; - // Account gas for both inner and wrapper (if available) - data.gas_used = cumulated_gas; - // NOTE: the keys changed by the wrapper transaction (if any) are not - // returned from this function - let data = data.serialize_to_vec(); - Ok(EncodedResponseQuery { - data, - proof: None, - info: Default::default(), - }) + // If dry run only the inner tx, use the max block gas as the + // gas limit + TxGasMeter::new( + namada_core::ledger::gas::get_max_block_gas(ctx.wl_storage) + .unwrap() + .into(), + ) + } + }; + + let mut data = protocol::apply_wasm_tx( + tx, + &TxIndex(0), + ShellParams::new( + &mut tx_gas_meter, + &mut temp_wl_storage, + &mut ctx.vp_wasm_cache, + &mut ctx.tx_wasm_cache, + ), + ) + .into_storage_result()?; + cumulated_gas = cumulated_gas + .checked_add(tx_gas_meter.get_tx_consumed_gas()) + .ok_or(namada_core::ledger::storage_api::Error::SimpleMessage( + "Overflow in gas", + ))?; + // Account gas for both inner and wrapper (if available) + data.gas_used = cumulated_gas; + // NOTE: the keys changed by the wrapper transaction (if any) are not + // returned from this function + let data = data.serialize_to_vec(); + Ok(EncodedResponseQuery { + data, + proof: None, + info: Default::default(), + }) + } } #[cfg(test)] @@ -138,14 +143,15 @@ mod test { use namada_core::types::transaction::decrypted::DecryptedTx; use namada_core::types::transaction::TxType; use namada_core::types::{address, token}; - use namada_sdk::queries::{Router, RPC}; + use namada_sdk::queries::{ + EncodedResponseQuery, RequestCtx, RequestQuery, Router, RPC, + }; use namada_test_utils::TestWasms; use tempfile::TempDir; use tendermint_rpc::{Error as RpcError, Response}; use crate::ledger::events::log::EventLog; use crate::ledger::queries::Client; - use crate::ledger::{EncodedResponseQuery, RequestCtx, RequestQuery}; use crate::proto::{Code, Data, Tx}; use crate::vm::wasm::{TxCache, VpCache}; use crate::vm::{wasm, WasmCacheRoAccess}; From 1cd505f7e4b5f87b3919e1c935a3cf321914f63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 6 Dec 2023 17:55:43 +0100 Subject: [PATCH 103/175] changelog: add #2233 --- .changelog/unreleased/miscellaneous/2233-upgrade-borsh.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/miscellaneous/2233-upgrade-borsh.md diff --git a/.changelog/unreleased/miscellaneous/2233-upgrade-borsh.md b/.changelog/unreleased/miscellaneous/2233-upgrade-borsh.md new file mode 100644 index 0000000000..6de319fd5e --- /dev/null +++ b/.changelog/unreleased/miscellaneous/2233-upgrade-borsh.md @@ -0,0 +1,2 @@ +- Upgraded borsh dependency to v1.2.0. + ([\#2233](https://github.com/anoma/namada/pull/2233)) \ No newline at end of file From 56b538479cb707d4144e4301f5e745528048be9f Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 6 Dec 2023 13:06:28 -0500 Subject: [PATCH 104/175] changelog: add #2246 --- .changelog/unreleased/improvements/2246-fix-liveness.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/unreleased/improvements/2246-fix-liveness.md diff --git a/.changelog/unreleased/improvements/2246-fix-liveness.md b/.changelog/unreleased/improvements/2246-fix-liveness.md new file mode 100644 index 0000000000..524c79aafb --- /dev/null +++ b/.changelog/unreleased/improvements/2246-fix-liveness.md @@ -0,0 +1,3 @@ +- Fix bug in client to allow for unjailing a validator + that was jailed for missing liveness requirements + ([\#2246](https://github.com/anoma/namada/pull/2246)) \ No newline at end of file From 41e1f5257ecaf463fce04f219a2eeb2b43ae2df0 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 21 Nov 2023 15:38:41 +0000 Subject: [PATCH 105/175] Implement serde serialization for validator meta --- Cargo.lock | 1 + proof_of_stake/Cargo.toml | 1 + proof_of_stake/src/types.rs | 3 +++ wasm/Cargo.lock | 1 + wasm_for_tests/wasm_source/Cargo.lock | 1 + 5 files changed, 7 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index a760f39701..4e7035351b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4020,6 +4020,7 @@ dependencies = [ "pretty_assertions", "proptest", "proptest-state-machine", + "serde 1.0.190", "test-log", "thiserror", "tracing", diff --git a/proof_of_stake/Cargo.toml b/proof_of_stake/Cargo.toml index 19eb0e2493..700dccb7fc 100644 --- a/proof_of_stake/Cargo.toml +++ b/proof_of_stake/Cargo.toml @@ -24,6 +24,7 @@ data-encoding.workspace = true derivative.workspace = true once_cell.workspace = true proptest = {version = "1.2.0", optional = true} +serde.workspace = true thiserror.workspace = true tracing.workspace = true diff --git a/proof_of_stake/src/types.rs b/proof_of_stake/src/types.rs index 21919896b0..20c9b2a0ca 100644 --- a/proof_of_stake/src/types.rs +++ b/proof_of_stake/src/types.rs @@ -21,6 +21,7 @@ use namada_core::types::storage::{Epoch, KeySeg}; use namada_core::types::token; use namada_core::types::token::Amount; pub use rev_order::ReverseOrdTokenAmount; +use serde::{Deserialize, Serialize}; use crate::parameters::PosParams; @@ -345,6 +346,8 @@ pub struct GenesisValidator { BorshSerialize, BorshSchema, BorshDeserialize, + Deserialize, + Serialize, Eq, Ord, PartialOrd, diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 66a3bb5817..f8851f7973 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -3087,6 +3087,7 @@ dependencies = [ "namada_core", "once_cell", "proptest", + "serde", "thiserror", "tracing", ] diff --git a/wasm_for_tests/wasm_source/Cargo.lock b/wasm_for_tests/wasm_source/Cargo.lock index 133935e7f0..71b92988cd 100644 --- a/wasm_for_tests/wasm_source/Cargo.lock +++ b/wasm_for_tests/wasm_source/Cargo.lock @@ -3087,6 +3087,7 @@ dependencies = [ "namada_core", "once_cell", "proptest", + "serde", "thiserror", "tracing", ] From a4a523fdfe36b3cfba988b461f71726c47e2ea0f Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 21 Nov 2023 16:07:56 +0000 Subject: [PATCH 106/175] wip mess --- apps/src/lib/client/utils.rs | 7 +- apps/src/lib/config/genesis/chain.rs | 5 +- apps/src/lib/config/genesis/transactions.rs | 74 ++++++++++++--------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 7420029726..431ea44a67 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -643,13 +643,8 @@ pub fn derive_genesis_addresses( println!("{}", "Validator account txs:".underline().bold()); for tx in genesis_txs.validator_account.as_ref().into_iter().flatten() { - let address = { - let unsigned = - genesis::transactions::UnsignedValidatorAccountTx::from(tx); - unsigned.derive_address() - }; println!(); - println!("{} {address}", "Address:".bold().bright_green()); + println!("{} {}", "Address:".bold().bright_green(), tx.address); let keys = [ ("Account key:", &tx.account_key.pk.raw), ("Consensus key:", &tx.consensus_key.pk.raw), diff --git a/apps/src/lib/config/genesis/chain.rs b/apps/src/lib/config/genesis/chain.rs index a5dd2a6352..fc3b42eac7 100644 --- a/apps/src/lib/config/genesis/chain.rs +++ b/apps/src/lib/config/genesis/chain.rs @@ -653,10 +653,7 @@ impl FinalizedTransactions { let validator_account = validator_account.map(|txs| { txs.into_iter() .map(|tx| FinalizedValidatorAccountTx { - address: transactions::UnsignedValidatorAccountTx::from( - &tx, - ) - .derive_address(), + address: Address::Established(tx.address.clone()), tx, }) .collect() diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index da38a63721..6d93507117 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -6,8 +6,9 @@ use std::net::SocketAddr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; -use namada::core::types::address::Address; +use namada::core::types::address::{Address, EstablishedAddress}; use namada::core::types::string_encoding::StringEncoded; +use namada::ledger::pos::types::ValidatorMetaData; use namada::proto::{ standalone_signature, verify_standalone_sig, SerializeWithBorsh, }; @@ -98,6 +99,7 @@ pub fn parse_unsigned( /// Create signed [`Transactions`] for a genesis validator. pub fn init_validator( GenesisValidatorData { + address, commission_rate, max_commission_rate_change, net_address, @@ -110,6 +112,7 @@ pub fn init_validator( validator_wallet: &ValidatorWallet, ) -> (Address, Transactions) { let unsigned_validator_account_tx = UnsignedValidatorAccountTx { + address, account_key: StringEncoded::new(validator_wallet.account_key.ref_to()), consensus_key: StringEncoded::new( validator_wallet.consensus_key.ref_to(), @@ -139,8 +142,7 @@ pub fn init_validator( discord_handle, net_address, }; - let unsigned_validator_addr = - unsigned_validator_account_tx.derive_established_address(); + let unsigned_validator_addr = unsigned_validator_account_tx.address.clone(); let validator_account = Some(vec![sign_validator_account_tx( unsigned_validator_account_tx, validator_wallet, @@ -189,6 +191,7 @@ pub fn sign_validator_account_tx( sign_tx(&unsigned_tx, &validator_wallet.tendermint_node_key); let ValidatorAccountTx { + address, account_key, consensus_key, protocol_key, @@ -233,6 +236,7 @@ pub fn sign_validator_account_tx( }; SignedValidatorAccountTx { + address, account_key, consensus_key, protocol_key, @@ -408,17 +412,15 @@ pub type SignedValidatorAccountTx = ValidatorAccountTx; Eq, )] pub struct ValidatorAccountTx { + /// The address of the validator. + pub address: StringEncoded, + // TODO: remove the vp field pub vp: String, /// Commission rate charged on rewards for delegators (bounded inside /// 0-1) pub commission_rate: Dec, /// Maximum change in commission rate permitted per epoch pub max_commission_rate_change: Dec, - /// Validator metadata - pub email: String, - pub description: Option, - pub website: Option, - pub discord_handle: Option, /// P2P IP:port pub net_address: SocketAddr, /// PKs have to come last in TOML to avoid `ValueAfterTable` error @@ -428,10 +430,8 @@ pub struct ValidatorAccountTx { pub tendermint_node_key: PK, pub eth_hot_key: PK, pub eth_cold_key: PK, -} - -impl DeriveEstablishedAddress for UnsignedValidatorAccountTx { - const SALT: &'static str = "validator-account-tx"; + /// Validator metadata + pub metadata: ValidatorMetaData, } #[derive( @@ -658,7 +658,7 @@ pub fn validate( if !validate_validator_account( tx, vps, - &mut all_used_addresses, + &all_used_addresses, &mut validator_accounts, ) { is_valid = false; @@ -732,14 +732,11 @@ pub fn validate( validator_accounts .into_iter() .map(|acct| ValidatorAccountTx { + address: acct.address, vp: acct.vp, commission_rate: acct.commission_rate, max_commission_rate_change: acct .max_commission_rate_change, - email: acct.email, - description: acct.description, - website: acct.website, - discord_handle: acct.discord_handle, net_address: acct.net_address, account_key: acct.account_key, consensus_key: acct.consensus_key, @@ -747,6 +744,7 @@ pub fn validate( tendermint_node_key: acct.tendermint_node_key, eth_hot_key: acct.eth_hot_key, eth_cold_key: acct.eth_cold_key, + metadata: acct.metadata, }) .collect() }, @@ -924,25 +922,33 @@ pub fn validate_established_account( pub fn validate_validator_account( tx: &ValidatorAccountTx, vps: Option<&ValidityPredicates>, - all_used_addresses: &mut BTreeSet
          , - validator_accounts: &mut BTreeMap, + all_used_addresses: &BTreeSet
          , + validator_accounts: &mut BTreeSet
          , ) -> bool { let mut is_valid = true; - let established_address = ValidatorAccountTx::from(tx).derive_address(); - validator_accounts - .insert(established_address.clone(), tx.account_key.pk.raw.clone()); - - // Check that address is unique - if all_used_addresses.contains(&established_address) { - eprintln!( - "A duplicate address \"{}\" found in a `validator_account` tx.", - established_address - ); - is_valid = false; - } else { - all_used_addresses.insert(established_address.clone()); - } + let established_address = { + let established_address = Address::Established(tx.address.clone()); + if !all_used_addresses.contains(&established_address) { + eprintln!( + "Unable to find established account with address \"{}\" in a \ + `validator_account` tx, to initialize a new validator with.", + established_address + ); + is_valid = false; + } + if validator_accounts.contains(&established_address) { + eprintln!( + "A duplicate validator \"{}\" found in a `validator_account` \ + tx.", + established_address + ); + is_valid = false; + } else { + validator_accounts.insert(established_address.clone()); + } + established_address + }; // Check the VP exists if !vps @@ -1056,6 +1062,7 @@ fn validate_signature( impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { fn from(tx: &SignedValidatorAccountTx) -> Self { let SignedValidatorAccountTx { + address, vp, commission_rate, max_commission_rate_change, @@ -1074,6 +1081,7 @@ impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { } = tx; Self { + address: address.clone(), vp: vp.clone(), commission_rate: *commission_rate, max_commission_rate_change: *max_commission_rate_change, From c15e750de8025b3746f65b52a4a51aad343cac69 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 22 Nov 2023 11:30:30 +0000 Subject: [PATCH 107/175] clippy is pleased --- apps/src/lib/cli.rs | 23 ++- apps/src/lib/client/utils.rs | 39 ++--- apps/src/lib/config/genesis.rs | 67 ++++---- apps/src/lib/config/genesis/chain.rs | 22 ++- apps/src/lib/config/genesis/templates.rs | 11 +- apps/src/lib/config/genesis/transactions.rs | 164 ++++++------------- apps/src/lib/node/ledger/shell/init_chain.rs | 22 +-- apps/src/lib/wallet/pre_genesis.rs | 13 +- sdk/src/wallet/pre_genesis.rs | 4 - sdk/src/wallet/store.rs | 5 - tests/src/e2e/ibc_tests.rs | 16 +- 11 files changed, 158 insertions(+), 228 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index bda9e4b6aa..d6957bdd62 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2867,7 +2867,7 @@ pub mod args { use std::str::FromStr; use namada::ibc::core::ics24_host::identifier::{ChannelId, PortId}; - use namada::types::address::Address; + use namada::types::address::{Address, EstablishedAddress}; use namada::types::chain::{ChainId, ChainIdPrefix}; use namada::types::dec::Dec; use namada::types::ethereum_events::EthAddress; @@ -3054,6 +3054,7 @@ pub mod args { pub const PROPOSAL_VOTE_ETH_OPT: ArgOpt = arg_opt("eth"); pub const PROPOSAL_VOTE: Arg = arg("vote"); pub const RAW_ADDRESS: Arg
          = arg("address"); + pub const RAW_ADDRESS_ESTABLISHED: Arg = arg("address"); pub const RAW_ADDRESS_OPT: ArgOpt
          = RAW_ADDRESS.opt(); pub const RAW_PUBLIC_KEY: Arg = arg("public-key"); pub const RAW_PUBLIC_KEY_OPT: ArgOpt = @@ -6751,6 +6752,7 @@ pub mod args { pub description: Option, pub website: Option, pub discord_handle: Option, + pub address: EstablishedAddress, } impl Args for InitGenesisValidator { @@ -6768,6 +6770,7 @@ pub mod args { let description = DESCRIPTION_OPT.parse(matches); let website = WEBSITE_OPT.parse(matches); let discord_handle = DISCORD_OPT.parse(matches); + let address = RAW_ADDRESS_ESTABLISHED.parse(matches); Self { alias, net_address, @@ -6780,11 +6783,16 @@ pub mod args { description, website, discord_handle, + address, } } fn def(app: App) -> App { app.arg(ALIAS.def().help("The validator address alias.")) + .arg(RAW_ADDRESS_ESTABLISHED.def().help( + "The address of an established account to be promoted to \ + a validator.", + )) .arg(NET_ADDRESS.def().help( "Static {host:port} of your validator node's P2P address. \ Namada uses port `26656` for P2P connections by default, \ @@ -6854,13 +6862,19 @@ pub mod args { pub struct SignGenesisTx { pub path: PathBuf, pub output: Option, + pub validator_alias: Option, } impl Args for SignGenesisTx { fn parse(matches: &ArgMatches) -> Self { let path = PATH.parse(matches); let output = OUTPUT.parse(matches); - Self { path, output } + let validator_alias = ALIAS_OPT.parse(matches); + Self { + path, + output, + validator_alias, + } } fn def(app: App) -> App { @@ -6872,6 +6886,11 @@ pub mod args { "Save the output to a TOML file. When not supplied, the \ signed transactions will be printed to stdout instead.", )) + .arg( + ALIAS_OPT + .def() + .help("Optional alias to a validator wallet."), + ) } } } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 431ea44a67..489c1af2eb 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -234,12 +234,10 @@ pub async fn join_network( .map(|(alias, _wallet)| alias.clone()); let validator_keys = validator_alias_and_pre_genesis_wallet.as_ref().map( |(_alias, wallet)| { - let validator_account_pk: common::PublicKey = - wallet.account_key.ref_to(); let tendermint_node_key: common::SecretKey = wallet.tendermint_node_key.clone(); let consensus_key: common::SecretKey = wallet.consensus_key.clone(); - (validator_account_pk, tendermint_node_key, consensus_key) + (tendermint_node_key, consensus_key) }, ); let node_mode = if validator_alias.is_some() { @@ -252,7 +250,7 @@ pub async fn join_network( let config = genesis.derive_config( &chain_dir, node_mode, - validator_keys.as_ref().map(|(pk, _, _)| pk), + validator_keys.as_ref().map(|(sk, _)| sk.ref_to()).as_ref(), allow_duplicate_ip, ); @@ -271,7 +269,7 @@ pub async fn join_network( crate::wallet::save(&wallet).unwrap(); // Setup the node for a genesis validator, if used - if let Some((_, tendermint_node_key, consensus_key)) = validator_keys { + if let Some((tendermint_node_key, consensus_key)) = validator_keys { println!( "Setting up validator keys in CometBFT. Consensus key: {}.", consensus_key.to_public() @@ -646,7 +644,6 @@ pub fn derive_genesis_addresses( println!(); println!("{} {}", "Address:".bold().bright_green(), tx.address); let keys = [ - ("Account key:", &tx.account_key.pk.raw), ("Consensus key:", &tx.consensus_key.pk.raw), ("Protocol key:", &tx.protocol_key.pk.raw), ("Tendermint node key:", &tx.tendermint_node_key.pk.raw), @@ -684,6 +681,7 @@ pub fn init_genesis_validator( description, website, discord_handle, + address, }: args::InitGenesisValidator, ) { // Validate the commission rate data @@ -725,6 +723,7 @@ pub fn init_genesis_validator( let (address, transactions) = genesis::transactions::init_validator( genesis::transactions::GenesisValidatorData { + address, commission_rate, max_commission_rate_change, net_address, @@ -857,7 +856,11 @@ pub fn validate_genesis_templates( /// Sign genesis transactions. pub fn sign_genesis_tx( global_args: args::Global, - args::SignGenesisTx { path, output }: args::SignGenesisTx, + args::SignGenesisTx { + path, + output, + validator_alias, + }: args::SignGenesisTx, ) { let (mut wallet, _wallet_file) = load_pre_genesis_wallet_or_exit(&global_args.base_dir); @@ -877,18 +880,16 @@ pub fn sign_genesis_tx( ); safe_exit(1); }); - if unsigned.validator_account.is_some() - && !unsigned.validator_account.as_ref().unwrap().is_empty() - { - eprintln!( - "Validator transactions must be signed with a validator wallet. \ - You can use `namada client utils init-genesis-validator` \ - supplied with the required arguments to generate a validator \ - wallet and sign the validator genesis transactions." - ); - safe_exit(1); - } - let signed = genesis::transactions::sign_txs(unsigned, &mut wallet); + let maybe_pre_genesis_wallet = validator_alias.and_then(|alias| { + let pre_genesis_dir = + validator_pre_genesis_dir(&global_args.base_dir, &alias); + crate::wallet::pre_genesis::load(&pre_genesis_dir).ok() + }); + let signed = genesis::transactions::sign_txs( + unsigned, + &mut wallet, + maybe_pre_genesis_wallet.as_ref(), + ); match output { Some(output_path) => { diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index 52320210f6..ae8062ca00 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -25,7 +25,7 @@ use namada::types::{storage, token}; use serde::{Deserialize, Serialize}; #[cfg(all(any(test, feature = "benches"), not(feature = "integration")))] -use crate::config::genesis::chain::Finalized; +use crate::config::genesis::chain::{Finalized, FinalizedEstablishedAccountTx}; #[derive( Clone, @@ -312,6 +312,7 @@ pub fn make_dev_genesis( use std::time::Duration; use namada::ledger::eth_bridge::{Contracts, UpgradeableContract}; + use namada::ledger::pos::types::ValidatorMetaData; use namada::proto::{standalone_signature, SerializeWithBorsh}; use namada::types::address::wnam; use namada::types::chain::ChainIdPrefix; @@ -320,7 +321,6 @@ pub fn make_dev_genesis( use namada_sdk::wallet::alias::Alias; use crate::config::genesis::chain::{finalize, DeriveEstablishedAddress}; - use crate::config::genesis::transactions::UnsignedValidatorAccountTx; use crate::wallet::defaults; let mut current_path = std::env::current_dir() @@ -401,10 +401,8 @@ pub fn make_dev_genesis( .unwrap() .get(0) .unwrap(); - let genesis_addr = GenesisAddress::EstablishedAddress( - UnsignedValidatorAccountTx::from(&tx.tx) - .derive_established_address(), - ); + let genesis_addr = + GenesisAddress::EstablishedAddress(tx.tx.address.raw.clone()); let balance = *nam_balances.0.get(&genesis_addr).unwrap(); let bonded = { @@ -435,30 +433,45 @@ pub fn make_dev_genesis( testing::gen_keypair::() .try_to_sk() .unwrap(); - let account_keypair = consensus_keypair.clone(); let eth_cold_keypair = common::SecretKey::try_from_sk(&secp_eth_cold_keypair).unwrap(); let (protocol_keypair, eth_bridge_keypair) = defaults::validator_keys(); // add the validator - let (validator_address, account_pk) = if let Some(vals) = - genesis.transactions.validator_account.as_mut() - { + let validator_address = { + let vals = genesis.transactions.validator_account.as_mut().unwrap(); + let established_accounts = + genesis.transactions.established_account.as_mut().unwrap(); + + let tx = transactions::EstablishedAccountTx { + vp: "vp_user".to_string(), + public_keys: vec![StringEncoded::new( + consensus_keypair.ref_to(), + )], + threshold: 1, + }; + let address = tx.derive_established_address(); + let established_account_tx = FinalizedEstablishedAccountTx { + address: Address::Established(address.clone()), + tx, + }; + established_accounts.push(established_account_tx); + let validator_account_tx = transactions::ValidatorAccountTx { + address: StringEncoded::new(address.clone()), vp: "vp_validator".to_string(), commission_rate: Dec::new(5, 2).expect("This can't fail"), max_commission_rate_change: Dec::new(1, 2) .expect("This can't fail"), - email: "null@null.net".to_string(), - description: None, - website: None, - discord_handle: None, + metadata: ValidatorMetaData { + email: "null@null.net".to_string(), + description: None, + website: None, + discord_handle: None, + }, net_address: SocketAddr::new( IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 8080, ), - account_key: StringEncoded { - raw: account_keypair.to_public(), - }, consensus_key: StringEncoded { raw: consensus_keypair.to_public(), }, @@ -475,21 +488,16 @@ pub fn make_dev_genesis( raw: eth_cold_keypair.to_public(), }, }; - let validator_address = - validator_account_tx.derive_established_address(); vals.push(chain::FinalizedValidatorAccountTx { - address: Address::Established(validator_address.clone()), + address: Address::Established(address.clone()), tx: transactions::ValidatorAccountTx { + address: StringEncoded::new(address.clone()), vp: validator_account_tx.vp, commission_rate: validator_account_tx.commission_rate, max_commission_rate_change: validator_account_tx .max_commission_rate_change, - email: validator_account_tx.email, - description: validator_account_tx.description, - website: validator_account_tx.website, - discord_handle: validator_account_tx.discord_handle, + metadata: validator_account_tx.metadata, net_address: validator_account_tx.net_address, - account_key: sign_pk(&account_keypair), consensus_key: sign_pk(&consensus_keypair), protocol_key: sign_pk(&protocol_keypair), tendermint_node_key: sign_pk(&consensus_keypair), @@ -497,9 +505,7 @@ pub fn make_dev_genesis( eth_cold_key: sign_pk(ð_cold_keypair), }, }); - (validator_address, account_keypair.ref_to()) - } else { - unreachable!() + address }; // credit nam tokens to validators such that they can bond { @@ -511,8 +517,9 @@ pub fn make_dev_genesis( let validator_addr = GenesisAddress::EstablishedAddress(validator_address.clone()); - let account_pk = - GenesisAddress::PublicKey(StringEncoded::new(account_pk)); + let account_pk = GenesisAddress::PublicKey(StringEncoded::new( + consensus_keypair.ref_to(), + )); nam_balances.0.insert(validator_addr, first_val_balance); nam_balances.0.insert(account_pk, first_val_balance); diff --git a/apps/src/lib/config/genesis/chain.rs b/apps/src/lib/config/genesis/chain.rs index fc3b42eac7..55f675b6d2 100644 --- a/apps/src/lib/config/genesis/chain.rs +++ b/apps/src/lib/config/genesis/chain.rs @@ -142,10 +142,10 @@ impl Finalized { wallet.extend(pre_genesis_wallet); } if let Some((alias, validator_wallet)) = validator { - let account_pk = validator_wallet.account_key.ref_to(); + let tendermint_pk = validator_wallet.tendermint_node_key.ref_to(); let address = self .transactions - .find_validator(&account_pk) + .find_validator(&tendermint_pk) .map(|tx| tx.address.clone()) .expect("Validator alias not found in genesis transactions."); wallet.extend_from_pre_genesis_validator( @@ -162,12 +162,10 @@ impl Finalized { &self, base_dir: &Path, node_mode: TendermintMode, - validator_account_pk: Option<&common::PublicKey>, + tendermint_pk: Option<&common::PublicKey>, allow_duplicate_ip: bool, ) -> Config { - if node_mode != TendermintMode::Validator - && validator_account_pk.is_some() - { + if node_mode != TendermintMode::Validator && tendermint_pk.is_some() { println!( "Warning: Validator alias used to derive config, but node \ mode is not validator, it is {node_mode:?}!" @@ -178,10 +176,10 @@ impl Finalized { // Derive persistent peers from genesis let persistent_peers = self.derive_persistent_peers(); - // If `validator_account_pk` is given, find its net_address + // If `tendermint_pk` is given, find its net_address let validator_net_and_tm_address = - if let Some(account_pk) = validator_account_pk { - self.transactions.find_validator(account_pk).map( + if let Some(tendermint_pk) = tendermint_pk { + self.transactions.find_validator(tendermint_pk).map( |validator_tx| { ( validator_tx.tx.net_address, @@ -653,7 +651,7 @@ impl FinalizedTransactions { let validator_account = validator_account.map(|txs| { txs.into_iter() .map(|tx| FinalizedValidatorAccountTx { - address: Address::Established(tx.address.clone()), + address: Address::Established(tx.address.raw.clone()), tx, }) .collect() @@ -667,12 +665,12 @@ impl FinalizedTransactions { fn find_validator( &self, - validator_account_pk: &common::PublicKey, + tendermint_pk: &common::PublicKey, ) -> Option<&FinalizedValidatorAccountTx> { let validator_accounts = self.validator_account.as_ref()?; validator_accounts .iter() - .find(|tx| &tx.tx.account_key.pk.raw == validator_account_pk) + .find(|tx| &tx.tx.tendermint_node_key.pk.raw == tendermint_pk) } } diff --git a/apps/src/lib/config/genesis/templates.rs b/apps/src/lib/config/genesis/templates.rs index a9f513214e..620c00a77e 100644 --- a/apps/src/lib/config/genesis/templates.rs +++ b/apps/src/lib/config/genesis/templates.rs @@ -18,7 +18,7 @@ use namada::types::token::{ use serde::{Deserialize, Serialize}; use super::toml_utils::{read_toml, write_toml}; -use super::transactions::{self, Transactions, UnsignedValidatorAccountTx}; +use super::transactions::{self, Transactions}; use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::genesis::transactions::{BondTx, SignedBondTx}; use crate::config::genesis::GenesisAddress; @@ -825,15 +825,6 @@ pub fn validate_parameters( } } - if let Some(accs) = &txs.validator_account { - if accs.iter().any(|acct| { - let addr = - UnsignedValidatorAccountTx::from(acct).derive_address(); - &addr == steward - }) { - found_steward = true; - } - } is_valid = found_steward && is_valid; if !is_valid { eprintln!( diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 6d93507117..7ad8979e06 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -33,6 +33,7 @@ use crate::wallet::CliWalletUtils; pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; pub struct GenesisValidatorData { + pub address: EstablishedAddress, pub commission_rate: Dec, pub max_commission_rate_change: Dec, pub net_address: SocketAddr, @@ -49,6 +50,7 @@ pub struct GenesisValidatorData { pub fn sign_txs( txs: UnsignedTransactions, wallet: &mut Wallet, + validator_wallet: Option<&ValidatorWallet>, ) -> Transactions { let UnsignedTransactions { established_account, @@ -56,32 +58,22 @@ pub fn sign_txs( bond, } = txs; - // Validate input first - if validator_account.is_some() && !validator_account.unwrap().is_empty() { - panic!( - "Validator transactions must be signed with a validator wallet." - ); - } - - if let Some(bonds) = bond.as_ref() { - for bond in bonds { - if bond.source.address() == bond.validator { - panic!( - "Validator self-bonds must be signed with a validator \ - wallet." - ) - } - } - } - - // Sign all the transactions - let validator_account = None; - let bond = bond.map(|tx| { - tx.into_iter() + // Sign bond txs + let bond = bond.map(|txs| { + txs.into_iter() .map(|tx| sign_delegation_bond_tx(tx, wallet, &established_account)) .collect() }); + // Sign validator account txs + let validator_account = validator_account.map(|txs| { + let validator_wallet = validator_wallet + .expect("Validator wallet required to sign validator account txs"); + txs.into_iter() + .map(|tx| sign_validator_account_tx(tx, validator_wallet)) + .collect() + }); + Transactions { established_account, validator_account, @@ -96,7 +88,7 @@ pub fn parse_unsigned( toml::from_slice(bytes) } -/// Create signed [`Transactions`] for a genesis validator. +/// Create [`UnsignedTransactions`] for a genesis validator. pub fn init_validator( GenesisValidatorData { address, @@ -110,10 +102,9 @@ pub fn init_validator( discord_handle, }: GenesisValidatorData, validator_wallet: &ValidatorWallet, -) -> (Address, Transactions) { +) -> (Address, UnsignedTransactions) { let unsigned_validator_account_tx = UnsignedValidatorAccountTx { - address, - account_key: StringEncoded::new(validator_wallet.account_key.ref_to()), + address: StringEncoded::new(address), consensus_key: StringEncoded::new( validator_wallet.consensus_key.ref_to(), ), @@ -136,17 +127,17 @@ pub fn init_validator( vp: "vp_user".to_string(), commission_rate, max_commission_rate_change, - email, - description, - website, - discord_handle, net_address, + metadata: ValidatorMetaData { + email, + description, + website, + discord_handle, + }, }; - let unsigned_validator_addr = unsigned_validator_account_tx.address.clone(); - let validator_account = Some(vec![sign_validator_account_tx( - unsigned_validator_account_tx, - validator_wallet, - )]); + let unsigned_validator_addr = + unsigned_validator_account_tx.address.raw.clone(); + let validator_account = Some(vec![unsigned_validator_account_tx]); let bond = if self_bond_amount.amount.is_zero() { None @@ -158,12 +149,11 @@ pub fn init_validator( validator: Address::Established(unsigned_validator_addr.clone()), amount: self_bond_amount, }; - let bond_tx = sign_self_bond_tx(unsigned_bond_tx, validator_wallet); - Some(vec![bond_tx]) + Some(vec![unsigned_bond_tx]) }; let address = Address::Established(unsigned_validator_addr); - let txs = Transactions { + let txs = UnsignedTransactions { validator_account, bond, ..Default::default() @@ -177,7 +167,6 @@ pub fn sign_validator_account_tx( validator_wallet: &ValidatorWallet, ) -> SignedValidatorAccountTx { // Sign the tx with every validator key to authorize their usage - let account_key_sig = sign_tx(&unsigned_tx, &validator_wallet.account_key); let consensus_key_sig = sign_tx(&unsigned_tx, &validator_wallet.consensus_key); let protocol_key_sig = sign_tx( @@ -192,26 +181,18 @@ pub fn sign_validator_account_tx( let ValidatorAccountTx { address, - account_key, consensus_key, protocol_key, tendermint_node_key, vp, commission_rate, max_commission_rate_change, - email, - description, - website, - discord_handle, net_address, eth_hot_key, eth_cold_key, + metadata, } = unsigned_tx; - let account_key = SignedPk { - pk: account_key, - authorization: account_key_sig, - }; let consensus_key = SignedPk { pk: consensus_key, authorization: consensus_key_sig, @@ -237,32 +218,19 @@ pub fn sign_validator_account_tx( SignedValidatorAccountTx { address, - account_key, consensus_key, protocol_key, tendermint_node_key, vp, commission_rate, max_commission_rate_change, - email, - description, - website, - discord_handle, net_address, eth_hot_key, eth_cold_key, + metadata, } } -pub fn sign_self_bond_tx( - unsigned_tx: BondTx, - validator_wallet: &ValidatorWallet, -) -> SignedBondTx { - let mut signed = SignedBondTx::from(unsigned_tx); - signed.sign(std::slice::from_ref(&validator_wallet.account_key)); - signed -} - pub fn sign_delegation_bond_tx( unsigned_tx: BondTx, wallet: &mut Wallet, @@ -424,7 +392,6 @@ pub struct ValidatorAccountTx { /// P2P IP:port pub net_address: SocketAddr, /// PKs have to come last in TOML to avoid `ValueAfterTable` error - pub account_key: PK, pub consensus_key: PK, pub protocol_key: PK, pub tendermint_node_key: PK, @@ -460,7 +427,21 @@ impl DeriveEstablishedAddress for EstablishedAccountTx { const SALT: &'static str = "established-account-tx"; } -pub type SignedBondTx = Signed>; +#[derive( + Clone, + Debug, + Deserialize, + Serialize, + BorshSerialize, + BorshDeserialize, + PartialEq, + Eq, +)] +pub struct SignedBondTx { + #[serde(flatten)] + pub data: BondTx, + pub signatures: Vec>, +} impl SignedBondTx where @@ -587,22 +568,6 @@ impl From> for SignedBondTx { } } -#[derive( - Clone, - Debug, - Deserialize, - Serialize, - BorshSerialize, - BorshDeserialize, - PartialEq, - Eq, -)] -pub struct Signed { - #[serde(flatten)] - pub data: T, - pub signatures: Vec>, -} - #[derive( Clone, Debug, @@ -631,8 +596,7 @@ pub fn validate( Address, (Vec, u8), > = BTreeMap::default(); - let mut validator_accounts: BTreeMap = - BTreeMap::default(); + let mut validator_accounts = BTreeSet::new(); let Transactions { ref established_account, @@ -738,7 +702,6 @@ pub fn validate( max_commission_rate_change: acct .max_commission_rate_change, net_address: acct.net_address, - account_key: acct.account_key, consensus_key: acct.consensus_key, protocol_key: acct.protocol_key, tendermint_node_key: acct.tendermint_node_key, @@ -757,7 +720,7 @@ fn validate_bond( tx: SignedBondTx, balances: &mut BTreeMap, established_accounts: &BTreeMap, u8)>, - validator_accounts: &BTreeMap, + validator_accounts: &BTreeSet
          , parameters: &Parameters, ) -> Option> { // Check signature @@ -771,11 +734,6 @@ fn validate_bond( established_accounts .get(&established_addr) .map(|(pks, t)| (pks.as_slice(), *t)) - .or_else(|| { - validator_accounts - .get(&established_addr) - .map(|addr| (std::slice::from_ref(addr), 1)) - }) } GenesisAddress::PublicKey(pk) => { Some((std::slice::from_ref(&pk.raw), 1)) @@ -807,7 +765,7 @@ fn validate_bond( } = &validated_bond; // Check that the validator exists - if !validator_accounts.contains_key(validator) { + if !validator_accounts.contains(validator) { eprintln!( "Invalid bond tx. The target validator \"{validator}\" account \ not found." @@ -928,7 +886,7 @@ pub fn validate_validator_account( let mut is_valid = true; let established_address = { - let established_address = Address::Established(tx.address.clone()); + let established_address = Address::Established(tx.address.raw.clone()); if !all_used_addresses.contains(&established_address) { eprintln!( "Unable to find established account with address \"{}\" in a \ @@ -965,18 +923,6 @@ pub fn validate_validator_account( // Check keys authorizations let unsigned = UnsignedValidatorAccountTx::from(tx); - if !validate_signature( - &unsigned, - &tx.account_key.pk.raw, - &tx.account_key.authorization.raw, - ) { - eprintln!( - "Invalid `account_key` authorization for `validator_account` tx \ - with address \"{}\".", - established_address - ); - is_valid = false; - } if !validate_signature( &unsigned, &tx.consensus_key.pk.raw, @@ -1066,12 +1012,8 @@ impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { vp, commission_rate, max_commission_rate_change, - email, - description, - website, - discord_handle, + metadata, net_address, - account_key, consensus_key, protocol_key, tendermint_node_key, @@ -1085,12 +1027,8 @@ impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { vp: vp.clone(), commission_rate: *commission_rate, max_commission_rate_change: *max_commission_rate_change, - email: email.clone(), - description: description.clone(), - website: website.clone(), - discord_handle: discord_handle.clone(), + metadata: metadata.clone(), net_address: *net_address, - account_key: account_key.pk.clone(), consensus_key: consensus_key.pk.clone(), protocol_key: protocol_key.pk.clone(), tendermint_node_key: tendermint_node_key.pk.clone(), diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index c21463b28d..ee9b7af289 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -14,7 +14,6 @@ use namada::types::key::*; use namada::types::time::{DateTimeUtc, TimeZone, Utc}; use namada::vm::validate_untrusted_wasm; use namada_sdk::eth_bridge::EthBridgeStatus; -use namada_sdk::proof_of_stake::types::ValidatorMetaData; use namada_sdk::proof_of_stake::PosParams; use super::*; @@ -396,12 +395,8 @@ where vp, commission_rate, max_commission_rate_change, - email, - description, - website, - discord_handle, + metadata, net_address: _, - account_key, consensus_key, protocol_key, tendermint_node_key: _, @@ -420,14 +415,6 @@ where self.wl_storage .write_bytes(&Key::validity_predicate(address), code_hash) .expect("Unable to write user VP"); - // Validator account key - storage_api::account::set_public_key_at( - &mut self.wl_storage, - address, - &account_key.pk.raw, - 0, - ) - .unwrap(); self.wl_storage .write(&protocol_pk_key(address), &protocol_key.pk.raw) @@ -447,12 +434,7 @@ where current_epoch, commission_rate: *commission_rate, max_commission_rate_change: *max_commission_rate_change, - metadata: ValidatorMetaData { - email: email.clone(), - description: description.clone(), - website: website.clone(), - discord_handle: discord_handle.clone(), - }, + metadata: metadata.clone(), offset_opt: Some(0), }, ) { diff --git a/apps/src/lib/wallet/pre_genesis.rs b/apps/src/lib/wallet/pre_genesis.rs index 7ff77407fb..12f88ed99a 100644 --- a/apps/src/lib/wallet/pre_genesis.rs +++ b/apps/src/lib/wallet/pre_genesis.rs @@ -72,18 +72,12 @@ pub fn load(store_dir: &Path) -> Result { })?; let store = ValidatorStore::decode(store).map_err(ReadError::Decode)?; - let password = if store.account_key.is_encrypted() - || store.consensus_key.is_encrypted() - || store.account_key.is_encrypted() - { + let password = if store.consensus_key.is_encrypted() { Some(CliWalletUtils::read_password(false)) } else { None }; - let account_key = store - .account_key - .get::(true, password.clone())?; let consensus_key = store .consensus_key .get::(true, password.clone())?; @@ -97,7 +91,6 @@ pub fn load(store_dir: &Path) -> Result { Ok(ValidatorWallet { store, - account_key, consensus_key, eth_cold_key, eth_hot_key, @@ -111,8 +104,6 @@ fn gen( scheme: SchemeType, password: Option>, ) -> ValidatorWallet { - let (account_key, account_sk) = - gen_key_to_store(scheme, password.clone(), &mut OsRng); let (consensus_key, consensus_sk) = gen_key_to_store( // Note that TM only allows ed25519 for consensus key SchemeType::Ed25519, @@ -130,7 +121,6 @@ fn gen( let validator_keys = gen_validator_keys(None, None, scheme); let eth_hot_key = validator_keys.eth_bridge_keypair.clone(); let store = ValidatorStore { - account_key, consensus_key, eth_cold_key, tendermint_node_key, @@ -138,7 +128,6 @@ fn gen( }; ValidatorWallet { store, - account_key: account_sk, consensus_key: consensus_sk, eth_cold_key: eth_cold_sk, eth_hot_key, diff --git a/sdk/src/wallet/pre_genesis.rs b/sdk/src/wallet/pre_genesis.rs index a0c9d4d58e..abbb918470 100644 --- a/sdk/src/wallet/pre_genesis.rs +++ b/sdk/src/wallet/pre_genesis.rs @@ -30,8 +30,6 @@ pub enum ReadError { pub struct ValidatorWallet { /// The wallet store that can be written/read to/from TOML pub store: ValidatorStore, - /// Cryptographic keypair for validator account key - pub account_key: common::SecretKey, /// Cryptographic keypair for consensus key pub consensus_key: common::SecretKey, /// Cryptographic keypair for eth cold key @@ -46,8 +44,6 @@ pub struct ValidatorWallet { /// genesis setup. #[derive(Serialize, Deserialize, Debug)] pub struct ValidatorStore { - /// Cryptographic keypair for validator account key - pub account_key: wallet::StoredKeypair, /// Cryptographic keypair for consensus key pub consensus_key: wallet::StoredKeypair, /// Cryptographic keypair for eth cold key diff --git a/sdk/src/wallet/store.rs b/sdk/src/wallet/store.rs index 980aa6ae70..6c7b539c2d 100644 --- a/sdk/src/wallet/store.rs +++ b/sdk/src/wallet/store.rs @@ -612,14 +612,12 @@ impl Store { validator_alias: Alias, other: pre_genesis::ValidatorWallet, ) { - let account_key_alias = alias::validator_key(&validator_alias); let consensus_key_alias = alias::validator_consensus_key(&validator_alias); let tendermint_node_key_alias = alias::validator_tendermint_node_key(&validator_alias); let keys = [ - (account_key_alias.clone(), other.store.account_key), (consensus_key_alias.clone(), other.store.consensus_key), ( tendermint_node_key_alias.clone(), @@ -628,11 +626,9 @@ impl Store { ]; self.secret_keys.extend(keys.into_iter()); - let account_pk = other.account_key.ref_to(); let consensus_pk = other.consensus_key.ref_to(); let tendermint_node_pk = other.tendermint_node_key.ref_to(); let addresses = [ - (account_key_alias.clone(), (&account_pk).into()), (consensus_key_alias.clone(), (&consensus_pk).into()), ( tendermint_node_key_alias.clone(), @@ -642,7 +638,6 @@ impl Store { self.addresses.extend(addresses.into_iter()); let pkhs = [ - ((&account_pk).into(), account_key_alias), ((&consensus_pk).into(), consensus_key_alias), ((&tendermint_node_pk).into(), tendermint_node_key_alias), ]; diff --git a/tests/src/e2e/ibc_tests.rs b/tests/src/e2e/ibc_tests.rs index 08a864f3d1..b0d0cf47d1 100644 --- a/tests/src/e2e/ibc_tests.rs +++ b/tests/src/e2e/ibc_tests.rs @@ -73,6 +73,7 @@ use namada_apps::facade::tendermint::block::Header as TmHeader; use namada_apps::facade::tendermint::merkle::proof::ProofOps as TmProof; use namada_apps::facade::tendermint_config::net::Address as TendermintAddress; use namada_apps::facade::tendermint_rpc::{Client, HttpClient, Url}; +use namada_core::types::string_encoding::StringEncoded; use namada_sdk::masp::fs::FsShieldedUtils; use prost::Message; use setup::constants::*; @@ -263,13 +264,26 @@ fn setup_two_single_node_nets() -> Result<(Test, Test)> { // 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| val.tx.account_key.pk.raw == validator_pk) + .find(|val| val.address == validator_addr) .unwrap(); let new_port = validator_tx.tx.net_address.port() + setup::ANOTHER_CHAIN_PORT_OFFSET; From c4260b6bf8f564c0fc4ea942b613c22008188d0b Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 22 Nov 2023 15:05:35 +0000 Subject: [PATCH 108/175] Revert "Remove established account init CLI subcmd" This reverts commit c50b0e33c653a525cd6870e5e6c69d70acacecd6. --- apps/src/lib/cli.rs | 65 ++++++++++++++++++++ apps/src/lib/cli/client.rs | 3 + apps/src/lib/client/utils.rs | 67 +++++++++++++++++++++ apps/src/lib/config/genesis/transactions.rs | 34 +++++++++++ 4 files changed, 169 insertions(+) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index d6957bdd62..e675e75f15 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2180,6 +2180,7 @@ pub mod cmds { ValidateWasm(ValidateWasm), InitNetwork(InitNetwork), DeriveGenesisAddresses(DeriveGenesisAddresses), + InitGenesisEstablishedAccount(InitGenesisEstablishedAccount), InitGenesisValidator(InitGenesisValidator), PkToTmAddress(PkToTmAddress), DefaultBaseDir(DefaultBaseDir), @@ -2202,6 +2203,8 @@ pub mod cmds { SubCmd::parse(matches).map(Self::InitNetwork); let derive_addresses = SubCmd::parse(matches).map(Self::DeriveGenesisAddresses); + let init_established = SubCmd::parse(matches) + .map(Self::InitGenesisEstablishedAccount); let init_genesis = SubCmd::parse(matches).map(Self::InitGenesisValidator); let pk_to_tm_address = @@ -2218,6 +2221,7 @@ pub mod cmds { .or(validate_wasm) .or(init_network) .or(derive_addresses) + .or(init_established) .or(init_genesis) .or(pk_to_tm_address) .or(default_base_dir) @@ -2235,6 +2239,7 @@ pub mod cmds { .subcommand(ValidateWasm::def()) .subcommand(InitNetwork::def()) .subcommand(DeriveGenesisAddresses::def()) + .subcommand(InitGenesisEstablishedAccount::def()) .subcommand(InitGenesisValidator::def()) .subcommand(PkToTmAddress::def()) .subcommand(DefaultBaseDir::def()) @@ -2344,6 +2349,29 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct InitGenesisEstablishedAccount( + pub args::InitGenesisEstablishedAccount, + ); + + impl SubCmd for InitGenesisEstablishedAccount { + const CMD: &'static str = "init-genesis-established-account"; + + fn parse(matches: &ArgMatches) -> Option { + matches.subcommand_matches(Self::CMD).map(|matches| { + Self(args::InitGenesisEstablishedAccount::parse(matches)) + }) + } + + fn def() -> App { + App::new(Self::CMD) + .about( + "Initialize an established account available at genesis.", + ) + .add_args::() + } + } + #[derive(Clone, Debug)] pub struct InitGenesisValidator(pub args::InitGenesisValidator); @@ -2904,6 +2932,7 @@ pub mod args { pub const ALIAS_OPT: ArgOpt = ALIAS.opt(); pub const ALIAS: Arg = arg("alias"); pub const ALIAS_FORCE: ArgFlag = flag("alias-force"); + pub const ALIAS_MANY: ArgMulti = arg_multi("alias"); pub const ALLOW_DUPLICATE_IP: ArgFlag = flag("allow-duplicate-ip"); pub const AMOUNT: Arg = arg("amount"); pub const ARCHIVE_DIR: ArgOpt = arg_opt("archive-dir"); @@ -6739,6 +6768,42 @@ pub mod args { } } + #[derive(Clone, Debug)] + pub struct InitGenesisEstablishedAccount { + pub vp: String, + pub wallet_aliases: Vec, + pub threshold: u8, + } + + impl Args for InitGenesisEstablishedAccount { + fn parse(matches: &ArgMatches) -> Self { + let wallet_aliases = ALIAS_MANY.parse(matches); + let vp = VP.parse(matches).unwrap_or_else(|| "vp_user".to_string()); + let threshold = THRESOLD.parse(matches).unwrap_or(1); + Self { + wallet_aliases, + vp, + threshold, + } + } + + fn def(app: App) -> App { + app.arg( + ALIAS_MANY + .def() + .help("The aliases of the keys to use from the wallet."), + ) + .arg(THRESOLD.def().help( + "The minimum number of signatures to be provided for \ + authorization. Must be less than or equal to the maximum \ + number of key aliases provided.", + )) + .arg(VP.def().help( + "The validity predicate of the account. Defaults to `vp_user`.", + )) + } + } + #[derive(Clone, Debug)] pub struct InitGenesisValidator { pub alias: String, diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 472b7ae099..2f06a497d4 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -637,6 +637,9 @@ impl CliApi { Utils::DeriveGenesisAddresses(DeriveGenesisAddresses(args)) => { utils::derive_genesis_addresses(global_args, args) } + Utils::InitGenesisEstablishedAccount( + InitGenesisEstablishedAccount(args), + ) => utils::init_genesis_established_account(global_args, args), Utils::InitGenesisValidator(InitGenesisValidator(args)) => { utils::init_genesis_validator(global_args, args) } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 489c1af2eb..f7a18ed867 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -9,6 +9,8 @@ use color_eyre::owo_colors::OwoColorize; use flate2::read::GzDecoder; use flate2::write::GzEncoder; use flate2::Compression; +use itertools::Itertools; +use namada::core::types::string_encoding::StringEncoded; use namada::types::chain::ChainId; use namada::types::dec::Dec; use namada::types::key::*; @@ -665,6 +667,62 @@ pub fn derive_genesis_addresses( } } +/// Initialize a genesis established account. +/// key into a special "pre-genesis" wallet. +pub fn init_genesis_established_account( + global_args: args::Global, + args: args::InitGenesisEstablishedAccount, +) { + let (mut pre_genesis_wallet, _) = + load_pre_genesis_wallet_or_exit(&global_args.base_dir); + + let public_keys: Vec<_> = args + .wallet_aliases + .iter() + .map(|alias| { + let sk = pre_genesis_wallet + .find_secret_key(alias, None) + .unwrap_or_else(|err| { + eprintln!( + "Failed to look-up `{alias}` in the pre-genesis \ + wallet: {err}", + ); + safe_exit(1) + }); + StringEncoded::new(sk.ref_to()) + }) + .collect(); + + let (address, txs) = genesis::transactions::init_established_account( + args.vp, + public_keys, + args.threshold, + ); + let toml_path = { + let pre_genesis_dir = global_args.base_dir.join(PRE_GENESIS_DIR); + established_acc_pre_genesis_txs_file( + &args.wallet_aliases.iter().join("_"), + &pre_genesis_dir, + ) + }; + let toml_path_str = toml_path.to_string_lossy(); + + let genesis_part = toml::to_string(&txs).unwrap(); + fs::write(&toml_path, genesis_part).unwrap_or_else(|err| { + eprintln!( + "Couldn't write pre-genesis transactions file to {toml_path_str}. \ + Failed with: {err}", + ); + safe_exit(1) + }); + + println!( + "{}: {address}", + "Derived established account address".bold() + ); + println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); +} + /// Initialize genesis validator's address, consensus key and validator account /// key into a special "pre-genesis" wallet. pub fn init_genesis_validator( @@ -838,6 +896,15 @@ pub fn validator_pre_genesis_txs_file(pre_genesis_path: &Path) -> PathBuf { pre_genesis_path.join("transactions.toml") } +/// The default path to an established account txs file. +pub fn established_acc_pre_genesis_txs_file( + wallet_key_alias: &str, + pre_genesis_path: &Path, +) -> PathBuf { + pre_genesis_path + .join(format!("established-account-tx-{wallet_key_alias}.toml")) +} + /// The default validator pre-genesis directory pub fn validator_pre_genesis_dir(base_dir: &Path, alias: &str) -> PathBuf { base_dir.join(PRE_GENESIS_DIR).join(alias) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 7ad8979e06..6bf25be086 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -88,6 +88,25 @@ pub fn parse_unsigned( toml::from_slice(bytes) } +/// Create signed [`Transactions`] for an established account. +pub fn init_established_account( + vp: String, + public_keys: Vec>, + threshold: u8, +) -> (Address, Transactions) { + let unsigned_tx = EstablishedAccountTx { + vp, + threshold, + public_keys, + }; + let address = unsigned_tx.derive_address(); + let txs = Transactions { + established_account: Some(vec![unsigned_tx]), + ..Default::default() + }; + (address, txs) +} + /// Create [`UnsignedTransactions`] for a genesis validator. pub fn init_validator( GenesisValidatorData { @@ -837,6 +856,21 @@ pub fn validate_established_account( eprintln!("An established account may not have zero thresold"); is_valid = false; } + if tx.threshold as usize > tx.public_keys.len() { + eprintln!( + "An established account may not have a threshold ({}) greater \ + than the number of public keys associated with it ({})", + tx.threshold, + tx.public_keys.len() + ); + is_valid = false; + } + if tx.public_keys.len() > u8::MAX as usize { + eprintln!( + "The number of configured public keys is way too fucking big" + ); + is_valid = false; + } established_accounts.insert( established_address.clone(), ( From 974ecea8ee6223965211bfa7faccc6d1d401557e Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 22 Nov 2023 15:51:54 +0000 Subject: [PATCH 109/175] Unify genesis templates --- apps/src/lib/cli.rs | 55 ++++++++++ apps/src/lib/cli/client.rs | 3 + apps/src/lib/client/utils.rs | 114 ++++++++++++++++++++ apps/src/lib/config/genesis/transactions.rs | 7 ++ 4 files changed, 179 insertions(+) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index e675e75f15..ac6de317db 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2187,6 +2187,7 @@ pub mod cmds { EpochSleep(EpochSleep), ValidateGenesisTemplates(ValidateGenesisTemplates), SignGenesisTx(SignGenesisTx), + UnifyGenesisTemplates(UnifyGenesisTemplates), } impl SubCmd for Utils { @@ -2216,6 +2217,8 @@ pub mod cmds { SubCmd::parse(matches).map(Self::ValidateGenesisTemplates); let genesis_tx = SubCmd::parse(matches).map(Self::SignGenesisTx); + let unify_genesis_templates = + SubCmd::parse(matches).map(Self::UnifyGenesisTemplates); join_network .or(fetch_wasms) .or(validate_wasm) @@ -2228,6 +2231,7 @@ pub mod cmds { .or(epoch_sleep) .or(validate_genesis_templates) .or(genesis_tx) + .or(unify_genesis_templates) }) } @@ -2246,6 +2250,7 @@ pub mod cmds { .subcommand(EpochSleep::def()) .subcommand(ValidateGenesisTemplates::def()) .subcommand(SignGenesisTx::def()) + .subcommand(UnifyGenesisTemplates::def()) .subcommand_required(true) .arg_required_else_help(true) } @@ -2349,6 +2354,28 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct UnifyGenesisTemplates(pub args::UnifyGenesisTemplates); + + impl SubCmd for UnifyGenesisTemplates { + const CMD: &'static str = "unify-genesis-templates"; + + fn parse(matches: &ArgMatches) -> Option { + matches.subcommand_matches(Self::CMD).map(|matches| { + Self(args::UnifyGenesisTemplates::parse(matches)) + }) + } + + fn def() -> App { + App::new(Self::CMD) + .about( + "Concatenate all the given genesis templates into a \ + single (unified) genesis transactions file.", + ) + .add_args::() + } + } + #[derive(Clone, Debug)] pub struct InitGenesisEstablishedAccount( pub args::InitGenesisEstablishedAccount, @@ -3063,6 +3090,7 @@ pub mod args { pub const OWNER: Arg = arg("owner"); pub const OWNER_OPT: ArgOpt = OWNER.opt(); pub const PATH: Arg = arg("path"); + pub const PATH_MANY: ArgMulti = arg_multi("path"); pub const PIN: ArgFlag = flag("pin"); pub const PORT_ID: ArgDefault = arg_default( "port-id", @@ -3101,6 +3129,7 @@ pub mod args { pub const SIGNING_KEY: Arg = arg("signing-key"); pub const SIGNING_KEYS: ArgMulti = arg_multi("signing-keys"); pub const SIGNATURES: ArgMulti = arg_multi("signatures"); + pub const SIGNED: ArgFlag = flag("signed"); pub const SOURCE: Arg = arg("source"); pub const SOURCE_OPT: ArgOpt = SOURCE.opt(); pub const STEWARD: Arg = arg("steward"); @@ -6804,6 +6833,32 @@ pub mod args { } } + #[derive(Clone, Debug)] + pub struct UnifyGenesisTemplates { + pub paths: Vec, + pub signed: bool, + } + + impl Args for UnifyGenesisTemplates { + fn parse(matches: &ArgMatches) -> Self { + let paths = PATH_MANY.parse(matches); + let signed = SIGNED.parse(matches); + Self { paths, signed } + } + + fn def(app: App) -> App { + app.arg(PATH_MANY.def().help( + "Paths to genesis transaction toml files. Repeat as many \ + times as needed.", + )) + .arg( + SIGNED.def().help( + "Whether the genesis tx toml files are signed or not.", + ), + ) + } + } + #[derive(Clone, Debug)] pub struct InitGenesisValidator { pub alias: String, diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 2f06a497d4..1dc76054af 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -666,6 +666,9 @@ impl CliApi { Utils::SignGenesisTx(SignGenesisTx(args)) => { utils::sign_genesis_tx(global_args, args) } + Utils::UnifyGenesisTemplates(UnifyGenesisTemplates(args)) => { + utils::unify_genesis_templates(args) + } }, } Ok(()) diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index f7a18ed867..c2d2a0050d 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -809,6 +809,120 @@ pub fn init_genesis_validator( println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); } +/// Concatenate all the given genesis templates into a single (unified) +/// genesis transactions file. +pub fn unify_genesis_templates( + args::UnifyGenesisTemplates { signed, paths }: args::UnifyGenesisTemplates, +) { + if signed { + unify_genesis_templates_signed(&paths); + } else { + unify_genesis_templates_unsigned(&paths); + } +} + +fn unify_genesis_templates_signed(paths: &[PathBuf]) { + let mut transactions = genesis::transactions::Transactions::< + genesis::templates::Unvalidated, + > { + established_account: Some(vec![]), + validator_account: Some(vec![]), + bond: Some(vec![]), + }; + + for path in paths { + let contents = fs::read(path).unwrap_or_else(|err| { + eprintln!( + "Unable to read from file {}. Failed with {err}.", + path.to_string_lossy() + ); + safe_exit(1); + }); + let mut parsed = genesis::transactions::parse_signed(&contents) + .unwrap_or_else(|err| { + eprintln!( + "Unable to parse the TOML from {}. Failed with {err}.", + path.to_string_lossy() + ); + safe_exit(1); + }); + + if let Some((accum, txs)) = transactions + .established_account + .as_mut() + .zip(parsed.established_account.as_mut()) + { + accum.append(txs); + } + + if let Some((accum, txs)) = transactions + .validator_account + .as_mut() + .zip(parsed.validator_account.as_mut()) + { + accum.append(txs); + } + + if let Some((accum, txs)) = + transactions.bond.as_mut().zip(parsed.bond.as_mut()) + { + accum.append(txs); + } + } + + println!("{}", toml::to_string(&transactions).unwrap()); +} + +fn unify_genesis_templates_unsigned(paths: &[PathBuf]) { + let mut transactions = genesis::transactions::UnsignedTransactions { + established_account: Some(vec![]), + validator_account: Some(vec![]), + bond: Some(vec![]), + }; + + for path in paths { + let contents = fs::read(path).unwrap_or_else(|err| { + eprintln!( + "Unable to read from file {}. Failed with {err}.", + path.to_string_lossy() + ); + safe_exit(1); + }); + let mut parsed = genesis::transactions::parse_unsigned(&contents) + .unwrap_or_else(|err| { + eprintln!( + "Unable to parse the TOML from {}. Failed with {err}.", + path.to_string_lossy() + ); + safe_exit(1); + }); + + if let Some((accum, txs)) = transactions + .established_account + .as_mut() + .zip(parsed.established_account.as_mut()) + { + accum.append(txs); + } + + if let Some((accum, txs)) = transactions + .validator_account + .as_mut() + .zip(parsed.validator_account.as_mut()) + { + accum.append(txs); + } + + if let Some((accum, txs)) = + transactions.bond.as_mut().zip(parsed.bond.as_mut()) + { + accum.append(txs); + } + } + + println!("{}", toml::to_string(&transactions).unwrap()); +} + /// Try to load a pre-genesis wallet or return nothing, /// if it cannot be found. pub fn try_load_pre_genesis_wallet( diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 6bf25be086..7ef398c7a5 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -88,6 +88,13 @@ pub fn parse_unsigned( toml::from_slice(bytes) } +/// Parse [`Transactions`] from bytes. +pub fn parse_signed( + bytes: &[u8], +) -> Result, toml::de::Error> { + toml::from_slice(bytes) +} + /// Create signed [`Transactions`] for an established account. pub fn init_established_account( vp: String, From 0232679ecbaa8b9404e251cac16fb12114b4fafb Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 23 Nov 2023 10:14:01 +0100 Subject: [PATCH 110/175] Revert "Unify genesis templates" This reverts commit b95c14bc0b9f5312061ed7db328918d5add53ba3. --- apps/src/lib/cli.rs | 55 ---------- apps/src/lib/cli/client.rs | 3 - apps/src/lib/client/utils.rs | 114 -------------------- apps/src/lib/config/genesis/transactions.rs | 7 -- 4 files changed, 179 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index ac6de317db..e675e75f15 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2187,7 +2187,6 @@ pub mod cmds { EpochSleep(EpochSleep), ValidateGenesisTemplates(ValidateGenesisTemplates), SignGenesisTx(SignGenesisTx), - UnifyGenesisTemplates(UnifyGenesisTemplates), } impl SubCmd for Utils { @@ -2217,8 +2216,6 @@ pub mod cmds { SubCmd::parse(matches).map(Self::ValidateGenesisTemplates); let genesis_tx = SubCmd::parse(matches).map(Self::SignGenesisTx); - let unify_genesis_templates = - SubCmd::parse(matches).map(Self::UnifyGenesisTemplates); join_network .or(fetch_wasms) .or(validate_wasm) @@ -2231,7 +2228,6 @@ pub mod cmds { .or(epoch_sleep) .or(validate_genesis_templates) .or(genesis_tx) - .or(unify_genesis_templates) }) } @@ -2250,7 +2246,6 @@ pub mod cmds { .subcommand(EpochSleep::def()) .subcommand(ValidateGenesisTemplates::def()) .subcommand(SignGenesisTx::def()) - .subcommand(UnifyGenesisTemplates::def()) .subcommand_required(true) .arg_required_else_help(true) } @@ -2354,28 +2349,6 @@ pub mod cmds { } } - #[derive(Clone, Debug)] - pub struct UnifyGenesisTemplates(pub args::UnifyGenesisTemplates); - - impl SubCmd for UnifyGenesisTemplates { - const CMD: &'static str = "unify-genesis-templates"; - - fn parse(matches: &ArgMatches) -> Option { - matches.subcommand_matches(Self::CMD).map(|matches| { - Self(args::UnifyGenesisTemplates::parse(matches)) - }) - } - - fn def() -> App { - App::new(Self::CMD) - .about( - "Concatenate all the given genesis templates into a \ - single (unified) genesis transactions file.", - ) - .add_args::() - } - } - #[derive(Clone, Debug)] pub struct InitGenesisEstablishedAccount( pub args::InitGenesisEstablishedAccount, @@ -3090,7 +3063,6 @@ pub mod args { pub const OWNER: Arg = arg("owner"); pub const OWNER_OPT: ArgOpt = OWNER.opt(); pub const PATH: Arg = arg("path"); - pub const PATH_MANY: ArgMulti = arg_multi("path"); pub const PIN: ArgFlag = flag("pin"); pub const PORT_ID: ArgDefault = arg_default( "port-id", @@ -3129,7 +3101,6 @@ pub mod args { pub const SIGNING_KEY: Arg = arg("signing-key"); pub const SIGNING_KEYS: ArgMulti = arg_multi("signing-keys"); pub const SIGNATURES: ArgMulti = arg_multi("signatures"); - pub const SIGNED: ArgFlag = flag("signed"); pub const SOURCE: Arg = arg("source"); pub const SOURCE_OPT: ArgOpt = SOURCE.opt(); pub const STEWARD: Arg = arg("steward"); @@ -6833,32 +6804,6 @@ pub mod args { } } - #[derive(Clone, Debug)] - pub struct UnifyGenesisTemplates { - pub paths: Vec, - pub signed: bool, - } - - impl Args for UnifyGenesisTemplates { - fn parse(matches: &ArgMatches) -> Self { - let paths = PATH_MANY.parse(matches); - let signed = SIGNED.parse(matches); - Self { paths, signed } - } - - fn def(app: App) -> App { - app.arg(PATH_MANY.def().help( - "Paths to genesis transaction toml files. Repeat as many \ - times as needed.", - )) - .arg( - SIGNED.def().help( - "Whether the genesis tx toml files are signed or not.", - ), - ) - } - } - #[derive(Clone, Debug)] pub struct InitGenesisValidator { pub alias: String, diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 1dc76054af..2f06a497d4 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -666,9 +666,6 @@ impl CliApi { Utils::SignGenesisTx(SignGenesisTx(args)) => { utils::sign_genesis_tx(global_args, args) } - Utils::UnifyGenesisTemplates(UnifyGenesisTemplates(args)) => { - utils::unify_genesis_templates(args) - } }, } Ok(()) diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index c2d2a0050d..f7a18ed867 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -809,120 +809,6 @@ pub fn init_genesis_validator( println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); } -/// Concatenate all the given genesis templates into a single (unified) -/// genesis transactions file. -pub fn unify_genesis_templates( - args::UnifyGenesisTemplates { signed, paths }: args::UnifyGenesisTemplates, -) { - if signed { - unify_genesis_templates_signed(&paths); - } else { - unify_genesis_templates_unsigned(&paths); - } -} - -fn unify_genesis_templates_signed(paths: &[PathBuf]) { - let mut transactions = genesis::transactions::Transactions::< - genesis::templates::Unvalidated, - > { - established_account: Some(vec![]), - validator_account: Some(vec![]), - bond: Some(vec![]), - }; - - for path in paths { - let contents = fs::read(path).unwrap_or_else(|err| { - eprintln!( - "Unable to read from file {}. Failed with {err}.", - path.to_string_lossy() - ); - safe_exit(1); - }); - let mut parsed = genesis::transactions::parse_signed(&contents) - .unwrap_or_else(|err| { - eprintln!( - "Unable to parse the TOML from {}. Failed with {err}.", - path.to_string_lossy() - ); - safe_exit(1); - }); - - if let Some((accum, txs)) = transactions - .established_account - .as_mut() - .zip(parsed.established_account.as_mut()) - { - accum.append(txs); - } - - if let Some((accum, txs)) = transactions - .validator_account - .as_mut() - .zip(parsed.validator_account.as_mut()) - { - accum.append(txs); - } - - if let Some((accum, txs)) = - transactions.bond.as_mut().zip(parsed.bond.as_mut()) - { - accum.append(txs); - } - } - - println!("{}", toml::to_string(&transactions).unwrap()); -} - -fn unify_genesis_templates_unsigned(paths: &[PathBuf]) { - let mut transactions = genesis::transactions::UnsignedTransactions { - established_account: Some(vec![]), - validator_account: Some(vec![]), - bond: Some(vec![]), - }; - - for path in paths { - let contents = fs::read(path).unwrap_or_else(|err| { - eprintln!( - "Unable to read from file {}. Failed with {err}.", - path.to_string_lossy() - ); - safe_exit(1); - }); - let mut parsed = genesis::transactions::parse_unsigned(&contents) - .unwrap_or_else(|err| { - eprintln!( - "Unable to parse the TOML from {}. Failed with {err}.", - path.to_string_lossy() - ); - safe_exit(1); - }); - - if let Some((accum, txs)) = transactions - .established_account - .as_mut() - .zip(parsed.established_account.as_mut()) - { - accum.append(txs); - } - - if let Some((accum, txs)) = transactions - .validator_account - .as_mut() - .zip(parsed.validator_account.as_mut()) - { - accum.append(txs); - } - - if let Some((accum, txs)) = - transactions.bond.as_mut().zip(parsed.bond.as_mut()) - { - accum.append(txs); - } - } - - println!("{}", toml::to_string(&transactions).unwrap()); -} - /// Try to load a pre-genesis wallet or return nothing, /// if it cannot be found. pub fn try_load_pre_genesis_wallet( diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 7ef398c7a5..6bf25be086 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -88,13 +88,6 @@ pub fn parse_unsigned( toml::from_slice(bytes) } -/// Parse [`Transactions`] from bytes. -pub fn parse_signed( - bytes: &[u8], -) -> Result, toml::de::Error> { - toml::from_slice(bytes) -} - /// Create signed [`Transactions`] for an established account. pub fn init_established_account( vp: String, From 5138fb1d8f9190c9fd135fe1b904febd169df59d Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 23 Nov 2023 15:05:28 +0100 Subject: [PATCH 111/175] [feat]: Fixed cli tooling for multi-signing txs --- apps/src/lib/cli.rs | 17 +- apps/src/lib/client/utils.rs | 238 +++++++++++++------- apps/src/lib/config/genesis/templates.rs | 12 +- apps/src/lib/config/genesis/transactions.rs | 59 +++-- core/src/types/token.rs | 6 + 5 files changed, 228 insertions(+), 104 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index e675e75f15..e3cf07fffc 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2389,7 +2389,8 @@ pub mod cmds { .about( "Initialize genesis validator's address, consensus key \ and validator account key and use it in the ledger's \ - node.", + node. Appends validator creation and self-bond txs to a \ + .toml file containing an established account tx.", ) .add_args::() } @@ -6773,6 +6774,7 @@ pub mod args { pub vp: String, pub wallet_aliases: Vec, pub threshold: u8, + pub output_path: PathBuf, } impl Args for InitGenesisEstablishedAccount { @@ -6780,10 +6782,12 @@ pub mod args { let wallet_aliases = ALIAS_MANY.parse(matches); let vp = VP.parse(matches).unwrap_or_else(|| "vp_user".to_string()); let threshold = THRESOLD.parse(matches).unwrap_or(1); + let output_path = PATH.parse(matches); Self { wallet_aliases, vp, threshold, + output_path, } } @@ -6801,6 +6805,10 @@ pub mod args { .arg(VP.def().help( "The validity predicate of the account. Defaults to `vp_user`.", )) + .arg(PATH.def().help( + "The path of the .toml file to write the established account \ + transaction to. Overwrites the file if it exists.", + )) } } @@ -6818,6 +6826,7 @@ pub mod args { pub website: Option, pub discord_handle: Option, pub address: EstablishedAddress, + pub tx_path: PathBuf, } impl Args for InitGenesisValidator { @@ -6836,6 +6845,7 @@ pub mod args { let website = WEBSITE_OPT.parse(matches); let discord_handle = DISCORD_OPT.parse(matches); let address = RAW_ADDRESS_ESTABLISHED.parse(matches); + let tx_path = PATH.parse(matches); Self { alias, net_address, @@ -6848,6 +6858,7 @@ pub mod args { description, website, discord_handle, + tx_path, address, } } @@ -6858,6 +6869,10 @@ pub mod args { "The address of an established account to be promoted to \ a validator.", )) + .arg(PATH.def().help( + "The .toml file containing an established account tx from \ + which to create a validator.", + )) .arg(NET_ADDRESS.def().help( "Static {host:port} of your validator node's P2P address. \ Namada uses port `26656` for P2P connections by default, \ diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index f7a18ed867..a190617bf7 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -9,7 +9,6 @@ use color_eyre::owo_colors::OwoColorize; use flate2::read::GzDecoder; use flate2::write::GzEncoder; use flate2::Compression; -use itertools::Itertools; use namada::core::types::string_encoding::StringEncoded; use namada::types::chain::ChainId; use namada::types::dec::Dec; @@ -25,6 +24,9 @@ use sha2::{Digest, Sha256}; use crate::cli::args; use crate::cli::context::ENV_VAR_WASM_DIR; use crate::config::genesis::chain::DeriveEstablishedAddress; +use crate::config::genesis::transactions::{ + sign_delegation_bond_tx, UnsignedTransactions, +}; use crate::config::global::GlobalConfig; use crate::config::{ self, genesis, get_default_namada_folder, Config, TendermintMode, @@ -598,21 +600,51 @@ pub fn derive_genesis_addresses( let maybe_pre_genesis_wallet = try_load_pre_genesis_wallet(&global_args.base_dir) .map(|(wallet, _)| wallet); - - let genesis_txs = - genesis::templates::read_transactions(&args.genesis_txs_path).unwrap(); + let contents = + fs::read_to_string(&args.genesis_txs_path).unwrap_or_else(|err| { + eprintln!( + "Unable to read from file {}. Failed with error {err}.", + args.genesis_txs_path.to_string_lossy() + ); + safe_exit(1) + }); + let (estbd_txs, validator_addrs) = + toml::from_str::<'_, UnsignedTransactions>(&contents) + .ok() + .map(|txs| { + ( + txs.established_account.unwrap_or_default(), + txs.validator_account + .unwrap_or_default() + .into_iter() + .map(|acct| acct.address) + .collect::>(), + ) + }) + .unwrap_or_else(|| { + let genesis_txs = genesis::templates::read_transactions( + &args.genesis_txs_path, + ) + .unwrap(); + ( + genesis_txs.established_account.unwrap_or_default(), + genesis_txs + .validator_account + .unwrap_or_default() + .into_iter() + .map(|acct| acct.address) + .collect(), + ) + }); println!("{}", "Established account txs:".underline().bold()); - for tx in genesis_txs - .established_account - .as_ref() - .into_iter() - .flatten() - { - let address = tx.derive_address(); - + for tx in &estbd_txs { println!(); - println!("{} {address}", "Address:".bold().bright_green()); + println!( + "{} {}", + "Address:".bold().bright_green(), + tx.derive_address() + ); println!("{}", "Public key(s):".bold().bright_green()); for (ix, pk) in tx.public_keys.iter().enumerate() { @@ -629,39 +661,18 @@ pub fn derive_genesis_addresses( } } } - if genesis_txs - .established_account - .as_ref() - .map(|txs| txs.is_empty()) - .unwrap_or(true) - { + if estbd_txs.is_empty() { println!(); println!("{}", "".dimmed()); } - println!(); println!("{}", "Validator account txs:".underline().bold()); - for tx in genesis_txs.validator_account.as_ref().into_iter().flatten() { + for addr in &validator_addrs { println!(); - println!("{} {}", "Address:".bold().bright_green(), tx.address); - let keys = [ - ("Consensus key:", &tx.consensus_key.pk.raw), - ("Protocol key:", &tx.protocol_key.pk.raw), - ("Tendermint node key:", &tx.tendermint_node_key.pk.raw), - ("Ethereum hot key:", &tx.eth_hot_key.pk.raw), - ("Ethereum cold key:", &tx.eth_cold_key.pk.raw), - ]; - for (description, key) in keys { - println!("{} {key}", description.bold().bright_green()); - } + println!("{} {}", "Address:".bold().bright_green(), addr.raw); } - if genesis_txs - .validator_account - .as_ref() - .map(|txs| txs.is_empty()) - .unwrap_or(true) - { + if validator_addrs.is_empty() { println!(); println!("{}", "".dimmed()); } @@ -673,23 +684,23 @@ pub fn init_genesis_established_account( global_args: args::Global, args: args::InitGenesisEstablishedAccount, ) { - let (mut pre_genesis_wallet, _) = + let (pre_genesis_wallet, _) = load_pre_genesis_wallet_or_exit(&global_args.base_dir); let public_keys: Vec<_> = args .wallet_aliases .iter() .map(|alias| { - let sk = pre_genesis_wallet - .find_secret_key(alias, None) - .unwrap_or_else(|err| { + let pk = pre_genesis_wallet.find_public_key(alias).unwrap_or_else( + |err| { eprintln!( "Failed to look-up `{alias}` in the pre-genesis \ wallet: {err}", ); safe_exit(1) - }); - StringEncoded::new(sk.ref_to()) + }, + ); + StringEncoded::new(pk) }) .collect(); @@ -698,13 +709,7 @@ pub fn init_genesis_established_account( public_keys, args.threshold, ); - let toml_path = { - let pre_genesis_dir = global_args.base_dir.join(PRE_GENESIS_DIR); - established_acc_pre_genesis_txs_file( - &args.wallet_aliases.iter().join("_"), - &pre_genesis_dir, - ) - }; + let toml_path = args.output_path; let toml_path_str = toml_path.to_string_lossy(); let genesis_part = toml::to_string(&txs).unwrap(); @@ -717,8 +722,9 @@ pub fn init_genesis_established_account( }); println!( - "{}: {address}", - "Derived established account address".bold() + "{}: {}", + "Derived established account address".bold(), + address.green(), ); println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); } @@ -739,9 +745,36 @@ pub fn init_genesis_validator( description, website, discord_handle, + tx_path, address, }: args::InitGenesisValidator, ) { + let contents = fs::read_to_string(&tx_path).unwrap_or_else(|err| { + eprintln!( + "Unable to read from file {}. Failed with error {err}.", + tx_path.to_string_lossy() + ); + safe_exit(1) + }); + let prev_txs: UnsignedTransactions = toml::from_str(&contents).unwrap(); + if prev_txs + .established_account + .as_ref() + .and_then(|accts| { + accts + .iter() + .find(|acct| acct.derive_established_address() == address) + }) + .is_none() + { + eprintln!( + "The provided file did not contain an established account tx with \ + the provided address {}", + address + ); + safe_exit(1); + } + // Validate the commission rate data if commission_rate > Dec::one() { eprintln!("The validator commission rate must not exceed 1.0 or 100%"); @@ -779,7 +812,7 @@ pub fn init_genesis_validator( pre_genesis::validator_file_name(&pre_genesis_dir).to_string_lossy() ); - let (address, transactions) = genesis::transactions::init_validator( + let (address, mut transactions) = genesis::transactions::init_validator( genesis::transactions::GenesisValidatorData { address, commission_rate, @@ -793,8 +826,20 @@ pub fn init_genesis_validator( }, &validator_wallet, ); - let toml_path = validator_pre_genesis_txs_file(&pre_genesis_dir); + let toml_path = tx_path; let toml_path_str = toml_path.to_string_lossy(); + // append new transactions to the previous txs from the provided file. + transactions.established_account = prev_txs.established_account; + transactions + .validator_account + .as_mut() + .unwrap() + .append(&mut prev_txs.validator_account.unwrap_or_default()); + transactions + .bond + .as_mut() + .unwrap() + .append(&mut prev_txs.bond.unwrap_or_default()); let genesis_part = toml::to_string(&transactions).unwrap(); fs::write(&toml_path, genesis_part).unwrap_or_else(|err| { @@ -805,7 +850,11 @@ pub fn init_genesis_validator( safe_exit(1) }); - println!("{}: {address}", "Derived validator account address".bold()); + println!( + "{}: {}", + "Validator account address".bold(), + address.green() + ); println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); } @@ -896,15 +945,6 @@ pub fn validator_pre_genesis_txs_file(pre_genesis_path: &Path) -> PathBuf { pre_genesis_path.join("transactions.toml") } -/// The default path to an established account txs file. -pub fn established_acc_pre_genesis_txs_file( - wallet_key_alias: &str, - pre_genesis_path: &Path, -) -> PathBuf { - pre_genesis_path - .join(format!("established-account-tx-{wallet_key_alias}.toml")) -} - /// The default validator pre-genesis directory pub fn validator_pre_genesis_dir(base_dir: &Path, alias: &str) -> PathBuf { base_dir.join(PRE_GENESIS_DIR).join(alias) @@ -931,35 +971,67 @@ pub fn sign_genesis_tx( ) { let (mut wallet, _wallet_file) = load_pre_genesis_wallet_or_exit(&global_args.base_dir); - + let maybe_pre_genesis_wallet = validator_alias.and_then(|alias| { + let pre_genesis_dir = + validator_pre_genesis_dir(&global_args.base_dir, &alias); + pre_genesis::load(&pre_genesis_dir).ok() + }); let contents = fs::read(&path).unwrap_or_else(|err| { eprintln!( "Unable to read from file {}. Failed with {err}.", path.to_string_lossy() ); - safe_exit(1); + safe_exit(1) }); - let unsigned = genesis::transactions::parse_unsigned(&contents) + let (signed, append) = genesis::transactions::parse_unsigned(&contents) + .map(|unsigned| { + ( + genesis::transactions::sign_txs( + unsigned, + &mut wallet, + maybe_pre_genesis_wallet.as_ref(), + ), + true, + ) + }) .unwrap_or_else(|err| { - eprintln!( - "Unable to parse the TOML from {}. Failed with {err}.", - path.to_string_lossy() - ); - safe_exit(1); + let mut genesis_txs = genesis::templates::read_transactions(&path) + .unwrap_or_else(|e| { + eprintln!( + "Unable to parse the TOML from {}. Could not parse as \ + unsigned with {err}. Could not parse as signed with \ + {e}.", + path.to_string_lossy() + ); + safe_exit(1) + }); + // Sign bond txs + let bond = genesis_txs.bond.map(|txs| { + txs.into_iter() + .map(|tx| { + sign_delegation_bond_tx( + tx, + &mut wallet, + &genesis_txs.established_account, + ) + }) + .collect() + }); + genesis_txs.bond = bond; + (genesis_txs, false) }); - let maybe_pre_genesis_wallet = validator_alias.and_then(|alias| { - let pre_genesis_dir = - validator_pre_genesis_dir(&global_args.base_dir, &alias); - crate::wallet::pre_genesis::load(&pre_genesis_dir).ok() - }); - let signed = genesis::transactions::sign_txs( - unsigned, - &mut wallet, - maybe_pre_genesis_wallet.as_ref(), - ); match output { Some(output_path) => { + let signed = if append { + let mut prev_txs = + genesis::templates::read_transactions(&output_path) + .unwrap_or_default(); + prev_txs.merge(signed); + prev_txs + } else { + signed + }; let transactions = toml::to_vec(&signed).unwrap(); fs::write(&output_path, transactions).unwrap_or_else(|err| { eprintln!( diff --git a/apps/src/lib/config/genesis/templates.rs b/apps/src/lib/config/genesis/templates.rs index 620c00a77e..ba7a4bc682 100644 --- a/apps/src/lib/config/genesis/templates.rs +++ b/apps/src/lib/config/genesis/templates.rs @@ -502,6 +502,8 @@ impl TokenBalances { BorshSerialize, PartialEq, Eq, + PartialOrd, + Ord, )] pub struct Unvalidated {} @@ -514,6 +516,8 @@ pub struct Unvalidated {} BorshSerialize, PartialEq, Eq, + PartialOrd, + Ord, )] pub struct Validated {} @@ -525,7 +529,9 @@ pub trait TemplateValidation: Serialize { + BorshSerialize + BorshDeserialize + PartialEq - + Eq; + + Eq + + PartialOrd + + Ord; type Balances: for<'a> Deserialize<'a> + Serialize + Clone @@ -541,7 +547,9 @@ pub trait TemplateValidation: Serialize { + BorshSerialize + BorshDeserialize + PartialEq - + Eq; + + Eq + + PartialOrd + + Ord; type GasMinimums: for<'a> Deserialize<'a> + Serialize + Clone diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 6bf25be086..5eab9b4073 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -6,6 +6,7 @@ use std::net::SocketAddr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; +use itertools::Itertools; use namada::core::types::address::{Address, EstablishedAddress}; use namada::core::types::string_encoding::StringEncoded; use namada::ledger::pos::types::ValidatorMetaData; @@ -61,7 +62,9 @@ pub fn sign_txs( // Sign bond txs let bond = bond.map(|txs| { txs.into_iter() - .map(|tx| sign_delegation_bond_tx(tx, wallet, &established_account)) + .map(|tx| { + sign_delegation_bond_tx(tx.into(), wallet, &established_account) + }) .collect() }); @@ -69,8 +72,15 @@ pub fn sign_txs( let validator_account = validator_account.map(|txs| { let validator_wallet = validator_wallet .expect("Validator wallet required to sign validator account txs"); + let tnk = validator_wallet.tendermint_node_key.ref_to(); txs.into_iter() - .map(|tx| sign_validator_account_tx(tx, validator_wallet)) + .filter_map(|tx| { + if tx.tendermint_node_key.raw == tnk { + Some(sign_validator_account_tx(tx, validator_wallet)) + } else { + None + } + }) .collect() }); @@ -251,15 +261,14 @@ pub fn sign_validator_account_tx( } pub fn sign_delegation_bond_tx( - unsigned_tx: BondTx, + mut to_sign: SignedBondTx, wallet: &mut Wallet, established_accounts: &Option>, ) -> SignedBondTx { let source_keys = - look_up_sk_from(&unsigned_tx.source, wallet, established_accounts); - let mut signed = SignedBondTx::from(unsigned_tx); - signed.sign(&source_keys); - signed + look_up_sk_from(&to_sign.data.source, wallet, established_accounts); + to_sign.sign(&source_keys); + to_sign } pub fn sign_tx( @@ -300,7 +309,8 @@ impl Transactions { } txs }) - .or(other.established_account); + .or(other.established_account) + .map(|txs| txs.into_iter().sorted().dedup().collect()); self.validator_account = self .validator_account .take() @@ -310,7 +320,8 @@ impl Transactions { } txs }) - .or(other.validator_account); + .or(other.validator_account) + .map(|txs| txs.into_iter().sorted().dedup().collect()); self.bond = self .bond .take() @@ -320,7 +331,8 @@ impl Transactions { } txs }) - .or(other.bond); + .or(other.bond) + .map(|txs| txs.into_iter().sorted().dedup().collect()); } } @@ -397,8 +409,10 @@ pub type SignedValidatorAccountTx = ValidatorAccountTx; BorshDeserialize, PartialEq, Eq, + PartialOrd, + Ord, )] -pub struct ValidatorAccountTx { +pub struct ValidatorAccountTx { /// The address of the validator. pub address: StringEncoded, // TODO: remove the vp field @@ -429,6 +443,8 @@ pub struct ValidatorAccountTx { BorshDeserialize, PartialEq, Eq, + PartialOrd, + Ord, )] pub struct EstablishedAccountTx { pub vp: String, @@ -455,6 +471,8 @@ impl DeriveEstablishedAddress for EstablishedAccountTx { BorshDeserialize, PartialEq, Eq, + PartialOrd, + Ord, )] pub struct SignedBondTx { #[serde(flatten)] @@ -517,7 +535,10 @@ impl SignedBondTx { sk, &self.data.data_to_sign(), )) - })) + })); + let mut sigs = vec![]; + std::mem::swap(&mut self.signatures, &mut sigs); + self.signatures = sigs.into_iter().sorted().dedup().collect(); } } @@ -530,6 +551,8 @@ impl SignedBondTx { BorshDeserialize, PartialEq, Eq, + PartialOrd, + Ord, )] pub struct BondTx { pub source: GenesisAddress, @@ -596,6 +619,8 @@ impl From> for SignedBondTx { BorshDeserialize, PartialEq, Eq, + PartialOrd, + Ord, )] pub struct SignedPk { pub pk: StringEncoded, @@ -1095,14 +1120,12 @@ fn look_up_sk_from( .unwrap_or_else(|| { // If it's not in the wallet, it must be an established account // so we need to look-up its public key first + if established_accounts.is_none() { + return vec![]; + } established_accounts .as_ref() - .unwrap_or_else(|| { - panic!( - "Signing failed. Cannot find \"{source}\" in the wallet \ - and there are no established accounts." - ); - }) + .unwrap() .iter() .find_map(|account| match source { GenesisAddress::EstablishedAddress(address) => { diff --git a/core/src/types/token.rs b/core/src/types/token.rs index 5c319b7da6..eec4b5a7d4 100644 --- a/core/src/types/token.rs +++ b/core/src/types/token.rs @@ -504,6 +504,12 @@ impl PartialOrd for DenominatedAmount { } } +impl Ord for DenominatedAmount { + fn cmp(&self, other: &Self) -> Ordering { + self.partial_cmp(other).unwrap() + } +} + impl serde::Serialize for Amount { fn serialize( &self, From 34e3502105a83b150cbbd7f001a328b17ae32ea4 Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 23 Nov 2023 16:28:18 +0100 Subject: [PATCH 112/175] some dicking around --- apps/src/lib/cli/client.rs | 2 +- apps/src/lib/client/utils.rs | 71 +++++++++++---------- apps/src/lib/config/genesis/transactions.rs | 60 +++++++++++------ 3 files changed, 80 insertions(+), 53 deletions(-) diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 2f06a497d4..10679bfa3e 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -664,7 +664,7 @@ impl CliApi { args, )) => utils::validate_genesis_templates(global_args, args), Utils::SignGenesisTx(SignGenesisTx(args)) => { - utils::sign_genesis_tx(global_args, args) + utils::sign_genesis_tx(global_args, args).await } }, } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index a190617bf7..3cf835419a 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -961,7 +961,7 @@ pub fn validate_genesis_templates( } /// Sign genesis transactions. -pub fn sign_genesis_tx( +pub async fn sign_genesis_tx( global_args: args::Global, args::SignGenesisTx { path, @@ -983,44 +983,47 @@ pub fn sign_genesis_tx( ); safe_exit(1) }); - let (signed, append) = genesis::transactions::parse_unsigned(&contents) - .map(|unsigned| { - ( + let (signed, append) = + match genesis::transactions::parse_unsigned(&contents) { + Ok(unsigned) => ( genesis::transactions::sign_txs( unsigned, &mut wallet, maybe_pre_genesis_wallet.as_ref(), - ), + ) + .await, true, - ) - }) - .unwrap_or_else(|err| { - let mut genesis_txs = genesis::templates::read_transactions(&path) - .unwrap_or_else(|e| { - eprintln!( - "Unable to parse the TOML from {}. Could not parse as \ - unsigned with {err}. Could not parse as signed with \ - {e}.", - path.to_string_lossy() - ); - safe_exit(1) - }); - // Sign bond txs - let bond = genesis_txs.bond.map(|txs| { - txs.into_iter() - .map(|tx| { - sign_delegation_bond_tx( - tx, - &mut wallet, - &genesis_txs.established_account, - ) - }) - .collect() - }); - genesis_txs.bond = bond; - (genesis_txs, false) - }); - + ), + Err(err) => { + let mut genesis_txs = + genesis::templates::read_transactions(&path) + .unwrap_or_else(|e| { + eprintln!( + "Unable to parse the TOML from {}. Could not \ + parse as unsigned with {err}. Could not \ + parse as signed with {e}.", + path.to_string_lossy() + ); + safe_exit(1) + }); + // Sign bond txs + if let Some(txs) = genesis_txs.bond { + let mut bonds = vec![]; + for tx in txs { + bonds.push( + sign_delegation_bond_tx( + tx, + &mut wallet, + &genesis_txs.established_account, + ) + .await, + ); + } + genesis_txs.bond = Some(bonds); + } + (genesis_txs, false) + } + }; match output { Some(output_path) => { let signed = if append { diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 5eab9b4073..79bbf6d445 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -3,6 +3,7 @@ use std::collections::{BTreeMap, BTreeSet}; use std::fmt::Debug; use std::net::SocketAddr; +use std::str::FromStr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; @@ -11,13 +12,14 @@ use namada::core::types::address::{Address, EstablishedAddress}; use namada::core::types::string_encoding::StringEncoded; use namada::ledger::pos::types::ValidatorMetaData; use namada::proto::{ - standalone_signature, verify_standalone_sig, SerializeWithBorsh, + standalone_signature, verify_standalone_sig, SerializeWithBorsh, Tx, }; use namada::types::dec::Dec; use namada::types::key::{common, RefTo, VerifySigError}; use namada::types::time::{DateTimeUtc, MIN_UTC}; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; +use namada::types::transaction::{pos, Fee, TxType}; use namada_sdk::wallet::alias::Alias; use namada_sdk::wallet::pre_genesis::ValidatorWallet; use namada_sdk::wallet::Wallet; @@ -48,7 +50,7 @@ pub struct GenesisValidatorData { /// Panics if given `txs.validator_accounts` is not empty, because validator /// transactions must be signed with a validator wallet (see /// `init-genesis-validator` command). -pub fn sign_txs( +pub async fn sign_txs( txs: UnsignedTransactions, wallet: &mut Wallet, validator_wallet: Option<&ValidatorWallet>, @@ -60,13 +62,22 @@ pub fn sign_txs( } = txs; // Sign bond txs - let bond = bond.map(|txs| { - txs.into_iter() - .map(|tx| { - sign_delegation_bond_tx(tx.into(), wallet, &established_account) - }) - .collect() - }); + let bond = if let Some(txs) = bond { + let mut bonds = vec![]; + for tx in txs { + bonds.push( + sign_delegation_bond_tx( + tx.into(), + wallet, + &established_account, + ) + .await, + ); + } + Some(bonds) + } else { + None + }; // Sign validator account txs let validator_account = validator_account.map(|txs| { @@ -260,14 +271,14 @@ pub fn sign_validator_account_tx( } } -pub fn sign_delegation_bond_tx( +pub async fn sign_delegation_bond_tx( mut to_sign: SignedBondTx, wallet: &mut Wallet, established_accounts: &Option>, ) -> SignedBondTx { let source_keys = look_up_sk_from(&to_sign.data.source, wallet, established_accounts); - to_sign.sign(&source_keys); + to_sign.sign(&source_keys).await; to_sign } @@ -529,7 +540,7 @@ impl SignedBondTx { /// only verify signatures on [`SignedBondTx`] /// types. Thus we only allow signing of [`BondTx`] /// types. - pub fn sign(&mut self, key: &[common::SecretKey]) { + pub async fn sign(&mut self, key: &[common::SecretKey]) { self.signatures.extend(key.iter().map(|sk| { StringEncoded::new(standalone_signature::<_, SerializeWithBorsh>( sk, @@ -566,12 +577,25 @@ where { /// The signable data. This does not include the phantom data. fn data_to_sign(&self) -> Vec { - [ - self.source.serialize_to_vec(), - self.validator.serialize_to_vec(), - self.amount.serialize_to_vec(), - ] - .concat() + let mut tx = Tx::from_type(TxType::Raw); + tx.add_code_from_hash(Default::default(), None); + tx.add_data(pos::Bond { + validator: self.validator.clone(), + amount: self.amount.clone(), + source: Some(self.source.address()), + }); + let pk = common::PublicKey::from_str("tpknam1qp4jyqv4d2uh4zw2g64nl77knllqat4esw2mw94ypp8eq624am5hkf5uvjd").unwrap(); + tx.add_wrapper( + Fee { + amount_per_gas_unit: Default::default(), + token: Address::from(&pk), + }, + pk, + Default::default(), + Default::default(), + None, + ); + tx.serialize_to_vec() } } From dc66383f42f1b593c3a737fa0059408051d63596 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 24 Nov 2023 09:24:38 +0000 Subject: [PATCH 113/175] Temporarily revert hw wallet signing changes --- apps/src/lib/config/genesis/transactions.rs | 29 +++++---------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 79bbf6d445..223004c925 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -3,7 +3,6 @@ use std::collections::{BTreeMap, BTreeSet}; use std::fmt::Debug; use std::net::SocketAddr; -use std::str::FromStr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; @@ -12,14 +11,13 @@ use namada::core::types::address::{Address, EstablishedAddress}; use namada::core::types::string_encoding::StringEncoded; use namada::ledger::pos::types::ValidatorMetaData; use namada::proto::{ - standalone_signature, verify_standalone_sig, SerializeWithBorsh, Tx, + standalone_signature, verify_standalone_sig, SerializeWithBorsh, }; use namada::types::dec::Dec; use namada::types::key::{common, RefTo, VerifySigError}; use namada::types::time::{DateTimeUtc, MIN_UTC}; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; -use namada::types::transaction::{pos, Fee, TxType}; use namada_sdk::wallet::alias::Alias; use namada_sdk::wallet::pre_genesis::ValidatorWallet; use namada_sdk::wallet::Wallet; @@ -577,25 +575,12 @@ where { /// The signable data. This does not include the phantom data. fn data_to_sign(&self) -> Vec { - let mut tx = Tx::from_type(TxType::Raw); - tx.add_code_from_hash(Default::default(), None); - tx.add_data(pos::Bond { - validator: self.validator.clone(), - amount: self.amount.clone(), - source: Some(self.source.address()), - }); - let pk = common::PublicKey::from_str("tpknam1qp4jyqv4d2uh4zw2g64nl77knllqat4esw2mw94ypp8eq624am5hkf5uvjd").unwrap(); - tx.add_wrapper( - Fee { - amount_per_gas_unit: Default::default(), - token: Address::from(&pk), - }, - pk, - Default::default(), - Default::default(), - None, - ); - tx.serialize_to_vec() + [ + self.source.serialize_to_vec(), + self.validator.serialize_to_vec(), + self.amount.serialize_to_vec(), + ] + .concat() } } From 4c6af4d070c5ef2d3876761c950df4523f916b2e Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 24 Nov 2023 13:20:03 +0000 Subject: [PATCH 114/175] sumbish --- apps/src/lib/client/utils.rs | 26 +- apps/src/lib/config/genesis.rs | 32 +- apps/src/lib/config/genesis/chain.rs | 10 +- apps/src/lib/config/genesis/transactions.rs | 402 ++++++++++++------- apps/src/lib/node/ledger/shell/init_chain.rs | 28 +- tests/src/e2e/ibc_tests.rs | 6 +- 6 files changed, 312 insertions(+), 192 deletions(-) diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 3cf835419a..6c42648ab5 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -9,6 +9,7 @@ use color_eyre::owo_colors::OwoColorize; use flate2::read::GzDecoder; use flate2::write::GzEncoder; use flate2::Compression; +use itertools::Either; use namada::core::types::string_encoding::StringEncoded; use namada::types::chain::ChainId; use namada::types::dec::Dec; @@ -25,7 +26,7 @@ use crate::cli::args; use crate::cli::context::ENV_VAR_WASM_DIR; use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::genesis::transactions::{ - sign_delegation_bond_tx, UnsignedTransactions, + sign_delegation_bond_tx, sign_validator_account_tx, UnsignedTransactions, }; use crate::config::global::GlobalConfig; use crate::config::{ @@ -632,7 +633,7 @@ pub fn derive_genesis_addresses( .validator_account .unwrap_or_default() .into_iter() - .map(|acct| acct.address) + .map(|acct| acct.data.address) .collect(), ) }); @@ -1021,6 +1022,27 @@ pub async fn sign_genesis_tx( } genesis_txs.bond = Some(bonds); } + // Sign validator txs + if let Some(txs) = genesis_txs.validator_account { + let mut validator_accounts = vec![]; + for tx in txs { + validator_accounts.push( + sign_validator_account_tx( + Either::Right(tx), + &mut wallet, + genesis_txs + .established_account + .as_ref() + .expect( + "Established account txs required \ + when signing validator account txs", + ), + ) + .await, + ); + } + genesis_txs.validator_account = Some(validator_accounts); + } (genesis_txs, false) } }; diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index ae8062ca00..33d8fe90ba 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -402,7 +402,7 @@ pub fn make_dev_genesis( .get(0) .unwrap(); let genesis_addr = - GenesisAddress::EstablishedAddress(tx.tx.address.raw.clone()); + GenesisAddress::EstablishedAddress(tx.tx.data.address.raw.clone()); let balance = *nam_balances.0.get(&genesis_addr).unwrap(); let bonded = { @@ -490,20 +490,22 @@ pub fn make_dev_genesis( }; vals.push(chain::FinalizedValidatorAccountTx { address: Address::Established(address.clone()), - tx: transactions::ValidatorAccountTx { - address: StringEncoded::new(address.clone()), - vp: validator_account_tx.vp, - commission_rate: validator_account_tx.commission_rate, - max_commission_rate_change: validator_account_tx - .max_commission_rate_change, - metadata: validator_account_tx.metadata, - net_address: validator_account_tx.net_address, - consensus_key: sign_pk(&consensus_keypair), - protocol_key: sign_pk(&protocol_keypair), - tendermint_node_key: sign_pk(&consensus_keypair), - eth_hot_key: sign_pk(ð_bridge_keypair), - eth_cold_key: sign_pk(ð_cold_keypair), - }, + tx: transactions::Signed::new( + transactions::ValidatorAccountTx { + address: StringEncoded::new(address.clone()), + vp: validator_account_tx.vp, + commission_rate: validator_account_tx.commission_rate, + max_commission_rate_change: validator_account_tx + .max_commission_rate_change, + metadata: validator_account_tx.metadata, + net_address: validator_account_tx.net_address, + consensus_key: sign_pk(&consensus_keypair), + protocol_key: sign_pk(&protocol_keypair), + tendermint_node_key: sign_pk(&consensus_keypair), + eth_hot_key: sign_pk(ð_bridge_keypair), + eth_cold_key: sign_pk(ð_cold_keypair), + }, + ), }); address }; diff --git a/apps/src/lib/config/genesis/chain.rs b/apps/src/lib/config/genesis/chain.rs index 55f675b6d2..b5ff28d086 100644 --- a/apps/src/lib/config/genesis/chain.rs +++ b/apps/src/lib/config/genesis/chain.rs @@ -182,7 +182,7 @@ impl Finalized { self.transactions.find_validator(tendermint_pk).map( |validator_tx| { ( - validator_tx.tx.net_address, + validator_tx.tx.data.net_address, validator_tx.derive_tendermint_address(), ) }, @@ -651,7 +651,7 @@ impl FinalizedTransactions { let validator_account = validator_account.map(|txs| { txs.into_iter() .map(|tx| FinalizedValidatorAccountTx { - address: Address::Established(tx.address.raw.clone()), + address: Address::Established(tx.data.address.raw.clone()), tx, }) .collect() @@ -670,7 +670,7 @@ impl FinalizedTransactions { let validator_accounts = self.validator_account.as_ref()?; validator_accounts .iter() - .find(|tx| &tx.tx.tendermint_node_key.pk.raw == tendermint_pk) + .find(|tx| &tx.tx.data.tendermint_node_key.pk.raw == tendermint_pk) } } @@ -754,12 +754,12 @@ impl FinalizedValidatorAccountTx { pub fn derive_tendermint_address(&self) -> TendermintAddress { // Derive the node ID from the node key let node_id: TendermintNodeId = - id_from_pk(&self.tx.tendermint_node_key.pk.raw); + id_from_pk(&self.tx.data.tendermint_node_key.pk.raw); // Build the list of persistent peers from the validators' node IDs TendermintAddress::from_str(&format!( "{}@{}", - node_id, self.tx.net_address, + node_id, self.tx.data.net_address, )) .expect("Validator address must be valid") } diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 223004c925..cc0a7712c3 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -6,7 +6,7 @@ use std::net::SocketAddr; use borsh::{BorshDeserialize, BorshSerialize}; use borsh_ext::BorshSerializeExt; -use itertools::Itertools; +use itertools::{Either, Itertools}; use namada::core::types::address::{Address, EstablishedAddress}; use namada::core::types::string_encoding::StringEncoded; use namada::ledger::pos::types::ValidatorMetaData; @@ -31,6 +31,12 @@ use crate::config::genesis::templates::{ use crate::config::genesis::GenesisAddress; use crate::wallet::CliWalletUtils; +/// Helper trait to fetch tx data to sign. +pub trait TxToSign { + /// Return tx data to sign. + fn tx_to_sign(&self) -> Vec; +} + pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; pub struct GenesisValidatorData { @@ -78,20 +84,30 @@ pub async fn sign_txs( }; // Sign validator account txs - let validator_account = validator_account.map(|txs| { + let validator_account = if let Some(txs) = validator_account { let validator_wallet = validator_wallet .expect("Validator wallet required to sign validator account txs"); let tnk = validator_wallet.tendermint_node_key.ref_to(); - txs.into_iter() - .filter_map(|tx| { - if tx.tendermint_node_key.raw == tnk { - Some(sign_validator_account_tx(tx, validator_wallet)) - } else { - None - } - }) - .collect() - }); + let mut filtered_txs = vec![]; + for tx in txs { + if tx.tendermint_node_key.raw == tnk { + filtered_txs.push( + sign_validator_account_tx( + Either::Left((tx, validator_wallet)), + wallet, + established_account.as_ref().expect( + "Established account txs required when signing \ + validator account txs", + ), + ) + .await, + ); + } + } + Some(filtered_txs) + } else { + None + }; Transactions { established_account, @@ -200,73 +216,92 @@ pub fn init_validator( (address, txs) } -pub fn sign_validator_account_tx( - unsigned_tx: UnsignedValidatorAccountTx, - validator_wallet: &ValidatorWallet, +pub async fn sign_validator_account_tx( + to_sign: Either< + (UnsignedValidatorAccountTx, &ValidatorWallet), + SignedValidatorAccountTx, + >, + wallet: &mut Wallet, + established_accounts: &[EstablishedAccountTx], ) -> SignedValidatorAccountTx { - // Sign the tx with every validator key to authorize their usage - let consensus_key_sig = - sign_tx(&unsigned_tx, &validator_wallet.consensus_key); - let protocol_key_sig = sign_tx( - &unsigned_tx, - &validator_wallet.store.validator_keys.protocol_keypair, - ); - let eth_hot_key_sig = sign_tx(&unsigned_tx, &validator_wallet.eth_hot_key); - let eth_cold_key_sig = - sign_tx(&unsigned_tx, &validator_wallet.eth_cold_key); - let tendermint_node_key_sig = - sign_tx(&unsigned_tx, &validator_wallet.tendermint_node_key); - - let ValidatorAccountTx { - address, - consensus_key, - protocol_key, - tendermint_node_key, - vp, - commission_rate, - max_commission_rate_change, - net_address, - eth_hot_key, - eth_cold_key, - metadata, - } = unsigned_tx; - - let consensus_key = SignedPk { - pk: consensus_key, - authorization: consensus_key_sig, - }; - let protocol_key = SignedPk { - pk: protocol_key, - authorization: protocol_key_sig, - }; - let tendermint_node_key = SignedPk { - pk: tendermint_node_key, - authorization: tendermint_node_key_sig, - }; - - let eth_hot_key = SignedPk { - pk: eth_hot_key, - authorization: eth_hot_key_sig, + let mut to_sign = match to_sign { + Either::Right(signed_tx) => signed_tx, + Either::Left((unsigned_tx, validator_wallet)) => { + // Sign the tx with every validator key to authorize their usage + let consensus_key_sig = + sign_tx(&unsigned_tx, &validator_wallet.consensus_key); + let protocol_key_sig = sign_tx( + &unsigned_tx, + &validator_wallet.store.validator_keys.protocol_keypair, + ); + let eth_hot_key_sig = + sign_tx(&unsigned_tx, &validator_wallet.eth_hot_key); + let eth_cold_key_sig = + sign_tx(&unsigned_tx, &validator_wallet.eth_cold_key); + let tendermint_node_key_sig = + sign_tx(&unsigned_tx, &validator_wallet.tendermint_node_key); + + let ValidatorAccountTx { + address, + consensus_key, + protocol_key, + tendermint_node_key, + vp, + commission_rate, + max_commission_rate_change, + net_address, + eth_hot_key, + eth_cold_key, + metadata, + } = unsigned_tx; + + let consensus_key = SignedPk { + pk: consensus_key, + authorization: consensus_key_sig, + }; + let protocol_key = SignedPk { + pk: protocol_key, + authorization: protocol_key_sig, + }; + let tendermint_node_key = SignedPk { + pk: tendermint_node_key, + authorization: tendermint_node_key_sig, + }; + + let eth_hot_key = SignedPk { + pk: eth_hot_key, + authorization: eth_hot_key_sig, + }; + + let eth_cold_key = SignedPk { + pk: eth_cold_key, + authorization: eth_cold_key_sig, + }; + + Signed::new(ValidatorAccountTx { + address, + consensus_key, + protocol_key, + tendermint_node_key, + vp, + commission_rate, + max_commission_rate_change, + net_address, + eth_hot_key, + eth_cold_key, + metadata, + }) + } }; - let eth_cold_key = SignedPk { - pk: eth_cold_key, - authorization: eth_cold_key_sig, - }; + let source_keys = look_up_sks_from( + &GenesisAddress::EstablishedAddress(to_sign.data.address.raw.clone()), + wallet, + Some(established_accounts), + ); - SignedValidatorAccountTx { - address, - consensus_key, - protocol_key, - tendermint_node_key, - vp, - commission_rate, - max_commission_rate_change, - net_address, - eth_hot_key, - eth_cold_key, - metadata, - } + to_sign.sign(&source_keys).await; + to_sign } pub async fn sign_delegation_bond_tx( @@ -274,8 +309,11 @@ pub async fn sign_delegation_bond_tx( wallet: &mut Wallet, established_accounts: &Option>, ) -> SignedBondTx { - let source_keys = - look_up_sk_from(&to_sign.data.source, wallet, established_accounts); + let source_keys = look_up_sks_from( + &to_sign.data.source, + wallet, + established_accounts.as_ref().map(|txs| txs.as_slice()), + ); to_sign.sign(&source_keys).await; to_sign } @@ -407,7 +445,9 @@ pub struct UnsignedTransactions { pub type UnsignedValidatorAccountTx = ValidatorAccountTx>; -pub type SignedValidatorAccountTx = ValidatorAccountTx; +pub type SignedValidatorAccountTx = Signed>; + +pub type SignedBondTx = Signed>; #[derive( Clone, @@ -443,6 +483,25 @@ pub struct ValidatorAccountTx { pub metadata: ValidatorMetaData, } +impl TxToSign for ValidatorAccountTx { + fn tx_to_sign(&self) -> Vec { + [ + self.address.serialize_to_vec(), + self.vp.serialize_to_vec(), + self.commission_rate.serialize_to_vec(), + self.max_commission_rate_change.serialize_to_vec(), + self.net_address.serialize_to_vec(), + self.consensus_key.pk.raw.serialize_to_vec(), + self.protocol_key.pk.raw.serialize_to_vec(), + self.tendermint_node_key.pk.raw.serialize_to_vec(), + self.eth_hot_key.pk.raw.serialize_to_vec(), + self.eth_cold_key.pk.raw.serialize_to_vec(), + self.metadata.serialize_to_vec(), + ] + .concat() + } +} + #[derive( Clone, Debug, @@ -483,44 +542,75 @@ impl DeriveEstablishedAddress for EstablishedAccountTx { PartialOrd, Ord, )] -pub struct SignedBondTx { +pub struct Signed { #[serde(flatten)] - pub data: BondTx, - pub signatures: Vec>, + pub data: T, + pub signatures: BTreeMap< + StringEncoded, + StringEncoded, + >, } -impl SignedBondTx -where - T: BorshSerialize + TemplateValidation, -{ - /// Verify the signatures of `BondTx`. This should not depend - /// on whether the contained amount is denominated or not. - /// - /// Since we denominate amounts as part of validation, we can - /// only verify signatures on [`SignedBondTx`] - /// types. +impl Signed { + /// Instantiate data to be signed. + pub const fn new(data: T) -> Self { + Self { + data, + signatures: BTreeMap::new(), + } + } + + /// Return the inner wrapped `T`. + pub fn into_inner(self) -> T { + let Signed { data, .. } = self; + data + } + + /// Sign the underlying data and add to the list of signatures. + pub async fn sign(&mut self, keys: &[common::SecretKey]) + where + T: BorshSerialize + TxToSign, + { + for sk in keys { + self.signatures.insert( + StringEncoded::new(sk.ref_to()), + StringEncoded::new( + standalone_signature::<_, SerializeWithBorsh>( + sk, + &self.data.tx_to_sign(), + ), + ), + ); + } + } + + /// Verify the signatures of the inner data. pub fn verify_sig( &self, pks: &[common::PublicKey], threshold: u8, - ) -> Result<(), VerifySigError> { + ) -> Result<(), VerifySigError> + where + T: BorshSerialize + TxToSign, + { let Self { data, signatures } = self; if pks.len() > u8::MAX as usize { eprintln!("You're multisig is too facking big"); return Err(VerifySigError::TooGoddamnBig); } let mut valid_sigs = 0; + let tx_to_sign = data.tx_to_sign(); for pk in pks { - valid_sigs += signatures.iter().any(|sig| { - verify_standalone_sig::<_, SerializeWithBorsh>( - &data.data_to_sign(), + if let Some(sig) = signatures.get(&StringEncoded::new(pk.clone())) { + valid_sigs += verify_standalone_sig::<_, SerializeWithBorsh>( + &tx_to_sign, pk, &sig.raw, ) - .is_ok() - }) as u8; - if valid_sigs >= threshold { - break; + .is_ok() as u8; + if valid_sigs >= threshold { + break; + } } } if valid_sigs >= threshold { @@ -531,26 +621,6 @@ where } } -impl SignedBondTx { - /// Sign the transfer and add to the list of signatures. - /// - /// Since we denominate amounts as part of validation, we can - /// only verify signatures on [`SignedBondTx`] - /// types. Thus we only allow signing of [`BondTx`] - /// types. - pub async fn sign(&mut self, key: &[common::SecretKey]) { - self.signatures.extend(key.iter().map(|sk| { - StringEncoded::new(standalone_signature::<_, SerializeWithBorsh>( - sk, - &self.data.data_to_sign(), - )) - })); - let mut sigs = vec![]; - std::mem::swap(&mut self.signatures, &mut sigs); - self.signatures = sigs.into_iter().sorted().dedup().collect(); - } -} - #[derive( Clone, Debug, @@ -569,12 +639,11 @@ pub struct BondTx { pub amount: T::Amount, } -impl BondTx +impl TxToSign for BondTx where T: TemplateValidation + BorshSerialize, { - /// The signable data. This does not include the phantom data. - fn data_to_sign(&self) -> Vec { + fn tx_to_sign(&self) -> Vec { [ self.source.serialize_to_vec(), self.validator.serialize_to_vec(), @@ -611,11 +680,9 @@ impl BondTx { } impl From> for SignedBondTx { + #[inline] fn from(bond: BondTx) -> Self { - SignedBondTx { - data: bond, - signatures: vec![], - } + Signed::new(bond) } } @@ -676,6 +743,7 @@ pub fn validate( tx, vps, &all_used_addresses, + &established_accounts, &mut validator_accounts, ) { is_valid = false; @@ -748,19 +816,23 @@ pub fn validate( |validator_accounts| { validator_accounts .into_iter() - .map(|acct| ValidatorAccountTx { - address: acct.address, - vp: acct.vp, - commission_rate: acct.commission_rate, - max_commission_rate_change: acct - .max_commission_rate_change, - net_address: acct.net_address, - consensus_key: acct.consensus_key, - protocol_key: acct.protocol_key, - tendermint_node_key: acct.tendermint_node_key, - eth_hot_key: acct.eth_hot_key, - eth_cold_key: acct.eth_cold_key, - metadata: acct.metadata, + .map(|acct| SignedValidatorAccountTx { + signatures: acct.signatures, + data: ValidatorAccountTx { + address: acct.data.address, + vp: acct.data.vp, + commission_rate: acct.data.commission_rate, + max_commission_rate_change: acct + .data + .max_commission_rate_change, + net_address: acct.data.net_address, + consensus_key: acct.data.consensus_key, + protocol_key: acct.data.protocol_key, + tendermint_node_key: acct.data.tendermint_node_key, + eth_hot_key: acct.data.eth_hot_key, + eth_cold_key: acct.data.eth_cold_key, + metadata: acct.data.metadata, + }, }) .collect() }, @@ -946,12 +1018,39 @@ pub fn validate_established_account( } pub fn validate_validator_account( - tx: &ValidatorAccountTx, + signed_tx: &SignedValidatorAccountTx, vps: Option<&ValidityPredicates>, all_used_addresses: &BTreeSet
          , + established_accounts: &BTreeMap, u8)>, validator_accounts: &mut BTreeSet
          , ) -> bool { - let mut is_valid = true; + let tx = &signed_tx.data; + + // Check signature + let mut is_valid = { + let maybe_source = { + let established_addr = Address::Established(tx.address.raw.clone()); + established_accounts + .get(&established_addr) + .map(|(pks, t)| (pks.as_slice(), *t)) + }; + if let Some((source_pks, threshold)) = maybe_source { + if signed_tx.verify_sig(source_pks, threshold).is_err() { + eprintln!("Invalid validator account signature."); + false + } else { + true + } + } else { + let source = &tx.address.raw; + eprintln!( + "Invalid validator account tx. Couldn't verify the underlying \ + established account signatures, because the source account's \ + \"{source}\" public keys cannot be found." + ); + false + } + }; let established_address = { let established_address = Address::Established(tx.address.raw.clone()); @@ -1073,9 +1172,9 @@ fn validate_signature( } } -impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { - fn from(tx: &SignedValidatorAccountTx) -> Self { - let SignedValidatorAccountTx { +impl From<&ValidatorAccountTx> for UnsignedValidatorAccountTx { + fn from(tx: &ValidatorAccountTx) -> Self { + let ValidatorAccountTx { address, vp, commission_rate, @@ -1106,18 +1205,12 @@ impl From<&SignedValidatorAccountTx> for UnsignedValidatorAccountTx { } } -impl From<&SignedBondTx> for BondTx { - fn from(tx: &SignedBondTx) -> Self { - let SignedBondTx { data, .. } = tx; - data.clone() - } -} - -/// Attempt to look-up a secret key. -fn look_up_sk_from( +/// Attempt look-up a subset of secret keys from the wallet matching +/// the queried established account's public keys. +fn look_up_sks_from( source: &GenesisAddress, wallet: &mut Wallet, - established_accounts: &Option>, + established_accounts: Option<&[EstablishedAccountTx]>, ) -> Vec { // Try to look-up the source from wallet first match source { @@ -1133,7 +1226,6 @@ fn look_up_sk_from( return vec![]; } established_accounts - .as_ref() .unwrap() .iter() .find_map(|account| match source { diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index ee9b7af289..88af71c96a 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -23,7 +23,7 @@ use crate::config::genesis::chain::{ }; use crate::config::genesis::templates::{TokenBalances, TokenConfig}; use crate::config::genesis::transactions::{ - BondTx, EstablishedAccountTx, ValidatorAccountTx, + BondTx, EstablishedAccountTx, Signed as SignedTx, ValidatorAccountTx, }; use crate::facade::tendermint::v0_37::abci::{request, response}; use crate::facade::tendermint_proto::google::protobuf; @@ -391,17 +391,21 @@ where for FinalizedValidatorAccountTx { address, tx: - ValidatorAccountTx { - vp, - commission_rate, - max_commission_rate_change, - metadata, - net_address: _, - consensus_key, - protocol_key, - tendermint_node_key: _, - eth_hot_key, - eth_cold_key, + SignedTx { + data: + ValidatorAccountTx { + vp, + commission_rate, + max_commission_rate_change, + metadata, + net_address: _, + consensus_key, + protocol_key, + tendermint_node_key: _, + eth_hot_key, + eth_cold_key, + .. + }, .. }, } in txs diff --git a/tests/src/e2e/ibc_tests.rs b/tests/src/e2e/ibc_tests.rs index b0d0cf47d1..0b20e3fa7c 100644 --- a/tests/src/e2e/ibc_tests.rs +++ b/tests/src/e2e/ibc_tests.rs @@ -285,9 +285,9 @@ fn setup_two_single_node_nets() -> Result<(Test, Test)> { .iter_mut() .find(|val| val.address == validator_addr) .unwrap(); - let new_port = - validator_tx.tx.net_address.port() + setup::ANOTHER_CHAIN_PORT_OFFSET; - validator_tx.tx.net_address.set_port(new_port); + 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_a.net.chain_id.as_str())) .map_err(|_| eyre!("Could not write genesis toml files for test_b"))?; From f77550885806169de7a3c0ad02f467dcbc72fa64 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 24 Nov 2023 14:18:57 +0000 Subject: [PATCH 115/175] Sign over an actual bond tx --- apps/src/lib/config/genesis/templates.rs | 1 + apps/src/lib/config/genesis/transactions.rs | 36 ++++++++++++++++----- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/apps/src/lib/config/genesis/templates.rs b/apps/src/lib/config/genesis/templates.rs index ba7a4bc682..166efcad9a 100644 --- a/apps/src/lib/config/genesis/templates.rs +++ b/apps/src/lib/config/genesis/templates.rs @@ -524,6 +524,7 @@ pub struct Validated {} pub trait TemplateValidation: Serialize { type Amount: for<'a> Deserialize<'a> + Serialize + + Into + Clone + std::fmt::Debug + BorshSerialize diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index cc0a7712c3..cb0e9cdd4d 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -11,13 +11,15 @@ use namada::core::types::address::{Address, EstablishedAddress}; use namada::core::types::string_encoding::StringEncoded; use namada::ledger::pos::types::ValidatorMetaData; use namada::proto::{ - standalone_signature, verify_standalone_sig, SerializeWithBorsh, + standalone_signature, verify_standalone_sig, SerializeWithBorsh, Tx, }; use namada::types::dec::Dec; -use namada::types::key::{common, RefTo, VerifySigError}; +use namada::types::key::{common, ed25519, RefTo, SigScheme, VerifySigError}; use namada::types::time::{DateTimeUtc, MIN_UTC}; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; +use namada::types::transaction::{pos, Fee, TxType}; +use namada_sdk::tx::TX_BOND_WASM; use namada_sdk::wallet::alias::Alias; use namada_sdk::wallet::pre_genesis::ValidatorWallet; use namada_sdk::wallet::Wallet; @@ -644,12 +646,30 @@ where T: TemplateValidation + BorshSerialize, { fn tx_to_sign(&self) -> Vec { - [ - self.source.serialize_to_vec(), - self.validator.serialize_to_vec(), - self.amount.serialize_to_vec(), - ] - .concat() + let mut tx = Tx::from_type(TxType::Raw); + tx.add_code_from_hash( + Default::default(), + Some(TX_BOND_WASM.to_string()), + ); + tx.add_data(pos::Bond { + validator: self.validator.clone(), + amount: self.amount.clone().into(), + source: Some(self.source.address()), + }); + let pk = + common::SecretKey::Ed25519(ed25519::SigScheme::from_bytes([0; 32])) + .ref_to(); + tx.add_wrapper( + Fee { + amount_per_gas_unit: Default::default(), + token: Address::from(&pk), + }, + pk, + Default::default(), + Default::default(), + None, + ); + tx.to_bytes() } } From 694b3688b86fdbc6956b60777ff6122f658f3f34 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 24 Nov 2023 15:28:09 +0000 Subject: [PATCH 116/175] Implement signable tx helper --- apps/src/lib/config/genesis/transactions.rs | 52 ++++++++++++--------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index cb0e9cdd4d..40028d470d 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -39,6 +39,27 @@ pub trait TxToSign { fn tx_to_sign(&self) -> Vec; } +/// Return a ready to sign genesis [`Tx`]. +fn get_tx_to_sign(tag: impl AsRef, data: impl BorshSerialize) -> Tx { + let mut tx = Tx::from_type(TxType::Raw); + tx.add_code_from_hash(Default::default(), Some(tag.as_ref().to_string())); + tx.add_data(data); + let pk = + common::SecretKey::Ed25519(ed25519::SigScheme::from_bytes([0; 32])) + .ref_to(); + tx.add_wrapper( + Fee { + amount_per_gas_unit: Default::default(), + token: Address::from(&pk), + }, + pk, + Default::default(), + Default::default(), + None, + ); + tx +} + pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; pub struct GenesisValidatorData { @@ -646,30 +667,15 @@ where T: TemplateValidation + BorshSerialize, { fn tx_to_sign(&self) -> Vec { - let mut tx = Tx::from_type(TxType::Raw); - tx.add_code_from_hash( - Default::default(), - Some(TX_BOND_WASM.to_string()), - ); - tx.add_data(pos::Bond { - validator: self.validator.clone(), - amount: self.amount.clone().into(), - source: Some(self.source.address()), - }); - let pk = - common::SecretKey::Ed25519(ed25519::SigScheme::from_bytes([0; 32])) - .ref_to(); - tx.add_wrapper( - Fee { - amount_per_gas_unit: Default::default(), - token: Address::from(&pk), + get_tx_to_sign( + TX_BOND_WASM, + pos::Bond { + validator: self.validator.clone(), + amount: self.amount.clone().into(), + source: Some(self.source.address()), }, - pk, - Default::default(), - Default::default(), - None, - ); - tx.to_bytes() + ) + .to_bytes() } } From fd0132ef916a193efdfd6147cfa5cf224d1db18f Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 24 Nov 2023 15:42:20 +0000 Subject: [PATCH 117/175] Sign over an actual become validator tx --- apps/src/lib/config/genesis/transactions.rs | 40 ++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 40028d470d..cb0faaaabd 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -5,7 +5,6 @@ use std::fmt::Debug; use std::net::SocketAddr; use borsh::{BorshDeserialize, BorshSerialize}; -use borsh_ext::BorshSerializeExt; use itertools::{Either, Itertools}; use namada::core::types::address::{Address, EstablishedAddress}; use namada::core::types::string_encoding::StringEncoded; @@ -19,7 +18,7 @@ use namada::types::time::{DateTimeUtc, MIN_UTC}; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; use namada::types::transaction::{pos, Fee, TxType}; -use namada_sdk::tx::TX_BOND_WASM; +use namada_sdk::tx::{TX_BECOME_VALIDATOR_WASM, TX_BOND_WASM}; use namada_sdk::wallet::alias::Alias; use namada_sdk::wallet::pre_genesis::ValidatorWallet; use namada_sdk::wallet::Wallet; @@ -508,20 +507,29 @@ pub struct ValidatorAccountTx { impl TxToSign for ValidatorAccountTx { fn tx_to_sign(&self) -> Vec { - [ - self.address.serialize_to_vec(), - self.vp.serialize_to_vec(), - self.commission_rate.serialize_to_vec(), - self.max_commission_rate_change.serialize_to_vec(), - self.net_address.serialize_to_vec(), - self.consensus_key.pk.raw.serialize_to_vec(), - self.protocol_key.pk.raw.serialize_to_vec(), - self.tendermint_node_key.pk.raw.serialize_to_vec(), - self.eth_hot_key.pk.raw.serialize_to_vec(), - self.eth_cold_key.pk.raw.serialize_to_vec(), - self.metadata.serialize_to_vec(), - ] - .concat() + get_tx_to_sign( + TX_BECOME_VALIDATOR_WASM, + pos::BecomeValidator { + address: Address::Established(self.address.raw.clone()), + consensus_key: self.consensus_key.pk.raw.clone(), + eth_hot_key: match &self.eth_hot_key.pk.raw { + common::PublicKey::Secp256k1(key) => key.clone(), + _ => unreachable!(), + }, + eth_cold_key: match &self.eth_cold_key.pk.raw { + common::PublicKey::Secp256k1(key) => key.clone(), + _ => unreachable!(), + }, + protocol_key: self.protocol_key.pk.raw.clone(), + commission_rate: self.commission_rate, + max_commission_rate_change: self.max_commission_rate_change, + email: self.metadata.email.clone(), + description: self.metadata.description.clone(), + website: self.metadata.website.clone(), + discord_handle: self.metadata.discord_handle.clone(), + }, + ) + .to_bytes() } } From 16a489e91b87c80f1eb5531582f66ca27f34cb95 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Fri, 24 Nov 2023 15:42:50 +0000 Subject: [PATCH 118/175] Validator key validation --- apps/src/lib/config/genesis/transactions.rs | 37 +++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index cb0faaaabd..2a0b4f4d05 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -1060,13 +1060,44 @@ pub fn validate_validator_account( ) -> bool { let tx = &signed_tx.data; + // Check eth keys are secp256k1 keys + if !matches!( + &signed_tx.data.eth_cold_key.pk.raw, + common::PublicKey::Secp256k1(_) + ) { + panic!( + "The validator with address {} has a non Secp256k1 Ethereum cold \ + key", + signed_tx.data.address + ); + } + if !matches!( + &signed_tx.data.eth_hot_key.pk.raw, + common::PublicKey::Secp256k1(_) + ) { + panic!( + "The validator with address {} has a non Secp256k1 Ethereum hot \ + key", + signed_tx.data.address + ); + } + // Check signature let mut is_valid = { let maybe_source = { let established_addr = Address::Established(tx.address.raw.clone()); - established_accounts - .get(&established_addr) - .map(|(pks, t)| (pks.as_slice(), *t)) + established_accounts.get(&established_addr).map(|(pks, t)| { + let all_ed25519_keys = pks + .iter() + .all(|key| matches!(key, common::PublicKey::Ed25519(_))); + if !all_ed25519_keys { + panic!( + "Not all account keys of the validator with address \ + {established_addr} are Ed25519 keys" + ); + } + (pks.as_slice(), *t) + }) }; if let Some((source_pks, threshold)) = maybe_source { if signed_tx.verify_sig(source_pks, threshold).is_err() { From d2a075f62282494eb89b1798ac6f378a34edce26 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 27 Nov 2023 17:12:19 +0100 Subject: [PATCH 119/175] lifetime hell --- apps/src/lib/cli.rs | 7 + apps/src/lib/client/tx.rs | 206 ++++++++-------- apps/src/lib/client/utils.rs | 32 +++ apps/src/lib/config/genesis.rs | 2 +- apps/src/lib/config/genesis/chain.rs | 2 +- apps/src/lib/config/genesis/templates.rs | 2 +- apps/src/lib/config/genesis/toml_utils.rs | 38 --- apps/src/lib/config/genesis/transactions.rs | 259 ++++++++++++-------- apps/src/lib/config/genesis/utils.rs | 76 ++++++ sdk/src/io.rs | 1 + sdk/src/lib.rs | 9 +- sdk/src/signing.rs | 13 +- tests/src/e2e/setup.rs | 2 +- 13 files changed, 398 insertions(+), 251 deletions(-) delete mode 100644 apps/src/lib/config/genesis/toml_utils.rs create mode 100644 apps/src/lib/config/genesis/utils.rs diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index e3cf07fffc..b74bb5c496 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -6943,6 +6943,7 @@ pub mod args { pub path: PathBuf, pub output: Option, pub validator_alias: Option, + pub use_device: bool, } impl Args for SignGenesisTx { @@ -6950,10 +6951,12 @@ pub mod args { let path = PATH.parse(matches); let output = OUTPUT.parse(matches); let validator_alias = ALIAS_OPT.parse(matches); + let use_device = USE_DEVICE.parse(matches); Self { path, output, validator_alias, + use_device, } } @@ -6971,6 +6974,10 @@ pub mod args { .def() .help("Optional alias to a validator wallet."), ) + .arg(USE_DEVICE.def().help( + "Derive an address and public key from the seed stored on the \ + connected hardware wallet.", + )) } } } diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 7f2f2f930b..3e1c7cc10c 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -1,6 +1,8 @@ use std::collections::HashSet; use std::fs::File; +use std::future::Future; use std::io::Write; +use std::pin::Pin; use borsh::BorshDeserialize; use borsh_ext::BorshSerializeExt; @@ -22,8 +24,10 @@ use namada::types::key::{self, *}; use namada::types::transaction::pos::{BecomeValidator, ConsensusKeyChange}; use namada_sdk::rpc::{TxBroadcastData, TxResponse}; use namada_sdk::wallet::alias::validator_consensus_key; +use namada_sdk::wallet::{Wallet, WalletIo}; use namada_sdk::{display_line, edisplay_line, error, signing, tx, Namada}; use rand::rngs::OsRng; +use tokio::sync::RwLock; use super::rpc; use crate::cli::{args, safe_exit}; @@ -68,9 +72,105 @@ pub async fn aux_signing_data<'a>( Ok(signing_data) } +pub fn with_hardware_wallet<'a, 'b, U: WalletIo + Clone>( + wallet: &RwLock<&'b mut Wallet>, + app: &NamadaApp, +) -> impl Fn( + Tx, + common::PublicKey, + HashSet, +) -> Pin>>> { + let wallet = wallet.read(); + move |mut tx: Tx, + pubkey: common::PublicKey, + parts: HashSet| { + Box::pin(async move { + // Obtain derivation path + let path = wallet + .await + .find_path_by_pkh(&(&pubkey).into()) + .map_err(|_| { + error::Error::Other( + "Unable to find derivation path for key".to_string(), + ) + })?; + let path = BIP44Path { + path: path.to_string(), + }; + // Now check that the public key at this path in the Ledger + // matches + let response_pubkey = app + .get_address_and_pubkey(&path, false) + .await + .map_err(|err| error::Error::Other(err.to_string()))?; + let response_pubkey = + common::PublicKey::try_from_slice(&response_pubkey.public_key) + .map_err(|err| { + error::Error::Other(format!( + "unable to decode public key from hardware \ + wallet: {}", + err + )) + })?; + if response_pubkey != pubkey { + return Err(error::Error::Other(format!( + "Unrecognized public key fetched fom Ledger: {}. Expected \ + {}.", + response_pubkey, pubkey, + ))); + } + // Get the Ledger to sign using our obtained derivation path + let response = app + .sign(&path, &tx.serialize_to_vec()) + .await + .map_err(|err| error::Error::Other(err.to_string()))?; + // Sign the raw header if that is requested + if parts.contains(&signing::Signable::RawHeader) { + let pubkey = + common::PublicKey::try_from_slice(&response.pubkey) + .expect("unable to parse public key from Ledger"); + let signature = + common::Signature::try_from_slice(&response.raw_signature) + .expect("unable to parse signature from Ledger"); + // Signatures from the Ledger come back in compressed + // form + let compressed = CompressedSignature { + targets: response.raw_indices, + signer: Signer::PubKeys(vec![pubkey]), + signatures: [(0, signature)].into(), + }; + // Expand out the signature before adding it to the + // transaction + tx.add_section(Section::Signature(compressed.expand(&tx))); + } + // Sign the fee header if that is requested + if parts.contains(&signing::Signable::FeeHeader) { + let pubkey = + common::PublicKey::try_from_slice(&response.pubkey) + .expect("unable to parse public key from Ledger"); + let signature = common::Signature::try_from_slice( + &response.wrapper_signature, + ) + .expect("unable to parse signature from Ledger"); + // Signatures from the Ledger come back in compressed + // form + let compressed = CompressedSignature { + targets: response.wrapper_indices, + signer: Signer::PubKeys(vec![pubkey]), + signatures: [(0, signature)].into(), + }; + // Expand out the signature before adding it to the + // transaction + tx.add_section(Section::Signature(compressed.expand(&tx))); + } + Ok(tx) + }) + } +} + // Sign the given transaction using a hardware wallet as a backup -pub async fn sign<'a>( - context: &impl Namada<'a>, +pub async fn sign<'a, N: Namada<'a>>( + context: &N, tx: &mut Tx, args: &args::Tx, signing_data: SigningTxData, @@ -84,112 +184,14 @@ pub async fn sign<'a>( let app = NamadaApp::new(TransportNativeHID::new(&hidapi).map_err( |err| { error::Error::Other(format!( - "Unable to connect to Ledger: {}", + "Unble to connect to Ledger: {}", err )) }, )?); // A closure to facilitate signing transactions also using the Ledger let with_hw = - |mut tx: Tx, - pubkey: common::PublicKey, - parts: HashSet| { - let app = &app; - async move { - // Obtain derivation path corresponding to the signing - // public key - let path = context - .wallet() - .await - .find_path_by_pkh(&(&pubkey).into()) - .map_err(|_| { - error::Error::Other( - "Unable to find derivation path for key" - .to_string(), - ) - })?; - let path = BIP44Path { - path: path.to_string(), - }; - // Now check that the public key at this path in the Ledger - // matches - let response_pubkey = app - .get_address_and_pubkey(&path, false) - .await - .map_err(|err| error::Error::Other(err.to_string()))?; - let response_pubkey = common::PublicKey::try_from_slice( - &response_pubkey.public_key, - ) - .map_err(|err| { - error::Error::Other(format!( - "unable to decode public key from hardware \ - wallet: {}", - err - )) - })?; - if response_pubkey != pubkey { - return Err(error::Error::Other(format!( - "Unrecognized public key fetched fom Ledger: {}. \ - Expected {}.", - response_pubkey, pubkey, - ))); - } - // Get the Ledger to sign using our obtained derivation path - let response = app - .sign(&path, &tx.serialize_to_vec()) - .await - .map_err(|err| error::Error::Other(err.to_string()))?; - // Sign the raw header if that is requested - if parts.contains(&signing::Signable::RawHeader) { - let pubkey = - common::PublicKey::try_from_slice(&response.pubkey) - .expect( - "unable to parse public key from Ledger", - ); - let signature = common::Signature::try_from_slice( - &response.raw_signature, - ) - .expect("unable to parse signature from Ledger"); - // Signatures from the Ledger come back in compressed - // form - let compressed = CompressedSignature { - targets: response.raw_indices, - signer: Signer::PubKeys(vec![pubkey]), - signatures: [(0, signature)].into(), - }; - // Expand out the signature before adding it to the - // transaction - tx.add_section(Section::Signature( - compressed.expand(&tx), - )); - } - // Sign the fee header if that is requested - if parts.contains(&signing::Signable::FeeHeader) { - let pubkey = - common::PublicKey::try_from_slice(&response.pubkey) - .expect( - "unable to parse public key from Ledger", - ); - let signature = common::Signature::try_from_slice( - &response.wrapper_signature, - ) - .expect("unable to parse signature from Ledger"); - // Signatures from the Ledger come back in compressed - // form - let compressed = CompressedSignature { - targets: response.wrapper_indices, - signer: Signer::PubKeys(vec![pubkey]), - signatures: [(0, signature)].into(), - }; - // Expand out the signature before adding it to the - // transaction - tx.add_section(Section::Signature( - compressed.expand(&tx), - )); - } - Ok(tx) - } - }; + with_hardware_wallet::(context.wallet_lock(), &app); // Finally, begin the signing with the Ledger as backup context.sign(tx, args, signing_data, with_hw).await?; } else { diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 6c42648ab5..dea469bb86 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -11,6 +11,7 @@ use flate2::write::GzEncoder; use flate2::Compression; use itertools::Either; use namada::core::types::string_encoding::StringEncoded; +use namada::types::address::nam; use namada::types::chain::ChainId; use namada::types::dec::Dec; use namada::types::key::*; @@ -968,6 +969,7 @@ pub async fn sign_genesis_tx( path, output, validator_alias, + use_device, }: args::SignGenesisTx, ) { let (mut wallet, _wallet_file) = @@ -1016,6 +1018,7 @@ pub async fn sign_genesis_tx( tx, &mut wallet, &genesis_txs.established_account, + get_tx_args(use_device), ) .await, ); @@ -1037,6 +1040,7 @@ pub async fn sign_genesis_tx( "Established account txs required \ when signing validator account txs", ), + get_tx_args(use_device), ) .await, ); @@ -1079,6 +1083,34 @@ pub async fn sign_genesis_tx( } } +fn get_tx_args(use_device: bool) -> args::Tx { + args::Tx { + dry_run: false, + dry_run_wrapper: false, + dump_tx: false, + output_folder: None, + force: false, + broadcast_only: false, + ledger_address: (), + initialized_account_alias: None, + wallet_alias_force: false, + fee_amount: None, + wrapper_fee_payer: None, + fee_token: nam(), + fee_unshield: None, + gas_limit: Default::default(), + expiration: None, + disposable_signing_key: false, + chain_id: None, + signing_keys: vec![], + signatures: vec![], + tx_reveal_code_path: Default::default(), + verification_key: None, + password: None, + use_device, + } +} + /// Add a spinning wheel to a message for long running commands. /// Can be turned off for E2E tests by setting the `REDUCED_CLI_PRINTING` /// environment variable. diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index 33d8fe90ba..ca340cadfd 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -2,8 +2,8 @@ pub mod chain; pub mod templates; -pub mod toml_utils; pub mod transactions; +pub mod utils; use std::collections::{BTreeMap, HashMap}; use std::fmt::{Display, Formatter}; diff --git a/apps/src/lib/config/genesis/chain.rs b/apps/src/lib/config/genesis/chain.rs index b5ff28d086..88e6893acc 100644 --- a/apps/src/lib/config/genesis/chain.rs +++ b/apps/src/lib/config/genesis/chain.rs @@ -19,7 +19,7 @@ use namada_sdk::wallet::{pre_genesis, Wallet}; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; -use super::toml_utils::{read_toml, write_toml}; +use super::utils::{read_toml, write_toml}; use super::{templates, transactions}; use crate::config::genesis::templates::Validated; use crate::config::utils::{set_ip, set_port}; diff --git a/apps/src/lib/config/genesis/templates.rs b/apps/src/lib/config/genesis/templates.rs index 166efcad9a..fb374c4866 100644 --- a/apps/src/lib/config/genesis/templates.rs +++ b/apps/src/lib/config/genesis/templates.rs @@ -17,8 +17,8 @@ use namada::types::token::{ }; use serde::{Deserialize, Serialize}; -use super::toml_utils::{read_toml, write_toml}; use super::transactions::{self, Transactions}; +use super::utils::{read_toml, write_toml}; use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::genesis::transactions::{BondTx, SignedBondTx}; use crate::config::genesis::GenesisAddress; diff --git a/apps/src/lib/config/genesis/toml_utils.rs b/apps/src/lib/config/genesis/toml_utils.rs deleted file mode 100644 index e699341951..0000000000 --- a/apps/src/lib/config/genesis/toml_utils.rs +++ /dev/null @@ -1,38 +0,0 @@ -use std::path::Path; - -use eyre::Context; -use serde::de::DeserializeOwned; -use serde::Serialize; - -pub fn read_toml( - path: &Path, - which_file: &str, -) -> eyre::Result { - let file_contents = std::fs::read_to_string(path).wrap_err_with(|| { - format!( - "Couldn't read {which_file} config file from {}", - path.to_string_lossy() - ) - })?; - toml::from_str(&file_contents).wrap_err_with(|| { - format!( - "Couldn't parse {which_file} TOML from {}", - path.to_string_lossy() - ) - }) -} - -pub fn write_toml( - data: &T, - path: &Path, - which_file: &str, -) -> eyre::Result<()> { - let file_contents = toml::to_vec(data) - .wrap_err_with(|| format!("Couldn't format {which_file} to TOML."))?; - std::fs::write(path, file_contents).wrap_err_with(|| { - format!( - "Couldn't write {which_file} TOML to {}", - path.to_string_lossy() - ) - }) -} diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 2a0b4f4d05..cc3ff7c592 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -8,34 +8,44 @@ use borsh::{BorshDeserialize, BorshSerialize}; use itertools::{Either, Itertools}; use namada::core::types::address::{Address, EstablishedAddress}; use namada::core::types::string_encoding::StringEncoded; +use namada::ledger::pos::common::PublicKey; use namada::ledger::pos::types::ValidatorMetaData; -use namada::proto::{ - standalone_signature, verify_standalone_sig, SerializeWithBorsh, Tx, -}; +use namada::proto::{verify_standalone_sig, Section, SerializeWithBorsh, Tx}; use namada::types::dec::Dec; use namada::types::key::{common, ed25519, RefTo, SigScheme, VerifySigError}; use namada::types::time::{DateTimeUtc, MIN_UTC}; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; use namada::types::transaction::{pos, Fee, TxType}; +use namada_sdk::signing::{sign_tx, SigningTxData}; use namada_sdk::tx::{TX_BECOME_VALIDATOR_WASM, TX_BOND_WASM}; use namada_sdk::wallet::alias::Alias; use namada_sdk::wallet::pre_genesis::ValidatorWallet; use namada_sdk::wallet::Wallet; use serde::{Deserialize, Serialize}; +use tokio::sync::RwLock; use super::templates::{DenominatedBalances, Parameters, ValidityPredicates}; +use crate::cli::args; use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::genesis::templates::{ TemplateValidation, Unvalidated, Validated, }; -use crate::config::genesis::GenesisAddress; +use crate::config::genesis::{utils, GenesisAddress}; use crate::wallet::CliWalletUtils; /// Helper trait to fetch tx data to sign. pub trait TxToSign { /// Return tx data to sign. - fn tx_to_sign(&self) -> Vec; + fn tx_to_sign(&self) -> Tx; + + /// Get public keys that may sign this transaction from a genesis address + fn get_pks( + &self, + accounts: &[EstablishedAccountTx], + ) -> (Vec, u8); + + fn get_owner(&self) -> GenesisAddress; } /// Return a ready to sign genesis [`Tx`]. @@ -245,23 +255,33 @@ pub async fn sign_validator_account_tx( >, wallet: &mut Wallet, established_accounts: &[EstablishedAccountTx], + args: args::Tx, ) -> SignedValidatorAccountTx { let mut to_sign = match to_sign { Either::Right(signed_tx) => signed_tx, Either::Left((unsigned_tx, validator_wallet)) => { + fn sign_key( + tx_data: &T, + keypair: &common::SecretKey, + ) -> StringEncoded { + StringEncoded::new(namada::proto::standalone_signature::< + T, + SerializeWithBorsh, + >(keypair, tx_data)) + } // Sign the tx with every validator key to authorize their usage let consensus_key_sig = - sign_tx(&unsigned_tx, &validator_wallet.consensus_key); - let protocol_key_sig = sign_tx( + sign_key(&unsigned_tx, &validator_wallet.consensus_key); + let protocol_key_sig = sign_key( &unsigned_tx, &validator_wallet.store.validator_keys.protocol_keypair, ); let eth_hot_key_sig = - sign_tx(&unsigned_tx, &validator_wallet.eth_hot_key); + sign_key(&unsigned_tx, &validator_wallet.eth_hot_key); let eth_cold_key_sig = - sign_tx(&unsigned_tx, &validator_wallet.eth_cold_key); + sign_key(&unsigned_tx, &validator_wallet.eth_cold_key); let tendermint_node_key_sig = - sign_tx(&unsigned_tx, &validator_wallet.tendermint_node_key); + sign_key(&unsigned_tx, &validator_wallet.tendermint_node_key); let ValidatorAccountTx { address, @@ -316,13 +336,7 @@ pub async fn sign_validator_account_tx( } }; - let source_keys = look_up_sks_from( - &GenesisAddress::EstablishedAddress(to_sign.data.address.raw.clone()), - wallet, - Some(established_accounts), - ); - - to_sign.sign(&source_keys).await; + to_sign.sign(established_accounts, wallet, args).await; to_sign } @@ -330,26 +344,15 @@ pub async fn sign_delegation_bond_tx( mut to_sign: SignedBondTx, wallet: &mut Wallet, established_accounts: &Option>, + args: args::Tx, ) -> SignedBondTx { - let source_keys = look_up_sks_from( - &to_sign.data.source, - wallet, - established_accounts.as_ref().map(|txs| txs.as_slice()), - ); - to_sign.sign(&source_keys).await; + let default = vec![]; + let established_accounts = + established_accounts.as_ref().unwrap_or(&default); + to_sign.sign(established_accounts, wallet, &mut args).await; to_sign } -pub fn sign_tx( - tx_data: &T, - keypair: &common::SecretKey, -) -> StringEncoded { - StringEncoded::new(namada::proto::standalone_signature::< - T, - SerializeWithBorsh, - >(keypair, tx_data)) -} - #[derive( Clone, Debug, @@ -506,7 +509,7 @@ pub struct ValidatorAccountTx { } impl TxToSign for ValidatorAccountTx { - fn tx_to_sign(&self) -> Vec { + fn tx_to_sign(&self) -> Tx { get_tx_to_sign( TX_BECOME_VALIDATOR_WASM, pos::BecomeValidator { @@ -529,7 +532,39 @@ impl TxToSign for ValidatorAccountTx { discord_handle: self.metadata.discord_handle.clone(), }, ) - .to_bytes() + } + + fn get_pks( + &self, + established_accounts: &[EstablishedAccountTx], + ) -> (Vec, u8) { + established_accounts + .iter() + .find_map(|account| { + if &account.derive_established_address() == self.address.raw { + Some(( + account + .public_keys + .iter() + .map(|pk| pk.raw.clone()) + .collect::>(), + account.threshold, + )) + } else { + None + } + }) + .unwrap_or_else(|| { + panic!( + "Cannot sign a pre-genesis tx because the established \ + address {} could not be found", + self.address + ) + }) + } + + fn get_owner(&self) -> GenesisAddress { + GenesisAddress::EstablishedAddress(self.address.raw.clone()) } } @@ -598,19 +633,59 @@ impl Signed { } /// Sign the underlying data and add to the list of signatures. - pub async fn sign(&mut self, keys: &[common::SecretKey]) - where + pub async fn sign( + &mut self, + established_accounts: &[EstablishedAccountTx], + wallet: &mut Wallet, + args: args::Tx, + ) where T: BorshSerialize + TxToSign, { - for sk in keys { + let wallet_lock = RwLock::new(wallet); + let (pks, threshold) = self.data.get_pks(established_accounts); + let owner = self.data.get_owner().address(); + let signing_data = SigningTxData { + owner: Some(owner), + account_public_keys_map: Some(pks.iter().cloned().collect()), + public_keys: pks.clone(), + threshold, + fee_payer: common::SecretKey::Ed25519( + ed25519::SigScheme::from_bytes([0; 32]), + ) + .ref_to(), + }; + + let mut tx = self.data.tx_to_sign(); + sign_tx( + wallet, + &args, + &mut tx, + signing_data, + utils::with_hardware_wallet(&wallet_lock), + ) + .await + .expect("Failed to sign pre-genesis transaction."); + + let raw_header_hash = tx.raw_header_hash(); + let sigs = tx + .sections + .iter() + .find_map(|sec| { + if let Section::Signature(signatures) = sec { + if &[raw_header_hash] == signatures.targets.as_slice() { + Some(signatures) + } else { + None + } + } else { + None + } + }) + .unwrap(); + for (ix, sig) in sigs.signatures.into_iter() { self.signatures.insert( - StringEncoded::new(sk.ref_to()), - StringEncoded::new( - standalone_signature::<_, SerializeWithBorsh>( - sk, - &self.data.tx_to_sign(), - ), - ), + StringEncoded::new(pks[ix as usize].clone()), + StringEncoded::new(sig), ); } } @@ -674,7 +749,7 @@ impl TxToSign for BondTx where T: TemplateValidation + BorshSerialize, { - fn tx_to_sign(&self) -> Vec { + fn tx_to_sign(&self) -> Tx { get_tx_to_sign( TX_BOND_WASM, pos::Bond { @@ -683,7 +758,42 @@ where source: Some(self.source.address()), }, ) - .to_bytes() + } + + fn get_pks( + &self, + established_accounts: &[EstablishedAccountTx], + ) -> (Vec, u8) { + match &self.source { + GenesisAddress::PublicKey(pk) => (vec![pk.raw.clone()], 1), + GenesisAddress::EstablishedAddress(owner) => established_accounts + .iter() + .find_map(|account| { + if &account.derive_established_address() == owner { + Some(( + account + .public_keys + .iter() + .map(|pk| pk.raw.clone()) + .collect::>(), + account.threshold, + )) + } else { + None + } + }) + .unwrap_or_else(|| { + panic!( + "Cannot sign a pre-genesis tx because the established \ + address {} could not be found", + owner + ) + }), + } + } + + fn get_owner(&self) -> GenesisAddress { + self.source.clone() } } @@ -1269,58 +1379,3 @@ impl From<&ValidatorAccountTx> for UnsignedValidatorAccountTx { } } } - -/// Attempt look-up a subset of secret keys from the wallet matching -/// the queried established account's public keys. -fn look_up_sks_from( - source: &GenesisAddress, - wallet: &mut Wallet, - established_accounts: Option<&[EstablishedAccountTx]>, -) -> Vec { - // Try to look-up the source from wallet first - match source { - GenesisAddress::EstablishedAddress(_) => None, - GenesisAddress::PublicKey(pk) => { - wallet.find_key_by_pk(pk, None).map(|sk| vec![sk]).ok() - } - } - .unwrap_or_else(|| { - // If it's not in the wallet, it must be an established account - // so we need to look-up its public key first - if established_accounts.is_none() { - return vec![]; - } - established_accounts - .unwrap() - .iter() - .find_map(|account| match source { - GenesisAddress::EstablishedAddress(address) => { - // delegation from established account - if &account.derive_established_address() == address { - Some( - account - .public_keys - .iter() - .map(|pk| &pk.raw) - .collect::>(), - ) - } else { - None - } - } - GenesisAddress::PublicKey(pk) => { - // delegation from an implicit account - Some(vec![&pk.raw]) - } - }) - .unwrap_or_else(|| { - panic!( - "Signing failed. Cannot find \"{source}\" in the wallet \ - or in the established accounts." - ); - }) - .iter() - .filter_map(|pk| wallet.find_key_by_pk(pk, None).ok()) - .collect() - }) -} diff --git a/apps/src/lib/config/genesis/utils.rs b/apps/src/lib/config/genesis/utils.rs new file mode 100644 index 0000000000..dcc7e71cca --- /dev/null +++ b/apps/src/lib/config/genesis/utils.rs @@ -0,0 +1,76 @@ +use std::collections::HashSet; +use std::future::Future; +use std::path::Path; + +use eyre::Context; +use ledger_namada_rs::NamadaApp; +use ledger_transport_hid::hidapi::HidApi; +use ledger_transport_hid::TransportNativeHID; +use namada::proto::Tx; +use namada::types::key::common; +use namada_sdk::wallet::Wallet; +use namada_sdk::{error, signing}; +use serde::de::DeserializeOwned; +use serde::Serialize; +use tokio::sync::RwLock; + +use crate::wallet::CliWalletUtils; + +pub fn read_toml( + path: &Path, + which_file: &str, +) -> eyre::Result { + let file_contents = std::fs::read_to_string(path).wrap_err_with(|| { + format!( + "Couldn't read {which_file} config file from {}", + path.to_string_lossy() + ) + })?; + toml::from_str(&file_contents).wrap_err_with(|| { + format!( + "Couldn't parse {which_file} TOML from {}", + path.to_string_lossy() + ) + }) +} + +pub fn write_toml( + data: &T, + path: &Path, + which_file: &str, +) -> eyre::Result<()> { + let file_contents = toml::to_vec(data) + .wrap_err_with(|| format!("Couldn't format {which_file} to TOML."))?; + std::fs::write(path, file_contents).wrap_err_with(|| { + format!( + "Couldn't write {which_file} TOML to {}", + path.to_string_lossy() + ) + }) +} + +pub(super) fn with_hardware_wallet( + wallet: &RwLock<&mut Wallet>, +) -> F +where + F: Fn(Tx, common::PublicKey, HashSet) -> T, + T: Future> + Sized, +{ + // Setup a reusable context for signing transactions using the Ledger + let hidapi = + HidApi::new().map_err(|err| panic!("Failed to create Hidapi: {}", err)); + let app = NamadaApp::new( + TransportNativeHID::new(&hidapi) + .map_err(|err| panic!("Unable to connect to Ledger: {}", err))?, + ); + |tx: Tx, pubkey: common::PublicKey, parts: HashSet| async move { + if parts.contains(&signing::Signable::FeeHeader) { + return Ok(tx); + } + let app = app; + let with_hw = crate::client::tx::with_hardware_wallet::( + wallet, &app, + ); + with_hw(tx, pubkey, parts).await + } +} diff --git a/sdk/src/io.rs b/sdk/src/io.rs index 248f6f91d9..76f97d50b7 100644 --- a/sdk/src/io.rs +++ b/sdk/src/io.rs @@ -79,6 +79,7 @@ pub trait Io { } /// Rust native I/O handling. +#[derive(Default)] pub struct StdIo; #[async_trait::async_trait(?Send)] diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 04a2c63943..df3b881396 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -92,6 +92,9 @@ pub trait Namada<'a>: Sized { &self, ) -> RwLockWriteGuard<&'a mut Wallet>; + /// Obtain the wallet lock + fn wallet_lock(&self) -> &RwLock<&'a mut Wallet>; + /// Obtain read guard on the shielded context async fn shielded( &self, @@ -532,7 +535,7 @@ pub trait Namada<'a>: Sized { signing_data: SigningTxData, with: impl Fn(Tx, common::PublicKey, HashSet) -> F, ) -> crate::error::Result<()> { - signing::sign_tx(self, args, tx, signing_data, with).await + signing::sign_tx(self.wallet_lock(), args, tx, signing_data, with).await } /// Process the given transaction using the given flags @@ -707,6 +710,10 @@ where ) -> RwLockWriteGuard<&'a mut ShieldedContext> { self.shielded.write().await } + + fn wallet_lock(&self) -> &RwLock<&'a mut Wallet> { + &self.wallet + } } /// Allow the prototypical Tx builder to be modified diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index dd75e942f0..6240e0fd81 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -33,6 +33,7 @@ use prost::Message; use rand::rngs::OsRng; use serde::{Deserialize, Serialize}; use sha2::Digest; +use tokio::sync::RwLock; use super::masp::{ShieldedContext, ShieldedTransfer}; use crate::args::SdkTypes; @@ -225,8 +226,12 @@ pub async fn default_sign( /// hashes needed for monitoring the tx on chain. /// /// If it is a dry run, it is not put in a wrapper, but returned as is. -pub async fn sign_tx<'a, F: std::future::Future>>( - context: &impl Namada<'a>, +pub async fn sign_tx< + 'a, + U: WalletIo, + F: std::future::Future>, +>( + wallet: &RwLock<&'a mut Wallet>, args: &args::Tx, tx: &mut Tx, signing_data: SigningTxData, @@ -251,7 +256,7 @@ pub async fn sign_tx<'a, F: std::future::Future>>( // Then try to sign the raw header with private keys in the software wallet if let Some(account_public_keys_map) = signing_data.account_public_keys_map { - let mut wallet = context.wallet_mut().await; + let mut wallet = wallet.write().await; let signing_tx_keypairs = signing_data .public_keys .iter() @@ -299,7 +304,7 @@ pub async fn sign_tx<'a, F: std::future::Future>>( let key = { // Lock the wallet just long enough to extract a key from it without // interfering with the sign closure call - let mut wallet = context.wallet_mut().await; + let mut wallet = wallet.write().await; find_key_by_pk(*wallet, args, &signing_data.fee_payer) }; match key { diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index 6d4379720a..7852218ba8 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -22,7 +22,7 @@ use namada::types::chain::ChainId; use namada_apps::client::utils::{ self, validator_pre_genesis_dir, validator_pre_genesis_txs_file, }; -use namada_apps::config::genesis::toml_utils::read_toml; +use namada_apps::config::genesis::utils::read_toml; use namada_apps::config::genesis::{templates, GenesisAddress}; use namada_apps::config::{ethereum_bridge, genesis, Config}; use namada_apps::{config, wallet}; From 7fe53eb1ee4fdf66906cf04c56e05a147afa6910 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 28 Nov 2023 09:50:27 +0000 Subject: [PATCH 120/175] lifetime heaven --- apps/src/lib/client/tx.rs | 191 +++++++-------- apps/src/lib/client/utils.rs | 34 +-- apps/src/lib/config/genesis.rs | 1 - apps/src/lib/config/genesis/chain.rs | 8 +- apps/src/lib/config/genesis/transactions.rs | 239 +++++++++++++------ apps/src/lib/config/genesis/utils.rs | 44 ++-- apps/src/lib/node/ledger/shell/init_chain.rs | 5 +- core/src/proto/types.rs | 8 +- core/src/types/account.rs | 6 + core/src/types/key/mod.rs | 2 - sdk/src/lib.rs | 21 +- sdk/src/signing.rs | 19 +- tests/src/e2e/ibc_tests.rs | 5 +- 13 files changed, 328 insertions(+), 255 deletions(-) diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 3e1c7cc10c..fef1d52035 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -1,8 +1,6 @@ use std::collections::HashSet; use std::fs::File; -use std::future::Future; use std::io::Write; -use std::pin::Pin; use borsh::BorshDeserialize; use borsh_ext::BorshSerializeExt; @@ -72,100 +70,87 @@ pub async fn aux_signing_data<'a>( Ok(signing_data) } -pub fn with_hardware_wallet<'a, 'b, U: WalletIo + Clone>( - wallet: &RwLock<&'b mut Wallet>, - app: &NamadaApp, -) -> impl Fn( - Tx, - common::PublicKey, - HashSet, -) -> Pin>>> { - let wallet = wallet.read(); - move |mut tx: Tx, - pubkey: common::PublicKey, - parts: HashSet| { - Box::pin(async move { - // Obtain derivation path - let path = wallet - .await - .find_path_by_pkh(&(&pubkey).into()) - .map_err(|_| { - error::Error::Other( - "Unable to find derivation path for key".to_string(), - ) - })?; - let path = BIP44Path { - path: path.to_string(), - }; - // Now check that the public key at this path in the Ledger - // matches - let response_pubkey = app - .get_address_and_pubkey(&path, false) - .await - .map_err(|err| error::Error::Other(err.to_string()))?; - let response_pubkey = - common::PublicKey::try_from_slice(&response_pubkey.public_key) - .map_err(|err| { - error::Error::Other(format!( - "unable to decode public key from hardware \ - wallet: {}", - err - )) - })?; - if response_pubkey != pubkey { - return Err(error::Error::Other(format!( - "Unrecognized public key fetched fom Ledger: {}. Expected \ - {}.", - response_pubkey, pubkey, - ))); - } - // Get the Ledger to sign using our obtained derivation path - let response = app - .sign(&path, &tx.serialize_to_vec()) - .await - .map_err(|err| error::Error::Other(err.to_string()))?; - // Sign the raw header if that is requested - if parts.contains(&signing::Signable::RawHeader) { - let pubkey = - common::PublicKey::try_from_slice(&response.pubkey) - .expect("unable to parse public key from Ledger"); - let signature = - common::Signature::try_from_slice(&response.raw_signature) - .expect("unable to parse signature from Ledger"); - // Signatures from the Ledger come back in compressed - // form - let compressed = CompressedSignature { - targets: response.raw_indices, - signer: Signer::PubKeys(vec![pubkey]), - signatures: [(0, signature)].into(), - }; - // Expand out the signature before adding it to the - // transaction - tx.add_section(Section::Signature(compressed.expand(&tx))); - } - // Sign the fee header if that is requested - if parts.contains(&signing::Signable::FeeHeader) { - let pubkey = - common::PublicKey::try_from_slice(&response.pubkey) - .expect("unable to parse public key from Ledger"); - let signature = common::Signature::try_from_slice( - &response.wrapper_signature, - ) +pub async fn with_hardware_wallet<'a, U: WalletIo + Clone>( + mut tx: Tx, + pubkey: common::PublicKey, + parts: HashSet, + (wallet, app): (&RwLock<&'a mut Wallet>, &NamadaApp), +) -> Result { + // Obtain derivation path + let path = wallet + .read() + .await + .find_path_by_pkh(&(&pubkey).into()) + .map_err(|_| { + error::Error::Other( + "Unable to find derivation path for key".to_string(), + ) + })?; + let path = BIP44Path { + path: path.to_string(), + }; + // Now check that the public key at this path in the Ledger + // matches + let response_pubkey = app + .get_address_and_pubkey(&path, false) + .await + .map_err(|err| error::Error::Other(err.to_string()))?; + let response_pubkey = + common::PublicKey::try_from_slice(&response_pubkey.public_key) + .map_err(|err| { + error::Error::Other(format!( + "unable to decode public key from hardware wallet: {}", + err + )) + })?; + if response_pubkey != pubkey { + return Err(error::Error::Other(format!( + "Unrecognized public key fetched fom Ledger: {}. Expected {}.", + response_pubkey, pubkey, + ))); + } + // Get the Ledger to sign using our obtained derivation path + let response = app + .sign(&path, &tx.serialize_to_vec()) + .await + .map_err(|err| error::Error::Other(err.to_string()))?; + // Sign the raw header if that is requested + if parts.contains(&signing::Signable::RawHeader) { + let pubkey = common::PublicKey::try_from_slice(&response.pubkey) + .expect("unable to parse public key from Ledger"); + let signature = + common::Signature::try_from_slice(&response.raw_signature) .expect("unable to parse signature from Ledger"); - // Signatures from the Ledger come back in compressed - // form - let compressed = CompressedSignature { - targets: response.wrapper_indices, - signer: Signer::PubKeys(vec![pubkey]), - signatures: [(0, signature)].into(), - }; - // Expand out the signature before adding it to the - // transaction - tx.add_section(Section::Signature(compressed.expand(&tx))); - } - Ok(tx) - }) + // Signatures from the Ledger come back in compressed + // form + let compressed = CompressedSignature { + targets: response.raw_indices, + signer: Signer::PubKeys(vec![pubkey]), + signatures: [(0, signature)].into(), + }; + // Expand out the signature before adding it to the + // transaction + tx.add_section(Section::Signature(compressed.expand(&tx))); + } + // Sign the fee header if that is requested + if parts.contains(&signing::Signable::FeeHeader) { + let pubkey = common::PublicKey::try_from_slice(&response.pubkey) + .expect("unable to parse public key from Ledger"); + let signature = + common::Signature::try_from_slice(&response.wrapper_signature) + .expect("unable to parse signature from Ledger"); + // Signatures from the Ledger come back in compressed + // form + let compressed = CompressedSignature { + targets: response.wrapper_indices, + signer: Signer::PubKeys(vec![pubkey]), + signatures: [(0, signature)].into(), + }; + // Expand out the signature before adding it to the + // transaction + tx.add_section(Section::Signature(compressed.expand(&tx))); } + Ok(tx) } // Sign the given transaction using a hardware wallet as a backup @@ -189,14 +174,22 @@ pub async fn sign<'a, N: Namada<'a>>( )) }, )?); - // A closure to facilitate signing transactions also using the Ledger - let with_hw = - with_hardware_wallet::(context.wallet_lock(), &app); + let with_hw_data = (context.wallet_lock(), &app); // Finally, begin the signing with the Ledger as backup - context.sign(tx, args, signing_data, with_hw).await?; + context + .sign( + tx, + args, + signing_data, + with_hardware_wallet::, + with_hw_data, + ) + .await?; } else { // Otherwise sign without a backup procedure - context.sign(tx, args, signing_data, default_sign).await?; + context + .sign(tx, args, signing_data, default_sign, ()) + .await?; } Ok(()) } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index dea469bb86..afb6dfef20 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -11,7 +11,6 @@ use flate2::write::GzEncoder; use flate2::Compression; use itertools::Either; use namada::core::types::string_encoding::StringEncoded; -use namada::types::address::nam; use namada::types::chain::ChainId; use namada::types::dec::Dec; use namada::types::key::*; @@ -993,6 +992,7 @@ pub async fn sign_genesis_tx( unsigned, &mut wallet, maybe_pre_genesis_wallet.as_ref(), + use_device, ) .await, true, @@ -1018,7 +1018,7 @@ pub async fn sign_genesis_tx( tx, &mut wallet, &genesis_txs.established_account, - get_tx_args(use_device), + use_device, ) .await, ); @@ -1040,7 +1040,7 @@ pub async fn sign_genesis_tx( "Established account txs required \ when signing validator account txs", ), - get_tx_args(use_device), + use_device, ) .await, ); @@ -1083,34 +1083,6 @@ pub async fn sign_genesis_tx( } } -fn get_tx_args(use_device: bool) -> args::Tx { - args::Tx { - dry_run: false, - dry_run_wrapper: false, - dump_tx: false, - output_folder: None, - force: false, - broadcast_only: false, - ledger_address: (), - initialized_account_alias: None, - wallet_alias_force: false, - fee_amount: None, - wrapper_fee_payer: None, - fee_token: nam(), - fee_unshield: None, - gas_limit: Default::default(), - expiration: None, - disposable_signing_key: false, - chain_id: None, - signing_keys: vec![], - signatures: vec![], - tx_reveal_code_path: Default::default(), - verification_key: None, - password: None, - use_device, - } -} - /// Add a spinning wheel to a message for long running commands. /// Can be turned off for E2E tests by setting the `REDUCED_CLI_PRINTING` /// environment variable. diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index ca340cadfd..c24497d549 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -489,7 +489,6 @@ pub fn make_dev_genesis( }, }; vals.push(chain::FinalizedValidatorAccountTx { - address: Address::Established(address.clone()), tx: transactions::Signed::new( transactions::ValidatorAccountTx { address: StringEncoded::new(address.clone()), diff --git a/apps/src/lib/config/genesis/chain.rs b/apps/src/lib/config/genesis/chain.rs index 88e6893acc..d8e57f11f6 100644 --- a/apps/src/lib/config/genesis/chain.rs +++ b/apps/src/lib/config/genesis/chain.rs @@ -146,7 +146,7 @@ impl Finalized { let address = self .transactions .find_validator(&tendermint_pk) - .map(|tx| tx.address.clone()) + .map(|tx| Address::Established(tx.tx.data.address.raw.clone())) .expect("Validator alias not found in genesis transactions."); wallet.extend_from_pre_genesis_validator( address, @@ -650,10 +650,7 @@ impl FinalizedTransactions { }); let validator_account = validator_account.map(|txs| { txs.into_iter() - .map(|tx| FinalizedValidatorAccountTx { - address: Address::Established(tx.data.address.raw.clone()), - tx, - }) + .map(|tx| FinalizedValidatorAccountTx { tx }) .collect() }); FinalizedTransactions { @@ -745,7 +742,6 @@ pub struct FinalizedEstablishedAccountTx { Eq, )] pub struct FinalizedValidatorAccountTx { - pub address: Address, #[serde(flatten)] pub tx: transactions::SignedValidatorAccountTx, } diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index cc3ff7c592..25f8ac3455 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -1,22 +1,33 @@ //! Genesis transactions -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::{BTreeMap, BTreeSet, HashSet}; use std::fmt::Debug; use std::net::SocketAddr; use borsh::{BorshDeserialize, BorshSerialize}; +use borsh_ext::BorshSerializeExt; use itertools::{Either, Itertools}; +use ledger_namada_rs::NamadaApp; +use ledger_transport_hid::hidapi::HidApi; +use ledger_transport_hid::TransportNativeHID; +use namada::core::types::account::AccountPublicKeysMap; use namada::core::types::address::{Address, EstablishedAddress}; +use namada::core::types::chain::ChainId; use namada::core::types::string_encoding::StringEncoded; use namada::ledger::pos::common::PublicKey; use namada::ledger::pos::types::ValidatorMetaData; -use namada::proto::{verify_standalone_sig, Section, SerializeWithBorsh, Tx}; +use namada::proto::{ + verify_standalone_sig, Code, Commitment, Data, Section, SerializeWithBorsh, + SignatureIndex, Tx, +}; +use namada::types::address::nam; use namada::types::dec::Dec; -use namada::types::key::{common, ed25519, RefTo, SigScheme, VerifySigError}; +use namada::types::key::{common, ed25519, RefTo, SigScheme}; use namada::types::time::{DateTimeUtc, MIN_UTC}; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; use namada::types::transaction::{pos, Fee, TxType}; +use namada_sdk::args::Tx as TxArgs; use namada_sdk::signing::{sign_tx, SigningTxData}; use namada_sdk::tx::{TX_BECOME_VALIDATOR_WASM, TX_BOND_WASM}; use namada_sdk::wallet::alias::Alias; @@ -26,7 +37,6 @@ use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; use super::templates::{DenominatedBalances, Parameters, ValidityPredicates}; -use crate::cli::args; use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::genesis::templates::{ TemplateValidation, Unvalidated, Validated, @@ -34,6 +44,12 @@ use crate::config::genesis::templates::{ use crate::config::genesis::{utils, GenesisAddress}; use crate::wallet::CliWalletUtils; +/// Dummy chain id used to sign [`Tx`] objects at pre-genesis. +const NAMADA_GENESIS_TX_CHAIN_ID: &str = "namada-genesis"; + +/// Timestamp used to sign pre-genesis [`Tx`] objects. +pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; + /// Helper trait to fetch tx data to sign. pub trait TxToSign { /// Return tx data to sign. @@ -48,14 +64,51 @@ pub trait TxToSign { fn get_owner(&self) -> GenesisAddress; } +/// Return a dummy set of tx arguments to sign with the +/// hardware wallet. +fn get_tx_args(use_device: bool) -> TxArgs { + TxArgs { + dry_run: false, + dry_run_wrapper: false, + dump_tx: false, + output_folder: None, + force: false, + broadcast_only: false, + ledger_address: (), + initialized_account_alias: None, + wallet_alias_force: false, + fee_amount: None, + wrapper_fee_payer: None, + fee_token: nam(), + fee_unshield: None, + gas_limit: Default::default(), + expiration: None, + disposable_signing_key: false, + chain_id: None, + signing_keys: vec![], + signatures: vec![], + tx_reveal_code_path: Default::default(), + verification_key: None, + password: None, + use_device, + } +} + /// Return a ready to sign genesis [`Tx`]. fn get_tx_to_sign(tag: impl AsRef, data: impl BorshSerialize) -> Tx { let mut tx = Tx::from_type(TxType::Raw); - tx.add_code_from_hash(Default::default(), Some(tag.as_ref().to_string())); - tx.add_data(data); - let pk = - common::SecretKey::Ed25519(ed25519::SigScheme::from_bytes([0; 32])) - .ref_to(); + tx.header.chain_id = ChainId(NAMADA_GENESIS_TX_CHAIN_ID.to_string()); + tx.header.timestamp = PRE_GENESIS_TX_TIMESTAMP; + tx.set_code(Code { + salt: [0; 8], + code: Commitment::Hash(Default::default()), + tag: Some(tag.as_ref().to_string()), + }); + tx.set_data(Data { + salt: [0; 8], + data: data.serialize_to_vec(), + }); + let pk = get_sentinnel_pubkey(); tx.add_wrapper( Fee { amount_per_gas_unit: Default::default(), @@ -69,7 +122,11 @@ fn get_tx_to_sign(tag: impl AsRef, data: impl BorshSerialize) -> Tx { tx } -pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; +/// Get a dummy public key. +#[inline] +fn get_sentinnel_pubkey() -> common::PublicKey { + common::SecretKey::Ed25519(ed25519::SigScheme::from_bytes([0; 32])).ref_to() +} pub struct GenesisValidatorData { pub address: EstablishedAddress, @@ -90,6 +147,7 @@ pub async fn sign_txs( txs: UnsignedTransactions, wallet: &mut Wallet, validator_wallet: Option<&ValidatorWallet>, + use_device: bool, ) -> Transactions { let UnsignedTransactions { established_account, @@ -106,6 +164,7 @@ pub async fn sign_txs( tx.into(), wallet, &established_account, + use_device, ) .await, ); @@ -131,6 +190,7 @@ pub async fn sign_txs( "Established account txs required when signing \ validator account txs", ), + use_device, ) .await, ); @@ -255,7 +315,7 @@ pub async fn sign_validator_account_tx( >, wallet: &mut Wallet, established_accounts: &[EstablishedAccountTx], - args: args::Tx, + use_device: bool, ) -> SignedValidatorAccountTx { let mut to_sign = match to_sign { Either::Right(signed_tx) => signed_tx, @@ -336,7 +396,7 @@ pub async fn sign_validator_account_tx( } }; - to_sign.sign(established_accounts, wallet, args).await; + to_sign.sign(established_accounts, wallet, use_device).await; to_sign } @@ -344,12 +404,12 @@ pub async fn sign_delegation_bond_tx( mut to_sign: SignedBondTx, wallet: &mut Wallet, established_accounts: &Option>, - args: args::Tx, + use_device: bool, ) -> SignedBondTx { let default = vec![]; let established_accounts = established_accounts.as_ref().unwrap_or(&default); - to_sign.sign(established_accounts, wallet, &mut args).await; + to_sign.sign(established_accounts, wallet, use_device).await; to_sign } @@ -541,7 +601,7 @@ impl TxToSign for ValidatorAccountTx { established_accounts .iter() .find_map(|account| { - if &account.derive_established_address() == self.address.raw { + if account.derive_established_address() == self.address.raw { Some(( account .public_keys @@ -637,11 +697,10 @@ impl Signed { &mut self, established_accounts: &[EstablishedAccountTx], wallet: &mut Wallet, - args: args::Tx, + use_device: bool, ) where T: BorshSerialize + TxToSign, { - let wallet_lock = RwLock::new(wallet); let (pks, threshold) = self.data.get_pks(established_accounts); let owner = self.data.get_owner().address(); let signing_data = SigningTxData { @@ -649,30 +708,63 @@ impl Signed { account_public_keys_map: Some(pks.iter().cloned().collect()), public_keys: pks.clone(), threshold, - fee_payer: common::SecretKey::Ed25519( - ed25519::SigScheme::from_bytes([0; 32]), - ) - .ref_to(), + fee_payer: get_sentinnel_pubkey(), }; let mut tx = self.data.tx_to_sign(); - sign_tx( - wallet, - &args, - &mut tx, - signing_data, - utils::with_hardware_wallet(&wallet_lock), - ) - .await - .expect("Failed to sign pre-genesis transaction."); + let wallet_lock = RwLock::new(wallet); + + if use_device { + let hidapi = HidApi::new().expect("Failed to create Hidapi"); + let transport = TransportNativeHID::new(&hidapi) + .expect("Failed to create hardware wallet connection"); + let app = NamadaApp::new(transport); + + sign_tx( + &wallet_lock, + &get_tx_args(use_device), + &mut tx, + signing_data, + utils::with_hardware_wallet, + (&wallet_lock, &app), + ) + .await + .expect("Failed to sign pre-genesis transaction."); + } else { + async fn software_wallet_sign( + tx: Tx, + pubkey: common::PublicKey, + _parts: HashSet, + _user: (), + ) -> Result { + if pubkey == get_sentinnel_pubkey() { + Ok(tx) + } else { + Err(namada_sdk::error::Error::Other(format!( + "unable to sign transaction with {pubkey}", + ))) + } + } + + sign_tx( + &wallet_lock, + &get_tx_args(use_device), + &mut tx, + signing_data, + software_wallet_sign, + (), + ) + .await + .expect("Failed to sign pre-genesis transaction."); + } let raw_header_hash = tx.raw_header_hash(); let sigs = tx .sections - .iter() + .into_iter() .find_map(|sec| { if let Section::Signature(signatures) = sec { - if &[raw_header_hash] == signatures.targets.as_slice() { + if [raw_header_hash] == signatures.targets.as_slice() { Some(signatures) } else { None @@ -691,39 +783,40 @@ impl Signed { } /// Verify the signatures of the inner data. - pub fn verify_sig( - &self, - pks: &[common::PublicKey], - threshold: u8, - ) -> Result<(), VerifySigError> + pub fn verify_sig(&self, threshold: u8) -> Result<(), String> where T: BorshSerialize + TxToSign, { let Self { data, signatures } = self; - if pks.len() > u8::MAX as usize { - eprintln!("You're multisig is too facking big"); - return Err(VerifySigError::TooGoddamnBig); - } - let mut valid_sigs = 0; - let tx_to_sign = data.tx_to_sign(); - for pk in pks { - if let Some(sig) = signatures.get(&StringEncoded::new(pk.clone())) { - valid_sigs += verify_standalone_sig::<_, SerializeWithBorsh>( - &tx_to_sign, - pk, - &sig.raw, + let (public_keys, signatures): (Vec<_>, Vec<_>) = signatures + .iter() + .map(|(pk, sig)| { + ( + pk.raw.clone(), + SignatureIndex { + index: None, + signature: sig.raw.clone(), + pubkey: pk.raw.clone(), + }, ) - .is_ok() as u8; - if valid_sigs >= threshold { - break; - } - } - } - if valid_sigs >= threshold { - Ok(()) - } else { - Err(VerifySigError::ThresholdNotMet(threshold, valid_sigs)) - } + }) + .unzip(); + let signed_tx = { + let mut tx = data.tx_to_sign(); + tx.add_signatures(signatures); + tx + }; + signed_tx + .verify_signatures( + &[signed_tx.raw_header_hash()], + AccountPublicKeysMap::from_iter(public_keys.into_iter()), + &None, + threshold, + None, + || Ok(()), + ) + .map_err(|err| err.to_string())?; + Ok(()) } } @@ -995,22 +1088,18 @@ fn validate_bond( // Check signature let mut is_valid = { let source = &tx.data.source; - let maybe_source = match source { + let maybe_threshold = match source { GenesisAddress::EstablishedAddress(address) => { // Try to find the source's PK in either established_accounts or // validator_accounts let established_addr = Address::Established(address.clone()); - established_accounts - .get(&established_addr) - .map(|(pks, t)| (pks.as_slice(), *t)) - } - GenesisAddress::PublicKey(pk) => { - Some((std::slice::from_ref(&pk.raw), 1)) + established_accounts.get(&established_addr).map(|(_, t)| *t) } + GenesisAddress::PublicKey(_) => Some(1), }; - if let Some((source_pks, threshold)) = maybe_source { - if tx.verify_sig(source_pks, threshold).is_err() { - eprintln!("Invalid bond tx signature.",); + if let Some(threshold) = maybe_threshold { + if let Err(err) = tx.verify_sig(threshold) { + eprintln!("Invalid bond tx signature: {err}"); false } else { true @@ -1194,7 +1283,7 @@ pub fn validate_validator_account( // Check signature let mut is_valid = { - let maybe_source = { + let maybe_threshold = { let established_addr = Address::Established(tx.address.raw.clone()); established_accounts.get(&established_addr).map(|(pks, t)| { let all_ed25519_keys = pks @@ -1206,12 +1295,12 @@ pub fn validate_validator_account( {established_addr} are Ed25519 keys" ); } - (pks.as_slice(), *t) + *t }) }; - if let Some((source_pks, threshold)) = maybe_source { - if signed_tx.verify_sig(source_pks, threshold).is_err() { - eprintln!("Invalid validator account signature."); + if let Some(threshold) = maybe_threshold { + if let Err(err) = signed_tx.verify_sig(threshold) { + eprintln!("Invalid validator account signature: {err}"); false } else { true diff --git a/apps/src/lib/config/genesis/utils.rs b/apps/src/lib/config/genesis/utils.rs index dcc7e71cca..7918f8bc5b 100644 --- a/apps/src/lib/config/genesis/utils.rs +++ b/apps/src/lib/config/genesis/utils.rs @@ -1,10 +1,8 @@ use std::collections::HashSet; -use std::future::Future; use std::path::Path; use eyre::Context; use ledger_namada_rs::NamadaApp; -use ledger_transport_hid::hidapi::HidApi; use ledger_transport_hid::TransportNativeHID; use namada::proto::Tx; use namada::types::key::common; @@ -49,28 +47,24 @@ pub fn write_toml( }) } -pub(super) fn with_hardware_wallet( - wallet: &RwLock<&mut Wallet>, -) -> F -where - F: Fn(Tx, common::PublicKey, HashSet) -> T, - T: Future> + Sized, -{ - // Setup a reusable context for signing transactions using the Ledger - let hidapi = - HidApi::new().map_err(|err| panic!("Failed to create Hidapi: {}", err)); - let app = NamadaApp::new( - TransportNativeHID::new(&hidapi) - .map_err(|err| panic!("Unable to connect to Ledger: {}", err))?, - ); - |tx: Tx, pubkey: common::PublicKey, parts: HashSet| async move { - if parts.contains(&signing::Signable::FeeHeader) { - return Ok(tx); - } - let app = app; - let with_hw = crate::client::tx::with_hardware_wallet::( - wallet, &app, - ); - with_hw(tx, pubkey, parts).await +pub(super) async fn with_hardware_wallet<'a>( + tx: Tx, + pubkey: common::PublicKey, + parts: HashSet, + (wallet, app): ( + &RwLock<&'a mut Wallet>, + &NamadaApp, + ), +) -> Result { + if parts.contains(&signing::Signable::FeeHeader) { + Ok(tx) + } else { + crate::client::tx::with_hardware_wallet( + tx, + pubkey, + parts, + (wallet, app), + ) + .await } } diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index 88af71c96a..c07f627f8a 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -9,6 +9,7 @@ use namada::ledger::storage_api::token::{credit_tokens, write_denom}; use namada::ledger::storage_api::StorageWrite; use namada::ledger::{ibc, pos}; use namada::proof_of_stake::BecomeValidator; +use namada::types::address::Address; use namada::types::hash::Hash as CodeHash; use namada::types::key::*; use namada::types::time::{DateTimeUtc, TimeZone, Utc}; @@ -389,11 +390,11 @@ where ) { if let Some(txs) = genesis.transactions.validator_account.as_ref() { for FinalizedValidatorAccountTx { - address, tx: SignedTx { data: ValidatorAccountTx { + address, vp, commission_rate, max_commission_rate_change, @@ -410,6 +411,8 @@ where }, } in txs { + let address = &Address::Established(address.raw.clone()); + tracing::debug!( "Applying genesis tx to init a validator account {address}" ); diff --git a/core/src/proto/types.rs b/core/src/proto/types.rs index 97c16f1b1d..96652c22cb 100644 --- a/core/src/proto/types.rs +++ b/core/src/proto/types.rs @@ -1312,9 +1312,11 @@ impl Tx { } } } - Err(Error::InvalidSectionSignature( - "signature threshold not met.".to_string(), - )) + Err(Error::InvalidSectionSignature(format!( + "signature threshold not met: ({} < {})", + verified_pks.len(), + threshold + ))) } /// Verify that the sections with the given hashes have been signed together diff --git a/core/src/types/account.rs b/core/src/types/account.rs index 83f0b0aafe..b38c8b6792 100644 --- a/core/src/types/account.rs +++ b/core/src/types/account.rs @@ -7,6 +7,7 @@ use serde::{Deserialize, Serialize}; use super::address::Address; use super::key::{common, RefTo}; +use crate::hints; #[derive( Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, @@ -62,6 +63,11 @@ impl FromIterator for AccountPublicKeysMap { let mut idx_to_pk = HashMap::new(); for (index, public_key) in iter.into_iter().enumerate() { + if hints::unlikely(index > u8::MAX as usize) { + panic!( + "Only up to 255 signers are allowed in a multisig account" + ); + } pk_to_idx.insert(public_key.to_owned(), index as u8); idx_to_pk.insert(index as u8, public_key.to_owned()); } diff --git a/core/src/types/key/mod.rs b/core/src/types/key/mod.rs index fb9964cccc..9d22ee3af1 100644 --- a/core/src/types/key/mod.rs +++ b/core/src/types/key/mod.rs @@ -129,8 +129,6 @@ pub enum VerifySigError { required {0} got {1}" )] ThresholdNotMet(u8, u8), - #[error("Too many fucking sigs")] - TooGoddamnBig, } #[allow(missing_docs)] diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index df3b881396..1b467947b0 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -528,14 +528,27 @@ pub trait Namada<'a>: Sized { } /// Sign the given transaction using the given signing data - async fn sign>>( + async fn sign( &self, tx: &mut Tx, args: &args::Tx, signing_data: SigningTxData, - with: impl Fn(Tx, common::PublicKey, HashSet) -> F, - ) -> crate::error::Result<()> { - signing::sign_tx(self.wallet_lock(), args, tx, signing_data, with).await + with: impl Fn(Tx, common::PublicKey, HashSet, D) -> F, + user_data: D, + ) -> crate::error::Result<()> + where + D: Clone, + F: std::future::Future>, + { + signing::sign_tx( + self.wallet_lock(), + args, + tx, + signing_data, + with, + user_data, + ) + .await } /// Process the given transaction using the given flags diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index 6240e0fd81..f2e0d52473 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -208,6 +208,7 @@ pub async fn default_sign( _tx: Tx, pubkey: common::PublicKey, _parts: HashSet, + _user: (), ) -> Result { Err(Error::Other(format!( "unable to sign transaction with {}", @@ -226,17 +227,19 @@ pub async fn default_sign( /// hashes needed for monitoring the tx on chain. /// /// If it is a dry run, it is not put in a wrapper, but returned as is. -pub async fn sign_tx< - 'a, - U: WalletIo, - F: std::future::Future>, ->( +pub async fn sign_tx<'a, D, F, U>( wallet: &RwLock<&'a mut Wallet>, args: &args::Tx, tx: &mut Tx, signing_data: SigningTxData, - sign: impl Fn(Tx, common::PublicKey, HashSet) -> F, -) -> Result<(), Error> { + sign: impl Fn(Tx, common::PublicKey, HashSet, D) -> F, + user_data: D, +) -> Result<(), Error> +where + D: Clone, + U: WalletIo, + F: std::future::Future>, +{ let mut used_pubkeys = HashSet::new(); // First try to sign the raw header with the supplied signatures @@ -290,6 +293,7 @@ pub async fn sign_tx< tx.clone(), pubkey.clone(), HashSet::from([Signable::RawHeader]), + user_data.clone(), ) .await { @@ -316,6 +320,7 @@ pub async fn sign_tx< tx.clone(), signing_data.fee_payer.clone(), HashSet::from([Signable::FeeHeader, Signable::RawHeader]), + user_data, ) .await?; } diff --git a/tests/src/e2e/ibc_tests.rs b/tests/src/e2e/ibc_tests.rs index 0b20e3fa7c..7aa6355087 100644 --- a/tests/src/e2e/ibc_tests.rs +++ b/tests/src/e2e/ibc_tests.rs @@ -283,7 +283,10 @@ fn setup_two_single_node_nets() -> Result<(Test, Test)> { .as_mut() .unwrap() .iter_mut() - .find(|val| val.address == validator_addr) + .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; From 7af5d934dd51fd0516719480ea4f2ad2e1540e77 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 28 Nov 2023 16:20:04 +0000 Subject: [PATCH 121/175] wip: fixing localnet genesis templates --- genesis/localnet/balances.toml | 56 +++--- genesis/localnet/parameters.toml | 4 +- .../established-account-tx-albert.toml | 6 +- .../established-account-tx-bertha.toml | 6 +- .../established-account-tx-christel.toml | 6 +- .../established-account-tx-validator-0.toml | 4 + .../src/pre-genesis/signed-transactions.toml | 26 ++- .../pre-genesis/unsigned-transactions.toml | 13 +- .../validator-0/signed-transactions.toml | 45 +++++ .../pre-genesis/validator-0/transactions.toml | 44 ----- .../validator-0/unsigned-transactions.toml | 24 +++ .../validator-0/validator-wallet.toml | 1 - genesis/localnet/src/pre-genesis/wallet.toml | 11 +- genesis/localnet/transactions.toml | 168 ++++-------------- 14 files changed, 167 insertions(+), 247 deletions(-) create mode 100644 genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml create mode 100644 genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml delete mode 100644 genesis/localnet/src/pre-genesis/validator-0/transactions.toml create mode 100644 genesis/localnet/src/pre-genesis/validator-0/unsigned-transactions.toml diff --git a/genesis/localnet/balances.toml b/genesis/localnet/balances.toml index 78ddf06758..a14c274456 100644 --- a/genesis/localnet/balances.toml +++ b/genesis/localnet/balances.toml @@ -16,102 +16,102 @@ [token.NAM] # albert -tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "2000000" +tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu = "2000000" tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "2000000" # bertha -tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "2000000" +tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn = "2000000" tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq = "2000000" # christel -tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "2000000" +tnam1q9sx4ekzqaq3xdxtruxkm764nhl00cvcsc7df5jf = "2000000" tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79 = "2000000" # daewon tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "100000000" # ester tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" # validator-0 -tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "200000" +tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx = "200000" tpknam1qpzrttnzfyt6xfu2vy092eruasll3z52rjfexwapdw0rdww5uktlk3j73dw = "200000" [token.BTC] # albert -tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu = "1000000" # bertha -tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" +tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn = "1000000" # christel -tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +tnam1q9sx4ekzqaq3xdxtruxkm764nhl00cvcsc7df5jf = "1000000" # daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" # ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" # validator-0 -tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" +tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx = "1000000" [token.ETH] # albert -tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu = "1000000" # bertha -tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" +tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn = "1000000" # christel -tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +tnam1q9sx4ekzqaq3xdxtruxkm764nhl00cvcsc7df5jf = "1000000" # daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" # ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" # validator-0 -tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" +tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx = "1000000" [token.DOT] # albert -tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu = "1000000" # bertha -tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" +tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn = "1000000" # christel -tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +tnam1q9sx4ekzqaq3xdxtruxkm764nhl00cvcsc7df5jf = "1000000" # daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" # ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" # validator-0 -tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" +tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx = "1000000" [token.Schnitzel] # albert -tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu = "1000000" # bertha -tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" +tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn = "1000000" # christel -tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +tnam1q9sx4ekzqaq3xdxtruxkm764nhl00cvcsc7df5jf = "1000000" # daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" # ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" # validator-0 -tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" +tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx = "1000000" [token.Apfel] # albert -tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu = "1000000" # bertha -tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" +tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn = "1000000" # christel -tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +tnam1q9sx4ekzqaq3xdxtruxkm764nhl00cvcsc7df5jf = "1000000" # daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" # ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" # validator-0 -tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" +tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx = "1000000" [token.Kartoffel] # albert -tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt = "1000000" +tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu = "1000000" # bertha -tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7 = "1000000" +tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn = "1000000" # christel -tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns = "1000000" +tnam1q9sx4ekzqaq3xdxtruxkm764nhl00cvcsc7df5jf = "1000000" # daewon-key tpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm = "1000000" # ester-key tpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4 = "1000000" # validator-0 -tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w = "1000000" +tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx = "1000000" diff --git a/genesis/localnet/parameters.toml b/genesis/localnet/parameters.toml index 00a721290f..266fe803fa 100644 --- a/genesis/localnet/parameters.toml +++ b/genesis/localnet/parameters.toml @@ -93,9 +93,9 @@ min_proposal_grace_epochs = 6 # Initial set of stewards stewards = [ # bertha - "tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7", + "tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn", # validator-0 - "tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w" + "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" ] # The pgf funding inflation rate pgf_inflation_rate = "0.1" diff --git a/genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml b/genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml index 8bdc7b04b1..532198f7e2 100644 --- a/genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml +++ b/genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml @@ -1,6 +1,4 @@ [[established_account]] vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha" -authorization = "signam1qz39jpapmmxyc99ra8ty74kdx8c0kax3n42z7n5y44e3tcara4ezm3l4llgwgqhp0kgg0kz48d02v2xfeqn5at4h069dddvmlhral7qgm59d37" +threshold = 1 +public_keys = ["tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha"] diff --git a/genesis/localnet/src/pre-genesis/established/established-account-tx-bertha.toml b/genesis/localnet/src/pre-genesis/established/established-account-tx-bertha.toml index b6b1611bb5..177974ff4a 100644 --- a/genesis/localnet/src/pre-genesis/established/established-account-tx-bertha.toml +++ b/genesis/localnet/src/pre-genesis/established/established-account-tx-bertha.toml @@ -1,6 +1,4 @@ [[established_account]] vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq" -authorization = "signam1qqqvnh3e3j8rv6au622yw74jj76wpty7pttlnfussnyffhg8sk07q7g5ehw5hyz67amnvr4afmcr6tcfs6ktylcqrtc0h350j4zd0qgpqwn9z7" +threshold = 1 +public_keys = ["tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq"] diff --git a/genesis/localnet/src/pre-genesis/established/established-account-tx-christel.toml b/genesis/localnet/src/pre-genesis/established/established-account-tx-christel.toml index 2ecbd53966..cdb56e0666 100644 --- a/genesis/localnet/src/pre-genesis/established/established-account-tx-christel.toml +++ b/genesis/localnet/src/pre-genesis/established/established-account-tx-christel.toml @@ -1,6 +1,4 @@ [[established_account]] vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79" -authorization = "signam1qqfsz9dvtsan6kqp8zn256gvnuw5hsr27935w63cu0hl30535ewx7tpsf3zypq0hxmjh23z4q4sk7l046n6gjqmvg9ueyxl69lxgzvcfvujj9x" +threshold = 1 +public_keys = ["tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79"] diff --git a/genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml b/genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml new file mode 100644 index 0000000000..562ffd2ba0 --- /dev/null +++ b/genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml @@ -0,0 +1,4 @@ +[[established_account]] +vp = "vp_user" +threshold = 1 +public_keys = ["tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj"] diff --git a/genesis/localnet/src/pre-genesis/signed-transactions.toml b/genesis/localnet/src/pre-genesis/signed-transactions.toml index 9d6baed550..1fd02da9ff 100644 --- a/genesis/localnet/src/pre-genesis/signed-transactions.toml +++ b/genesis/localnet/src/pre-genesis/signed-transactions.toml @@ -1,26 +1,22 @@ [[established_account]] vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha" -authorization = "signam1qz39jpapmmxyc99ra8ty74kdx8c0kax3n42z7n5y44e3tcara4ezm3l4llgwgqhp0kgg0kz48d02v2xfeqn5at4h069dddvmlhral7qgm59d37" +threshold = 1 +public_keys = ["tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79"] [[established_account]] vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq" -authorization = "signam1qqqvnh3e3j8rv6au622yw74jj76wpty7pttlnfussnyffhg8sk07q7g5ehw5hyz67amnvr4afmcr6tcfs6ktylcqrtc0h350j4zd0qgpqwn9z7" +threshold = 1 +public_keys = ["tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq"] [[established_account]] vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79" -authorization = "signam1qqfsz9dvtsan6kqp8zn256gvnuw5hsr27935w63cu0hl30535ewx7tpsf3zypq0hxmjh23z4q4sk7l046n6gjqmvg9ueyxl69lxgzvcfvujj9x" +threshold = 1 +public_keys = ["tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha"] [[bond]] -source = "tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt" -validator = "tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w" +source = "tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu" +validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "20000" -signature = "signam1qz00emwjxmvgjlknc55qffxepur6xlay4zhmnejchw32nuwz2kajmn06hdkmdctu9nrnp3kk0hg6495rsvm5paglyuvyekzcvcxzp2qxvf8hlh" + +[bond.signatures] +tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qqrhz8puehekzc4960f322f2nm9vn9r47wavvqs33f6vv6uerycj8e2x89ljzmuyekn7rfg6enchhn2s0wm2r6czlhep5kj0an5ll4qqqkkgqz" diff --git a/genesis/localnet/src/pre-genesis/unsigned-transactions.toml b/genesis/localnet/src/pre-genesis/unsigned-transactions.toml index 4450ea7289..c1f290bec5 100644 --- a/genesis/localnet/src/pre-genesis/unsigned-transactions.toml +++ b/genesis/localnet/src/pre-genesis/unsigned-transactions.toml @@ -14,22 +14,25 @@ # Albert [[established_account]] vp = "vp_user" -public_key = "tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha" +threshold = 1 +public_keys = ["tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha"] # Bertha [[established_account]] vp = "vp_user" -public_key = "tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq" +threshold = 1 +public_keys = ["tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq"] # Christel [[established_account]] vp = "vp_user" -public_key = "tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79" +threshold = 1 +public_keys = ["tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79"] ########################################################################################## # Albert bonds to `validator-0` [[bond]] -source = "tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt" -validator = "tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w" +source = "tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu" +validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "20000" diff --git a/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml b/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml new file mode 100644 index 0000000000..c3a9a6ec8c --- /dev/null +++ b/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml @@ -0,0 +1,45 @@ +[[established_account]] +vp = "vp_user" +threshold = 1 +public_keys = ["tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj"] + +[[validator_account]] +address = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +vp = "vp_user" +commission_rate = "0.05" +max_commission_rate_change = "0.01" +net_address = "127.0.0.1:27656" + +[validator_account.consensus_key] +pk = "tpknam1qr9u5py97pdmcvnrxhzuuv79ydv5rw7r9z402sucwt6h0lvmmmwqy2wrweg" +authorization = "signam1qqxx2kpu0yla6jy958t58c649m5gf8v5rjqk5rqemkvxa3xynfxgznjwx2yzre20l7n7mvul2p4vdpsunmjt33fu9c94tu26caevrvgdllk4mx" + +[validator_account.protocol_key] +pk = "tpknam1qrenhfdphzpszlr7fzand6qgmppge430g3a2lquqzhz64fkve5mq2hdfjaa" +authorization = "signam1qqfz3hym66j8my6exzfv88c8e829gulwr4eycyzn5j4a5tns8wj6md6j2kwly4kdr2ts8jwln7mta6weacgf2xjh08scykl3yzqeers899d9fn" + +[validator_account.tendermint_node_key] +pk = "tpknam1qpgcgptcjl22hl2te2uqnp33aqjmvfaud3a3f3sgtxezg7uu5rsv6d2flr3" +authorization = "signam1qpev0rmgakenvsec34xlyz8e2cpyc64u0fex6dv2us2x0yg9plyfrmfwcpxg2png7xl8404fmm6vp4h0afz25jclvc0yavjrc2vncps8wqqgds" + +[validator_account.eth_hot_key] +pk = "tpknam1qypnh98mexms8edj8rcwu0cayx0459p39dwzsffxrr394mf4cse707qcctyrx" +authorization = "signam1qy04m2dqtvwrkk7rjxzpeua89hag2yc38rm3z9ljeg9c7ymp35tuqfd7yk0w4epnsydfvdyd682lvcrtzf28rdkd8snzmmyj846r36zyqq77j5s0" + +[validator_account.eth_cold_key] +pk = "tpknam1qypz8zr0w8lsz3s98vh4p974xuxeedpecj9s2l3326r3kdz4tc0snrcpnc8yv" +authorization = "signam1q8pmqdqcqh9v8djeqlrzy4mv845v9harnm9u5z54nwlrhwkyvc9y79sv0ucaa08c7y3xypcn7wqj6qvjqzfzs9h89hesuxttlujswz5wqyux24m9" + +[validator_account.metadata] +email = "null@null.net" + +[validator_account.signatures] +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qzxx53nx6tptrfp2qhr2du8lmlvhyrxuvcp3razw0yqha45redp7nqsx09d45jads34ecrny5mj2fplru9vyq8ghttksczj86vqx2tg0kwk2f9" + +[[bond]] +source = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +amount = "100000" + +[bond.signatures] +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qrzf2xg5m2hudxc7p0zjnnzlnfrlsjkt5j0wpesw9le2nn7u4sgr3y8s9sr7xs5yzs5qt5fhmtmp2j5cmfr8ulzz2rhwmqzfslry56cymvurrg" diff --git a/genesis/localnet/src/pre-genesis/validator-0/transactions.toml b/genesis/localnet/src/pre-genesis/validator-0/transactions.toml deleted file mode 100644 index 85c174edc2..0000000000 --- a/genesis/localnet/src/pre-genesis/validator-0/transactions.toml +++ /dev/null @@ -1,44 +0,0 @@ -[[validator_account]] -alias = "validator-0" -vp = "vp_user" -commission_rate = "0.05" -max_commission_rate_change = "0.01" -email = "null@null.net" -net_address = "127.0.0.1:27656" - -[validator_account.account_key] -pk = "tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj" -authorization = "signam1qzyc89wynvm4n7eq7jglv4d8upaxu38mkkktykjjtgqygmk4sq97ffxermz5wpur4rqr8gk6fze5uvc4u7q4qzqsr285gungdyhv2acgna2ltq" - -[validator_account.consensus_key] -pk = "tpknam1qr9u5py97pdmcvnrxhzuuv79ydv5rw7r9z402sucwt6h0lvmmmwqy2wrweg" -authorization = "signam1qzt7ww0q00punp93jrvtkq62n4rk8y5d90tllmlkzr0z7urwfdkn7z8ttne92utwskl6ves4qp66r60tg2xqr568ranwfhcm0665wncqq4t5gx" - -[validator_account.protocol_key] -pk = "tpknam1qrenhfdphzpszlr7fzand6qgmppge430g3a2lquqzhz64fkve5mq2hdfjaa" -authorization = "signam1qqeaqzj9fu0xsu7pvrkwla5asxde2wak7fslst0p79vxxydt40tzdj54js7dmjvqs2quygqqwup8z2cfffvm86ff8cud6gzel9g40ycw25wp5d" - -[validator_account.tendermint_node_key] -pk = "tpknam1qpgcgptcjl22hl2te2uqnp33aqjmvfaud3a3f3sgtxezg7uu5rsv6d2flr3" -authorization = "signam1qrq7x5e7svuddy8dyr3xpcdt6a07u6sky0n5qnv5z757g33t5zm3jnnh9uhh073g05n8jx8rmdu5r2djhwh6few6u329u9cld4c7ynsw2592h8" - -[validator_account.eth_hot_key] -pk = "tpknam1qypnh98mexms8edj8rcwu0cayx0459p39dwzsffxrr394mf4cse707qcctyrx" -authorization = "signam1qyrvwveg76nrz2ppnsl0em82gcl4p90cqw8eadyzcvk59e2dx0jqja8ln9l9j79sxzhhh5gdggduz78vtthzj5nzs0xvpwhjuh3hymapqq07qxzm" - -[validator_account.eth_cold_key] -pk = "tpknam1qypz8zr0w8lsz3s98vh4p974xuxeedpecj9s2l3326r3kdz4tc0snrcpnc8yv" -authorization = "signam1q992kq4ymfl6v8arc2s2tn0w7c4f48wx6fxry9qxv2qk8zvjan8q7j9rxg73cx0f5l56fy53x2jgwv7vy8jtxzucckdzgnxc5tpzajs4qq8r02r2" - -[[transfer]] -token = "nam" -source = "tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch" -target = "validator-0" -amount = "200000" -signature = "signam1qz8ch7n6jp7g7hvnzkhmprhqc5umd0gatarlttm7gpcdx6g8hmgqffdq67fn6vzcflmym5xej3m5jmfw7nap00s4nlx2zxrlwz0wlfgt3lswty" - -[[bond]] -source = "validator-0" -validator = "validator-0" -amount = "100000" -signature = "signam1qqukrz3js2pgzrne90u5f7y4mstrzvmzcq7eelml9m3lzrh9zwpf0vhgjq0rsw4ufj4ffdx8ew74uxkk4df649pg6qq5fgwyqa9mpfcyvskk67" diff --git a/genesis/localnet/src/pre-genesis/validator-0/unsigned-transactions.toml b/genesis/localnet/src/pre-genesis/validator-0/unsigned-transactions.toml new file mode 100644 index 0000000000..aa84f561ac --- /dev/null +++ b/genesis/localnet/src/pre-genesis/validator-0/unsigned-transactions.toml @@ -0,0 +1,24 @@ +[[established_account]] +vp = "vp_user" +threshold = 1 +public_keys = ["tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj"] + +[[validator_account]] +address = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +vp = "vp_user" +commission_rate = "0.05" +max_commission_rate_change = "0.01" +net_address = "127.0.0.1:27656" +consensus_key = "tpknam1qr9u5py97pdmcvnrxhzuuv79ydv5rw7r9z402sucwt6h0lvmmmwqy2wrweg" +protocol_key = "tpknam1qrenhfdphzpszlr7fzand6qgmppge430g3a2lquqzhz64fkve5mq2hdfjaa" +tendermint_node_key = "tpknam1qpgcgptcjl22hl2te2uqnp33aqjmvfaud3a3f3sgtxezg7uu5rsv6d2flr3" +eth_hot_key = "tpknam1qypnh98mexms8edj8rcwu0cayx0459p39dwzsffxrr394mf4cse707qcctyrx" +eth_cold_key = "tpknam1qypz8zr0w8lsz3s98vh4p974xuxeedpecj9s2l3326r3kdz4tc0snrcpnc8yv" + +[validator_account.metadata] +email = "null@null.net" + +[[bond]] +source = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +amount = "100000" diff --git a/genesis/localnet/src/pre-genesis/validator-0/validator-wallet.toml b/genesis/localnet/src/pre-genesis/validator-0/validator-wallet.toml index 2e0107b173..d7ceb76fb9 100644 --- a/genesis/localnet/src/pre-genesis/validator-0/validator-wallet.toml +++ b/genesis/localnet/src/pre-genesis/validator-0/validator-wallet.toml @@ -1,4 +1,3 @@ -account_key = "unencrypted:0024204e13c51b26ed9b42c05647bc46b3821bb453e53d194962ede57ce5ec66ac" consensus_key = "unencrypted:0037a44681b64d42497e2229516479f83e5344a7a30e8316bde45881a1ec745359" eth_cold_key = "unencrypted:010d34fcb42383f0babe7c86203f07bf4134f0756a630eb07923f21c90cc068602" tendermint_node_key = "unencrypted:002f2e94bb5834e18433343345baf47b2b5d4e1ef4d46ba0f876d3d2c89d831419" diff --git a/genesis/localnet/src/pre-genesis/wallet.toml b/genesis/localnet/src/pre-genesis/wallet.toml index 60a328c0c0..fbf083e87b 100644 --- a/genesis/localnet/src/pre-genesis/wallet.toml +++ b/genesis/localnet/src/pre-genesis/wallet.toml @@ -11,6 +11,7 @@ christel-key = "unencrypted:00a08de8d33b9798328d2e4476fade49f515dc82754451fc6ef7 daewon = "unencrypted:00d19e226c0e7d123d79f5908b5948d4c461b66a5f8aa95600c28b55ab6f5dc772" ester = "unencrypted:01369093e2035d84f72a7e5a17c89b7a938b5d08cc87b2289805e3afcc66ef9a42" faucet-key = "unencrypted:00548aa8393422b88dce5f4be8ee0320638061c3e0649ada1b0dacbec4c0c75bb2" +validator-0-account-key = "unencrypted:0024204e13c51b26ed9b42c05647bc46b3821bb453e53d194962ede57ce5ec66ac" [public_keys] albert-key = "ED25519_PK_PREFIXtpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha" @@ -19,20 +20,21 @@ christel-key = "ED25519_PK_PREFIXtpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkax daewon = "ED25519_PK_PREFIXtpknam1qzz4x4fammhdcfa0g8xw4udkq8s4n6kjhzlxh00ul3da05wuu9wkykqqvjm" ester = "SECP256K1_PK_PREFIXtpknam1qypvqpzu74nafjahlwyq272dj76qq9rz30dulyc94883tmj893mquqs74gxv4" faucet-key = "ED25519_PK_PREFIXtpknam1qzh2d8vk9wvj2j63fa3cvjru9uldpdjctjjxpafl5r8vwwf56pdgyq0vra4" +validator-0-account-key = "ED25519_PK_PREFIXtpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj" [derivation_paths] [addresses] -albert = "tnam1q8uthkc42sw609e8ce6tcjwu6mgz6zgtccff8wdt" -bertha = "tnam1qx6qc3cpupxgntk7awtqrnqh02cyr3e8vghpspr7" -christel = "tnam1qy38nhqlcceqjn5sflrs6mvmp8fq2h79kvsdrwns" +albert = "tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu" +bertha = "tnam1q9rhgyv3ydq0zu3whnftvllqnvhvhm270qxay5tn" +christel = "tnam1q9sx4ekzqaq3xdxtruxkm764nhl00cvcsc7df5jf" albert-key = "tnam1qrr8r00nrf6490ff9zgfz52xrnfhdja7rqvldl46" bertha-key = "tnam1qqc2ge6tg7s03nlshjr5d79dqyjr33aa8g2mxyzm" christel-key = "tnam1qz0nvec686e9pks8ynhm5ddq8ke7j2eey50uagtr" daewon = "tnam1qpca48f45pdtpcz06rue7k4kfdcjrvrux5cr3pwn" ester = "tnam1qpm3dpsv76ttu382vfggtr7m8n00na3sfyzm2g2q" faucet-key = "tnam1qzgcl2znamndmku7ujw6e79dmvd4v7rfd5c89dfz" -validator-0 = "tnam1qyfcx4un953sf06lhcja377hk2z6faw67ykx549w" +validator-0 = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" [pkhs] 30A4674B47A0F8CFF0BC8746F8AD012438C7BD3A = "bertha-key" @@ -41,5 +43,6 @@ C671BDF31A7552BD2928909151461CD376CBBE18 = "albert-key" 918FA853EEE6DDDB9EE49DACF8ADDB1B5678696D = "faucet-key" 9F36671A3EB250DA0724EFBA35A03DB3E92B3925 = "christel-key" 7716860CF696BE44EA6250858FDB3CDEF9F63049 = "ester" +9D371C6D220F8A4C6D70F0D3F828698881AB2447 = "validator-0-account-key" [address_vp_types] diff --git a/genesis/localnet/transactions.toml b/genesis/localnet/transactions.toml index 0662c5147b..76526a2ca6 100644 --- a/genesis/localnet/transactions.toml +++ b/genesis/localnet/transactions.toml @@ -1,181 +1,77 @@ # Transactions pasted from: # -# 1. `src/pre-genesis/validator-0/transactions.toml` +# 1. `src/pre-genesis/validator-0/signed-transactions.toml` # 2. `src/pre-genesis/signed-transactions.toml` # 1. +[[established_account]] +vp = "vp_user" +threshold = 1 +public_keys = ["tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj"] + [[validator_account]] -alias = "validator-0" +address = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" vp = "vp_user" commission_rate = "0.05" max_commission_rate_change = "0.01" -email = "null@null.net" net_address = "127.0.0.1:27656" -[validator_account.account_key] -pk = "tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj" -authorization = "signam1qzyc89wynvm4n7eq7jglv4d8upaxu38mkkktykjjtgqygmk4sq97ffxermz5wpur4rqr8gk6fze5uvc4u7q4qzqsr285gungdyhv2acgna2ltq" - [validator_account.consensus_key] pk = "tpknam1qr9u5py97pdmcvnrxhzuuv79ydv5rw7r9z402sucwt6h0lvmmmwqy2wrweg" -authorization = "signam1qzt7ww0q00punp93jrvtkq62n4rk8y5d90tllmlkzr0z7urwfdkn7z8ttne92utwskl6ves4qp66r60tg2xqr568ranwfhcm0665wncqq4t5gx" +authorization = "signam1qqxx2kpu0yla6jy958t58c649m5gf8v5rjqk5rqemkvxa3xynfxgznjwx2yzre20l7n7mvul2p4vdpsunmjt33fu9c94tu26caevrvgdllk4mx" [validator_account.protocol_key] pk = "tpknam1qrenhfdphzpszlr7fzand6qgmppge430g3a2lquqzhz64fkve5mq2hdfjaa" -authorization = "signam1qqeaqzj9fu0xsu7pvrkwla5asxde2wak7fslst0p79vxxydt40tzdj54js7dmjvqs2quygqqwup8z2cfffvm86ff8cud6gzel9g40ycw25wp5d" +authorization = "signam1qqfz3hym66j8my6exzfv88c8e829gulwr4eycyzn5j4a5tns8wj6md6j2kwly4kdr2ts8jwln7mta6weacgf2xjh08scykl3yzqeers899d9fn" [validator_account.tendermint_node_key] pk = "tpknam1qpgcgptcjl22hl2te2uqnp33aqjmvfaud3a3f3sgtxezg7uu5rsv6d2flr3" -authorization = "signam1qrq7x5e7svuddy8dyr3xpcdt6a07u6sky0n5qnv5z757g33t5zm3jnnh9uhh073g05n8jx8rmdu5r2djhwh6few6u329u9cld4c7ynsw2592h8" +authorization = "signam1qpev0rmgakenvsec34xlyz8e2cpyc64u0fex6dv2us2x0yg9plyfrmfwcpxg2png7xl8404fmm6vp4h0afz25jclvc0yavjrc2vncps8wqqgds" [validator_account.eth_hot_key] pk = "tpknam1qypnh98mexms8edj8rcwu0cayx0459p39dwzsffxrr394mf4cse707qcctyrx" -authorization = "signam1qyrvwveg76nrz2ppnsl0em82gcl4p90cqw8eadyzcvk59e2dx0jqja8ln9l9j79sxzhhh5gdggduz78vtthzj5nzs0xvpwhjuh3hymapqq07qxzm" +authorization = "signam1qy04m2dqtvwrkk7rjxzpeua89hag2yc38rm3z9ljeg9c7ymp35tuqfd7yk0w4epnsydfvdyd682lvcrtzf28rdkd8snzmmyj846r36zyqq77j5s0" [validator_account.eth_cold_key] pk = "tpknam1qypz8zr0w8lsz3s98vh4p974xuxeedpecj9s2l3326r3kdz4tc0snrcpnc8yv" -authorization = "signam1q992kq4ymfl6v8arc2s2tn0w7c4f48wx6fxry9qxv2qk8zvjan8q7j9rxg73cx0f5l56fy53x2jgwv7vy8jtxzucckdzgnxc5tpzajs4qq8r02r2" +authorization = "signam1q8pmqdqcqh9v8djeqlrzy4mv845v9harnm9u5z54nwlrhwkyvc9y79sv0ucaa08c7y3xypcn7wqj6qvjqzfzs9h89hesuxttlujswz5wqyux24m9" + +[validator_account.metadata] +email = "null@null.net" -[[transfer]] -token = "nam" -source = "tpknam1qzp22w6trhmxmp2dx5h883c2l684z0e20a9egusmxaat62wvaa4agjf64ch" -target = "validator-0" -amount = "200000" -signature = "signam1qz8ch7n6jp7g7hvnzkhmprhqc5umd0gatarlttm7gpcdx6g8hmgqffdq67fn6vzcflmym5xej3m5jmfw7nap00s4nlx2zxrlwz0wlfgt3lswty" +[validator_account.signatures] +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qzxx53nx6tptrfp2qhr2du8lmlvhyrxuvcp3razw0yqha45redp7nqsx09d45jads34ecrny5mj2fplru9vyq8ghttksczj86vqx2tg0kwk2f9" [[bond]] -source = "validator-0" -validator = "validator-0" +source = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "100000" -signature = "signam1qqukrz3js2pgzrne90u5f7y4mstrzvmzcq7eelml9m3lzrh9zwpf0vhgjq0rsw4ufj4ffdx8ew74uxkk4df649pg6qq5fgwyqa9mpfcyvskk67" +[bond.signatures] +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qrzf2xg5m2hudxc7p0zjnnzlnfrlsjkt5j0wpesw9le2nn7u4sgr3y8s9sr7xs5yzs5qt5fhmtmp2j5cmfr8ulzz2rhwmqzfslry56cymvurrg" # 2. [[established_account]] -alias = "albert" vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -authorization = "signam1qzq6dwf2a9dq4hp3nmxfgckh55mulzryxsfkqhr9uvfvmtr9wt38lyyvzvfqryxnat2a4ry6hygv957z683dyngu03gse2uvl5ldfccyqvdpfr" - -[established_account.storage] +threshold = 1 +public_keys = ["tpknam1qqwfpuvn8x7yqtquejhppef4vddv9ghusec2rkaxav38amamxaxpgj9cs79"] [[established_account]] -alias = "bertha" vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -authorization = "signam1qzt58nd7k2mj647x8x4ydhsjkut7dmsl7yjlnrnwu9kzjdch3cljv6dq05mx2kvwn80kjezh7lz26adc5ksvyn3knufymtkhlmnhg3c8rvmxvv" - -[established_account.storage] +threshold = 1 +public_keys = ["tpknam1qq52dx5e290wyh7ngdt6wudtyd502lg6ln49yvg3vz97e8j2ruux5e3yewq"] [[established_account]] -alias = "christel" vp = "vp_user" - -[established_account.public_key] -pk = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -authorization = "signam1qrf2l6a5u4ywskryhdueudnm50j3kqhujas3mmktenqm89fmlskjnyeskr2tr7js5swmtqqtenkj6ap9xpelx2w40fjjczc4w9xtdggqn3k4vv" - -[established_account.storage] - -[[transfer]] -token = "nam" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qrxfthuz5yzapdt82d8nc656ffrzkxnkfg6fw8w7e6045vcpn8kpr4c536ug4fs2ddz5823dfd3w4qnhcl40qmtasfccaa99a0hvjcqv97vg8n" - -[[transfer]] -token = "btc" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qq826qel8zn5p4dfx25ma45uxeskx0yjlsaxp38uyvehvds6t93c8wkhaydunm4nzz9750dwhkjst00mfrwmu066y3rj6gtk5wjskxq9rksf35" - -[[transfer]] -token = "eth" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qzghddk0u6kpqaxhskrj8ah69d3hce95wndgvlpuyvuw0h0fnyrnp026ltvtfmfhpzywkf88yyhv80hzkus57s9nn6vn3ljvmkkf7zgqtfyyak" - -[[transfer]] -token = "dot" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qqlu8kajh0up5zhewd2h44fhq7zdaapqt9xaj8xp7jmdqpv4dl9d5tesw3wyr9su962rvpkf02x27579vqjk4f4advx7t9ejz74cjrc24m6y4r" - -[[transfer]] -token = "schnitzel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qpukdd6f7pvtgau9v58xxwrnmv5pjra6527aggce9j8cu6fnekzag2cmmf4w0x0cn76gpth2vw6zcsnw37xjuz96hflqfnk5sznxe6cfvwa9m4" - -[[transfer]] -token = "apfel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qprnsyhlruvw4a6jjs98xdd04gxdsgycywzt79gyyak68gn4f50ppdvdm0q6ns44cheu7s43kal0qsldml8s0zexqk3s9zmglu4l6fsz0zx8xa" - -[[transfer]] -token = "kartoffel" -source = "tpknam1qz0aphcsrw37j8fy742cjwhphu9jwx7esd3ad4xxtxrkwv07ff63we33t3r" -target = "albert" -amount = "1000000" -signature = "signam1qpg4y6ltax3qfclguym2kpa0ezlkf4hz4u3h8fc2ndmuzm4zfe26ygq9u6nhjjvj93n5v296x4arkvjk22ygee2fx054ce7ap6gvynq2nsscys" - -[[transfer]] -token = "nam" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" -signature = "signam1qpe3ms76cxvqsa58624ked5ndjr3jr3u7lf9ypalxdh29gajwmsxtzjxzswk0xmza90u47tgksr0d7enpd730ps7fq5u76l7ekxeyvgfj9fhwt" - -[[transfer]] -token = "btc" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" -signature = "signam1qqq4yc6s3h4ysezcmgsdgyfsqu8mmrwwc8a358sm864zehx74ums8fmgmkyyr3wz9qqrc5fagwrw0a4mgqkkleumc0u6ynshj5ns0tcdz7wtf3" - -[[transfer]] -token = "eth" -source = "tpknam1qpyfnrl6qdqvguah9kknvp9t6ajcrec7fge56pcgaa655zkua3nds48x83t" -target = "bertha" -amount = "1000000" -signature = "signam1qzyqkdxt3cxf0huv0hzskqmuthw38s3kj2sx50znzc68gzx64hrd3hkyx0g27pruwa9fv42suw3k8gkfaelcp4ymnvfw7ltx0mz2z9qrt9gesf" - -[[transfer]] -token = "nam" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" -signature = "signam1qran2jh0dwuwchh45snhk3p9uyxqym57eg527pcjeekwhvpr5j0fy6dte7x3v2dwwc6vqmv49drpvmk6uhzlt2p8rqx0th3h7smf8rqrem03s8" - -[[transfer]] -token = "btc" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" -signature = "signam1qrxp6p56qtvsyp7jfs4jru3mkfv6l4t7hpguur72579pqjaexdry9turgmzwzj6qmua3s2y2a4krtuxwaag66j4dpz44aaqksy30tfcx6f3ez0" - -[[transfer]] -token = "eth" -source = "tpknam1qp6uy52q0fldjxupznuskm69fkuswx3fq3vw9kekzp4enkh5h7pmzwgc7uu" -target = "christel" -amount = "1000000" -signature = "signam1qrtrec6mps9p7zhmm7sywxwc7zdm32umt0zdwpuflrkh6952rx74amnsf9hn0yughs4e6czgpdmwsmujvkr4ptk2x24vtc8phz0s2asv27zjfs" +threshold = 1 +public_keys = ["tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha"] [[bond]] -source = "albert" -validator = "validator-0" +source = "tnam1qxfj3sf6a0meahdu9t6znp05g8zx4dkjtgyn9gfu" +validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "20000" -signature = "signam1qpx0kc8rl966vnnswfwhcwxh5vv69p7lev2apc2yephag978gqg5903kuw6dugg9c6pg5jdw048umk72ntympphz0dka74aspldslaqrs6cwg6" + +[bond.signatures] +tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qqrhz8puehekzc4960f322f2nm9vn9r47wavvqs33f6vv6uerycj8e2x89ljzmuyekn7rfg6enchhn2s0wm2r6czlhep5kj0an5ll4qqqkkgqz" From 1a4e160acd9e2634329f007f034e4e97bde4b919 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 29 Nov 2023 10:12:11 +0000 Subject: [PATCH 122/175] Fix dev genesis --- apps/src/lib/config/genesis.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index c24497d549..b16a337972 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -458,7 +458,7 @@ pub fn make_dev_genesis( let validator_account_tx = transactions::ValidatorAccountTx { address: StringEncoded::new(address.clone()), - vp: "vp_validator".to_string(), + vp: "vp_user".to_string(), commission_rate: Dec::new(5, 2).expect("This can't fail"), max_commission_rate_change: Dec::new(1, 2) .expect("This can't fail"), From 26161f1f51f32d3d8d8b7861d6a690e1b4ee1511 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 29 Nov 2023 10:54:28 +0000 Subject: [PATCH 123/175] Add base dir arg to gen localnet script --- scripts/gen_localnet.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/gen_localnet.py b/scripts/gen_localnet.py index b5e99f1479..9e03c7d6cf 100644 --- a/scripts/gen_localnet.py +++ b/scripts/gen_localnet.py @@ -44,6 +44,7 @@ def edit_parameters(params_toml, **kwargs): parser = argparse.ArgumentParser(description='Builds a localnet for testing purposes') # Add the arguments +parser.add_argument('--base-dir', type=str, help='The path to the base directory of the chain.') parser.add_argument('--localnet-dir', type=str, help='The localnet directory containing the genesis templates.') parser.add_argument('-m', '--mode', type=str, help='The mode to run the localnet in. Can be release or debug, defaults to debug.') parser.add_argument('--epoch-length', type=int, help='The epoch length in seconds, defaults to parameters.toml value.') @@ -116,7 +117,10 @@ def edit_parameters(params_toml, **kwargs): TEMPLATES_PATH=localnet_dir WASM_CHECKSUMS_PATH=namada_dir + '/wasm/checksums.json' WASM_PATH=namada_dir + '/wasm/' -BASE_DIR = subprocess.check_output([namadac_bin, "utils", "default-base-dir"]).decode().strip() +BASE_DIR = args.base_dir + +if not BASE_DIR: + BASE_DIR = subprocess.check_output([namadac_bin, "utils", "default-base-dir"]).decode().strip() # Delete the base dir if os.path.isdir(BASE_DIR): @@ -133,7 +137,7 @@ def edit_parameters(params_toml, **kwargs): print(f"Cannot find wasm directory that is not empty at {WASM_PATH}") sys.exit(1) -os.system(f"{namadac_bin} utils init-network --chain-prefix {CHAIN_PREFIX} --genesis-time {GENESIS_TIME} --templates-path {TEMPLATES_PATH} --wasm-checksums-path {WASM_CHECKSUMS_PATH}") +os.system(f"{namadac_bin} --base-dir={BASE_DIR} utils init-network --chain-prefix {CHAIN_PREFIX} --genesis-time {GENESIS_TIME} --templates-path {TEMPLATES_PATH} --wasm-checksums-path {WASM_CHECKSUMS_PATH}") base_dir_files = os.listdir(BASE_DIR) CHAIN_ID="" @@ -154,7 +158,7 @@ def edit_parameters(params_toml, **kwargs): print(f"Cannot find pre-genesis directory that is not empty at {PRE_GENESIS_PATH}") sys.exit(1) -os.system(f"NAMADA_NETWORK_CONFIGS_DIR='{temp_dir}' {namadac_bin} utils join-network --chain-id {CHAIN_ID} --genesis-validator {GENESIS_VALIDATOR} --pre-genesis-path {PRE_GENESIS_PATH} --dont-prefetch-wasm") +os.system(f"NAMADA_NETWORK_CONFIGS_DIR='{temp_dir}' {namadac_bin} --base-dir={BASE_DIR} utils join-network --chain-id {CHAIN_ID} --genesis-validator {GENESIS_VALIDATOR} --pre-genesis-path {PRE_GENESIS_PATH} --dont-prefetch-wasm") shutil.rmtree(BASE_DIR + '/' + CHAIN_ID + '/wasm/') shutil.move(temp_dir + CHAIN_ID + '/wasm/', BASE_DIR + '/' + CHAIN_ID + '/wasm/') @@ -167,5 +171,5 @@ def edit_parameters(params_toml, **kwargs): shutil.rmtree(temp_dir) print("Run the ledger using the following command:") -print(f"{namada_bin} ledger run") +print(f"{namada_bin} --base-dir={BASE_DIR} ledger run") From 8a7ee7ea36cd7c71dab1a178f67e1759df08223c Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 29 Nov 2023 11:20:20 +0000 Subject: [PATCH 124/175] Update masp proofs --- ...27024E9AC79985302DD15C96CB57743A74CC3.bin} | Bin 9941 -> 9941 bytes ...ECD8CFD237A237C63AA565FC44893414EE7FC.bin} | Bin 9649 -> 9649 bytes ...7E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin} | Bin 7448 -> 7448 bytes ...62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin} | Bin 7448 -> 7448 bytes ...3F779253B53A9A0BD62FD3DF8F6FCF4AF1E145.bin | Bin 17018 -> 0 bytes ...BF9BC175A70082068C8785BDDBF49DCCA4BE66.bin | Bin 7448 -> 0 bytes ...B5464810F6974083CC2FEE2756ED1E97B8143.bin} | Bin 7448 -> 7448 bytes ...C89879834677F926130D56EB5E4067728EB5CF.bin | Bin 10382 -> 0 bytes ...BE50202AF004DFD895A721EDA284D96B253ACC.bin | Bin 7448 -> 0 bytes ...3CEA99A9BC66B2BAB03D4ABA1AE57B12596061.bin | Bin 7448 -> 0 bytes ...F136D4522BAFC99E0E81FD54A28A38E8419CFC.bin | Bin 20518 -> 0 bytes ...CBE1A9EAF3496A30D69069DE2FBD293EEC978.bin} | Bin 7448 -> 7448 bytes ...8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin} | Bin 24494 -> 24494 bytes ...6D2CF14C7F9E90A8588BA75DA0D2860F36E2CB.bin | Bin 9649 -> 0 bytes ...6D2AEEF55A6F202D8EB4564017DB5BEF872107.bin | Bin 15597 -> 15597 bytes ...396732D2EBF77728D2772EB251123DF2CEF6A1.bin | Bin 9941 -> 0 bytes ...A5C2232840271F032F756953233DB3E53E757.bin} | Bin 9941 -> 9941 bytes ...CC6F78791F8954A0219C07B15344AEE0D2E0F.bin} | Bin 10382 -> 10382 bytes ...5CF776D5DE7C9153D67B7FDF22ED6F35558738.bin | Bin 24494 -> 0 bytes ...DBA1FDB2515DF33D43611F2860B8D3C178B474.bin | Bin 7448 -> 0 bytes ...99481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin | Bin 15257 -> 15257 bytes ...699E65D4B40A4E1BC9E7A32D63CF28466A2F20.bin | Bin 17018 -> 17018 bytes ...6C8B75587507CA52981F48FD1FC9C5BE0BEE43.bin | Bin 15257 -> 0 bytes ...1D5DEF92B9A9BB3A159947560514682CC3877.bin} | Bin 7448 -> 7448 bytes 24 files changed, 0 insertions(+), 0 deletions(-) rename test_fixtures/masp_proofs/{76BADC1367FEF1062029B180AD637D60B440C71729F148923838380D5CFE71A9.bin => 30E148B3F9E8D21A41ABB09756027024E9AC79985302DD15C96CB57743A74CC3.bin} (76%) rename test_fixtures/masp_proofs/{ABB08197C40226F64D449C7F116BC11A30C23464FD05B13516E0B576456D6BE9.bin => 473EDF0B2908F047110AC52C7F7ECD8CFD237A237C63AA565FC44893414EE7FC.bin} (76%) rename test_fixtures/masp_proofs/{96CBC406931DDBC76053B417CCFE78D0FC876E11ADD563D149168D4BDE86FBB8.bin => 4B412E2EA5AC98758E696AB36327E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin} (75%) rename test_fixtures/masp_proofs/{B74C1EC89D48DC01F71DA402F898CB65B7F71F737870C86AEA55454B8B32DC2D.bin => 4CCB9ADD3188CD893508CBB4FCB62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin} (76%) delete mode 100644 test_fixtures/masp_proofs/51EF94B13138B91DB3081F95193F779253B53A9A0BD62FD3DF8F6FCF4AF1E145.bin delete mode 100644 test_fixtures/masp_proofs/544F7432B95E26E312105FB804BF9BC175A70082068C8785BDDBF49DCCA4BE66.bin rename test_fixtures/masp_proofs/{25FA248C27E805F28102B6E3DCFEAD637C92544211E7B3765CA7AA186FB1E409.bin => 553C507BF748CC2353DCE98EB91B5464810F6974083CC2FEE2756ED1E97B8143.bin} (75%) delete mode 100644 test_fixtures/masp_proofs/6DD5A788D36258E9D5FEF454DBC89879834677F926130D56EB5E4067728EB5CF.bin delete mode 100644 test_fixtures/masp_proofs/6E92D0B97A65FB5ADFA6371A6CBE50202AF004DFD895A721EDA284D96B253ACC.bin delete mode 100644 test_fixtures/masp_proofs/8032CA7B951C625E43F48AEBD53CEA99A9BC66B2BAB03D4ABA1AE57B12596061.bin delete mode 100644 test_fixtures/masp_proofs/8A79BF5E0292339E70287DB626F136D4522BAFC99E0E81FD54A28A38E8419CFC.bin rename test_fixtures/masp_proofs/{CA6AF0286DB05F3AB2513109958B21F6D7D9EE1DA5A6E60E9A37CD30DA4A505F.bin => 8BA2DA741BF1FE1CDEC5295AE3ECBE1A9EAF3496A30D69069DE2FBD293EEC978.bin} (74%) rename test_fixtures/masp_proofs/{0AB9DC2FED12A93FDA42447E6A14612B09451DF258B1B593CFED41B0E9256A2E.bin => 978C35E058808D61F0E265D72DE8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin} (79%) delete mode 100644 test_fixtures/masp_proofs/A8A9963AC2983B576BAE4DE9BA6D2CF14C7F9E90A8588BA75DA0D2860F36E2CB.bin delete mode 100644 test_fixtures/masp_proofs/AEA19C9B07742FF5F6D759B171396732D2EBF77728D2772EB251123DF2CEF6A1.bin rename test_fixtures/masp_proofs/{8DAE054DE58BDFFE4F551092B09402D995E6F74FFBF5CE3BA13049D272C5E752.bin => BB9AA71A4227C9E62948CBA8DB4A5C2232840271F032F756953233DB3E53E757.bin} (76%) rename test_fixtures/masp_proofs/{FD874BACE965B637E528BF66B079048F119C09D85335704A083700CA11415DF3.bin => C506FA6C2EFB37B06CD5A473AF5CC6F78791F8954A0219C07B15344AEE0D2E0F.bin} (76%) delete mode 100644 test_fixtures/masp_proofs/C788F9057C615CCE7B260BB8BF5CF776D5DE7C9153D67B7FDF22ED6F35558738.bin delete mode 100644 test_fixtures/masp_proofs/CBF4087F2AB578C83A736E4598DBA1FDB2515DF33D43611F2860B8D3C178B474.bin delete mode 100644 test_fixtures/masp_proofs/EDE8DC791D02098C5C199CAF2F6C8B75587507CA52981F48FD1FC9C5BE0BEE43.bin rename test_fixtures/masp_proofs/{2E78CC40C345D7EA50407110784E2EF3EC23A99F9E8F0A5B95AB1BEB71B18583.bin => F0471ECBD3AF04B4A373D2966781D5DEF92B9A9BB3A159947560514682CC3877.bin} (71%) diff --git a/test_fixtures/masp_proofs/76BADC1367FEF1062029B180AD637D60B440C71729F148923838380D5CFE71A9.bin b/test_fixtures/masp_proofs/30E148B3F9E8D21A41ABB09756027024E9AC79985302DD15C96CB57743A74CC3.bin similarity index 76% rename from test_fixtures/masp_proofs/76BADC1367FEF1062029B180AD637D60B440C71729F148923838380D5CFE71A9.bin rename to test_fixtures/masp_proofs/30E148B3F9E8D21A41ABB09756027024E9AC79985302DD15C96CB57743A74CC3.bin index 0e0759b3c3552261d66ce23876c2e75855f93a5f..5abe95051451598fa2d1f6a3bd271e04bcf7ed78 100644 GIT binary patch delta 1787 zcmV6$a7qi5GPB%elF*CIFLeMZu+Mxu9)b}>nmTYlU^A>AcN1@9TEq& zs7pm>Y+@>!qQujzr`KV%6Y~47Kx=Vn1e3lQKp@`BYJ<_cN>dGFfXBj+O&hki;+#L5 z^KQxs%#TP2;31P98bLvwu9vmg|Gq1?#X+TcT%^xJXqe{LxL^=L_OI}8XwnD*hsy~r z5Rv^2*w(yrg|bjolq147-R`wk@cY8mg;L?>v!ELE0wDK^o#4R!Gmki->*G?tWMAh3 zROL-s9BoF^UKm?!m~FGP9i#$KE&H>68Qa|A;j2C*V~$nXn(g8Gz5h8#Q&y?9aaoLv zsszZ@3KN2Ty9A6W(6ApcG%t_xleZ-VIv7~Y$4A3ChnQW+LzzXxOFSKKc({GJk{KzH zod}cJAV7bJ`hKbbxhNkyloDktzrjuq-wbG4cK?s?S(o_Ur~c7d+dQjlHb+QBgm1AE{P!@gk*8QdRb4xCXkPDCy-+b*h-ZCzayS*70% zfVW{+FOT&bNtt&64m0n7NPRX%XCvw_u=y736Ab_u^|q zg?;rHy^^igfUO-0vnjZi1S}cEil!@o?#YT%7Qff4cG4}s+ulQCk)}2Vv*Lj>QOHS2WbA8 zEVvL#xX3u}?GJ7`N7hTuNH#v$3fMtZT9hBcr9aZ&3W~|f|1P|no{XbfpS~yLaI8-F zaxkrGDv%d(H4p9F4ZWh?8{LwA9J}f0tqo=Jc|KTi@D5El_Ox zVsKa|1nF_>!^t>_zMF|Xk2$Wxe;nGJUU?a3t~=24EXfAQan^q_St7tJV~u~Fc|jCS z42Vdp4ex7_x2^cX=c&53)$LvKQ91U);rg65bu$XxTd^NG1-N809fz&7{)DRb{IjOb z&8>&ll&rJ;DqBN?s<5ln?H6-`QTchpyG7o?xbE};J`K=O=@4pKTy#KDOa{i0X=fIE(1SoTLVOgD7>H z6fBKwS~e5P+Osr_A1A=9{Z89DDh(McD^>yf%Z(fO{uH9?dL)a~hL(S0R!51u$}a^S zE^mVfAus&OPHvTU9dlK?7)e|EAeum-$n0n;;Vr(lo42#k>4nZbA9)g#i8t=Ys?-}uwqN^$enBpXpR08h8GnIddMX0DAjrElNgOU1EfP@S|jXDUXApI0d?2j8BaY>*qQikNv zxnwydT`fZ{JF%6#O-bTSz1Ln5gu`|pHRNoScBMeb+dVito9O~=qN>F`_x_*Vqm9() zI3kKsq{1ZFTG*N&d1b(Y6#j`B_-VM%_^{Y>Rh-$V-nqTuwIhEI;}u)OKE7zVSN3>A z8})FfP6dWM?6(4D*_cQw=Yko*ZXWZXWJOkBstd>)&z2YP1ZX*rO6(!B_lB1~z%#kv zBvc-OH@oG#Y!#C2=DP1ILIs}XcdYpTqt{~P)IMTF#SUiCBZm>PTy=G2dyoa7lD}yc dQgHf+93Nst1#qCOp7Xa@qg@ delta 1787 zcmVAVEIlCmj0D z#jFdTlzNN6#ZWc={{j2Nnk&om3ywY|VUxZYKp;>hDREQom_?bCgPGFCow<)aPs(Yd zQJ*KbK4pWK!ibX|8bLuoX#=nlMYCK&+)NEXlNYOdXkf*JJUe$H#GIgs4e&hzw$%NL zI0gBx#9akk*pg@*g<7trdgG7<{L?iGi;&Vzv!ELE0w5!72dFp`bB!uy+{ii)o0}=} z>k`Z^J<^I_W_-WLDQdH{9i#$KoV=WukZ5g4`gHZ+Crw=4{Nj%`7b7I>%vaNaN!fwh(K%M2A}MaSDv9%*aCsQc-bNo zz50cV;Aws;gXVXhVrH%shj)pElXad#bySuJu7Q8qKLo(1<9fzxS*wG59R>Mbt}`tu zhGo68u41lUZ2V_g=OFu{w(hgkadk*#BO(X!O6^=4x;5i74~{ZeuDgazt+c05N<#Sq zY4k*^mu*m(JRUF(>ZkvOM@8`>+sjH~M6-@%Ig>!@{*Ia&Kk^kqt7pOGo#XTy|w5@7cOX~wPVSg)*Y3C0;ncKbOCfGi8>4BN#m9}!Fs%4Rmq&Pgd<56nC` zmclk|9H;p9MNJ*~c;0n#lUVbFn7&WY@E+E4yvdCDp|wq?mP#gjT+VR{=4j({35yg7 z4a~Y(bcwI_B}E{$(=KK4x_u)R$Q1epYBm6pYLjd@vz;s!p*t%+lL3-D0b1^1lIPdr5Z*w&j0YF1gVGySS8RvD%~A;#(@amL;E3MQp7JO5 zmR8Fl4eKsiI36cR;dIqp@+msV&%T{0)=_0XT;e~rfPlPpdcQ-^7PJ>i%1VD=bwEQ7K8X)I%oi~P^+fVsJr;daQ`qh)=t5cLqlM{z z)cd^slV_n&B=cKYOGX*!fGKYs8=?wf@}y;@t}Cm>$ooCGiTXM!;K?3JT^I`BwD)*r zdz-2AUq*7cvKsU;w$Z$omRx^WUXNc=o55*uhHU)cC%-leDIG7E;v1Mg(Y1eApDPE2 zN_OR<_Xz2OEJJZ_0kgb=y}bT#*6%SMapcaqjmBl(1>rSCBOsHp4EW;J*AFp~iV;wA zX#-~>?O$LakJ3ln@~P;~yb5PbGl5vF}eZptgTxA+BehKKW8$ zp5dY1;l&F>@)qE8kXiyC-EyTZ`_#ys)1eAvW`nE?um%$weC`P5j4p+i;dhA(w7>Wr7#YrI5$R9>y0ih6kR z>~Z8OQv2)jI)3fW;jtLI#5^Jt`_)dhjn}NdQ>6qCW!tc6D}1pSmcKP*C^k``#B9@m zba}7TExSpf0%PisV|Do1IIG2vF2g=L@R^21)X~zQ$+)x7i(E%(Rw&Dgw$nGi9 d+Q6K@lWj=m@0JVXDQ#;vFNJ!kCQ<;xFM?0tdklUL1A1o0bvv(n`IW-UmlcQS<{_=^i(P% zOOd4ecwvrH77iODWEx~#7T)^O@bz%fDZ)K_YMAP=e-EunY5k$R8tww1E5MXeJ?`rP zpo)Mm4eMe=R-EBKRL%b3?R+gU+&*Npycwhde;fA3s4=p7dqPRPcZ;oX=S+R`(~_9Z zHbBdJ^0knQIQVoy4Hvj6gP9|u?0Q}R}f;AvIZ+3&)r9ypAf^)IXkhx&esZySloc1Q-8J%*J8zWP84jk~M zv)>$61AnHGYK;kK6C-z+&*_?Fg)hoyqGAmTmSIKlZe3Xb4oyXYD3PY73w19<3ba1m z^qHBz7-vO*U}Thrrmsrae13u+L4k#pFaWIwPXW8 zksA^ASao&i8F&eeMp{E#>>2&!- zlU-FW3%aLJ2>}F^%oSgkq&V|`bR_Pa*S%pNM~JbSliS2sjvBxV*gT1pkSAw}6V0N& z64eb>0L)(2DXQ&4KI)1QFG`fwi{NGXdH#apb37U>@oLj@wN!VhDiD+I>%Q}5UxKDV zaDUBu`&s|A2X4G>2bQkZtQCj7`*Y?182>b&;&KwQH3J2Rh~N{s3#pgFqFurn&DF-B-5Zr; zkXv#Mp*Riz`->#M+`n!c;2~8S1NPHj&VPz3g(-A^?+*qqF*Tx})Ey@XZ|LS8)sWpKVO0f^&+6Lxd4reJcZ z6z%HoSY^ILPms3YIZx%n4!6#P$MidUktayvQye;{XZ4#||HY94=My^ZS7-Q!=YN-_ z%mbE$zEp6?pZ&0A)~*qWv2V4fhbZ8CPz&T}=K=<0z-n`jk}M)i0CNSvT`@3L;kmZ6 z{d$>!9;0J-$ZGT>*M}Bz0-4|1eTkrJm=vPq4jeiaMRSjg+IsdUS0Cv*thf^d67nYD z7K&<5df>k3z_6Tjvf1iFS5xt=G=IGoEbQTgJyFPID?}Ogtm;xupa|EJR?GY)f~^QA zS;za>+Zoetpx9no2jB?u4TpdR;*(To5xzgh+q(^ziITR)h}1}l2BSs?frWzK;)B{c zQIYO`zFa)ad~=TMNTtokih|~;U{TxRKRB{d-IXiGUyL4!!7&NRj{nE9^na(5ER_sO zPUvs`IY@lZoIg`=uVS+Fj-bfJ^g%ub(*?;ew7ntR09BlHjN@=s{T0TV{{X=UbNj!R z-zdVrK|4lpb(j;+;*MfVgxmWi#I}Xda+5d8uS#s*q?S3R;`ILtz%Kj51pRnhZDVPh z=W>xDd$up|J0ztTzKrAam47lW4iR!kT7VAbRC=bGMT@YRBW|RD`Q*gJJ%i7pVq`De z{67dR;&H7_OtydnBbLcu6-3CRy`?7Pwk>#sMyY3G6F*ktybtue_34I8JsVPr0?iM9Os?&C1&htoExATpQJ3UWV}#wR(?ltKrxC-J)cePJ z3o^Ni{?q}}UY3%wdz`z$r+rnw&Hdtreu+#Sz;x%6_ggml3FRgOn()2`rMiP<2RQGs zK?tE$Ww)5hXQuY1B!55(Z$|*Dga=yV_up%k8)B+C0aBE<;aPBRuu`N#(S=tK)E&ud zTq%eKX?>Sf1wRJVhsNgmY=N17-$9h4fwM~c6cR^OfzQ|CE_QldzgX>XxR;P->Q<($ z9Y+rC{hZbXDx$%kJfn7Fbk?R-nkCqXw*)y|f(hAf+_}lb?@F7Fa?}!rZ>r-F$r!Bl z9-VlomG^5EPk?*G>PEmliO66cqf{SzS&;as)ixx=0uzYi!Tfds12q9(5K451lNl5W4!ljle!o{AZ0q3{NUC{ zb*@qCy|0K&rB_J8xYF^=aD*_E?N63oppzOIL193I%-vgAcQQ4IP6EsjbPJ0;#m6h< z7B=Lu2$i_S-ZDWA5ycwhdf2}$L10cLr3QeTIr@%HgYcm()=-!)) z-4y9T7$f(G;LP|fuX`DB3vN-6MVv6b&7HNKA9kDH)~-(pb9oc>I36(bjy)l(f^JC{ zuEr71Bhg%fR5?~Rh9iNtrAza{7*|KrS+{`=)`fx7Q|t}4+V&>m8J%*J8zWP84jk~M zv)>$61AmMI?UUcKj}^QKX^#z)eGQAY+e20k1lgS=s4JaBCrgf6q&2gge zgL*L%5&|7D57e~XgVRp^y~*6cMi*YW5ec!er)y281DOJv~@zY zrGE{Sb4X!XrdNanGy(Wi2fX=Z9>`s634L9tG_5#LGPy@k2YvEk-k6+OsTt@aK*5=O z{Ao)`1Mrh)NRl$#Wex#Qw?Fv31iGW3rg7E;p8^$1jS}F3?Ngg%7FFyn&qBZe=<~E= zf|*$(ZyWMXpWU4Jc)B}b;eE!0FZAE(yMHTHXsdCny_$}9Y;kV_@<0)ZKM*C(>k-F8 z0&>6)U(%q7XSt&Ct^9#CVZ?4}0S)Pi37Iwn@+dcsFn@4^Ck)zIlhkvCt z-VA`p3sc`=vK^GblhLM~KjF@}?|1Cap5tFRf{q%J5=->_O{wv;;bPIbrfdXan&G$^ zXuw0$UM-loJ9U0wsf>jKgqwR>0x5M@6mC|7iq)mCm62dbK?8QOk)dB|!cPYwM_bpC zZ;)?n*o%ml8B{I^4nMewPL%YKI)8k^1WNB{YUvXOGAno}=1aHEjxqeR`Ylp?fd8!@ zJ+KEV`l<-*)nY)?srBlIYEF;CUy?timnLs^GsK>2)&H0`hx{Cm!bv~W-feOKrF3vi zO_!Kg;D(UWBavw1OgrZ^Js`2uVRXH@ke1C8YMZKORmYBp07=ZEUK)Tyqkp6|S3>+_ z1ALD|2`64Pd$F`=+Cl2bV8-U+WF2#8t4paI& zmj+Z7xKn+_1WqgjbK+p5LPrMth@%EIxb+(!!mO21&_B8kv9>2S@M7!biFe~-^uUcw zvm9!0WDfb_cBJ@!~Z9m;=nUOs;=YWm?MxbG(%=P768+grOW756Ff%{;7WY0!;}~BBsk^W=n<8Jh|^fR zUw=TR*(No{EL4czW{qtp5SSwC75VqYC=kKXjS2{~={`k9{U8}MPXT}A*e zt(ZpuAbyp0+}_E7DT1yZ8*DQ7%M0w0IF9k=aVG;Y?2b2Pk>@O>W4h_ZX~v;A42MIG zxZ}u<2^_b{=A@6Zoy_ce-2By9V^s@NN;2Abe#L~l0RI1>(@H^k5IAbLRp+ySj4i~v zBfD7!XN_S4oL`*IMx4xK3&P(g%aXP|gf3_l@5QP|maO(IbQ4TVfYx>iNo$5YtvX6> P1}d3Wegf$WlXWFL%#Bgn diff --git a/test_fixtures/masp_proofs/96CBC406931DDBC76053B417CCFE78D0FC876E11ADD563D149168D4BDE86FBB8.bin b/test_fixtures/masp_proofs/4B412E2EA5AC98758E696AB36327E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin similarity index 75% rename from test_fixtures/masp_proofs/96CBC406931DDBC76053B417CCFE78D0FC876E11ADD563D149168D4BDE86FBB8.bin rename to test_fixtures/masp_proofs/4B412E2EA5AC98758E696AB36327E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin index 8c4d3c8e9b19a4a18ab50b12050c676db892002d..8b15531e3ec213b150ecbd96ab3450d790576908 100644 GIT binary patch delta 1200 zcmbPXHN$FxiAe0#t)glQ&rD{soR)I4x8B^x?%^{zn@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_29~|Ebfx!xiL*LrrgZ9?rl8h2##N6Kbe}!&Da)F)JKSUPW@p|nObUK? z*2@e24KFL(aInI?B~kiY(ZxgY_pSu|+gr1XQSImc&EWz-RgX^0HN0~2q}%E1p;NbN zbg|7@>3(`k;_S)KpB+=<=bSTZbG9&0Rblk*&Xu-h9J{(ji}ycxpWe>Z8(fwUdCUCZ z#+XKj(v6$z#Z;N=XKuKA*sQQ%=d?0~Q@M35TNsS~`0<6Q_H1H*w@o9B!^qU@`Gfqw zFHXrt+$~dG;WTf})B25JGj_H+q!g8|{I_n)(ZsE*&fPiJe1@?aQ7G~^2RYk`=j_10>oYZ!$FLf$RE5Gtx_E3>``{I3b z{~Tm#yQt-}z4r0)ol9=&xBpzluK9ZEg=^RMp3N5*>1fXIRMk75QTE;9|Bm=DAL$z& zN6YT5joh~Wz>0-^j~rOpEv#O>HLRCZc(?j)O}N2KoyA69!)y-QH-Aa0+x0a(MauD) zu`;!Q!g+hy3^P~#mA_FV_3Pg8 zsggdqQqyUiIOV&nToT02{)OqZ@v3@ zYVXd1&LxK(j=o;!`a(7S)$0x2W=-cm2wo2}`lXktes#|BN0&akbscJPd4DQ);T_8^ z`7-~E=`m^bH-6Rk#+?3gH#K*$?;~;Nmx_A&>JqzFyHEKLIisp=+nqY6rT({nJzXO1 z!6Uorn468oyUVN-OZF~d(fPiv`E_lTZk3~r&EdsaS+j)M{`_ZAxfJtIcK6MDb0%(_ zu){7Xq44#a>aAsF$A4brR^(-9PW5ePJg1!V_wYnrq57#C-5vVB^|}RAJ6)Tw{psE< zceXOG{BUN^{N3eOa>Z}0TeHc{BKh*1=W)GTx_ajp&d^opoErId*^bJPt?N#e|IW7+ WwRyKe=I*i=6*fjoIVL}mF#!M?9z&-9 delta 1200 zcmbPXHN$FxiAbFH)`>d;b+!Dj<~g;yK3U;y&96K;n@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_29|t|maJ;^oL$OcAET7}K5O}NEB(B?!EK|{-AyNcUXifh?9BUxNkQnn z=H3@hE)UWUDziPGb6&=5^GvC4!714v!VIdeFL-fmbGQId)lRjIYYWXz+Z%W|iXNWY z6H+C;^2*l=GX{I>nc0!+SMhJo76z*NckFs-+A){!3+G!bdAq;q?p@V0A{BnyLnn5N z-ju!Ole4*AOqIF5;ik!lS%-di*R8(e>^{X#C*tbajg7aQ*+mQ#l#CkIKi*#?!@jL~ zgUzx8?R?_}>sdB9TAqDTGJi#j`doe%0q)kEBR+V>3jU!2jCU*oRIA+YJ|{oju#`96NSHn;wvnx?dFO7Cud z)y%6oO;$`v(`T&>3NgJ<^@OD{^q-CE((nI|rBvQuT=>BKmEEnA&z5yX?Y1^s!}RRO zC1szEEh3j@tUYj5Qr$93^9t8yJrB;Ehnl+V*s}r_hdoxxXr^O@u9MoX(S zE-P-^eqt?u^@TDCj@8k^n^$qM*H5-HwEeNMx0D)L*0O3UJg_zyZhZ)6Q6rrojYZ(KIlsPQgQv@tZ^h}#|4p5@Mat1bIsHKW z9h=ha@x>o*3x3RRPx$=5HZ?YMx#spwrS@k1&DYxZr93h`%;eW%e!O7zyt@;Q%bx!+ zv13}_p0^X^)m;~!HwfPO)P%wM#F4x0k^d?#gq$#%s3w>4!{egl(bmQ-KX=V<&sV+3 zFQW5u`#DF>>xWNVo3NAVuWj|2octBBik`E$F0<6j8HKEzEF@y}F^9s?{QG0|O|ZiSS8-zSei)pgpLoC`N4 zT=$N0SX0n@v;LPv)YhcvDR(dD{Rw$F`Lmqt$7xTNcAXD$5IZ}gQJX=~rA;S`l|6TH zVv*bOikuaBg+2<`jg{H^KK;%4S+H`;5nH{O+P~c{-+tAEDwy*$8uNU4y}-5QP;yV6 zO*O;EG=KNwD=QMb9G)+ImatJ{?&74vqX!xcPpbFa$*Y)8H*jK5Rd#$-KnN%Arkm_CEeCQoK97kN-3}-E?tMhuimc SCr(5?;oszF%su&uj0php*e#9# diff --git a/test_fixtures/masp_proofs/B74C1EC89D48DC01F71DA402F898CB65B7F71F737870C86AEA55454B8B32DC2D.bin b/test_fixtures/masp_proofs/4CCB9ADD3188CD893508CBB4FCB62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin similarity index 76% rename from test_fixtures/masp_proofs/B74C1EC89D48DC01F71DA402F898CB65B7F71F737870C86AEA55454B8B32DC2D.bin rename to test_fixtures/masp_proofs/4CCB9ADD3188CD893508CBB4FCB62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin index 53999911ff012f317dacadec5895581c3e897c0b..e95e73953ed6015ec87fbee783238a40bf2604e4 100644 GIT binary patch delta 1200 zcmbPXHN$FxiAe0#t)glQ&rD{soR)I4x8B^x?%^{zn@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_2A04w?>UYtOIK!wUli&N)-B|nb=s?c#p?f+OZ8iBNJg}6cIN%Uq;RdY znYYSi)&GYI3bs#=?NsN`D=W-eUz_J~BDhG<>{jvSZ~>sId8sP9Kji#B71v$D@KG!y z@qM}X+L?J4#XEGTnR)I_$=RGO3{=&@mXI;^)#-iJnPzX+AMC7^zQgN3_vD@*75$mB zHXZq)v$o7f~Zzc%kZeCON?BZJtGpWh;c{kRfDE}W@m-L&xJ zw?a10<3WFyw5<_%*pv9RR_JEnYWp{nHx(FS397r8(N+ zX{#!p+lFnM{^V&6OUk18y7RPlL~kgV{@hYCIBthzQT3Md*Bd$QR+v3rslQlo`KDv> zui1{d*4&>Vf~Pg>A^9}4_(SFt^FwAbmV4U;qCA9_l0g0 zdcVKnyW%Wy+kJmTUu2sed42ca9OpQvDR1UAh}wKY>&wIup5x3t1qL1~S~ znanPCzQk14ZVo&0f3BOrq*VU%cMjQS3p|{#IVrw==3cdkCm!DxWolWyWW3_=)yFtx z%DT_Tzhti2oVc~3gio=@MCi{Vfyt?J@`IATDgLNdFVLHJWdGs?e>|9OnHKA}IE2pW zpC)wHiIa1t8?$V^ zYd;b+!Dj<~g;yK3U;y&96K;n@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_29`OCkE_XF(eM#Z*DbqUyydxa$nK?n9bflm-FA-jHC*1Y*_rnXlfv>P zuNfb=&ywptwsJywet%+Q#G+$+nWa?gcJvvG9w`sq94-JP7OgxSu|p7}j2>}p-$ z?5p2*uUNFXUQCs_e%roDb9i_~jyMOszgs1|{I7L@oRM9D*`#YJH8m$QnU=`B(_y~* z>2J^#AB#udFYGK`C@#V9fjQ*o>xRA}+pFbU+fs^>PfXt4^X;+c(s(-~rrH19(^WSA z|MEO^S8?(q#s$o0<7Cg*v#AK~)7|xa`*f|`uFc*{=ghZ?ZF@A~QuD%kJ-Y;khC?@Y z-uB#krCMIu#C-Xplh*l;z4H&)I#q~lbSt^NP4oZqTv6rIWkuFC&psUFT+N*-_5X;S zzughb??JncOs<`tXdtmm(cn$v`G?x!@sA}^7P_t4E`9BLRn+Il(+f9WJ9sluX-CMy z+1hE39~r%9XVHr&y7whwP1>VxSDot@&s0{kT${Un&V^;0V&{K2A#!3%&a3?#W&50_ zG9FpJQSyt2;HSFlM+&&rZL3?Yi|4EmabA8ZcxT_@C*POzIyLO#s6M@F>C;ZX#}RR6 za=m43qG#8?j5S%iCnzz|n`w!?ti^}ocIo5dTZ2C^_3Fn~>sT|Ny}_{fQbE(K<F@C9EIM{`v2Lo68iL)LlKY|2Hn3ZQuJ~SJJ;L5w#k-R)6`y z^KokEI-Py-@?OiGKi=I|&9r3(Q-GfSnSb{sj~st3Keb@j4}QC6s~PJAl8xOhjixvV zw*PzaxwU5gv|qVv>Zcm_A6XOsPvX>!LrGH}SYOmpe9&IwQP`}Ja`}YHcjLTWvs7-+ z7MG|@kVq&MT|C>Q{ouFil`Qt`6P{iOw>f)iPTZbfGKHii z=KXG^lC`sf>+k)05g;w?x!G25?Lqz~p3Vvbb zr5IS0COvTR7V@lOHxD`%c+R&>@@s#HlH%Ew&lu+z?_dh`XXl)`gPpnm^kVxt0o&iL VZ1PGH(7GBZztx40b@CG#69BgNIRpRz diff --git a/test_fixtures/masp_proofs/51EF94B13138B91DB3081F95193F779253B53A9A0BD62FD3DF8F6FCF4AF1E145.bin b/test_fixtures/masp_proofs/51EF94B13138B91DB3081F95193F779253B53A9A0BD62FD3DF8F6FCF4AF1E145.bin deleted file mode 100644 index 8b21aac70d3fd50b05a84cd005d0e440b1cbefc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17018 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 diff --git a/test_fixtures/masp_proofs/544F7432B95E26E312105FB804BF9BC175A70082068C8785BDDBF49DCCA4BE66.bin b/test_fixtures/masp_proofs/544F7432B95E26E312105FB804BF9BC175A70082068C8785BDDBF49DCCA4BE66.bin deleted file mode 100644 index 1636c1394f086ad2f8bb900c9ad58e1fc5e4caef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 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 diff --git a/test_fixtures/masp_proofs/25FA248C27E805F28102B6E3DCFEAD637C92544211E7B3765CA7AA186FB1E409.bin b/test_fixtures/masp_proofs/553C507BF748CC2353DCE98EB91B5464810F6974083CC2FEE2756ED1E97B8143.bin similarity index 75% rename from test_fixtures/masp_proofs/25FA248C27E805F28102B6E3DCFEAD637C92544211E7B3765CA7AA186FB1E409.bin rename to test_fixtures/masp_proofs/553C507BF748CC2353DCE98EB91B5464810F6974083CC2FEE2756ED1E97B8143.bin index 60aa5777a44a62800525dddf8d444f2de76bccf5..166af873e703183593d4e58d398140d4cf2a7982 100644 GIT binary patch delta 1199 zcmbPXHN$FxiAe0#t)glQ&rD{soR)I4x8B^x?%^{zn@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_29~GM!Xi9VW0!T-6rKxC@(ox1Xu2Y@?qNvN>&82^I_~V7oq4}7DYW>! z`FuHKU+{arQr>3{HcSO>iucTK-0HsnzVBe)+j$o^hYJ8zIYs(8?myj^h||0-Ni_)R^mQ*8dBC@#w_Hg7$r@E+3f7^v6eS<5b;@J@(2ICKRrhxUF7wXeGBc zV}w)MD(@_jg!M~~U(>pB=b3rk>RhE~zdY}seG%-s?&ZY@evf9h3!UZ8j#4+Dr=6Z< zx2o}O`p4?eOsf(yWj-WnFnwpqm0Dc;@NJi;CigEn(}rxzwnge2`zG(pkvS04{C2llZK{dzS%0@wfN>-%{m9`~9dxs^56`rkkC!xjls7Wr-2 zGO_D)?&ke%%(4NdCD-q5x+ZwJan0Ha-%A(O3J)#p5WcxmVTw`7_A~jb@5cZ75xd^z z^~~<&KhzrT-QHCH;xLm$PKlHc%bBf>+0`WzoIE!cWnTQ}ZNm{05y6-?@p7lfd7j)8 zf5T?(D|d;b+!Dj<~g;yK3U;y&96K;n@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_29_rG%iql%U%uYMv`zbzcWaukQ|8&{HpgwN_J8>J`pKgUo1J;TFewP# zJox4Jg-c88D&Bu%Ypy%B$?v*Ix$l*EsnQvDrYGDE*&HqaRCVxl)`cX-@X2oXRop7N zzp3zqDEaMG$(}MtX2Q*aD;$e9XA1*Wt=+UxH%>)APU*{Gj{~A!*AJL?*jG)@m)r0* zmm|n#$?VPbVrtCw32h%g^;d3kPPO4`^eVgRZn=CjqqlhcVY_domzcuy{aW^D>}L8h z!69$L1Nn=g-R6xtm-XH6e$|cJo^qzGIHj@nK&wh{z@k>J)#o!(wOxAGhCG$H z-@1Q^hk1TA>$jql)taok_;1ZPf8%~Fl$za?om5}QD;e{6Z7y&A zcgs0e(UYvVK8VndwB6KP{dVqMcfS*&0!b<}qO$*7vzN@g6a7{EjJYMF$mBJ3ye6&t zuJ<*axjap)^Uu}~KiJH)(|oHWC)yU)S*_}{occ1>+ewdq(}E}4GUuLfSt+%}qUrkM zZ&Th~>;5$Nb=^04-4~)UyPd4^>L0}`Jg5l`5;=MP|J2lD=i}Zj`*YXsR>Y;R?XzZD zZ`SvHFP1myUdKA#h9_TK734E_UzW0X{Vb2mJ0;V6`ytn#|JA%=)c47&^8SuF{c1YX z;mtdzHfQN>J)QsZ^vncl!nP zUH?1t3PS9?B964WEarMFq9h+)bf}fVJR@!^hmX~3#jq|f`}^VSymMc*d|Mc4xPQ~J zRSU1UA6Cseyrtwq+;OYrDGYAGG5LEx%1P#3Gm7V3?9O1IJHakaAvdk&^8zt#$@NTm zLj4;mcYV#^%l7Yg$a|J&{h}vHqe6Sa1Gkqk^@|Rjl79C6LRDS5tF?QFXVv*1j;p5e zI^QxXTJrNkfYE`sdgnslMs941s#UYs%${0N6Z%3U>*K}t4U-L`j-=Rp+3m4x;)~VW z`I%T(xO{tByEHVkTmQphQL|^VkIZiHb7!)DZ9nPp@X_BDSKnBz|MO&Sj{o9`jsNSa z>ow#S&f*iSU%vQ&=25QcNt_Pk*>F>?OGTTpI&{(9vj75`YxT7iFI9kg|)tpt;p);q_e46r&DTj`{eoeH78yEr^5TW zM^-&7eE;nd&c$8l8cA@T0EWZ5Puart$0gJAQGd+ag?l695N^gmGj8o7Gc Q#yOMT-P_1M`H74P0JcUnPXGV_ diff --git a/test_fixtures/masp_proofs/6DD5A788D36258E9D5FEF454DBC89879834677F926130D56EB5E4067728EB5CF.bin b/test_fixtures/masp_proofs/6DD5A788D36258E9D5FEF454DBC89879834677F926130D56EB5E4067728EB5CF.bin deleted file mode 100644 index 94f997688ba6215afe7dba75785ff44eb9cd9d65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10382 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 yQm)ULrP}O8+E~!gC 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 SG7FOu(@w9E;h6kH#smP8^DV#t delta 1200 zcmbPXHN$FxiAbFH)`>d;b+!Dj<~g;yK3U;y&96K;n@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_1{Q_r{zYGP%=A=*{k)R$7XH$ayW0Llsm=Z2V<^#%(!aJ@26OL%O$ox{EB zSc{($>*jhfRp$CtFW+$s%5=QtJCgZL_HfO;gJ1dV)y15@on8~16J6P-_d;aG-qZam zP7#_(PtAQ|FqT0@x(5_ z)(J1#*Dct8Vn);(!yO|CCj-1N$^`qj30{@%QJ ze?`9;4Hu{9tqc40I$rLwVafdZ9wFW4x|+$;tE+;2A{_&A*u?nQ*5*o`&1ZO@7qoF_ z>fH;X_1fmO)AYCWZz>Z_2{O3Jl3n>59A$RoO>g#3@%`;Iv*M+4a(#s2 zgf0uyHBk?IzP)7$?8%J~Nv}BSu6!@>$OG@)b1qGfnj^`Py0Y+52ixUJ&QG&8bw+yb zc$T9nVD(RlO=NPq>RUsnk4`7vHl16)a>tJpiEr0hFT6>Z&5`t7|AhAH+*!#PVUdDe z<|Q9rNR@`LCwr|4ws1DN_}O!|)%_bS0&N@WA2l=eGB!qvo;3W}Cz7nVK+D}qa>JxE z(r@pb&$}YGqnGd6wnvwBmrQ+jv+Lonqc_W(@7>DO;>q05`Aub`-)GMKAD!9Ddo*YK z*)&I9bws=j@k{{ z#m;Y<^w-uuy5pXsbR*`3s(bwkd(nvVuN3&-|EgaX^-1p5)SpaF&$eWIvC|W+zRCDf zf7{Qc-LtK(_cF#LzI(e_$78q3i#-RJT$z8CNuSzd?Aaf$Hl6+3jQj6*9$0niv@YV`O9x(^4J!;FRS~O?{b9ElFO~HE~%o!B4$u|{(m$HTiiPk8@t@0r_Ly6ItvEu;I96>-Tgx%@7&O=!9Ic@tkC`wF+v R&y^GE&!6z(n*2n@1OV|0FDC#1 diff --git a/test_fixtures/masp_proofs/0AB9DC2FED12A93FDA42447E6A14612B09451DF258B1B593CFED41B0E9256A2E.bin b/test_fixtures/masp_proofs/978C35E058808D61F0E265D72DE8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin similarity index 79% rename from test_fixtures/masp_proofs/0AB9DC2FED12A93FDA42447E6A14612B09451DF258B1B593CFED41B0E9256A2E.bin rename to test_fixtures/masp_proofs/978C35E058808D61F0E265D72DE8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin index 7524753fec47fdf4c0e73b22036c7a19f82254b9..06926fb5befcee3e11c47b388e13801d856b5362 100644 GIT binary patch delta 4215 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 N_Y;JkJPDIBUwryXE%yKb delta 4215 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 N-J%QLj|7u4UwouuA!Yyo diff --git a/test_fixtures/masp_proofs/A8A9963AC2983B576BAE4DE9BA6D2CF14C7F9E90A8588BA75DA0D2860F36E2CB.bin b/test_fixtures/masp_proofs/A8A9963AC2983B576BAE4DE9BA6D2CF14C7F9E90A8588BA75DA0D2860F36E2CB.bin deleted file mode 100644 index e475b08f8b72978c2a6cf90280bec31fc71997bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9649 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 S`T6eG_!p=Db^hxv(0>8E_ROCE diff --git a/test_fixtures/masp_proofs/AE4CEC9192B52E8CE5AB0C25936D2AEEF55A6F202D8EB4564017DB5BEF872107.bin b/test_fixtures/masp_proofs/AE4CEC9192B52E8CE5AB0C25936D2AEEF55A6F202D8EB4564017DB5BEF872107.bin index 89cbcb8263c2e14317c383f6882ee46b68cae626..cee551d22af939387e165299cdaa13f5271f37e3 100644 GIT binary patch delta 2810 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 M5E3kJ1(T6HTq1^EzW@LL delta 2810 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 MR{=Z{4wI2QT>Q>!H2?qr diff --git a/test_fixtures/masp_proofs/AEA19C9B07742FF5F6D759B171396732D2EBF77728D2772EB251123DF2CEF6A1.bin b/test_fixtures/masp_proofs/AEA19C9B07742FF5F6D759B171396732D2EBF77728D2772EB251123DF2CEF6A1.bin deleted file mode 100644 index 4b7967cf8517fcab5932ceb352630a2cdb92311b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9941 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 diff --git a/test_fixtures/masp_proofs/8DAE054DE58BDFFE4F551092B09402D995E6F74FFBF5CE3BA13049D272C5E752.bin b/test_fixtures/masp_proofs/BB9AA71A4227C9E62948CBA8DB4A5C2232840271F032F756953233DB3E53E757.bin similarity index 76% rename from test_fixtures/masp_proofs/8DAE054DE58BDFFE4F551092B09402D995E6F74FFBF5CE3BA13049D272C5E752.bin rename to test_fixtures/masp_proofs/BB9AA71A4227C9E62948CBA8DB4A5C2232840271F032F756953233DB3E53E757.bin index 8b2d8fd22e477c812e7551fb70c4dbf7b87d2048..ecdd51d5db955a7751dc46818651c02457d964b6 100644 GIT binary patch delta 1787 zcmVAXj&az46Rjj|0J5Fp>IkCk?W$!?A+oKt#JSMLRV!Ye` zdzw`1N<|GjF5)+3LK%HsOO6qrxQR(o&aYFy9~$_;<1Uo~-SFufqYX_GcZ|0K7TPS{qrH2vH5m9MDWEK z{Nx*NdhT#wsu@WPyN24>IDFGhxoJB^K2TGreW8CU6SuphYpTc=uXU&4jfDmxsw}vG zTpQi(b&2TW_L?a7!h}|&AT*5-!OAh=2|x1e+#&mu^_v`I4G)UH# z$Ep-7jvSdAy!&ple?!}PFsb;5;AaaB4vkER>soG7JBBL?XeN+NJrSNP6fkoq@gSHAk9IT=TrcqHU)99a{el!_p{^TFSedeO-4E9PzP zGMmrK_S7_OQlsf8^9ijYsOeV%l#PF)`?|#jU5~LgXg)C6Q8AmMk|~4S=hjxtJKjGG zb4a|802IKG2!7+cW;+6E%^Bc4zZ2pXxeR=5yzIpv8NxT!CS_3o?Aeb7`s*I3`Q}mD zfVpe3BZMb54`w^=?Rh?afhQjHzdA1b}-cjvU3z)km`Rylxk2g z1hF=ZTQH}l(ivMp){YE>O+AT3M;%nnoQ+1h=UTN z;Rv(lM4yTCOyBQfFiacM8A(#YM87Z?!N$`(1JM=3!qyUI3XNm&F^W3CoCF9wwZ}A( zc||TYC1uy6Yv-8t(5)C;P5OVzHYjP;^g~J`i^QeL&g?Bw53gNcyThaZI2)WJIjda( z*jx{Bab6E=gJ9fqGHi?nBZQ8OmP$i%K!uY(XOX+QI>!%Q38l5V)q?bU+|vdwspebK z`UK3x_SK7qNg8JeZ^9o@uzAYQTzzo!)Pl8*gGMEet1LzEU&Nt^4?$f-4{NiPZd-tSgmHk(wT)H zOQrPYx9#I0?Ky2EEDr^63uZazyRk1ghrH^y|MNL4k9DP$Sa)pqZx3Gi@XMub6t&vo zV~-pD#{)qpcsYVR;KhHMXTaSVf|H<$tPhB?>#>>2e_yb;AL4e7-KYx>h<7v<$h+m{ zmw69W%c+V9sHSPRiTMs#bVZ;yhcsd@BWX)l8{scnwov3|L3 d5ODu8L*cz>is%crs0#yt?`|#Q`~j1hCOlRZcC`Qi delta 1787 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 GUMMg$q-zQQ diff --git a/test_fixtures/masp_proofs/C788F9057C615CCE7B260BB8BF5CF776D5DE7C9153D67B7FDF22ED6F35558738.bin b/test_fixtures/masp_proofs/C788F9057C615CCE7B260BB8BF5CF776D5DE7C9153D67B7FDF22ED6F35558738.bin deleted file mode 100644 index d3c3a5c24181bdbe0be7e43634ce4e5cd0ac396a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24494 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 Dju1Rq delta 2749 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 PB=E_%(6MU1S&r1!^} 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 diff --git a/test_fixtures/masp_proofs/2E78CC40C345D7EA50407110784E2EF3EC23A99F9E8F0A5B95AB1BEB71B18583.bin b/test_fixtures/masp_proofs/F0471ECBD3AF04B4A373D2966781D5DEF92B9A9BB3A159947560514682CC3877.bin similarity index 71% rename from test_fixtures/masp_proofs/2E78CC40C345D7EA50407110784E2EF3EC23A99F9E8F0A5B95AB1BEB71B18583.bin rename to test_fixtures/masp_proofs/F0471ECBD3AF04B4A373D2966781D5DEF92B9A9BB3A159947560514682CC3877.bin index 84a26fb9c53d6d0fb35ffc72b4793cddd2bf5ba0..42007a8eaecbf55433122a228ce0ebf78b0c2c1b 100644 GIT binary patch delta 1200 zcmbPXHN$FxiAe0#t)glQ&rD{soR)I4x8B^x?%^{zn@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_1{UVqW`&a-wR=9Ndpy5qF>hV+oCQ+R4nO7zGR$PzHdp58W@p|nObV~0 ztZrtzH=gR<+MDTr`PlKk{8yjV^j;Nk1uS#byeqP1bGQIdRnTqz!<^TjP0L9t*0F22 zBJ_(r*v)eBQlYoJ;n&x7)L+`1EeuqZnwR=MRC(|5{uqO8J>DOJzY8xa*qT^;;PuRs z!VHbP#?AF&s?7D%mDoO>i>=~|`La@<@9I5~w-1<`qZIG{H~%fL^eXeOea461i)v}l zy=lG9`3c_wNzECzTHlo$%zUB2tyQC#p?W&m!b64i@+HBi(=V6*I#F$|8xsFz%J=^w zeiOfPxE}f&$7?>JL($LpO6fCpE7$o`YAgFLaMj%WdDN!AEG3`+UA>9m*7}`YyE1gY ziY#9+%U9Wa;;-Y@&0LeNFPs_H9erOfU9m{@rTFI4k1RZXD6ihHy5U3KS#^n52QND} zU8~$?Hf8&QCRh0-&u@Rw)$jlD=d(~@ozX_~)cnqwD*vtvXSAiLy|Iva-fn*Qk43?> zXH$GXz3Rz4!PEYH$}@|n*CnM7)IZ!Hs<-uLl+&-NzT9s%OWrcFN|?y-qjK^VyM=4o zJ_}zeTQBfMBw5G#+^<#F8bVz8*Dv@flgHP#cvIEJnAI=Wok%~&d}Gtb(zomkTf$=h zp552?cf-+D+)TOR#tN_J&wYJ%@@0={w?lfDD61AmSaVHx-%`cCUutur>J^^We19Rs z`YFuXUEuv>pN{X2+KWoj5f3J^C3h296RJ4j= zs+81}Z1>1N9{cu5&Fr$v<&LpMAV%C9aAH(iRC%^aH zyqweiHcRw7Wo5Ot#ws@LTN59M82-;Uy)&bMA%?&H$HJ*e=Wm{wH~Z+}j|UW(*6i^O zQ*Hit$l3ST#SfNypI%%d*JovSYaulpO#KI{B-U)r&lLtL*tp86WEX;C`dF3?q0pU2H1JGJ|W z*ZyUj`h8#Ih(~4Sr7vQOR_d|2y5h@S?nhG>F8SJ8St=U!_VHf3d^g*9_D*xJ>|s5( zPH^U%{OE*Vaf;uot9MvBIPCFGR4@8I_2$I=~knC(U@!$h?+g@)H>o0AR5(RsaA1 delta 1200 zcmbPXHN$FxiAbFH)`>d;b+!Dj<~g;yK3U;y&96K;n@0n?#2q#q5)(PGOKkiT&5hkC zvh1+H=3E8_2A2Cm!lx^J=d3)RDN~o=A^oz)^jpNGtvzh&yRt1_?O$QM*_rnXlLE^l zp59NEYi$f(G+jToKd);oZ{Mm-1&b%W{3*Fir1n<9=5PU^s{J+TGcIwzs%19bIx+iH zN|uSY@M7n_liMexDScs6lbyUdTNtP+@o?(4#Dhhr^a3+{FK5{-aawAzEWc^N4a1E; zB92xsG2UD+rpjEuOwDnJe_-t?GrzDCQzkr-DGqy-tSB1ZUuyq$%dZr}mC9{wrvsZ} zC%-MeZ(OkYvDGv_mjxHTZ|p45&-?wivulCLWEIt*ZM#|QVpLxDo;$ihzf?*2==4bLC%dQ$Bk4H@3>(3khrGCA}F;7;sePY`*6F#9cVvkZ^8J*uIl0KjRm~`a@ z&5FA_ooi+;y4@9jdCAEgN7|mcJgDavh;w<8T3~cw?Ik0-kd+>ak$K^PR-ueZpPG`_ zUb(XV)(HLznMC$dUiwo)%P4n zFQGljDcg=b_gr@}Dee51Mq}sOON3TNmAjq(Dr4Na>ly#_={HYsE8bsI?zhdhIQ{6e z*!rd`ucoWy&6v(LMb+V$>hY?d8=p-2xPdQR+^lsupJK^+#tTi~=l)){*HZIugH8%} z;g)-;OF4a(o`3f^?(p&I+lC6kNt%+YpSz_WYzG{@TSzClh)*gyQ?dK{j! zZ^b#@Vs{%x+nC*UVQl699wlDe@k)KcJEPuo1BN%N>I?2KYwk<$bp0H6<+RZ4 Date: Wed, 29 Nov 2023 13:20:21 +0000 Subject: [PATCH 125/175] Improve signing failure error msg --- apps/src/lib/config/genesis/transactions.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 25f8ac3455..94e0eefb33 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -773,7 +773,14 @@ impl Signed { None } }) - .unwrap(); + .unwrap_or_else(|| { + panic!( + "No signature could be produced for a transaction of type \ + {}. The most likely cause is a missing secret key, \ + public key hash or alias in your pre-genesis wallet.", + std::any::type_name::() + ); + }); for (ix, sig) in sigs.signatures.into_iter() { self.signatures.insert( StringEncoded::new(pks[ix as usize].clone()), From d1a9c9c0e98456f555178549fe8f5ee50d892e50 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 29 Nov 2023 15:16:00 +0000 Subject: [PATCH 126/175] Generate localnet script fixes --- scripts/gen_localnet.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/scripts/gen_localnet.py b/scripts/gen_localnet.py index 9e03c7d6cf..79f7285d55 100644 --- a/scripts/gen_localnet.py +++ b/scripts/gen_localnet.py @@ -5,6 +5,9 @@ import shutil import toml +def system(cmd): + if os.system(cmd) != 0: + exit(1) def move_genesis_wallet(genesis_wallet_toml : str, wallet_toml : str): genesis_wallet = toml.load(genesis_wallet_toml) @@ -58,7 +61,11 @@ def edit_parameters(params_toml, **kwargs): # Access the arguments if args.localnet_dir: - localnet_dir = namada_dir + '/' + args.localnet_dir + if args.localnet_dir[-1] == '/': + args.localnet_dir = args.localnet_dir[:-1] + print(os.path.basename(args.localnet_dir)) + localnet_dir = namada_dir + '/' + os.path.basename(args.localnet_dir) + shutil.copytree(args.localnet_dir, localnet_dir) if os.path.isdir(localnet_dir) and os.listdir(localnet_dir): print('Using localnet directory: ' + localnet_dir) @@ -137,7 +144,7 @@ def edit_parameters(params_toml, **kwargs): print(f"Cannot find wasm directory that is not empty at {WASM_PATH}") sys.exit(1) -os.system(f"{namadac_bin} --base-dir={BASE_DIR} utils init-network --chain-prefix {CHAIN_PREFIX} --genesis-time {GENESIS_TIME} --templates-path {TEMPLATES_PATH} --wasm-checksums-path {WASM_CHECKSUMS_PATH}") +system(f"{namadac_bin} --base-dir={BASE_DIR} utils init-network --chain-prefix {CHAIN_PREFIX} --genesis-time {GENESIS_TIME} --templates-path {TEMPLATES_PATH} --wasm-checksums-path {WASM_CHECKSUMS_PATH}") base_dir_files = os.listdir(BASE_DIR) CHAIN_ID="" @@ -158,7 +165,7 @@ def edit_parameters(params_toml, **kwargs): print(f"Cannot find pre-genesis directory that is not empty at {PRE_GENESIS_PATH}") sys.exit(1) -os.system(f"NAMADA_NETWORK_CONFIGS_DIR='{temp_dir}' {namadac_bin} --base-dir={BASE_DIR} utils join-network --chain-id {CHAIN_ID} --genesis-validator {GENESIS_VALIDATOR} --pre-genesis-path {PRE_GENESIS_PATH} --dont-prefetch-wasm") +system(f"NAMADA_NETWORK_CONFIGS_DIR='{temp_dir}' {namadac_bin} --base-dir={BASE_DIR} utils join-network --chain-id {CHAIN_ID} --genesis-validator {GENESIS_VALIDATOR} --pre-genesis-path {PRE_GENESIS_PATH} --dont-prefetch-wasm") shutil.rmtree(BASE_DIR + '/' + CHAIN_ID + '/wasm/') shutil.move(temp_dir + CHAIN_ID + '/wasm/', BASE_DIR + '/' + CHAIN_ID + '/wasm/') From 17c7d68910e89e85787256ed6aba3a3d3cd7563a Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 30 Nov 2023 09:59:23 +0000 Subject: [PATCH 127/175] Rename sign genesis txs subcmd --- apps/src/lib/cli.rs | 20 ++++++++++---------- apps/src/lib/cli/client.rs | 2 +- apps/src/lib/client/utils.rs | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index b74bb5c496..ffc5e9e420 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2186,7 +2186,7 @@ pub mod cmds { DefaultBaseDir(DefaultBaseDir), EpochSleep(EpochSleep), ValidateGenesisTemplates(ValidateGenesisTemplates), - SignGenesisTx(SignGenesisTx), + SignGenesisTxs(SignGenesisTxs), } impl SubCmd for Utils { @@ -2215,7 +2215,7 @@ pub mod cmds { let validate_genesis_templates = SubCmd::parse(matches).map(Self::ValidateGenesisTemplates); let genesis_tx = - SubCmd::parse(matches).map(Self::SignGenesisTx); + SubCmd::parse(matches).map(Self::SignGenesisTxs); join_network .or(fetch_wasms) .or(validate_wasm) @@ -2245,7 +2245,7 @@ pub mod cmds { .subcommand(DefaultBaseDir::def()) .subcommand(EpochSleep::def()) .subcommand(ValidateGenesisTemplates::def()) - .subcommand(SignGenesisTx::def()) + .subcommand(SignGenesisTxs::def()) .subcommand_required(true) .arg_required_else_help(true) } @@ -2416,21 +2416,21 @@ pub mod cmds { } #[derive(Clone, Debug)] - pub struct SignGenesisTx(pub args::SignGenesisTx); + pub struct SignGenesisTxs(pub args::SignGenesisTxs); - impl SubCmd for SignGenesisTx { - const CMD: &'static str = "sign-genesis-tx"; + impl SubCmd for SignGenesisTxs { + const CMD: &'static str = "sign-genesis-txs"; fn parse(matches: &ArgMatches) -> Option { matches .subcommand_matches(Self::CMD) - .map(|matches| Self(args::SignGenesisTx::parse(matches))) + .map(|matches| Self(args::SignGenesisTxs::parse(matches))) } fn def() -> App { App::new(Self::CMD) .about("Sign genesis transaction(s).") - .add_args::() + .add_args::() } } @@ -6939,14 +6939,14 @@ pub mod args { } #[derive(Clone, Debug)] - pub struct SignGenesisTx { + pub struct SignGenesisTxs { pub path: PathBuf, pub output: Option, pub validator_alias: Option, pub use_device: bool, } - impl Args for SignGenesisTx { + impl Args for SignGenesisTxs { fn parse(matches: &ArgMatches) -> Self { let path = PATH.parse(matches); let output = OUTPUT.parse(matches); diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 10679bfa3e..7acaf70e3d 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -663,7 +663,7 @@ impl CliApi { Utils::ValidateGenesisTemplates(ValidateGenesisTemplates( args, )) => utils::validate_genesis_templates(global_args, args), - Utils::SignGenesisTx(SignGenesisTx(args)) => { + Utils::SignGenesisTxs(SignGenesisTxs(args)) => { utils::sign_genesis_tx(global_args, args).await } }, diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index afb6dfef20..2015d91aeb 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -964,12 +964,12 @@ pub fn validate_genesis_templates( /// Sign genesis transactions. pub async fn sign_genesis_tx( global_args: args::Global, - args::SignGenesisTx { + args::SignGenesisTxs { path, output, validator_alias, use_device, - }: args::SignGenesisTx, + }: args::SignGenesisTxs, ) { let (mut wallet, _wallet_file) = load_pre_genesis_wallet_or_exit(&global_args.base_dir); From b679cf0732b304752602f377d477b32f97861a48 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 30 Nov 2023 10:29:35 +0000 Subject: [PATCH 128/175] Fix setup process on e2e tests --- tests/src/e2e/setup.rs | 160 +++++++++++++++++++++++++++-------------- 1 file changed, 106 insertions(+), 54 deletions(-) diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index 7852218ba8..3d8d21e823 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -23,10 +23,9 @@ use namada_apps::client::utils::{ self, validator_pre_genesis_dir, validator_pre_genesis_txs_file, }; use namada_apps::config::genesis::utils::read_toml; -use namada_apps::config::genesis::{templates, GenesisAddress}; +use namada_apps::config::genesis::{templates, transactions, GenesisAddress}; use namada_apps::config::{ethereum_bridge, genesis, Config}; use namada_apps::{config, wallet}; -use namada_core::types::address::Address; use namada_core::types::key::{RefTo, SchemeType}; use namada_core::types::string_encoding::StringEncoded; use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; @@ -145,10 +144,23 @@ where // - add txs to genesis templates let wallet_path = base_dir.join("pre-genesis"); for val in 0..num { + // init validator dir + let validator_alias = format!("validator-{val}"); + let pre_genesis_path = + validator_pre_genesis_dir(base_dir, &validator_alias); + let pre_genesis_tx_path = + validator_pre_genesis_txs_file(&pre_genesis_path); + std::fs::create_dir(&pre_genesis_path).unwrap_or_else(|err| { + panic!( + "Failed to create the pre-genesis path for {validator_alias}: \ + {err}" + ); + }); + let pre_genesis_tx_path_str = pre_genesis_tx_path.to_string_lossy(); // generate a balance key let mut wallet = wallet::load(&wallet_path) .expect("Could not locate pre-genesis wallet used for e2e tests."); - let alias = format!("validator-{}-balance-key", val); + let alias = format!("validator-{val}-balance-key"); let (alias, sk) = wallet .gen_store_secret_key( SchemeType::Ed25519, @@ -161,35 +173,81 @@ where panic!("Could not generate new key for validator-{}", val) }); wallet::save(&wallet).unwrap(); - // assign balance to the key - genesis + let validator_address = { + use namada_apps::config::genesis::chain::DeriveEstablishedAddress; + let pre_genesis_tx = transactions::EstablishedAccountTx { + vp: "vp_user".to_string(), + threshold: 1, + public_keys: vec![StringEncoded::new(sk.ref_to())], + }; + let address = pre_genesis_tx.derive_established_address(); + println!( + "Initializing validator {validator_alias} with address \ + {address}" + ); + address + }; + // invoke `init-genesis-established-account` to generate a new + // established account with the generated balance key + let args = vec![ + "utils", + "init-genesis-established-account", + "--alias", + &alias, + "--path", + &pre_genesis_tx_path_str, + ]; + let mut init_established_account = run_cmd( + Bin::Client, + args, + Some(5), + &working_dir(), + base_dir, + format!("{}:{}", std::file!(), std::line!()), + ) + .unwrap(); + init_established_account.assert_success(); + // assign balance to the implicit addr (i.e. pubkey) + established acc + let nam_balances = genesis .balances .token .get_mut(&Alias::from_str("nam").expect("Infallible")) - .expect("NAM balances should exist in pre-genesis wallet already") - .0 - .insert( - GenesisAddress::PublicKey(StringEncoded::new(sk.ref_to())), - token::DenominatedAmount { - amount: token::Amount::from_uint( - 3000000, - NATIVE_MAX_DECIMAL_PLACES, - ) - .unwrap(), - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }, - ); - // invoke `init-genesis-validator` signed by balance key to generate - // validator pre-genesis wallet signed genesis txs - let validator_alias = format!("validator-{}", val); + .expect("NAM balances should exist in pre-genesis wallet already"); + nam_balances.0.insert( + GenesisAddress::PublicKey(StringEncoded::new(sk.ref_to())), + token::DenominatedAmount { + amount: token::Amount::from_uint( + 1000000, + NATIVE_MAX_DECIMAL_PLACES, + ) + .unwrap(), + denom: NATIVE_MAX_DECIMAL_PLACES.into(), + }, + ); + nam_balances.0.insert( + GenesisAddress::EstablishedAddress(validator_address.clone()), + token::DenominatedAmount { + amount: token::Amount::from_uint( + 2000000, + NATIVE_MAX_DECIMAL_PLACES, + ) + .unwrap(), + denom: NATIVE_MAX_DECIMAL_PLACES.into(), + }, + ); + // invoke `init-genesis-validator` to promote the generated established + // account to a validator account let net_addr = format!("127.0.0.1:{}", 27656 + port_offset(val)); + let validator_address_str = validator_address.to_string(); let args = vec![ "utils", "init-genesis-validator", - "--source", - &alias, "--alias", &validator_alias, + "--address", + &validator_address_str, + "--path", + &pre_genesis_tx_path_str, "--net-address", &net_addr, "--commission-rate", @@ -198,14 +256,10 @@ where "0.01", "--email", "null@null.net", - "--transfer-from-source-amount", - "2000000", "--self-bond-amount", "100000", "--unsafe-dont-encrypt", ]; - let validator_alias = format!("validator-{}", val); - // initialize the validator let mut init_genesis_validator = run_cmd( Bin::Client, args, @@ -216,11 +270,30 @@ where ) .unwrap(); init_genesis_validator.assert_success(); + // invoke `sign-genesis-txs` to sign the validator txs with + // the generated balance key + let args = vec![ + "utils", + "sign-genesis-txs", + "--alias", + &validator_alias, + "--path", + &pre_genesis_tx_path_str, + "--output", + &pre_genesis_tx_path_str, + ]; + let mut sign_pre_genesis_txs = run_cmd( + Bin::Client, + args, + Some(5), + &working_dir(), + base_dir, + format!("{}:{}", std::file!(), std::line!()), + ) + .unwrap(); + sign_pre_genesis_txs.assert_success(); + // initialize the validator // add generated txs to genesis - let pre_genesis_path = - validator_pre_genesis_dir(base_dir, &validator_alias); - let pre_genesis_tx_path = - validator_pre_genesis_txs_file(&pre_genesis_path); let pre_genesis_txs = read_toml(&pre_genesis_tx_path, "transactions.toml").unwrap(); genesis.transactions.merge(pre_genesis_txs); @@ -243,26 +316,6 @@ where genesis } -/// Remove self-bonds from default templates. They will be -/// regenerated later. -fn remove_self_bonds(genesis: &mut templates::All) { - let bonds = genesis.transactions.bond.take().unwrap(); - genesis.transactions.bond = Some( - bonds - .into_iter() - .filter(|bond| { - if let genesis::GenesisAddress::EstablishedAddress(address) = - &bond.data.source - { - Address::Established(address.clone()) != bond.data.validator - } else { - true - } - }) - .collect(), - ); -} - /// Setup a network with a single genesis validator node. pub fn single_node_net() -> Result { network( @@ -302,10 +355,9 @@ pub fn network( templates_dir.to_string_lossy() ) }); - // clear existing validator txs from genesis + // clear existing validator txs and bonds from genesis templates.transactions.validator_account = None; - // remove self-bonds from genesis - remove_self_bonds(&mut templates); + templates.transactions.bond = None; // Update the templates as needed templates.parameters.parameters.vp_whitelist = From 0f34f9c92da1e4aa9d690a4afb86fc574efb1403 Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 30 Nov 2023 15:04:56 +0100 Subject: [PATCH 129/175] [fix]: fix e2e test --- tests/src/e2e/setup.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index 3d8d21e823..ce69f99b52 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -26,6 +26,7 @@ use namada_apps::config::genesis::utils::read_toml; use namada_apps::config::genesis::{templates, transactions, GenesisAddress}; use namada_apps::config::{ethereum_bridge, genesis, Config}; use namada_apps::{config, wallet}; +use namada_core::types::address::Address; use namada_core::types::key::{RefTo, SchemeType}; use namada_core::types::string_encoding::StringEncoded; use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; @@ -172,7 +173,6 @@ where .unwrap_or_else(|_| { panic!("Could not generate new key for validator-{}", val) }); - wallet::save(&wallet).unwrap(); let validator_address = { use namada_apps::config::genesis::chain::DeriveEstablishedAddress; let pre_genesis_tx = transactions::EstablishedAccountTx { @@ -187,6 +187,12 @@ where ); address }; + wallet.insert_address( + validator_alias.clone(), + Address::Established(validator_address.clone()), + true, + ); + wallet::save(&wallet).unwrap(); // invoke `init-genesis-established-account` to generate a new // established account with the generated balance key let args = vec![ From 8a0fd60f09d9a52a53ea2078f276d2c149b9cffc Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 1 Dec 2023 16:07:41 +0100 Subject: [PATCH 130/175] more e2e fixes --- tests/src/e2e/ledger_tests.rs | 244 ++++++---------------------------- tests/src/e2e/setup.rs | 1 + wasm/checksums.json | 49 ++++--- 3 files changed, 68 insertions(+), 226 deletions(-) diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 19784b2ddc..0ac79ce40d 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -654,7 +654,7 @@ fn ledger_txs_and_queries() -> Result<()> { } let christel = find_address(&test, CHRISTEL)?; // as setup in `genesis/e2e-tests-single-node.toml` - let christel_balance = token::Amount::native_whole(1000000); + let christel_balance = token::Amount::native_whole(2000000); let nam = find_address(&test, NAM)?; let storage_key = token::balance_key(&nam, &christel).to_string(); let query_args_and_expected_response = vec![ @@ -931,6 +931,8 @@ fn pos_bonds() -> Result<()> { }, None, )?; + allow_duplicate_ips(&test, &test.net.chain_id, &Who::Validator(0)); + allow_duplicate_ips(&test, &test.net.chain_id, &Who::Validator(1)); set_ethereum_bridge_mode( &test, &test.net.chain_id, @@ -946,26 +948,6 @@ fn pos_bonds() -> Result<()> { let validator_0_rpc = get_actor_rpc(&test, &Who::Validator(0)); - // put money in the validator account from its balance account so that it - // can self-bond - let tx_args = vec![ - "transfer", - "--source", - "validator-0-balance-key", - "--target", - "validator-0-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_0_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction applied with result:")?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); // 2. Submit a self-bond for the first genesis validator let tx_args = vec![ @@ -975,7 +957,7 @@ fn pos_bonds() -> Result<()> { "--amount", "10000.0", "--signing-keys", - "validator-0-validator-key", + "validator-0-balance-key", "--node", &validator_0_rpc, ]; @@ -1033,7 +1015,7 @@ fn pos_bonds() -> Result<()> { "--amount", "5100.0", "--signing-keys", - "validator-0-validator-key", + "validator-0-balance-key", "--node", &validator_0_rpc, ]; @@ -1112,7 +1094,7 @@ fn pos_bonds() -> Result<()> { "--validator", "validator-0", "--signing-keys", - "validator-0-validator-key", + "validator-0-balance-key", "--node", &validator_0_rpc, ]; @@ -1197,26 +1179,6 @@ fn pos_rewards() -> Result<()> { let validator_0_rpc = get_actor_rpc(&test, &Who::Validator(0)); - // Put money in the validator account from its balance account so that it - // can pay gas fees - let tx_args = vec![ - "transfer", - "--source", - "validator-0-balance-key", - "--target", - "validator-0-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_0_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - // Wait some epochs let epoch = get_epoch(&test, &validator_0_rpc)?; let wait_epoch = epoch + 4_u64; @@ -1256,7 +1218,7 @@ fn pos_rewards() -> Result<()> { "--validator", "validator-0", "--signing-keys", - "validator-0-validator-key", + "validator-0-balance-key", "--node", &validator_0_rpc, ]; @@ -1467,27 +1429,33 @@ All unbonds total withdrawable: 412.000000\r", #[test] fn pos_init_validator() -> Result<()> { let pipeline_len = 1; - let validator_stake = token::Amount::native_whole(20000_u64); + let validator_stake = token::Amount::native_whole(100000_u64); let test = setup::network( |mut genesis, base_dir: &_| { + + genesis.parameters.parameters.min_num_of_blocks = 4; + genesis.parameters.parameters.epochs_per_year = 31_536_000; + genesis.parameters.parameters.max_expected_time_per_block = 1; + genesis.parameters.pos_params.pipeline_len = pipeline_len; + genesis.parameters.pos_params.unbonding_len = 2; + let genesis = setup::set_validators(1, genesis, base_dir, default_port_offset); + println!("{:?}", genesis.transactions.bond); let stake = genesis .transactions .bond .as_ref() .unwrap() .iter() - .filter_map(|bond| { - (bond.data.validator.to_string() == *"validator-0").then( - || { - bond.data - .amount - .increase_precision( - NATIVE_MAX_DECIMAL_PLACES.into(), - ) - .unwrap() - .amount - }, - ) + .map(|bond| { + bond.data + .amount + .increase_precision( + NATIVE_MAX_DECIMAL_PLACES.into(), + ) + .unwrap() + .amount + + }) .sum::(); assert_eq!( @@ -1495,12 +1463,7 @@ fn pos_init_validator() -> Result<()> { "Assuming this stake, we give the same amount to the new \ validator to have half of voting power", ); - genesis.parameters.parameters.min_num_of_blocks = 4; - genesis.parameters.parameters.epochs_per_year = 31_536_000; - genesis.parameters.parameters.max_expected_time_per_block = 1; - genesis.parameters.pos_params.pipeline_len = pipeline_len; - genesis.parameters.pos_params.unbonding_len = 2; - setup::set_validators(1, genesis, base_dir, default_port_offset) + genesis }, None, )?; @@ -1800,26 +1763,6 @@ fn proposal_submission() -> Result<()> { let validator_0_rpc = get_actor_rpc(&test, &Who::Validator(0)); - // put money in the validator account from its balance account so that it - // can pay gas fees - let tx_args = vec![ - "transfer", - "--source", - "validator-0-balance-key", - "--target", - "validator-0-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_0_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - // 1.1 Delegate some token let tx_args = vec![ "bond", @@ -1890,7 +1833,7 @@ fn proposal_submission() -> Result<()> { ]; let mut client = run!(test, Bin::Client, query_balance_args, Some(40))?; - client.exp_string("nam: 979500")?; + client.exp_string("nam: 1999500")?; client.assert_success(); // 5. Query token balance governance @@ -1957,7 +1900,7 @@ fn proposal_submission() -> Result<()> { ]; let mut client = run!(test, Bin::Client, query_balance_args, Some(40))?; - client.exp_string("nam: 979500")?; + client.exp_string("nam: 1999500")?; client.assert_success(); // 9. Send a yay vote from a validator @@ -2043,7 +1986,7 @@ fn proposal_submission() -> Result<()> { let mut client = run!(test, Bin::Client, query_proposal, Some(15))?; client.exp_string("Proposal Id: 0")?; client.exp_string( - "passed with 120000.000000 yay votes and 900.000000 nay votes (0.%)", + "passed with 100000.000000 yay votes and 900.000000 nay votes (0.%)", )?; client.assert_success(); @@ -2065,7 +2008,7 @@ fn proposal_submission() -> Result<()> { ]; let mut client = run!(test, Bin::Client, query_balance_args, Some(30))?; - client.exp_string("nam: 980000")?; + client.exp_string("nam: 200000")?; client.assert_success(); // 13. Check if governance funds are 0 @@ -2145,26 +2088,6 @@ fn pgf_governance_proposal() -> Result<()> { let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); - // put money in the validator account from its balance account so that it - // can pay gas fees - let tx_args = vec![ - "transfer", - "--source", - "validator-0-balance-key", - "--target", - "validator-0-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_one_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - // Delegate some token let tx_args = vec![ "bond", @@ -2231,7 +2154,7 @@ fn pgf_governance_proposal() -> Result<()> { ]; client = run!(test, Bin::Client, query_balance_args, Some(40))?; - client.exp_string("nam: 979500")?; + client.exp_string("nam: 1999500")?; client.assert_success(); // Query token balance governance @@ -2336,7 +2259,7 @@ fn pgf_governance_proposal() -> Result<()> { ]; client = run!(test, Bin::Client, query_balance_args, Some(30))?; - client.exp_string("nam: 980000")?; + client.exp_string("nam: 2000000")?; client.assert_success(); // Check if governance funds are 0 @@ -2583,7 +2506,7 @@ fn proposal_offline() -> Result<()> { let mut client = run!(test, Bin::Client, tally_offline, Some(15))?; client.exp_string("Parsed 1 votes")?; - client.exp_string("rejected with 20900.000000 yay votes")?; + client.exp_string("rejected with 900.000000 yay votes")?; client.assert_success(); Ok(()) @@ -3183,7 +3106,8 @@ fn deactivate_and_reactivate_validator() -> Result<()> { }, None, )?; - + allow_duplicate_ips(&test, &test.net.chain_id, &Who::Validator(0)); + allow_duplicate_ips(&test, &test.net.chain_id, &Who::Validator(1)); set_ethereum_bridge_mode( &test, &test.net.chain_id, @@ -3203,27 +3127,6 @@ fn deactivate_and_reactivate_validator() -> Result<()> { let validator_1_rpc = get_actor_rpc(&test, &Who::Validator(1)); - // put money in the validator-1 account from its balance account so that it - // can deactivate and reactivate - let tx_args = vec![ - "transfer", - "--source", - "validator-1-balance-key", - "--target", - "validator-1-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_1_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(1), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction applied with result:")?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - // Check the state of validator-0 let tx_args = vec![ "validator-state", @@ -3242,7 +3145,7 @@ fn deactivate_and_reactivate_validator() -> Result<()> { "--validator", "validator-1", "--signing-keys", - "validator-1-validator-key", + "validator-1-balance-key", "--node", &validator_1_rpc, ]; @@ -3286,7 +3189,7 @@ fn deactivate_and_reactivate_validator() -> Result<()> { "--validator", "validator-1", "--signing-keys", - "validator-1-validator-key", + "validator-1-balance-key", "--node", &validator_1_rpc, ]; @@ -3347,26 +3250,6 @@ fn change_validator_metadata() -> Result<()> { let validator_0_rpc = get_actor_rpc(&test, &Who::Validator(0)); - // put money in the validator account from its balance account so that it - // can pay gas fees - let tx_args = vec![ - "transfer", - "--source", - "validator-0-balance-key", - "--target", - "validator-0-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_0_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - // 2. Query the validator metadata loaded from genesis let metadata_query_args = vec![ "validator-metadata", @@ -3507,47 +3390,6 @@ fn test_invalid_validator_txs() -> Result<()> { let validator_0_rpc = get_actor_rpc(&test, &Who::Validator(0)); let validator_1_rpc = get_actor_rpc(&test, &Who::Validator(1)); - // put money in the validator-1 account from its balance account so that it - // can deactivate and reactivate - let tx_args = vec![ - "transfer", - "--source", - "validator-1-balance-key", - "--target", - "validator-1-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_1_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(1), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction applied with result:")?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - - // put money in the validator-0 account from its balance account so that it - // can deactivate and reactivate - let tx_args = vec![ - "transfer", - "--source", - "validator-0-balance-key", - "--target", - "validator-0-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_0_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction applied with result:")?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); // Try to change validator-1 commission rate as validator-0 let tx_args = vec![ @@ -3557,7 +3399,7 @@ fn test_invalid_validator_txs() -> Result<()> { "--commission-rate", "0.06", "--signing-keys", - "validator-0-validator-key", + "validator-0-balance-key", "--node", &validator_0_rpc, ]; @@ -3573,7 +3415,7 @@ fn test_invalid_validator_txs() -> Result<()> { "--validator", "validator-1", "--signing-keys", - "validator-0-validator-key", + "validator-0-balance-key", "--node", &validator_0_rpc, ]; @@ -3591,7 +3433,7 @@ fn test_invalid_validator_txs() -> Result<()> { "--website", "theworstvalidator@namada.net", "--signing-keys", - "validator-0-validator-key", + "validator-0-balance-key", "--node", &validator_0_rpc, ]; @@ -3607,7 +3449,7 @@ fn test_invalid_validator_txs() -> Result<()> { "--validator", "validator-1", "--signing-keys", - "validator-1-validator-key", + "validator-1-balance-key", "--node", &validator_1_rpc, ]; @@ -3651,7 +3493,7 @@ fn test_invalid_validator_txs() -> Result<()> { "--validator", "validator-1", "--signing-keys", - "validator-0-validator-key", + "validator-0-balance-key", "--node", &validator_0_rpc, ]; diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index ce69f99b52..4e471c1697 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -173,6 +173,7 @@ where .unwrap_or_else(|_| { panic!("Could not generate new key for validator-{}", val) }); + println!("alias: {}, pk: {}", alias, sk.ref_to()); let validator_address = { use namada_apps::config::genesis::chain::DeriveEstablishedAddress; let pre_genesis_tx = transactions::EstablishedAccountTx { diff --git a/wasm/checksums.json b/wasm/checksums.json index 8c94ff7a0d..e2eb7f0da5 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,27 +1,26 @@ { - "tx_bond.wasm": "tx_bond.a660b13a79bd5c50c75a055ab4fed8eddb1cc2ae6d93e5505fbeb876b307fc49.wasm", - "tx_bridge_pool.wasm": "tx_bridge_pool.9564137202b291bd8930410700a5b0e08a1949bb4f79da5ee3e3dc9654266f4d.wasm", - "tx_change_consensus_key.wasm": "tx_change_consensus_key.4d2de1a762b4575925222fdeacadada429896a93fe3586f41657f247480161d9.wasm", - "tx_change_validator_commission.wasm": "tx_change_validator_commission.457abeb00c021822e54674b77ae97535620555707efd2029e52b0d4335a32b55.wasm", - "tx_change_validator_metadata.wasm": "tx_change_validator_metadata.b56e2fbaefe19800d8a6d989883ab0ceac439bdeac96fb1299f6aa2ce424e521.wasm", - "tx_claim_rewards.wasm": "tx_claim_rewards.c4fc5d2ace6b0ee785f12f90a6cc600e3a0a8f19f7237ecf9374a32ba27eb99e.wasm", - "tx_deactivate_validator.wasm": "tx_deactivate_validator.c7cb406926241ffaa5df56e43c8cc43854bdcb0ea565144f63b6a3e2eb697a96.wasm", - "tx_ibc.wasm": "tx_ibc.14568fef2ec08752b87ec97cb2c87b76adec72e6eeea771274948d7c7ddb92a8.wasm", - "tx_init_account.wasm": "tx_init_account.0017279b252083d2d337d943bf84251d3f8223756ecfd9648e7ce66305c45796.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.cb9d7a33dd9a37675dd1d9cb761f3f87a48728eae38f377a623c0b8f9a97b612.wasm", - "tx_init_validator.wasm": "tx_init_validator.53fefa66ce6351d6b3e7de7a2c993bd4435fbd478b66caecf5c588b5efdcf669.wasm", - "tx_reactivate_validator.wasm": "tx_reactivate_validator.6a40f8daebdd6b9f6bcc9ab88686b40bb7a7882443cd07443c0795a3fae27cb5.wasm", - "tx_redelegate.wasm": "tx_redelegate.ded70e2609371fc9d81de875cf44b0ec60757fb46f61f23a26418cfa9f437b0f.wasm", - "tx_resign_steward.wasm": "tx_resign_steward.a881ed70174b53a15402cbbe6e64200f72431ec73604f7b173fd77ea80b5aedb.wasm", - "tx_reveal_pk.wasm": "tx_reveal_pk.fbe760707aa0559c898cee47c91a5c7d0bc4b2f545cb47cc459ddcb8f97c455e.wasm", - "tx_transfer.wasm": "tx_transfer.aef75ec63198e4e6f95307a55e53fd0440448caf46617047f7a7557a7a2f1f4e.wasm", - "tx_unbond.wasm": "tx_unbond.1fd257addac3d91d77e1ae334b9394085335075581a6500ce2364cd403d028e9.wasm", - "tx_unjail_validator.wasm": "tx_unjail_validator.ba0e378bb48d5ba577dd898e618478c917e80ee11e46f79b00bb72fea4f91c28.wasm", - "tx_update_account.wasm": "tx_update_account.aa4ef57619b8b7c7c3849fa71873448808f7342fcc8d612e4b5e688a708a174a.wasm", - "tx_update_steward_commission.wasm": "tx_update_steward_commission.e7bf45b9039a5b4ef399fe926a4b56e035e9a7eedc4fdd59fc89210b4a8bbf74.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.4b39fd9c6ccc8a9537a295d154a8b9e60b8d135fe995276a01d714bc8097be6a.wasm", - "tx_withdraw.wasm": "tx_withdraw.2f6bf8c3cafbd5d987849db1583bd63e10bbe06193f619859caa80ab10f2e2a9.wasm", - "vp_implicit.wasm": "vp_implicit.262b8660014cd140bcbbef2d187863160678cb0034903257815dc08d947b03fa.wasm", - "vp_user.wasm": "vp_user.d66a3a289c9c9e6353a2741335775eab1487e2e7ee4b8baa69d32e73083363d3.wasm", - "vp_validator.wasm": "vp_validator.d89911d9c27b2e0926499623cc88ee35c4396c8ef0563f897386ff431c8148e7.wasm" + "tx_become_validator.wasm": "tx_become_validator.5ccfc10950bd07526c194767d9936f76e3c99dcc96b651c5de5b768995834c52.wasm", + "tx_bond.wasm": "tx_bond.c128c53aa9493c5a77b28b765ff43010441179f4eb2b853464a9fcae02e0303d.wasm", + "tx_bridge_pool.wasm": "tx_bridge_pool.c306667f44c80140785766f9aa865459fc5bedb4324d669d83137f20fb91cd88.wasm", + "tx_change_consensus_key.wasm": "tx_change_consensus_key.e1e10b5413f53cd0487da50b62e3282b5b4f665e5e0a3c0d68a67aab02fafe71.wasm", + "tx_change_validator_commission.wasm": "tx_change_validator_commission.31dbd9f4b41e81d98a8254c90b74e589e7967ad5456ed86ea5c7b51081c68f9a.wasm", + "tx_change_validator_metadata.wasm": "tx_change_validator_metadata.62b37dd2737690da928c937c05a230c1b701d3f733cc5e9151e3915454e04396.wasm", + "tx_claim_rewards.wasm": "tx_claim_rewards.c9accdfb3a3df9d29bc35f0837f6cc21a60c8726a7bbe8a5d5b24fc1aa7d3049.wasm", + "tx_deactivate_validator.wasm": "tx_deactivate_validator.42cf7a81c059da39249e4913f2ec977fb01e9a23b13f518971c35fe4b06e4a88.wasm", + "tx_ibc.wasm": "tx_ibc.f95ae760d4c7a50a871b18f5ac1d32380ed2d02ccad6aa9856206bb007c9809b.wasm", + "tx_init_account.wasm": "tx_init_account.c452631ce986ae06f98bec86c69df7da1e1dad56cd569aabf3f77c577f227bc1.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.32de55454c0464e4854b63240221122168db17b876f4e8233445529df8b89e85.wasm", + "tx_reactivate_validator.wasm": "tx_reactivate_validator.a1fb89fc5315ec014a327eabccd9b9b09b44fe0133e23b448b6552c0979014c2.wasm", + "tx_redelegate.wasm": "tx_redelegate.6837eaa55ac88c97f0e10b1452938531a23e1db5d07f1a7b3626440d57e571c8.wasm", + "tx_resign_steward.wasm": "tx_resign_steward.a8267ce47823d7abdebd934d871457217c43c72f5e5bf8182874759b80686b79.wasm", + "tx_reveal_pk.wasm": "tx_reveal_pk.515cf3de9063a47f651af4169ad218a4e17f7e230981eb58b28205ce6d30df76.wasm", + "tx_transfer.wasm": "tx_transfer.a71d9bb1c96b881602de6f680eb932c5ecb58ec316513b285141f06311c8098e.wasm", + "tx_unbond.wasm": "tx_unbond.2adac65b3f74dee53621de09a3abbfbc1f503de15b51953f09654bd467f7a7b4.wasm", + "tx_unjail_validator.wasm": "tx_unjail_validator.ef5c2a214ae47bfe4f135e320422a766d36a96e79026375ad74b06277f12580c.wasm", + "tx_update_account.wasm": "tx_update_account.92ef1c5fa7a242bf1b4e96a0da58a0580c6417930bd24de53652a20803a7871b.wasm", + "tx_update_steward_commission.wasm": "tx_update_steward_commission.96d394e9a7edf19dfb290ea0433245462e897db970886c5586d98167a7bf412d.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.6f5810560da53f5096ca5528500e97f9b18a9ab73f15f082ccf73f175c21feb4.wasm", + "tx_withdraw.wasm": "tx_withdraw.17aab3a6f3606d059118946447820d8e3cc1e65fa07234e334ea4b06f6a97da9.wasm", + "vp_implicit.wasm": "vp_implicit.5f24ee9c926050052f84a7194b2c6eb4f28a18c0ac173c89a6e701c093361fb1.wasm", + "vp_user.wasm": "vp_user.0f21d9e233e4fbacebd9c842314ab62add96182af1a517b4a323f61b4b322c80.wasm" } \ No newline at end of file From b8a26606a7c71815b5d10cf638f83cf750306368 Mon Sep 17 00:00:00 2001 From: satan Date: Fri, 1 Dec 2023 17:19:24 +0100 Subject: [PATCH 131/175] [fix] Wallet can generated keys without genesis files --- apps/src/lib/cli/context.rs | 2 +- apps/src/lib/cli/wallet.rs | 2 +- sdk/src/wallet/mod.rs | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 51c8ba4eac..34dd187245 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -92,7 +92,7 @@ impl Context { pub fn new(global_args: args::Global) -> Result { let global_config = read_or_try_new_global_config(&global_args); - let chain = match global_config.default_chain_id.as_ref() { + let chain = match global_args.chain_id.as_ref() { Some(default_chain_id) => { tracing::info!("Default chain ID: {default_chain_id}"); let mut config = diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index 4d22365f80..c5c76eca59 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -510,7 +510,7 @@ fn key_and_address_gen( }); let mut rng = OsRng; let (_mnemonic, seed) = Wallet::::gen_hd_seed( - None, &mut rng, + None, &mut rng, unsafe_dont_encrypt, ) .unwrap_or_else(|err| { edisplay_line!(io, "{}", err); diff --git a/sdk/src/wallet/mod.rs b/sdk/src/wallet/mod.rs index 28b25c1076..9a112485f6 100644 --- a/sdk/src/wallet/mod.rs +++ b/sdk/src/wallet/mod.rs @@ -587,6 +587,7 @@ impl Wallet { pub fn gen_hd_seed( passphrase: Option>, rng: &mut U::Rng, + unsafe_dont_encrypt: bool ) -> Result<(Mnemonic, Seed), GenRestoreKeyError> { const MNEMONIC_TYPE: MnemonicType = MnemonicType::Words24; let mnemonic = U::generate_mnemonic_code(MNEMONIC_TYPE, rng)?; @@ -596,8 +597,11 @@ impl Wallet { ); println!("{}", mnemonic.clone().into_phrase()); - let passphrase = - passphrase.unwrap_or_else(|| U::read_mnemonic_passphrase(true)); + let passphrase = if unsafe_dont_encrypt { + Zeroizing::new(String::new()) + } else { + passphrase.unwrap_or_else(|| U::read_mnemonic_passphrase(true)) + }; let seed = Seed::new(&mnemonic, &passphrase); Ok((mnemonic, seed)) } From e66fc31409f3d14fa0f3e9cba5e1532cf43a626e Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 4 Dec 2023 12:21:41 +0100 Subject: [PATCH 132/175] Fixed stupid epoch sleep and now pass chain-id to post-genesis ledger commands --- apps/src/lib/cli/client.rs | 6 +----- apps/src/lib/cli/context.rs | 12 +++++------ apps/src/lib/cli/wallet.rs | 4 +++- apps/src/lib/client/rpc.rs | 20 +++++++++++++++++- sdk/src/wallet/mod.rs | 2 +- tests/src/e2e/ledger_tests.rs | 40 +++++++++++++++++++---------------- 6 files changed, 51 insertions(+), 33 deletions(-) diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 7acaf70e3d..09b636af3b 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -650,15 +650,11 @@ impl CliApi { utils::default_base_dir(global_args, args) } Utils::EpochSleep(EpochSleep(args)) => { - let mut ctx = cli::Context::new::(global_args) - .expect("expected to construct a context"); let mut ledger_address = args.ledger_address.clone(); let client = C::from_tendermint_address(&mut ledger_address); client.wait_until_node_is_synced(io).await?; - let args = args.to_sdk(&mut ctx); - let namada = ctx.to_sdk(&client, io); - rpc::epoch_sleep(&namada, args).await; + rpc::epoch_sleep_ctxless(&client, io).await; } Utils::ValidateGenesisTemplates(ValidateGenesisTemplates( args, diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 34dd187245..8f78e87f09 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -93,12 +93,10 @@ impl Context { let global_config = read_or_try_new_global_config(&global_args); let chain = match global_args.chain_id.as_ref() { - Some(default_chain_id) => { - tracing::info!("Default chain ID: {default_chain_id}"); + Some(chain_id) => { let mut config = - Config::load(&global_args.base_dir, default_chain_id, None); - let chain_dir = - global_args.base_dir.join(default_chain_id.as_str()); + Config::load(&global_args.base_dir, chain_id, None); + let chain_dir = global_args.base_dir.join(chain_id.as_str()); let genesis = genesis::chain::Finalized::read_toml_files(&chain_dir) .expect("Missing genesis files"); @@ -187,8 +185,8 @@ impl Context { fn safe_exit_on_missing_chain_context() -> ! { eprintln!( - "No chain is configured. You may need to run `namada client utils \ - join-network` command." + "No chain-id was provided. If no chain is configured, you may need to \ + run `namada client utils join-network` command." ); utils::safe_exit(1) } diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index c5c76eca59..e8262ccfbf 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -510,7 +510,9 @@ fn key_and_address_gen( }); let mut rng = OsRng; let (_mnemonic, seed) = Wallet::::gen_hd_seed( - None, &mut rng, unsafe_dont_encrypt, + None, + &mut rng, + unsafe_dont_encrypt, ) .unwrap_or_else(|err| { edisplay_line!(io, "{}", err); diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 788e54a80b..7bb1860acc 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -54,7 +54,7 @@ use namada_sdk::rpc::{ self, enriched_bonds_and_unbonds, query_epoch, TxResponse, }; use namada_sdk::wallet::AddressVpType; -use namada_sdk::{display, display_line, edisplay_line, error, prompt, Namada}; +use namada_sdk::{display, display_line, edisplay_line, error, prompt, Namada, queries}; use tokio::time::Instant; use crate::cli::{self, args}; @@ -75,6 +75,12 @@ pub async fn query_tx_status<'a>( .unwrap() } +/// Query and print the epoch of the last committed block +pub async fn query_and_print_epoch_ctxless<'a, T: 'a + Io>(client: &(impl 'a + queries::Client + Sync), io: &T) -> Epoch { + let epoch = rpc::query_epoch(client).await.unwrap(); + display_line!(io, "Last committed epoch: {}", epoch); + epoch +} /// Query and print the epoch of the last committed block pub async fn query_and_print_epoch<'a>(context: &impl Namada<'a>) -> Epoch { let epoch = rpc::query_epoch(context.client()).await.unwrap(); @@ -2537,6 +2543,18 @@ pub async fn query_result<'a>( } } +pub async fn epoch_sleep_ctxless<'a, T: 'a + Io>(client: &(impl 'a + queries::Client + Sync), io: &T) { + let start_epoch = query_and_print_epoch_ctxless(client, io).await; + loop { + tokio::time::sleep(core::time::Duration::from_secs(1)).await; + let current_epoch = query_epoch(client).await.unwrap(); + if current_epoch > start_epoch { + display_line!(io, "Reached epoch {}", current_epoch); + break; + } + } +} + pub async fn epoch_sleep<'a>(context: &impl Namada<'a>, _args: args::Query) { let start_epoch = query_and_print_epoch(context).await; loop { diff --git a/sdk/src/wallet/mod.rs b/sdk/src/wallet/mod.rs index 9a112485f6..86a0e892d8 100644 --- a/sdk/src/wallet/mod.rs +++ b/sdk/src/wallet/mod.rs @@ -587,7 +587,7 @@ impl Wallet { pub fn gen_hd_seed( passphrase: Option>, rng: &mut U::Rng, - unsafe_dont_encrypt: bool + unsafe_dont_encrypt: bool, ) -> Result<(Mnemonic, Seed), GenRestoreKeyError> { const MNEMONIC_TYPE: MnemonicType = MnemonicType::Words24; let mnemonic = U::generate_mnemonic_code(MNEMONIC_TYPE, rng)?; diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 0ac79ce40d..41d76c30e0 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -60,8 +60,14 @@ fn start_namada_ledger_node( Some(idx) => Who::Validator(idx), _ => Who::NonValidator, }; - let mut node = - run_as!(test, who.clone(), Bin::Node, &["ledger"], timeout_sec)?; + let chain_id = test.net.chain_id.to_string(); + let mut node = run_as!( + test, + who.clone(), + Bin::Node, + &["--chain-id", &chain_id, "ledger"], + timeout_sec + )?; node.exp_string("Namada ledger node started")?; if let Who::Validator(_) = who { node.exp_string("This node is a validator")?; @@ -95,8 +101,11 @@ fn run_ledger() -> Result<()> { ethereum_bridge::ledger::Mode::Off, None, ); - - let cmd_combinations = vec![vec!["ledger"], vec!["ledger", "run"]]; + let chain_id = test.net.chain_id.to_string(); + let cmd_combinations = vec![ + vec!["--chain-id", &chain_id, "ledger"], + vec!["--chain-id", &chain_id, "ledger", "run"], + ]; // Start the ledger as a validator for args in &cmd_combinations { @@ -283,10 +292,7 @@ fn run_ledger_load_state_and_reset() -> Result<()> { ); // 1. Run the ledger node - let mut ledger = start_namada_ledger_node(&test, Some(0), Some(40))?; - - // There should be no previous state - ledger.exp_string("No state could be found")?; + let mut ledger = start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))?; // Wait to commit a block ledger.exp_regex(r"Committed block hash.*, height: [0-9]+")?; let bg_ledger = ledger.background(); @@ -320,7 +326,7 @@ fn run_ledger_load_state_and_reset() -> Result<()> { test, Who::Validator(0), Bin::Node, - &["ledger", "reset"], + &["--chain-id", &test.net.chain_id.to_string(),"ledger", "reset"], Some(10), )?; session.exp_eof()?; @@ -948,7 +954,6 @@ fn pos_bonds() -> Result<()> { let validator_0_rpc = get_actor_rpc(&test, &Who::Validator(0)); - // 2. Submit a self-bond for the first genesis validator let tx_args = vec![ "bond", @@ -1432,13 +1437,17 @@ fn pos_init_validator() -> Result<()> { let validator_stake = token::Amount::native_whole(100000_u64); let test = setup::network( |mut genesis, base_dir: &_| { - genesis.parameters.parameters.min_num_of_blocks = 4; genesis.parameters.parameters.epochs_per_year = 31_536_000; genesis.parameters.parameters.max_expected_time_per_block = 1; genesis.parameters.pos_params.pipeline_len = pipeline_len; genesis.parameters.pos_params.unbonding_len = 2; - let genesis = setup::set_validators(1, genesis, base_dir, default_port_offset); + let genesis = setup::set_validators( + 1, + genesis, + base_dir, + default_port_offset, + ); println!("{:?}", genesis.transactions.bond); let stake = genesis .transactions @@ -1449,13 +1458,9 @@ fn pos_init_validator() -> Result<()> { .map(|bond| { bond.data .amount - .increase_precision( - NATIVE_MAX_DECIMAL_PLACES.into(), - ) + .increase_precision(NATIVE_MAX_DECIMAL_PLACES.into()) .unwrap() .amount - - }) .sum::(); assert_eq!( @@ -3390,7 +3395,6 @@ fn test_invalid_validator_txs() -> Result<()> { let validator_0_rpc = get_actor_rpc(&test, &Who::Validator(0)); let validator_1_rpc = get_actor_rpc(&test, &Who::Validator(1)); - // Try to change validator-1 commission rate as validator-0 let tx_args = vec![ "change-commission-rate", From 55ec4839bace8b6562649bc1c92b865d5ffb0371 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 4 Dec 2023 13:54:38 +0000 Subject: [PATCH 133/175] Allow the chain id to be configured through an env var --- apps/src/lib/cli/client.rs | 6 +++++- apps/src/lib/cli/context.rs | 16 ++++++++++++++-- apps/src/lib/client/rpc.rs | 20 +------------------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 09b636af3b..7acaf70e3d 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -650,11 +650,15 @@ impl CliApi { utils::default_base_dir(global_args, args) } Utils::EpochSleep(EpochSleep(args)) => { + let mut ctx = cli::Context::new::(global_args) + .expect("expected to construct a context"); let mut ledger_address = args.ledger_address.clone(); let client = C::from_tendermint_address(&mut ledger_address); client.wait_until_node_is_synced(io).await?; - rpc::epoch_sleep_ctxless(&client, io).await; + let args = args.to_sdk(&mut ctx); + let namada = ctx.to_sdk(&client, io); + rpc::epoch_sleep(&namada, args).await; } Utils::ValidateGenesisTemplates(ValidateGenesisTemplates( args, diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 8f78e87f09..af26ae1bdf 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -6,6 +6,7 @@ use std::path::{Path, PathBuf}; use std::str::FromStr; use color_eyre::eyre::Result; +use namada::core::types::chain::ChainId; use namada::ledger::ibc::storage::ibc_token; use namada::types::address::{Address, InternalAddress}; use namada::types::ethereum_events::EthAddress; @@ -28,6 +29,9 @@ use crate::{wallet, wasm_loader}; /// Env. var to set wasm directory pub const ENV_VAR_WASM_DIR: &str = "NAMADA_WASM_DIR"; +/// Env. var to read the Namada chain id from +pub const ENV_VAR_CHAIN_ID: &str = "NAMADA_CHAIN_ID"; + /// A raw address (bech32m encoding) or an alias of an address that may be found /// in the wallet pub type WalletAddress = FromContext
          ; @@ -92,7 +96,13 @@ impl Context { pub fn new(global_args: args::Global) -> Result { let global_config = read_or_try_new_global_config(&global_args); - let chain = match global_args.chain_id.as_ref() { + let chain_id = std::env::var(ENV_VAR_CHAIN_ID) + .ok() + .and_then(|chain_id| ChainId::from_str(&chain_id).ok()); + let chain_id = + chain_id.as_ref().or_else(|| global_args.chain_id.as_ref()); + + let chain = match chain_id { Some(chain_id) => { let mut config = Config::load(&global_args.base_dir, chain_id, None); @@ -186,7 +196,9 @@ impl Context { fn safe_exit_on_missing_chain_context() -> ! { eprintln!( "No chain-id was provided. If no chain is configured, you may need to \ - run `namada client utils join-network` command." + run `namada client utils join-network` command. If the chain is \ + configured, set the chain id with `--chain-id ` or + via the env var `{ENV_VAR_CHAIN_ID}`." ); utils::safe_exit(1) } diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index 7bb1860acc..788e54a80b 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -54,7 +54,7 @@ use namada_sdk::rpc::{ self, enriched_bonds_and_unbonds, query_epoch, TxResponse, }; use namada_sdk::wallet::AddressVpType; -use namada_sdk::{display, display_line, edisplay_line, error, prompt, Namada, queries}; +use namada_sdk::{display, display_line, edisplay_line, error, prompt, Namada}; use tokio::time::Instant; use crate::cli::{self, args}; @@ -75,12 +75,6 @@ pub async fn query_tx_status<'a>( .unwrap() } -/// Query and print the epoch of the last committed block -pub async fn query_and_print_epoch_ctxless<'a, T: 'a + Io>(client: &(impl 'a + queries::Client + Sync), io: &T) -> Epoch { - let epoch = rpc::query_epoch(client).await.unwrap(); - display_line!(io, "Last committed epoch: {}", epoch); - epoch -} /// Query and print the epoch of the last committed block pub async fn query_and_print_epoch<'a>(context: &impl Namada<'a>) -> Epoch { let epoch = rpc::query_epoch(context.client()).await.unwrap(); @@ -2543,18 +2537,6 @@ pub async fn query_result<'a>( } } -pub async fn epoch_sleep_ctxless<'a, T: 'a + Io>(client: &(impl 'a + queries::Client + Sync), io: &T) { - let start_epoch = query_and_print_epoch_ctxless(client, io).await; - loop { - tokio::time::sleep(core::time::Duration::from_secs(1)).await; - let current_epoch = query_epoch(client).await.unwrap(); - if current_epoch > start_epoch { - display_line!(io, "Reached epoch {}", current_epoch); - break; - } - } -} - pub async fn epoch_sleep<'a>(context: &impl Namada<'a>, _args: args::Query) { let start_epoch = query_and_print_epoch(context).await; loop { From f9cae1644f513d847de1edeefd8501485be50ce4 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 4 Dec 2023 13:54:54 +0000 Subject: [PATCH 134/175] Set chain id in e2e tests through env var --- tests/src/e2e/ledger_tests.rs | 24 +++++++++--------------- tests/src/e2e/setup.rs | 4 ++++ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 41d76c30e0..c2a6bc0e5c 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -60,14 +60,8 @@ fn start_namada_ledger_node( Some(idx) => Who::Validator(idx), _ => Who::NonValidator, }; - let chain_id = test.net.chain_id.to_string(); - let mut node = run_as!( - test, - who.clone(), - Bin::Node, - &["--chain-id", &chain_id, "ledger"], - timeout_sec - )?; + let mut node = + run_as!(test, who.clone(), Bin::Node, &["ledger"], timeout_sec)?; node.exp_string("Namada ledger node started")?; if let Who::Validator(_) = who { node.exp_string("This node is a validator")?; @@ -101,11 +95,8 @@ fn run_ledger() -> Result<()> { ethereum_bridge::ledger::Mode::Off, None, ); - let chain_id = test.net.chain_id.to_string(); - let cmd_combinations = vec![ - vec!["--chain-id", &chain_id, "ledger"], - vec!["--chain-id", &chain_id, "ledger", "run"], - ]; + + let cmd_combinations = vec![vec!["ledger"], vec!["ledger", "run"]]; // Start the ledger as a validator for args in &cmd_combinations { @@ -292,7 +283,10 @@ fn run_ledger_load_state_and_reset() -> Result<()> { ); // 1. Run the ledger node - let mut ledger = start_namada_ledger_node_wait_wasm(&test, Some(0), Some(40))?; + let mut ledger = start_namada_ledger_node(&test, Some(0), Some(40))?; + + // There should be no previous state + ledger.exp_string("No state could be found")?; // Wait to commit a block ledger.exp_regex(r"Committed block hash.*, height: [0-9]+")?; let bg_ledger = ledger.background(); @@ -326,7 +320,7 @@ fn run_ledger_load_state_and_reset() -> Result<()> { test, Who::Validator(0), Bin::Node, - &["--chain-id", &test.net.chain_id.to_string(),"ledger", "reset"], + &["ledger", "reset"], Some(10), )?; session.exp_eof()?; diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index 4e471c1697..af810670b2 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -19,6 +19,7 @@ use expectrl::{ControlCode, Eof, WaitStatus}; use eyre::eyre; use itertools::{Either, Itertools}; use namada::types::chain::ChainId; +use namada_apps::cli::context::ENV_VAR_CHAIN_ID; use namada_apps::client::utils::{ self, validator_pre_genesis_dir, validator_pre_genesis_txs_file, }; @@ -548,6 +549,9 @@ pub fn network( copy_wasm_to_chain_dir(&working_dir, test_dir.path(), &net.chain_id); + // Set the chain id + std::env::set_var(ENV_VAR_CHAIN_ID, net.chain_id.to_string()); + Ok(Test { working_dir, test_dir, From 2a12a7a080a08920120d3adf07854021fed46960 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 4 Dec 2023 14:01:39 +0000 Subject: [PATCH 135/175] Appease clippy --- apps/src/lib/cli/context.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index af26ae1bdf..b17b8a34d4 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -99,8 +99,7 @@ impl Context { let chain_id = std::env::var(ENV_VAR_CHAIN_ID) .ok() .and_then(|chain_id| ChainId::from_str(&chain_id).ok()); - let chain_id = - chain_id.as_ref().or_else(|| global_args.chain_id.as_ref()); + let chain_id = chain_id.as_ref().or(global_args.chain_id.as_ref()); let chain = match chain_id { Some(chain_id) => { From fff1064423bb5c28308e3cadd9e82eb00495f111 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 4 Dec 2023 14:45:50 +0000 Subject: [PATCH 136/175] fixing more dumb shit --- tests/src/e2e/ledger_tests.rs | 54 ++++++++++++++--------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index c2a6bc0e5c..492a7ffd9f 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -38,7 +38,8 @@ use setup::Test; use super::helpers::{ epochs_per_year_from_min_duration, get_established_addr_from_pregenesis, - get_height, wait_for_block_height, wait_for_wasm_pre_compile, + get_height, get_pregenesis_wallet, wait_for_block_height, + wait_for_wasm_pre_compile, }; use super::setup::{get_all_wasms_hashes, set_ethereum_bridge_mode, NamadaCmd}; use crate::e2e::helpers::{ @@ -921,10 +922,13 @@ fn pos_bonds() -> Result<()> { default_port_offset, ); genesis.transactions.bond = Some({ + let wallet = get_pregenesis_wallet(base_dir); + let validator_1_address = wallet + .find_address("validator-1") + .expect("Failed to find validator-1 address"); let mut bonds = genesis.transactions.bond.unwrap(); - // NB: the last bond should be from `validator-1`. - // we will filter it out from the list of bonds - bonds.pop(); + bonds + .retain(|bond| bond.data.validator != *validator_1_address); bonds }); genesis @@ -1283,26 +1287,6 @@ fn test_bond_queries() -> Result<()> { let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(0)); let validator_alias = "validator-0"; - // put money in the validator account from its balance account so that it - // can pay gas fees - let tx_args = vec![ - "transfer", - "--source", - "validator-0-balance-key", - "--target", - "validator-0-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_one_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - client.assert_success(); - // 2. Submit a delegation to the genesis validator let tx_args = vec![ "bond", @@ -2956,8 +2940,6 @@ fn implicit_account_reveal_pk() -> Result<()> { &["key", "gen", "--alias", &key_alias, "--unsafe-dont-encrypt"], Some(20), )?; - cmd.exp_string("Enter BIP39 passphrase (empty for none): ")?; - cmd.send_line("")?; cmd.assert_success(); // Apply the key_alias once the key is generated to obtain tx args @@ -3095,10 +3077,13 @@ fn deactivate_and_reactivate_validator() -> Result<()> { default_port_offset, ); genesis.transactions.bond = Some({ + let wallet = get_pregenesis_wallet(base_dir); + let validator_1_address = wallet + .find_address("validator-1") + .expect("Failed to find validator-1 address"); let mut bonds = genesis.transactions.bond.unwrap(); - // NB: the last bond should be from `validator-1`. - // we will filter it out from the list of bonds - bonds.pop(); + bonds + .retain(|bond| bond.data.validator != *validator_1_address); bonds }); genesis @@ -3126,7 +3111,7 @@ fn deactivate_and_reactivate_validator() -> Result<()> { let validator_1_rpc = get_actor_rpc(&test, &Who::Validator(1)); - // Check the state of validator-0 + // Check the state of validator-1 let tx_args = vec![ "validator-state", "--validator", @@ -3358,10 +3343,13 @@ fn test_invalid_validator_txs() -> Result<()> { default_port_offset, ); genesis.transactions.bond = Some({ + let wallet = get_pregenesis_wallet(base_dir); + let validator_1_address = wallet + .find_address("validator-1") + .expect("Failed to find validator-1 address"); let mut bonds = genesis.transactions.bond.unwrap(); - // NB: the last bond should be from `validator-1`. - // we will filter it out from the list of bonds - bonds.pop(); + bonds + .retain(|bond| bond.data.validator != *validator_1_address); bonds }); genesis From 92bdbbed3531e96b33b4e66782b3bf46ba750378 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 4 Dec 2023 15:25:14 +0000 Subject: [PATCH 137/175] Temporarily disable test_bond_queries --- tests/src/e2e/ledger_tests.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 492a7ffd9f..768ee5d995 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -1264,6 +1264,7 @@ fn pos_rewards() -> Result<()> { /// 6. Wait for epoch 7 /// 7. Check the output of the bonds query #[test] +#[ignore] // TODO: fix this test fn test_bond_queries() -> Result<()> { let pipeline_len = 2; let unbonding_len = 4; @@ -1380,6 +1381,7 @@ fn test_bond_queries() -> Result<()> { // 6. Wait for withdraw_epoch loop { let epoch = epoch_sleep(&test, &validator_one_rpc, 120)?; + // NOTE: test passes from epoch ~13 onwards if epoch >= withdraw_epoch { break; } @@ -1389,8 +1391,8 @@ fn test_bond_queries() -> Result<()> { let tx_args = vec!["bonds", "--ledger-address", &validator_one_rpc]; let mut client = run!(test, Bin::Client, tx_args, Some(40))?; client.exp_string( - "All bonds total active: 120188.000000\r -All bonds total: 120188.000000\r + "All bonds total active: 100188.000000\r +All bonds total: 100188.000000\r All unbonds total active: 412.000000\r All unbonds total: 412.000000\r All unbonds total withdrawable: 412.000000\r", From d227c53d4ee52628c404a8759e52654c040e62c7 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Mon, 4 Dec 2023 15:25:24 +0000 Subject: [PATCH 138/175] Fix e2e wallet tests --- tests/src/e2e/wallet_tests.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/src/e2e/wallet_tests.rs b/tests/src/e2e/wallet_tests.rs index ad6b86f985..167d67202e 100644 --- a/tests/src/e2e/wallet_tests.rs +++ b/tests/src/e2e/wallet_tests.rs @@ -131,8 +131,6 @@ fn wallet_unencrypted_key_cmds() -> Result<()> { &["key", "gen", "--alias", key_alias, "--unsafe-dont-encrypt"], Some(20), )?; - cmd.exp_string("Enter BIP39 passphrase (empty for none): ")?; - cmd.send_line("")?; cmd.exp_string(&format!( "Successfully added a key and an address with alias: \"{}\"", key_alias @@ -181,8 +179,6 @@ fn wallet_address_cmds() -> Result<()> { ], Some(20), )?; - cmd.exp_string("Enter BIP39 passphrase (empty for none): ")?; - cmd.send_line("")?; cmd.exp_string(&format!( "Successfully added a key and an address with alias: \"{}\"", gen_address_alias From 9991b1a1404ddf22b2d6d31a31c6dde7042bb9f8 Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 4 Dec 2023 12:58:01 -0500 Subject: [PATCH 139/175] fix `test_bond_queries` and trigger in CI --- .github/workflows/scripts/e2e.json | 1 + sdk/src/queries/vp/pos.rs | 4 ++-- tests/src/e2e/ledger_tests.rs | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scripts/e2e.json b/.github/workflows/scripts/e2e.json index a0478a9322..0b121161cf 100644 --- a/.github/workflows/scripts/e2e.json +++ b/.github/workflows/scripts/e2e.json @@ -24,6 +24,7 @@ "e2e::ledger_tests::change_validator_metadata": 31, "e2e::ledger_tests::pos_rewards": 44, "e2e::ledger_tests::test_invalid_validator_txs": 73, + "e2e::ledger_tests::test_bond_queries": 95, "e2e::wallet_tests::wallet_address_cmds": 1, "e2e::wallet_tests::wallet_encrypted_key_cmds": 1, "e2e::wallet_tests::wallet_encrypted_key_cmds_env_var": 1, diff --git a/sdk/src/queries/vp/pos.rs b/sdk/src/queries/vp/pos.rs index 0a4777514a..3938be5818 100644 --- a/sdk/src/queries/vp/pos.rs +++ b/sdk/src/queries/vp/pos.rs @@ -462,8 +462,8 @@ where next_result.map( |( lazy_map::NestedSubKey::Data { - key: withdraw_epoch, - nested_sub_key: lazy_map::SubKey::Data(bond_epoch), + key: bond_epoch, + nested_sub_key: lazy_map::SubKey::Data(withdraw_epoch), }, amount, )| ((bond_epoch, withdraw_epoch), amount), diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 768ee5d995..5ae380ba5e 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -1264,7 +1264,6 @@ fn pos_rewards() -> Result<()> { /// 6. Wait for epoch 7 /// 7. Check the output of the bonds query #[test] -#[ignore] // TODO: fix this test fn test_bond_queries() -> Result<()> { let pipeline_len = 2; let unbonding_len = 4; From d9b7418e6bab1c3805891e88b745e148658fa9d2 Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 4 Dec 2023 13:05:50 -0500 Subject: [PATCH 140/175] add other missing e2e tests to CI --- .github/workflows/scripts/e2e.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/scripts/e2e.json b/.github/workflows/scripts/e2e.json index 0b121161cf..6e736d16f1 100644 --- a/.github/workflows/scripts/e2e.json +++ b/.github/workflows/scripts/e2e.json @@ -25,6 +25,8 @@ "e2e::ledger_tests::pos_rewards": 44, "e2e::ledger_tests::test_invalid_validator_txs": 73, "e2e::ledger_tests::test_bond_queries": 95, + "e2e::ledger_tests::suspend_ledger": 30, + "e2e::ledger_tests::stop_ledger_at_height": 18, "e2e::wallet_tests::wallet_address_cmds": 1, "e2e::wallet_tests::wallet_encrypted_key_cmds": 1, "e2e::wallet_tests::wallet_encrypted_key_cmds_env_var": 1, From 2eca765bb451ecbbb42530b406cb62f8b308aa48 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 09:56:07 +0000 Subject: [PATCH 141/175] End-to-end test fixes --- tests/src/e2e/helpers.rs | 2 +- tests/src/e2e/ibc_tests.rs | 4 ++-- tests/src/e2e/ledger_tests.rs | 26 ++------------------------ 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/tests/src/e2e/helpers.rs b/tests/src/e2e/helpers.rs index d7cea1d79c..9fe5194da6 100644 --- a/tests/src/e2e/helpers.rs +++ b/tests/src/e2e/helpers.rs @@ -192,7 +192,7 @@ pub fn get_validator_pk(test: &Test, who: &Who) -> Option { }; let mut wallet = get_node_wallet(test, who); let sk = wallet - .find_secret_key(format!("validator-{index}-validator-key"), None) + .find_secret_key(format!("validator-{index}-balance-key"), None) .ok()?; Some(sk.ref_to()) } diff --git a/tests/src/e2e/ibc_tests.rs b/tests/src/e2e/ibc_tests.rs index 7aa6355087..668733e6da 100644 --- a/tests/src/e2e/ibc_tests.rs +++ b/tests/src/e2e/ibc_tests.rs @@ -1432,7 +1432,7 @@ fn check_balances( "balance", "--owner", ALBERT, "--token", NAM, "--node", &rpc_a, ]; let mut client = run!(test_a, Bin::Client, query_args, Some(40))?; - let expected = "nam: 880000".to_string(); + let expected = "nam: 1900000".to_string(); client.exp_string(&expected)?; client.assert_success(); @@ -1499,7 +1499,7 @@ fn check_balances_after_back( "balance", "--owner", ALBERT, "--token", NAM, "--node", &rpc_a, ]; let mut client = run!(test_a, Bin::Client, query_args, Some(40))?; - let expected = "nam: 930000".to_string(); + let expected = "nam: 1950000".to_string(); client.exp_string(&expected)?; client.assert_success(); diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 5ae380ba5e..985cb2982f 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -217,7 +217,7 @@ fn test_node_connectivity_and_consensus() -> Result<()> { for ledger_rpc in &[validator_0_rpc, validator_1_rpc, non_validator_rpc] { let mut client = run!(test, Bin::Client, query_balance_args(ledger_rpc), Some(40))?; - client.exp_string("nam: 980010.1")?; + client.exp_string("nam: 2000010.1")?; client.assert_success(); } @@ -2587,28 +2587,6 @@ fn double_signing_gets_slashed() -> Result<()> { validator_3.exp_string("This node is a validator")?; let _bg_validator_3 = validator_3.background(); - let validator_zero_rpc = get_actor_rpc(&test, &Who::Validator(0)); - // put money in the validator account from its balance account so that it - // can pay gas fees - let tx_args = vec![ - "transfer", - "--source", - "validator-0-balance-key", - "--target", - "validator-0-validator-key", - "--amount", - "100.0", - "--token", - "NAM", - "--node", - &validator_zero_rpc, - ]; - let mut client = - run_as!(test, Who::Validator(0), Bin::Client, tx_args, Some(40))?; - client.exp_string("Transaction is valid.")?; - - client.assert_success(); - // 2. Copy the first genesis validator base-dir let validator_0_base_dir = test.get_base_dir(&Who::Validator(0)); let validator_0_base_dir_copy = test @@ -2716,7 +2694,7 @@ fn double_signing_gets_slashed() -> Result<()> { "--node", &validator_one_rpc, ]; - let _client = run!(test, Bin::Client, tx_args, Some(40))?; + let _client = run!(test, Bin::Client, tx_args, Some(100))?; // We don't wait for tx result - sometimes the node may crash before while // it's being applied, because the slashed validator will stop voting and // rewards calculation then fails with `InsufficientVotes`. From 9e2c6c170d51a12cea2d2e523f1fb1d9c85d0514 Mon Sep 17 00:00:00 2001 From: bengtlofgren Date: Thu, 30 Nov 2023 14:07:49 +0000 Subject: [PATCH 142/175] gen_localnet working on mac os --- scripts/gen_localnet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/gen_localnet.py b/scripts/gen_localnet.py index 79f7285d55..ddfbad4bb9 100644 --- a/scripts/gen_localnet.py +++ b/scripts/gen_localnet.py @@ -144,7 +144,7 @@ def edit_parameters(params_toml, **kwargs): print(f"Cannot find wasm directory that is not empty at {WASM_PATH}") sys.exit(1) -system(f"{namadac_bin} --base-dir={BASE_DIR} utils init-network --chain-prefix {CHAIN_PREFIX} --genesis-time {GENESIS_TIME} --templates-path {TEMPLATES_PATH} --wasm-checksums-path {WASM_CHECKSUMS_PATH}") +system(f"{namadac_bin} --base-dir='{BASE_DIR}' utils init-network --chain-prefix {CHAIN_PREFIX} --genesis-time {GENESIS_TIME} --templates-path {TEMPLATES_PATH} --wasm-checksums-path {WASM_CHECKSUMS_PATH}") base_dir_files = os.listdir(BASE_DIR) CHAIN_ID="" @@ -165,7 +165,7 @@ def edit_parameters(params_toml, **kwargs): print(f"Cannot find pre-genesis directory that is not empty at {PRE_GENESIS_PATH}") sys.exit(1) -system(f"NAMADA_NETWORK_CONFIGS_DIR='{temp_dir}' {namadac_bin} --base-dir={BASE_DIR} utils join-network --chain-id {CHAIN_ID} --genesis-validator {GENESIS_VALIDATOR} --pre-genesis-path {PRE_GENESIS_PATH} --dont-prefetch-wasm") +system(f"NAMADA_NETWORK_CONFIGS_DIR='{temp_dir}' {namadac_bin} --base-dir='{BASE_DIR}' utils join-network --chain-id {CHAIN_ID} --genesis-validator {GENESIS_VALIDATOR} --pre-genesis-path {PRE_GENESIS_PATH} --dont-prefetch-wasm") shutil.rmtree(BASE_DIR + '/' + CHAIN_ID + '/wasm/') shutil.move(temp_dir + CHAIN_ID + '/wasm/', BASE_DIR + '/' + CHAIN_ID + '/wasm/') @@ -178,5 +178,5 @@ def edit_parameters(params_toml, **kwargs): shutil.rmtree(temp_dir) print("Run the ledger using the following command:") -print(f"{namada_bin} --base-dir={BASE_DIR} ledger run") +print(f"{namada_bin} --base-dir='{BASE_DIR}' --chain-id '{CHAIN_ID}' ledger run") From 47c1e3127dc0779432c4a6fe48a5b6730fa3a9db Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 10:14:27 +0000 Subject: [PATCH 143/175] Update masp proofs --- ...027024E9AC79985302DD15C96CB57743A74CC3.bin | Bin 9941 -> 9941 bytes ...7ECD8CFD237A237C63AA565FC44893414EE7FC.bin | Bin 9649 -> 9649 bytes ...27E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin | Bin 7448 -> 7448 bytes ...B62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin | Bin 7448 -> 7448 bytes ...1B5464810F6974083CC2FEE2756ED1E97B8143.bin | Bin 7448 -> 7448 bytes ...ECBE1A9EAF3496A30D69069DE2FBD293EEC978.bin | Bin 7448 -> 7448 bytes ...E8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin | Bin 24494 -> 24494 bytes ...6D2AEEF55A6F202D8EB4564017DB5BEF872107.bin | Bin 15597 -> 15597 bytes ...4A5C2232840271F032F756953233DB3E53E757.bin | Bin 9941 -> 9941 bytes ...5CC6F78791F8954A0219C07B15344AEE0D2E0F.bin | Bin 10382 -> 10382 bytes ...99481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin | Bin 15257 -> 15257 bytes ...699E65D4B40A4E1BC9E7A32D63CF28466A2F20.bin | Bin 17018 -> 17018 bytes ...81D5DEF92B9A9BB3A159947560514682CC3877.bin | Bin 7448 -> 7448 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/test_fixtures/masp_proofs/30E148B3F9E8D21A41ABB09756027024E9AC79985302DD15C96CB57743A74CC3.bin b/test_fixtures/masp_proofs/30E148B3F9E8D21A41ABB09756027024E9AC79985302DD15C96CB57743A74CC3.bin index 5abe95051451598fa2d1f6a3bd271e04bcf7ed78..3c06d74bb61575d39627d35804b4dc3faf0e1301 100644 GIT binary patch delta 1742 zcmV;<1~K{7P1Q}XJ{cgG_WT#s)9owOkUKv0j z#U4-S{t$`LZtB16u`1!&moz-(LlY3N125pJUyGHFlfD^1AP9m=kW-iBE0k;eifGxn zdemR;M2Qb?vOH-6cG*Y(kCPr6K|$y}^UlfQBEGd|2`1xgl<%IhNrSk2nPHFkSJT%k z*@yyq&GKqFZ9eE#&Vyyijab{~@v|8mMHmpc?c7Ao;j#Dr?pM??ZD| z2o#_HqKE)@;UeuWF-h*J6%VolD6_O3qykXvG&6fLcZfOLFG`=fOqXb9O-IoK9Jw|& zwCMB{nY5ObQGp?X=I8PNfCa{VCY+L@85u}eY|tuyEzuKL0mc>YseV@<)GqxkNh56d z3F?iK87YyS2$R_$K!1eQsxw^YJ}N>EG28N_;LaVGf^YJeG16oIZtedJCj+p%(Rx5X zsPkVgK7H|NP{JO)2`r_4g7OWtolsLJ^+syCCn{u#wA;tAw82n1nh zJ04nozcdgyv-i6#OApHs&ZOoCwEl^>;|PJNt=D{VA5_+JJAY0IvTb=Qe^IM5Xo&n6 zr#B9)pkKAtTD|iTG=wLYxO8YN8F4j40Z!tq&SQ11j-i8AOUm}&W8GI+&N>N{vcy7= zYDRlHzY8=?Eo0VH3b?y0GuTcYn22uN7m5H!0hv_*Lo+m7!uu5O-1t}nEDs8?6LEE5 zEQ;wdEKu09^M9Q5+g~5JA)kLxYwaCK5G?QZA55mZ;#3w8DHPguj%k(P60vu@7+vJ> zmKTVh)8)27e!b#1s3V=xNaP~Z{h?0gF5|$NWq{2s=A4p@GYJCglze!*@di@O+HE(} z`g_WUsr8DSSfJ)?-&m3S6M%oOMoHDe1i5^y%+Ev~Xn)73VuBQZRYiQZl+k*#vbU8q z)tqc_tsnW1PS#q~A*!$pbKO0@BHhYj>Fk^NcvWKP{J0rt;SOb0tly;QiB5NoH<|$8B=g6O^_3I?|4rD6GJ)b(^{>SWWU*LN&HJ5Ea4f5mJ{@l^w3dhLN2WxqZlL|15>+^(Q6$E^k+ zntzfhNA2 z$ZF;YhxMF{KBY5dQ=mh?6OTc$>MQxhdnX!JuvI(yt|FT)hTi2KO`7@myU)(WRlMU! z0DZ^*Sm5K%3R4bp3uI1;VmxVEA> zB~v#%)58;@Boi&9^uNK@_-8V4#ysX4V;2#;n5G4zT;3<>7(;h8TG`vHaFdIOi8yn& zj{Q8GJxdH!kaDFbs`!tN;sB?SW`963?niu?i*slr2ND_p4NGGNhF$b8oDNiggDe8Bd4D&%)x{RV;ntL1hP*Qa?tX?u0YN4Mo7F zME9`8loCY3^#Dn)?7fa1N8urTu3}O&aNQ++;~JMG34nmMrU@P2g)H=Nh)G4;dGC@S z6?g6c;A?;4s)%)up$7%HJxvr^vwyu^CNZ@*I55Dq)~qkrFr}F&ZXOSw%W3wK3>6rR zT*$+C73|AL2q=!n$wyZ zaP_bPPv3kkOjyY%ZV(F_!?BBRrtjk2YoAx!EkNA+KQ2iel|E>EH)o=@XH==^7y4BH znqRn59JVHWq||d-k$j#iHLd}QwjU+6{2#aK;?;SXnitA4c@eija$QA{xU58$Yzqz% k!)@c@P`%d&3KVe(?JUY<{0qYVyqDdBMjhjR43n8AJkh^cz5oCK delta 1742 zcmV;<1~K{7P1Q}XJ{cfcTa9kWb6k@UCriG5F6VbRkV0T?`ll+cnCQ*xD_^UVUKv0j zgU{I=5(l=ZOGRgFVk(-V#M7*&*I~62^82qqYjJ4=lfD^1Al}PrgVDQ6Qw?N*$HI_J z8@9LNoIjiMZpsPFk4OmMA(I{&K|!6am$lgczALxIL8WY`?zL9%`@+?QQsL&apc?c7Aoq!#;K2Sfk2s<0 z<5It5U*`f;J;K zJSn=mzkdw}rGHg~F;DCQ8<@g~^Iu9WFxAAKVHRA_ghAyF^X99gAS`^HkK5%{yAkfZiAoPgs&{$V|C;t zzQW{(+vO!^4I*)oLi;C3M2EQb2E1FPYF{YO?E`24P|%7bqS1Wl<+S0eJu{{9|IAXRa^VJXcYTtAEA9X1EF!H1oC4tVp~N%T}+$!kHdu zAJ85CE9Em%aO+NxnY68#XOEr6pk6({I7_H|&G1efjkdptlXTg%)XD#Umtqd)^s2d4B$vBC=n~6P-Ij+Nh9NL^-c^PM}JJ9ni$p*-A)_*ctBET$T zjenkbK@?34h)Amq?`x5_t@y&{sk*k+?OpOwIrhTg`kXd(GYZ{Xu^%}FxMVXOhpn{! zgsS%Zv!>0>t%uf>th4;Mc%=IC+^|UwbDzFlOWu4|YU{86nw-|0OY|VcoS0AZwwYdWQoBE~xf6i|E9h zqy~F~D0P|?ERAehHWSL)vowq!C%~-zPTM*v4H+vdRss9VjT`v>6r$^TB#YFBmVaYb zM~S=2F9jVgZ-WRSFZ{|*Zk2W&b5*+-Nm(Iu17CY9@p7QwNSO*77g{kK(HJHjB7z(l zkQUyhkJ+^6YF-+u$TQ#KtAR6=5m=Uy-zbT5efO5dq3ob*%pOv(VoUGHoq(QJ*8zME zb0mT_u?q%!M&iKf$DWN;0`9^ym4AsvsHh%|^_2dDk@{1BgbYEAItZp9{S->WH}{WEkiClv6Z|{N#aet*Ip5X!*(Avlz{s>MC` z{-52WjnwEkB8pL@!X(&Q*qR@CWx#?I{)rj*X}Hk%u-J1|oY|<}xxL}FBYzL$6C+71%^EAw*qF_m`Ez;f*HYX9`m4NMOI*{3&>;xE zhL=9TGr8a-R33phyXCuV6_V}dy6-DO1)k-1toZ+<*J9<=K4L`04rb9KhY_+|b#-NX kkOiQUziAaxaQcWGA82^2Qwv#>;fPE8*5B-^2a}m5JYrs5!vFvP diff --git a/test_fixtures/masp_proofs/473EDF0B2908F047110AC52C7F7ECD8CFD237A237C63AA565FC44893414EE7FC.bin b/test_fixtures/masp_proofs/473EDF0B2908F047110AC52C7F7ECD8CFD237A237C63AA565FC44893414EE7FC.bin index 496db42382e4af1f954ae84cf94a2dbab3e79ac3..4b8a998a30a0254f84abe571d6a94700e71b2f08 100644 GIT binary patch delta 1676 zcmV;726OqbOR-C^niwFNXtJNn>xkmKOic@iK+$m-&s&C1ksAjBurnk~-tLu?x)?wp zL$9-p)8QM#_f|cPgE|5S=)t?Z1NttR)j#_TVGh#alNuR8VWXfB0igrd4hK{v#kO5q zfNc02JPugx`R21#GFiL@-7=;G@}yAH=G~idJZ~)9Sn;AOR?O7e!05A@5tVUQ*8+ue z%FZMKA4!?Ap_0}*Zlpm~ssKBbO@}6QBdDUztthj+8KeS#5g|@Cv0BVJR z5-%;!3Rxes9v~(G+I__RCY=6gh2$762*Y+}nZBV&>gscPWp-rJ(el?saVETxazMVC zk!y2TN4^va)=qsEU?2^)MR`QedkpaHDgx>_(M+>~gMiW6KM#QGJ|Er^_9o&PopO{L zBU5$`9Pp*H-yBv0e~QUk=JyMw;kX}dT2bw>b;ztDvb7oAw1R8Ku@R;T%GumYLHi1- z!HvEPJ^JnHO@b4;7%5l#Y+x{ z!km&Wc+3d8q|X=w28aO!#hveYl|RF06&Y@qZg*F)F1d)x#Eq&E{Ts1FtM@m^?7^k6 zpi5(3Aw{&#bdErG_91E}BAbGSGf%F=4Qq;I84c6FT+$olRh)MH4;VO5w@8!}uwb3^ zweI7G*@0r|e{ldjXO>&m+)h}!j%n1V1RShWe8sd3A9#MNZw6;SX(>Pspv9yAc7t#W zO(X5#VrMm|AO3RVs0ELccdRmV(q>nXjv$t2-ZMXNxqM`1OHIa)F57~lg^TW|TG+_* zlslzZz%X*&`I=66F8xtvBKYee*R_HmGLNjb9wE4$f0*F7X5%&jJu+b-ZLc+o6GFuV z5jmf!v%oh48plj!HTY3v((;-7^+nqXVfQV>_noi+b$T#n&?ibcWm!ff4t7Rk%FKFDe50h@dSQst>>YS+ZHF|4z267FQ3A z=_xazf33Dx4!L0hQQDOkb^caY*dh|)(dL_=K58=(c?|PG{&maG8cU?t9P{?MnC1xXgOYimi%xWR+eH5v3NR*^PTR_Z&iuckg8Nz z&U#riFe+kRQ8rfX02OHa9mDF$r%Ur$**#v7sgR}%a+TLz2Y-*rKRt-b^iOBB9efbQXD4an(MfY zdC1G=FA@3nNew#D{v1N6&7pHFJrcUme^51sX=O1Ll4F0g} z=7}n-wZ+1NyOnE5h(2aQheec9*J>RK4>#v<;9i^)O7-Sv(kOk@3SH~+cT9=(f9BQz z<0%_&h+zRAlI_bJ29`x@S}As%8?RfchS^H`(p7^Q;~1vt0f%>KAzQho+f^;A`N8+! z#l4&_5`OytK(h~|c>;3otEGDm0Sn-4{0$hd$TMR2x^HTo*Cv&Pw)wRVM>j{IlXp3< z83^&))WX$kN}5%}qK=txEMOmDf67K*Sx2R|BYrOt>=|UV(dOaGxbCJ4Op8{1ltP2+ z^PtO$wU1#Q!Oj(wS`5AXsw)3d#O8@iK|_pj^t=a!u)#S9(gT)rUkAq-ZyzcEgNGuc?o)2#vM1DTh?j-OO5RadGk1@= z3)K1H3M!<>DK6lEY54$*1U`C8zl00XqbNl%7?a%Y2Vm9mZmXGulTMX@g9 WvBd18SpkRlk`z@&EXDwnbtOEYq&TSn delta 1676 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 Ycl&QW6+G^+9Nnhqcsw$t2$SR-G~M9*(EtDd diff --git a/test_fixtures/masp_proofs/4CCB9ADD3188CD893508CBB4FCB62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin b/test_fixtures/masp_proofs/4CCB9ADD3188CD893508CBB4FCB62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin index e95e73953ed6015ec87fbee783238a40bf2604e4..015abca093093f9449e9648b9c47e4dd5da08f4f 100644 GIT binary patch delta 1002 zcmV)YZLSWAnn>60u` z|3u&9p0j@zB?Etq)gThs0n=0+j!9?1aul&IQA_*;2cfL!P*HH2y@dpi9Z$+Fcsgi1 zvpp6>j&U!L#uzZ?Kk&m2cb>);W3x&qK4y+TTdFBR5Ji zl?Y@PW+V)=Zx|VX__N?mU>zMatRVf%yBADWz{=;R;Xi*4)Kw{NY17Lo1|KF5wxB2X zgLY?(rt#QwP`<41KWcoU=D#M9eA05D!~=qX^`xuu9Z{E<223{ZJ0i9SPTPLlfW|WK zHK5ht&SBN{S&Pn<0Wgav>lrhf0r(YIe1g0mU;8^64qYt&r52<~11j~skS|&6m>?+J zZQf8aBE^3rf~)Bd*_!(~QWCbrJ&~7PQHt`G@;_$U=t<}M8M$99t_Oyy5VsiRM&VMk ze(<2(-LoQFFOJL-zyeaef#b+PQ#}$7Eli|{B$Ts--vGtTShI7w9`2-gK-)y<%5+-v zx9O)H#EgpNY0fJdpEI%dIf9Zj?&l_#Atwh6_oIK_-2R8V&+=@!@T*pZWXrM7J)<4+ zsGX{>qus{r;X`(1tRaIod#wcMPP*k;vP5Wu``g2-am->DCEiMS^i%zCm z)qE839PM8>KB&U~s4VDzD+Dr+-_n>&i^J!i&z{n?j) YJF5T|oHfws&Y|jURDVVZ2$SR-G;sO!$N&HU delta 1002 zcmV|x^CkQTfacZx9Zb-;eauGJ#bF)_v^a3EBWhA@sZ2!t$i*x|- z7HDDbcT26AZa8zeEtWP(y<}{&YZLSWAczKFXqD>AzI$ml?61LzeH+{jPo2rU_;`o<+V+|KASFkMvn_E-~63Sbn_%zFj0p~?1f z21&~<$xMDaxNG6;kV5KCmmj0kJj7z8|F*YSUm{=XEzm(rXoS7xes=RH=o zm*nMa1Z1M0EuJd4Td;7K=Q$};Ubq=@d$iBjfeAjSHsh%;qYNnD zz$ST94)Zl%18F7U zF;a1VDg-)h?nSj+XNWtF?E=l2a$2AHZxF*Vwx@raJ0b$#&=Ld4l_aohKwzE!aj@4tZeA(|IGzWf#FYc<5{-Ts_IUP6@Y zo`4idsiQ&g9Yuv{BPDcO!wVZAtq~h2ftdqD-1J;|eX~}?|D8qO=5aE!s zVqbrmy(U=XNcN&>Dmv)_)Ijx2Gh~#m^T+gQtg~UYcytaSj5HGbq7aj1oNrQM_96It zCvYyF#J{7U{73@YHFGb7KvkTNmJ-c0^P^kVLyo&}!e$u|6tJrA!IR>Q_jyGf()#B( z5O4S<&OBZGY#7O$moo&l(>ceVKJ+JdO(=hfanwUkS%vTftqW>{cp?CP&3ZGBX3QA) zfw~N<7PY4gvzLZGHb@O)$`RAYOygn!xF1r@44vTcp$KU z_aa~hgibc5vgP)3ZC^#wvmKtayrd(LLH}?0Y0$<#T}{R9`ObvG>&T2^E!K(_|_6j3TDVlqp9q(Lk;u- zAoK&pqvyZcV};DRhc4n1`R0l!+$VLH#FaxnG8jp2ZnIYq^a3D`X9WD+CHF!is{J;B#iz2Pmd zgrwUD5^U$fb_snWJslZBpj5k7{olF4@XO(q$-#jw|?Apde=fel41CKf!N;l%iAJ^{mP`Y(}3!q2!6 z)jD(TxD6FxtTS|e-s>+cL1e?0>NtROUfo*-dXQg^N%3mw-jG5?9K^f4s@|`+9Su8G z-y&K{sokJz{akk>tp z?DoVF1_v#}4I!=t-sAndIPbg#COs+3z5^1B)0PQZ8Y!2b!dPIB6wo%hkhUIoc1Q-c zAX)bRcF{0m`Ag@$u0iwUI@xlWX1nDcN+CpAFKye)0_GAgIBUn$5un z&FO=BQDSzR`!WA}55K^82$H)C$e^rYD@wJS%BN$|GLi$#Wvk-e5-KTjIO&s*G$3;F zpj3h7IGsw(v4IfxJO+TV8XvS%OpnU*Q~x{}hDrJPrdKhVyu1Ba$3RjFIGUJi<-JDV z%x~nW3fnXaJ;GLqijwq+pMT4QRY5Jj$SVzoW*0y+mmP+YDfz9V00_;t(q3Ph`)ESW YZMJuM*AaR_1Q>&WbF#R@1e4?(G@(=P^Z)<= delta 1002 zcmVw(;TEJp{kLk;u- zAcRcp^V3wmQ|}IS4dy^R0&qql-Z$9Vi{I~#!H(^o(X&?&^a3D4Sx!N}%Z_44cAo`Y zy=pe?eCPl5T?kDj)_UknUJS~!YZLSWAW+TLGhB)VtZC`~u#Bbt>0Q=Q-IF12Hf zC6Tqn5VL<4B?Et%e6Rjj=;Fw+aEHFC)4-hq{7fdXl`UwzKO>NkajzKLCwjuE3o8Lw zLT0K|Ex>7EK@D*9P zp{*X|M(buZwxTDoj+4G@9Kc+I?YlO8Wi%7hRT(L3SZ!4sHT;TweU0<4`tZ_1uhOvB z5TXj{bpXwRz%lzsj-OoIFfJImnOdYBA&_tl`~kjMMk6-IiwMmWv;vO;x9!|fTiKVK zuRZyAG53E6CRcu=ouP6NNUyNOOR z1jV@59>z&J`YndjejBHrE8a*xYSz_CISZ!7(l$zdEmQ?S^tCw%U$lK4fk&-PoNboR z(~+p5y+gqcp6CTru>&qWkMzI~^YkS78Fsv`60d(2%Z#-7Gb)6p#b(|bKL*z1hv4?4 znhPbed<+xbqpF?&!hRr7g|Cc0H_}5Y_T^nlNok3Y!1gF1%B_?>$^}lZ)-B2M8x#N7 z1SzN%kK4ugZ{v;YD-TgBBPVo@UQG8B!d(!}L^F^)9{2tUu^)XJsXT!sh$`PAs~Do< zdrW_Idol(-u5XZrdIAZd=IJI$p&P-L*Ep=X-5lr1<60C6jJqV2^6!vU;pGt5|8Fl& zNMXlHm>IPNT|55%7sEJUl%h_ww2_L-ZL`0I107H`bl2Xp))CWztgU!W($OYy!l8&0 z*{L9uGIY1hZ>!y3`uJV1JnNZ@r}!p--rIk&=)(dSY;+n-1kAO8YkPE%LP@c5Y0>^m zJP2G^SOI2{(}_sW3~k8$R++wb@17anNKM=X3g;FI?;n7{(`bkHIANrr)cuuOsG(bM zXs;M|R^XrCr5>rBWXRNlTM&57l3`}Z>5_=}_Y*-6)1dV;LI_^q!CA?h&Jkm>BA-T< zAEewLc$hM%@gTq@1)AzMIz&IB=N9@mHBE1zMetbF@GiFb$6qE|4dhXKV)lpKCrV!P Y!b;0^W;0vLt#ao`UGte@36ta;G?NSSOaK4? diff --git a/test_fixtures/masp_proofs/8BA2DA741BF1FE1CDEC5295AE3ECBE1A9EAF3496A30D69069DE2FBD293EEC978.bin b/test_fixtures/masp_proofs/8BA2DA741BF1FE1CDEC5295AE3ECBE1A9EAF3496A30D69069DE2FBD293EEC978.bin index a8c9a560f847fe28c8dd1ca7848bf3d23eb5259c..8f5274df04dc2c6ceca2bf75b48b6f23ab85445a 100644 GIT binary patch delta 1002 zcmV3APzIcNb$ow!eT3*Pxk4{y|7^lp8@Oc- zgwlZ+UqKQMyl=6GK;C=Kk%U{vjy09en@2q^6Zb1ua11N9l)fJGc9MB6B}fi%iSf4d zmhX}vEIvo*h3(QJQ?;_O5+}erR5o&9adj5kC{^pl))nzFssbe&3{pqhq`~P4F$%BY zqKO?a)X9I&NykemRZFP<8rlV0;+ErJ9g+>%S%KhitK{SVAmdKd6A&n&^0lMA@j!?` zv$Y|`_aYSloWlcpimL8{X0t0n;R^lrf=Yk%1Sv67@1|p+F5_73h^Yx1I=*n75?8Q9QL!GVZpHO)+zSJ z)Zn|7>R#;Z|IV?40!cVUX3^99C4V^R9ggJv#26W2w#c43p#>G=PTd82|tP delta 1002 zcmVNf|LXnbipk`Xsj4HshLk;u- zAbW0aD~XRlyB2HyT5H(Dk)0Fdb{**fkXMi5TYeo7z_V8n^a3FKiEOpQL=96by)CG_)= z(i<`cS|`lQ-H_G<(sLT;#)32jLI_jk2wiW%z1q`sp4iB)?o{lnT^sW?!9#b2Dw zmd3%=0)c-Pd!J@mG>F+X)`Ol~ae+e~hRg{IC@^`bjFq6#(!%01>5Fp~B zZ);DfDyw49P_}9Aw(7pRH_9D=L2Ga8TQinv=k|XyaDkWHQ)B$OCY;CDX8!JLek0EC zr{Newr#HV1z`qR)TA0PM2QoWYmKpRvLexY051weVtT1HnS;))%Sqe-*jyonqORxtr!pW1 zJ6?bJlEeF}fGw2{L`VM3kM*n@Tx`deF%87aNa>0ldug)mvGmv6w^?W&=eDk1v!_;h zSvK;2t2mEpee3T$3gg26JsA_IWi}rB@L5Jlrjj^rolT7HU$7|SgryX39o4DE?ykOa z?dC{Ai%NFbivJkmq3nE;2)#eVVE<7-@(zD4Xdg^jC;8I6ft5_Q@#S!Z+;(;#@%nw8 zDvn6enE;wbFH59y7dbe4bM%|Sv%6%%C1WqBty_!+1wUA^g`r6qHF)pOv9@wn72X=b z66?sC4w2ZTi1s|P6Dk6)AB`K>2PKw}R^uTUR%tsK;VIa+JgBt+vW(j1PvmKfp}$6c zJ58xT)!!39=646|Fb>j)6VpmtPAjW(fHEPqh&`$NwaiyJG|N~ks0Hq)$ diff --git a/test_fixtures/masp_proofs/978C35E058808D61F0E265D72DE8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin b/test_fixtures/masp_proofs/978C35E058808D61F0E265D72DE8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin index 06926fb5befcee3e11c47b388e13801d856b5362..a70424fea0369e855cbc6bb477f28250071e698c 100644 GIT binary patch delta 4170 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 UM!pth=8LHLbf9lR1Cuged<&NTNB{r; delta 4170 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 Myi(&v1e1|GTu*LRGynhq delta 2810 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 M5E3kJ1(T6HT>cVY5&!@I diff --git a/test_fixtures/masp_proofs/BB9AA71A4227C9E62948CBA8DB4A5C2232840271F032F756953233DB3E53E757.bin b/test_fixtures/masp_proofs/BB9AA71A4227C9E62948CBA8DB4A5C2232840271F032F756953233DB3E53E757.bin index ecdd51d5db955a7751dc46818651c02457d964b6..84b4675138ac522106edc9521cbd33e5ecb0b90d 100644 GIT binary patch delta 1742 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 diff --git a/test_fixtures/masp_proofs/C506FA6C2EFB37B06CD5A473AF5CC6F78791F8954A0219C07B15344AEE0D2E0F.bin b/test_fixtures/masp_proofs/C506FA6C2EFB37B06CD5A473AF5CC6F78791F8954A0219C07B15344AEE0D2E0F.bin index 43b47e8c43e260e618681bb3042860412c95f910..5b3f70956f0ae464ae32d48db67371263d1f16bc 100644 GIT binary patch delta 1781 zcmVs6^Nml7q})al z{CYx~(XI(wT%cHU>TxY)Inp*0ZFfU_PwdJwIRmh3RE;*WEhVMnhZ51;pGy?Lm;x0` zAqblHcgOz!An4&r|5zv?jH(@?rrxaW8Y|KkaI3SC9Hat&K;s_QL57AXo^I>qrADk# zi5(^hxDF&1KkG}JokivELNo-!pF=6Q9FRB(9rhP(r3A?*=&2vOL1^vcP%I;k1h^jP;# zp7`Zr%lMP&FcrZR>N`uJ&d3kF=kRK(|z~uVnlrE_1pt2HU_lYVRRy+)s(f z&f`(9JU=M4xHB}wsh;C&8H2x?4S4TkDZ*^~4`%YG8QKus{v_G`ijy%LDUqEBlgc7M ze~4bUep-imEa^GaF9VH|YVAwbRAuA%ei9PQ{2&D@QYHNp-p`;nwG0_)Z38x>xvXcx zI)xR-p_R!=cnUW0`X}0Ia-a0r90)v2MF4oyWX6_&uQBp*(18@~!cnW!-x5E(jBKeh z=n%oH-*1KjFm?R($Hm&>l{)cPdmv9he`KI18HKi6HMkmGAq4B}O>MOy2;}l7kO1DJ zn8qJil3nXlDmfdrnhTPuGv5~s>9jH&3Kx7gt08kjs>6Cuv$C!6aM77i<;%Ekc^aSTEYuvE^)& zlYk_@ss@dL0ey*+L*c%>oxGJb8ygxzA+Wy+_~) zkn}C?99n+LB(w>rCYYdscph^-e}2|OHn&-)VX%nRIMar-{9hx|+(qGSkP%M~F4PF;nJ4Lg1d;4z?g1ldf?x;rDxjD|w^ z4C#Q<is4hLsMX$lN;#rx=qc}Y_3u9*`LR9`Y)bIve?*N40h5PC z$~PZ!%GeM)JCLXVcY)&W{-bM-5G{#)N-_NVL$OJuKD45JcD>s6CBvrBUb!T5VX!5@ zUf)c4LQE^fFGh>St9Ns?Vc={bSO`j4PRcP}m3CBEo)nsPA}W);kq#uWt&3)M4F@I* zb2%+Dp@g!aReUb1YSF>|f0!)F*udxg4odB0jDWuuUwe8Qk{z~RL7YK9D$LtgpqpdQ zA0YSNlcxqY-|y0zf3SwK<6{Zu3OHw&G(<#V3l(xcXo(rf^0mxjT;l;L&yv}?Hz#TePk zFtG-o_UtpKO_;-VVf~T@G=bwBx6hh|I}Iy5AU`&4&wX@LsR0hGmwrMbN`Zhn{?2K; zyldQ51Z`|Wuk@Xbe=wO063F@-lkC|1ue&5s?k@#Jrs%H`4|-z*&ZnyRylY2Wcs*Pm z`qhvuW9ti-FSuzFawvmXvOYBKOXjFXm%KJpiHMTsrW}P+?TS$1m^)6UBBlPvWy2jG zZXv*AI6?0`2ce9D58h%xayI&H2%QoMU}?~zS2rwb^DU6qe*zY!$t~B;iGNh%i2CM% zt8vLw0lSOjREIXJRC*egT|6XB*4An733!V<62J!|4ag$f^+2GCaA`7qyWaRleTuVW zn&vO0x0lsmB`d1#RB+9H@6eYP+NHJM*7h)F@sMk1Ag?AbxpxnIO1DI!9pJ_-I)@UF znUVxgU^eFIf9`jfiS$1BgN>o4HUEo(V8QjxnhRjN^?j0rW(4ssWEiuJ9ow)1G0q9T zP;n#eMX?O~Cd6(+9B?EUjz>%97V;-If7xs4HTXufp2?!d9IETeC2}FL_E@f*Iha6t zF)wRHyu659M>Zn)+*3tj#%9u1!rmqHd~K6inq*qLN|A1fs`VW9VhU7C^OcFu4II$q zdG*;=o@ufvw2ej-hl0ILU3W!~A X7$gUiUMMJ&UMLg@1^@s600000nTc?v delta 1781 zcmV5-uacJ^<{;=Mh}T(qYX5}6sc+Mtk({az7-9znB{j~hTB zybO}7C2`vGqB_i4fst+|cYZrZ$*qy=RwCkIA@I!ulkXcrVIS}0N^JXK!?qj!_k_Q> zh*Ztw9CHXR6Uft3_{XgryZarwNpl3)2xByWS6odJ;OB+ji~i}DvQ1I-y-(Vs)dJ6L zx0g2b@b1Izd#FTff~J2q%dAvBmCryC(?pPlGrF^p9Hat&uRdA%s>2lm+E5EJ_v>SP z7c^eZqVWG`*S*P=N>8z`Za&$g%S)~maZxC<(An{tD-l1eh@*obOiAK&gDEO3h*tv~ z2<-B`FP@V;vLLxVW}f1YuMKSAG<7Mqnx|=Iq(YacfzjzT)*jRf(r?_AI;k1h^jP;# zp7`Zr%lMP(b%)IEIc=&t1*ij%IWwK6QI}yBpm=6+YESSa&1@C<#6fFei8_ zNtTSyd6Q@_w}}fD1i--Ld~vf|pU=dDSc_-i--NWnqBvD?!BqQ}?vpVaDUqEBlgc7M zf3f@1E$dK9@5iR$6b!T5lFHj*MaBhy}BRxK#Gw zx)I}{s1j8{ABw>#*KXI}!=XnMwtCp#f30Q{(93M0WrQ&=LY(KEL_xCki6}Bc3I463 zeu^qj_ZjJi?sM;WB&T`aQSs;lX&Vd-Lt zcku+p1|o+fhQ|O^Jg&<*<+$VK+3>Jb6z%ph?z?CdiNBch^B)3j~=6!y+2XEo)0OgWo+kNTR1v% ze=GZB{YPSN9^IxKNFD4c^_Q67f6?IW0-DiE3kwTGc=8;=q4_JEM?>^|MM@UUC8S20 zj#zP)wih+UoM{kzjaF=|tFp21ltMgLvPbIwjfq^0IW1BL?M^Mjg~5)~d(6IF)59`( zZ5TS_qs}{caGRwAMsXHQ;#cR8?#=(?ugypXBui!{XGk$lDmI(l|M?ube^aWb37MR0 zo;=^AMyos!VqFFScffoQK&{XRy5FEWu%CzFGkwNtJU=+WbN!G#2WCv~R-mmlix?v--2|&`-_(X8AFEykx@J*6;FAqLP!r8 zC82VmbBTQsb_(Gv?P^&vbaL821podFS9L*@0PJkG{=AbAenmI!v4kFT?hYj+ZFzu( ze;OL9QjFvu;h941Uk(bN#o1ptO+Ufea=rk3a{NulVf0^k^%%s!J1$8Av zVl=KqcYvse=2x*QXeqo7J15C!#x1(?Mqhjwe4{Q4?besORd9O2%BJcWUAmpkEt!2l z)C5ouFMNAbHoI*wymgoUt8<#5d#xCym2{pdRBBb6>1|!qP|_@7l4WzX;*IJ!*|{_t zq$;yqK(G}Ms^xrSfA}l4{ryT5p-NRQn|_z!PW2EYN zGbw|*z?IR!Pq(;BabLmVuig%x5lgBZo!ZvX%D0x2mavaGBkN2dq$evsE(10V5f)lH z751ZK8>@Qc%+P$}4Fr|w3bvV4_iHs+UKoUJQ3^i@6^JY1e+Je}lB&J$hgf^7r%-&b z-^4&SKFTQ9Jc5k8@I&x$^u+H^YuUlOac|aMLTO930j8%V$r~H+^pKsn1PGO+>r5}f z5E-|tbcCi@E-k?Q8nvOMM_&Sr$ATlbY5E&kfZF8dF}LvP_Fkyxt55G! zd6D(K+gsIG^rQ+HO0Db_GC16cllkUr9X|{jr_g^{N)K)C+d+Y3lS#6NdmRWU%N;f3 zP8IG0$O=hh=C#;!UO){_RwiL;7%3+6BJS*Z8&G&Ks*ry99}uj1yzo)Nl8{6fN+F%A XpA80+UMMJ&UMLg@1^@s600000nLBQe diff --git a/test_fixtures/masp_proofs/D007D1734AD42D34174F04566899481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin b/test_fixtures/masp_proofs/D007D1734AD42D34174F04566899481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin index ea4d0108ba2e8936875ef7502fa52fa5fb5e0b35..226549297567b3cadcb581d88e8979aec3103c66 100644 GIT binary patch delta 2749 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 DixFH6 delta 2749 zcmV;u3PSancbRvv79$`&(1?Ed1#tV`@%5Sl&(X{{sqAovt&?S^M-disbfdA8HX}eF z&YsPteHCz^GaqtN!!sXiL0+)I>ulKn$IzqS^8nUyla?bvVQ+PRFJ0^vIkNgaN_kbo zg{k1siMvQfQSKa)Yy6(sX%H8YrPz+ToD!$=V|q<1*C;NIqCifJPc@;$y*YVD;xQLl6HASOm5n=A`y?$;3n$#3;69lvn=%uoBI^p5-%f`lL~1eXx^)DLlW^x zvWWq#F_~$zTPKwQf9@N7=##vF)s$DcbEE9?6%(!?Ew(a7`P${be&q?HH8Szw%q*-o zhaZM%rU(b<^{@d(m`!&d6F9S9v1v|EBv=i;cFcn320Lr{2a?*9mGhY ziu!kUlfN3~_|=Dfgj)@l(9&WhgRPQcD46N+!5kq-#s8w6vu`Su0)J@E`!OfEC>8}! zQ8=wIwlny);K2d3mTs!2eicp@35An3>dw9bj%~h6jZ?MUkfD$LJr@+=UXjD$Z7dUa zY1=5%7?q_@6n!&bh;Av6{|3vZ&}DK2T(LjT{mBj>asS1 zz|(i}ciGx{u5VMtLE5p3AjC%I7Md{oFPrB7mbDV^3IebRcBNp~y=NNNjy@%Mtv2>= z!45-^iF;D;F*)g)Ml=|6XjIJqT#!i;sHEwvu_VtTH;P zhN!CYxF1U}>498Z&IvhOHMVH?#9VTvr4L!U6T#f3S=-qVMVvO4l8XmxgOT&2y1yil zWSnw~e_YeNVgfsVhyAoKF(6(BA_{^32kE5R6II-TmIk)*Ftl{z&T9KP(BZF-1%HXm zXw90CeAC!HZ_{>gN}~<7>?exYvV}p8UHy4N#%=+}+_SUnVqUD*TC-`^{jK$QD5T_Q zMs?t}eD=>kFYsT9k|Vev0*IvRp4IEpW);ctf7@m_;HfWty-rgN~5!uVYw5R`|*SC|KqH68;b^*fg8ggaH zC#0!$x1FQ901;Kbsib`{=4`q18*=(fBhQM2$u9ly^vYC`S_|q=MfK>|fqF#g}KJ^EwIRDU}Giw1I9@3+o1Uq_K3@$u%Q= z6Mh=T7G657*wZd@nyAtTgk=hwF%Qmt_2+)b#iCDJ*!&Bm575bX!;LL;h8IYce^cZ{ zT|p9Cn-DB_{hrTPyMGC?UOu+^_zO@fVrzOVp6?TxMoqq>J-Hdd;~Ydy5op2*+|6Tc z%1eur)oUce^JdXhr>2LEe&sFqWhvO#U7x=J_?oWv8&g!yj_RDcIOa$Af#~?QHDJ{` zh6b;ppIpe7glv&FUp9nwO#{{ze|-QL#ANHAG-Ko5jE6@F8Le0ntz+P#mk-DF@7vO_ zFgNN_xqcE2H>532L6>8L>f4MNb@FDlxf6sBEcbqfF zh{P6mouWB-PmUdH8V44ONsYF-k?T1^vJwycO%!W<*2S;QWLMS6(_&UgnXkCCipXZh zQMX_|yp+~+XsgCg;P$U0KR1VO`eFlU1WwWREiHk=BHj$7@O9BGn-4zt2Pn%V3B{l3 z@{C)SrBpqh5JDslae`i&e-Koy9g~s~2EHC;>WJKTj)h1gI>UQUWTkv*NMbwN;$y#a z7;L5lAg0MxAe+^xfnV$sDOTd3UJFrEOWn{XEpn%+s54jqVyGS3y8K@M{3=$QE2h(P zh+YY)5DwRif??e!VuwA^Lw9|GvHlL;RpFKd(kUKjOM;TV0JN&Ue|FWmccro>-U`-S z3A3_(N#ZqZoU`PC@5pd6k0?rV%A(}|jhw9L4ZICWMbER&H<>DxT_2~vj~oM7owUf+ zSn6r&f1dnWtEF#djrH7#OH(O;5=7$*8NTecv8|g!z+Z%;%0r-{jAu)ioZg6qHqO1m5lLgxdYTc?gcg{qC*kqrr7&@%kS_ zpC2nwMPTfK4VQ5noew?|=~cP7G?7o))ZU@5@t-R@7~EGFf44k2J%N)8r|SP@cN(nq z)t@~JDx+)f9yKoPnX&!)n@Y=8B4kttxH^#yDGL+uA1Z3%%WCdIc^&^Jq^pH8$)l~& zCA>fQw$1~ntyN_>VSdNbc!?*`i1SByz%aY`x+_UpR>(%nWJ)z z4LYdICc50Oe>5WZpJ@J*;S?ZmoI4c`NPg`qhAyA&^@R()^!$M`a?f<%{H_Sa;n@~U;w_%%Wc8#x#h5uc7*yu66doYX1hhIRz{Pw^t_Z^jlTkYqlTkZJ Dju1Rq diff --git a/test_fixtures/masp_proofs/DEDF664AD06184041515677A72699E65D4B40A4E1BC9E7A32D63CF28466A2F20.bin b/test_fixtures/masp_proofs/DEDF664AD06184041515677A72699E65D4B40A4E1BC9E7A32D63CF28466A2F20.bin index ef38a4b22f3311265d8019360433c06e0aacf795..26a4dcbf70e9b1e42c001c618f68efa1c56fb74f 100644 GIT binary patch delta 3073 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 Pmu?b8)X@nClNLf`e=iEI delta 3073 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 YD&GnM_!Cb Date: Tue, 5 Dec 2023 12:50:40 +0000 Subject: [PATCH 144/175] Make `vp_user` a constant --- apps/src/lib/cli.rs | 3 ++- apps/src/lib/config/genesis.rs | 4 ++-- apps/src/lib/config/genesis/transactions.rs | 2 +- apps/src/lib/config/genesis/utils.rs | 3 +++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index ffc5e9e420..b7e2f9b1ea 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -6779,8 +6779,9 @@ pub mod args { impl Args for InitGenesisEstablishedAccount { fn parse(matches: &ArgMatches) -> Self { + use crate::config::genesis::utils::VP_USER; let wallet_aliases = ALIAS_MANY.parse(matches); - let vp = VP.parse(matches).unwrap_or_else(|| "vp_user".to_string()); + let vp = VP.parse(matches).unwrap_or_else(|| VP_USER.to_string()); let threshold = THRESOLD.parse(matches).unwrap_or(1); let output_path = PATH.parse(matches); Self { diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index b16a337972..38128e403b 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -443,7 +443,7 @@ pub fn make_dev_genesis( genesis.transactions.established_account.as_mut().unwrap(); let tx = transactions::EstablishedAccountTx { - vp: "vp_user".to_string(), + vp: utils::VP_USER.to_string(), public_keys: vec![StringEncoded::new( consensus_keypair.ref_to(), )], @@ -458,7 +458,7 @@ pub fn make_dev_genesis( let validator_account_tx = transactions::ValidatorAccountTx { address: StringEncoded::new(address.clone()), - vp: "vp_user".to_string(), + vp: utils::VP_USER.to_string(), commission_rate: Dec::new(5, 2).expect("This can't fail"), max_commission_rate_change: Dec::new(1, 2) .expect("This can't fail"), diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 94e0eefb33..46ce5496d1 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -270,7 +270,7 @@ pub fn init_validator( validator_wallet.eth_cold_key.ref_to(), ), // No custom validator VPs yet - vp: "vp_user".to_string(), + vp: utils::VP_USER.to_string(), commission_rate, max_commission_rate_change, net_address, diff --git a/apps/src/lib/config/genesis/utils.rs b/apps/src/lib/config/genesis/utils.rs index 7918f8bc5b..cfa2dc8d23 100644 --- a/apps/src/lib/config/genesis/utils.rs +++ b/apps/src/lib/config/genesis/utils.rs @@ -14,6 +14,9 @@ use tokio::sync::RwLock; use crate::wallet::CliWalletUtils; +/// Validity predicaty assigned to established accounts. +pub const VP_USER: &str = "vp_user"; + pub fn read_toml( path: &Path, which_file: &str, From 9d6ed9f48c5a310e3b14ae3518ec9e1d3e7f74b7 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 12:54:06 +0000 Subject: [PATCH 145/175] Convert some static strs to consts --- apps/src/lib/wallet/defaults.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/wallet/defaults.rs b/apps/src/lib/wallet/defaults.rs index 19c8eda366..7f5a92c03b 100644 --- a/apps/src/lib/wallet/defaults.rs +++ b/apps/src/lib/wallet/defaults.rs @@ -176,6 +176,13 @@ mod dev { VALIDATOR_WALLET.consensus_key.clone() } + /// The name of a file that is unique to the project's root directory. + const PROJECT_ROOT_UNIQUE_FILE: &str = "rust-toolchain.toml"; + + /// The pre-genesis directory of `validator-0`. + const VALIDATOR_0_PREGENESIS_DIR: &str = + "genesis/localnet/src/pre-genesis/validator-0"; + lazy_static! { static ref PREGENESIS_WALLET: Wallet = { let mut root_dir = std::env::current_dir() @@ -183,7 +190,7 @@ mod dev { .canonicalize() .expect("Current directory should exist"); // Find the project root dir - while !root_dir.join("rust-toolchain.toml").exists() { + while !root_dir.join(PROJECT_ROOT_UNIQUE_FILE).exists() { root_dir.pop(); } let path = root_dir.join("genesis/localnet/src/pre-genesis"); @@ -196,11 +203,11 @@ mod dev { .canonicalize() .expect("Current directory should exist"); // Find the project root dir - while !root_dir.join("rust-toolchain.toml").exists() { + while !root_dir.join(PROJECT_ROOT_UNIQUE_FILE).exists() { root_dir.pop(); } let path = - root_dir.join("genesis/localnet/src/pre-genesis/validator-0"); + root_dir.join(VALIDATOR_0_PREGENESIS_DIR); crate::wallet::pre_genesis::load(&path).unwrap() }; } From b3e90088184a5fc35539dbdd84726d7cf8818806 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 12:55:28 +0000 Subject: [PATCH 146/175] Fix typo --- apps/src/lib/config/genesis/transactions.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 46ce5496d1..6bc4692ab9 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -108,7 +108,7 @@ fn get_tx_to_sign(tag: impl AsRef, data: impl BorshSerialize) -> Tx { salt: [0; 8], data: data.serialize_to_vec(), }); - let pk = get_sentinnel_pubkey(); + let pk = get_sentinel_pubkey(); tx.add_wrapper( Fee { amount_per_gas_unit: Default::default(), @@ -124,7 +124,7 @@ fn get_tx_to_sign(tag: impl AsRef, data: impl BorshSerialize) -> Tx { /// Get a dummy public key. #[inline] -fn get_sentinnel_pubkey() -> common::PublicKey { +fn get_sentinel_pubkey() -> common::PublicKey { common::SecretKey::Ed25519(ed25519::SigScheme::from_bytes([0; 32])).ref_to() } @@ -708,7 +708,7 @@ impl Signed { account_public_keys_map: Some(pks.iter().cloned().collect()), public_keys: pks.clone(), threshold, - fee_payer: get_sentinnel_pubkey(), + fee_payer: get_sentinel_pubkey(), }; let mut tx = self.data.tx_to_sign(); @@ -737,7 +737,7 @@ impl Signed { _parts: HashSet, _user: (), ) -> Result { - if pubkey == get_sentinnel_pubkey() { + if pubkey == get_sentinel_pubkey() { Ok(tx) } else { Err(namada_sdk::error::Error::Other(format!( From a0194c76a17ab1daf781f295efd611c2c01f1640 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 13:13:03 +0000 Subject: [PATCH 147/175] Use a Unix epoch as a pre-genesis tx timestamp --- apps/src/lib/config/genesis/transactions.rs | 13 ++++++++----- core/src/types/time.rs | 10 ++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 6bc4692ab9..9fb2aedc2e 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -23,7 +23,7 @@ use namada::proto::{ use namada::types::address::nam; use namada::types::dec::Dec; use namada::types::key::{common, ed25519, RefTo, SigScheme}; -use namada::types::time::{DateTimeUtc, MIN_UTC}; +use namada::types::time::DateTimeUtc; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; use namada::types::transaction::{pos, Fee, TxType}; @@ -47,9 +47,6 @@ use crate::wallet::CliWalletUtils; /// Dummy chain id used to sign [`Tx`] objects at pre-genesis. const NAMADA_GENESIS_TX_CHAIN_ID: &str = "namada-genesis"; -/// Timestamp used to sign pre-genesis [`Tx`] objects. -pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; - /// Helper trait to fetch tx data to sign. pub trait TxToSign { /// Return tx data to sign. @@ -94,11 +91,17 @@ fn get_tx_args(use_device: bool) -> TxArgs { } } +/// Timestamp used to sign pre-genesis [`Tx`] objects. +#[inline] +fn pre_genesis_tx_timestamp() -> DateTimeUtc { + DateTimeUtc::unix_epoch() +} + /// Return a ready to sign genesis [`Tx`]. fn get_tx_to_sign(tag: impl AsRef, data: impl BorshSerialize) -> Tx { let mut tx = Tx::from_type(TxType::Raw); tx.header.chain_id = ChainId(NAMADA_GENESIS_TX_CHAIN_ID.to_string()); - tx.header.timestamp = PRE_GENESIS_TX_TIMESTAMP; + tx.header.timestamp = pre_genesis_tx_timestamp(); tx.set_code(Code { salt: [0; 8], code: Commitment::Hash(Default::default()), diff --git a/core/src/types/time.rs b/core/src/types/time.rs index 99ddd25d6d..ddce370061 100644 --- a/core/src/types/time.rs +++ b/core/src/types/time.rs @@ -152,6 +152,16 @@ impl DateTimeUtc { Self(Utc::now()) } + /// Returns a [`DateTimeUtc`] corresponding to the Unix epoch. + #[inline] + pub fn unix_epoch() -> Self { + Self(chrono::DateTime::from_utc( + chrono::NaiveDateTime::from_timestamp_opt(0, 0) + .expect("This operation should be infallible"), + chrono::Utc, + )) + } + /// Returns an rfc3339 string or an error. pub fn to_rfc3339(&self) -> String { chrono::DateTime::to_rfc3339(&self.0) From b7d07137d7fddac9145c94ccc2b823c8665a0144 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 13:36:19 +0000 Subject: [PATCH 148/175] Revert "Use a Unix epoch as a pre-genesis tx timestamp" This reverts commit b6b2a04ee4c69d2bcb8a84d4c2f88895b36d9db5. --- apps/src/lib/config/genesis/transactions.rs | 13 +++++-------- core/src/types/time.rs | 10 ---------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 9fb2aedc2e..6bc4692ab9 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -23,7 +23,7 @@ use namada::proto::{ use namada::types::address::nam; use namada::types::dec::Dec; use namada::types::key::{common, ed25519, RefTo, SigScheme}; -use namada::types::time::DateTimeUtc; +use namada::types::time::{DateTimeUtc, MIN_UTC}; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; use namada::types::transaction::{pos, Fee, TxType}; @@ -47,6 +47,9 @@ use crate::wallet::CliWalletUtils; /// Dummy chain id used to sign [`Tx`] objects at pre-genesis. const NAMADA_GENESIS_TX_CHAIN_ID: &str = "namada-genesis"; +/// Timestamp used to sign pre-genesis [`Tx`] objects. +pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; + /// Helper trait to fetch tx data to sign. pub trait TxToSign { /// Return tx data to sign. @@ -91,17 +94,11 @@ fn get_tx_args(use_device: bool) -> TxArgs { } } -/// Timestamp used to sign pre-genesis [`Tx`] objects. -#[inline] -fn pre_genesis_tx_timestamp() -> DateTimeUtc { - DateTimeUtc::unix_epoch() -} - /// Return a ready to sign genesis [`Tx`]. fn get_tx_to_sign(tag: impl AsRef, data: impl BorshSerialize) -> Tx { let mut tx = Tx::from_type(TxType::Raw); tx.header.chain_id = ChainId(NAMADA_GENESIS_TX_CHAIN_ID.to_string()); - tx.header.timestamp = pre_genesis_tx_timestamp(); + tx.header.timestamp = PRE_GENESIS_TX_TIMESTAMP; tx.set_code(Code { salt: [0; 8], code: Commitment::Hash(Default::default()), diff --git a/core/src/types/time.rs b/core/src/types/time.rs index ddce370061..99ddd25d6d 100644 --- a/core/src/types/time.rs +++ b/core/src/types/time.rs @@ -152,16 +152,6 @@ impl DateTimeUtc { Self(Utc::now()) } - /// Returns a [`DateTimeUtc`] corresponding to the Unix epoch. - #[inline] - pub fn unix_epoch() -> Self { - Self(chrono::DateTime::from_utc( - chrono::NaiveDateTime::from_timestamp_opt(0, 0) - .expect("This operation should be infallible"), - chrono::Utc, - )) - } - /// Returns an rfc3339 string or an error. pub fn to_rfc3339(&self) -> String { chrono::DateTime::to_rfc3339(&self.0) From 508f0aec909b0ae2de16fba203d48ccfc81741d8 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 15:29:49 +0000 Subject: [PATCH 149/175] Genesis bond subcmd --- apps/src/lib/cli.rs | 68 +++++++++++++++++++++ apps/src/lib/cli/client.rs | 3 + apps/src/lib/client/utils.rs | 24 ++++++++ apps/src/lib/config/genesis.rs | 49 ++++++++------- apps/src/lib/config/genesis/transactions.rs | 17 ++++++ 5 files changed, 139 insertions(+), 22 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index b7e2f9b1ea..2d645ce25c 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2180,6 +2180,7 @@ pub mod cmds { ValidateWasm(ValidateWasm), InitNetwork(InitNetwork), DeriveGenesisAddresses(DeriveGenesisAddresses), + GenesisBond(GenesisBond), InitGenesisEstablishedAccount(InitGenesisEstablishedAccount), InitGenesisValidator(InitGenesisValidator), PkToTmAddress(PkToTmAddress), @@ -2203,6 +2204,8 @@ pub mod cmds { SubCmd::parse(matches).map(Self::InitNetwork); let derive_addresses = SubCmd::parse(matches).map(Self::DeriveGenesisAddresses); + let genesis_bond = + SubCmd::parse(matches).map(Self::GenesisBond); let init_established = SubCmd::parse(matches) .map(Self::InitGenesisEstablishedAccount); let init_genesis = @@ -2221,6 +2224,7 @@ pub mod cmds { .or(validate_wasm) .or(init_network) .or(derive_addresses) + .or(genesis_bond) .or(init_established) .or(init_genesis) .or(pk_to_tm_address) @@ -2239,6 +2243,7 @@ pub mod cmds { .subcommand(ValidateWasm::def()) .subcommand(InitNetwork::def()) .subcommand(DeriveGenesisAddresses::def()) + .subcommand(GenesisBond::def()) .subcommand(InitGenesisEstablishedAccount::def()) .subcommand(InitGenesisValidator::def()) .subcommand(PkToTmAddress::def()) @@ -2372,6 +2377,25 @@ pub mod cmds { } } + #[derive(Clone, Debug)] + pub struct GenesisBond(pub args::GenesisBond); + + impl SubCmd for GenesisBond { + const CMD: &'static str = "genesis-bond"; + + fn parse(matches: &ArgMatches) -> Option { + matches + .subcommand_matches(Self::CMD) + .map(|matches| Self(args::GenesisBond::parse(matches))) + } + + fn def() -> App { + App::new(Self::CMD) + .about("Bond to a validator at pre-genesis.") + .add_args::() + } + } + #[derive(Clone, Debug)] pub struct InitGenesisValidator(pub args::InitGenesisValidator); @@ -2925,6 +2949,7 @@ pub mod args { use super::utils::*; use super::{ArgGroup, ArgMatches}; use crate::client::utils::PRE_GENESIS_DIR; + use crate::config::genesis::GenesisAddress; use crate::config::{self, Action, ActionAtHeight}; use crate::facade::tendermint::Timeout; use crate::facade::tendermint_config::net::Address as TendermintAddress; @@ -3027,16 +3052,20 @@ pub mod args { denom: NATIVE_MAX_DECIMAL_PLACES.into(), }), ); + pub const GENESIS_BOND_SOURCE: ArgOpt = arg_opt("source"); pub const GENESIS_PATH: Arg = arg("genesis-path"); pub const GENESIS_TIME: Arg = arg("genesis-time"); pub const GENESIS_VALIDATOR: ArgOpt = arg("genesis-validator").opt(); + pub const GENESIS_VALIDATOR_ADDRESS: Arg = + arg("validator"); pub const HALT_ACTION: ArgFlag = flag("halt"); pub const HASH_LIST: Arg = arg("hash-list"); pub const HD_WALLET_DERIVATION_PATH: ArgDefault = arg_default("hd-path", DefaultFn(|| "default".to_string())); pub const HISTORIC: ArgFlag = flag("historic"); pub const IBC_TRANSFER_MEMO_PATH: ArgOpt = arg_opt("memo-path"); + pub const INPUT_OPT: ArgOpt = arg_opt("input"); pub const LEDGER_ADDRESS_ABOUT: &str = "Address of a ledger node as \"{scheme}://{host}:{port}\". If the \ scheme is not supplied, it is assumed to be TCP."; @@ -6813,6 +6842,45 @@ pub mod args { } } + #[derive(Clone, Debug)] + pub struct GenesisBond { + pub source: GenesisAddress, + pub validator: EstablishedAddress, + pub bond_amount: token::DenominatedAmount, + pub output: PathBuf, + } + + impl Args for GenesisBond { + fn parse(matches: &ArgMatches) -> Self { + let validator = GENESIS_VALIDATOR_ADDRESS.parse(matches); + let source = + GENESIS_BOND_SOURCE.parse(matches).unwrap_or_else(|| { + GenesisAddress::EstablishedAddress(validator.clone()) + }); + let bond_amount = AMOUNT.parse(matches); + let output = PATH.parse(matches); + Self { + source, + validator, + bond_amount, + output, + } + } + + fn def(app: App) -> App { + app.arg(GENESIS_VALIDATOR_ADDRESS.def().help("Validator address.")) + .arg(AMOUNT.def().help("Amount of tokens to stake in a bond.")) + .arg(GENESIS_BOND_SOURCE.def().help( + "Source address for delegations. For self-bonds, the \ + validator is also the source.", + )) + .arg( + PATH.def() + .help("Output toml file to write transactions to."), + ) + } + } + #[derive(Clone, Debug)] pub struct InitGenesisValidator { pub alias: String, diff --git a/apps/src/lib/cli/client.rs b/apps/src/lib/cli/client.rs index 7acaf70e3d..b0a7287197 100644 --- a/apps/src/lib/cli/client.rs +++ b/apps/src/lib/cli/client.rs @@ -634,6 +634,9 @@ impl CliApi { Utils::InitNetwork(InitNetwork(args)) => { utils::init_network(global_args, args) } + Utils::GenesisBond(GenesisBond(args)) => { + utils::genesis_bond(args) + } Utils::DeriveGenesisAddresses(DeriveGenesisAddresses(args)) => { utils::derive_genesis_addresses(global_args, args) } diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index 2015d91aeb..faa6a249b5 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -730,6 +730,30 @@ pub fn init_genesis_established_account( println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); } +/// Bond to a validator at pre-genesis. +pub fn genesis_bond(args: args::GenesisBond) { + let args::GenesisBond { + source, + validator, + bond_amount, + output: toml_path, + } = args; + let txs = genesis::transactions::init_bond(source, validator, bond_amount); + + let toml_path_str = toml_path.to_string_lossy(); + + let genesis_part = toml::to_string(&txs).unwrap(); + fs::write(&toml_path, genesis_part).unwrap_or_else(|err| { + eprintln!( + "Couldn't write pre-genesis transactions file to {toml_path_str}. \ + Failed with: {err}", + ); + safe_exit(1) + }); + + println!("{}: {toml_path_str}", "Wrote genesis tx to".bold()); +} + /// Initialize genesis validator's address, consensus key and validator account /// key into a special "pre-genesis" wallet. pub fn init_genesis_validator( diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index 38128e403b..f7da635257 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -7,6 +7,7 @@ pub mod utils; use std::collections::{BTreeMap, HashMap}; use std::fmt::{Display, Formatter}; +use std::str::FromStr; use borsh::{BorshDeserialize, BorshSerialize}; use derivative::Derivative; @@ -82,8 +83,6 @@ impl<'de> Deserialize<'de> for GenesisAddress { where D: serde::Deserializer<'de>, { - use std::str::FromStr; - struct FieldVisitor; impl<'de> serde::de::Visitor<'de> for FieldVisitor { @@ -99,25 +98,8 @@ impl<'de> Deserialize<'de> for GenesisAddress { where E: serde::de::Error, { - // Try to deserialize a PK first - let maybe_pk = - StringEncoded::::from_str(value); - match maybe_pk { - Ok(pk) => Ok(GenesisAddress::PublicKey(pk)), - Err(_) => { - // If that doesn't work, attempt to retrieve - // an established address - let address = Address::from_str(value) - .map_err(serde::de::Error::custom)?; - if let Address::Established(established) = address { - Ok(GenesisAddress::EstablishedAddress(established)) - } else { - Err(serde::de::Error::custom( - "expected an established address or public key", - )) - } - } - } + GenesisAddress::from_str(value) + .map_err(serde::de::Error::custom) } } @@ -136,6 +118,30 @@ impl Display for GenesisAddress { } } +impl FromStr for GenesisAddress { + type Err = String; + + fn from_str(value: &str) -> Result { + // Try to deserialize a PK first + let maybe_pk = StringEncoded::::from_str(value); + match maybe_pk { + Ok(pk) => Ok(GenesisAddress::PublicKey(pk)), + Err(_) => { + // If that doesn't work, attempt to retrieve + // an established address + let address = + Address::from_str(value).map_err(|err| err.to_string())?; + if let Address::Established(established) = address { + Ok(GenesisAddress::EstablishedAddress(established)) + } else { + Err("expected an established address or public key" + .to_string()) + } + } + } + } +} + #[derive(Debug, BorshSerialize, BorshDeserialize)] #[borsh(init=init)] pub struct Genesis { @@ -308,7 +314,6 @@ pub fn make_dev_genesis( target_chain_dir: std::path::PathBuf, ) -> Finalized { use std::net::{IpAddr, Ipv4Addr, SocketAddr}; - use std::str::FromStr; use std::time::Duration; use namada::ledger::eth_bridge::{Contracts, UpgradeableContract}; diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 6bc4692ab9..e582451bc6 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -234,6 +234,23 @@ pub fn init_established_account( (address, txs) } +/// Create a [`BondTx`] for a genesis validator. +pub fn init_bond( + source: GenesisAddress, + validator: EstablishedAddress, + bond_amount: token::DenominatedAmount, +) -> UnsignedTransactions { + let unsigned_tx = BondTx { + source, + validator: Address::Established(validator), + amount: bond_amount, + }; + UnsignedTransactions { + bond: Some(vec![unsigned_tx]), + ..Default::default() + } +} + /// Create [`UnsignedTransactions`] for a genesis validator. pub fn init_validator( GenesisValidatorData { From 0e6c434982a2aa065133eb7f94003ef081d3dd5a Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 15:41:40 +0000 Subject: [PATCH 150/175] Set new pre-genesis txs timestamp --- apps/src/lib/config/genesis/transactions.rs | 17 ++++++++++++----- core/src/types/time.rs | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index e582451bc6..991692e79b 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -23,7 +23,7 @@ use namada::proto::{ use namada::types::address::nam; use namada::types::dec::Dec; use namada::types::key::{common, ed25519, RefTo, SigScheme}; -use namada::types::time::{DateTimeUtc, MIN_UTC}; +use namada::types::time::DateTimeUtc; use namada::types::token; use namada::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; use namada::types::transaction::{pos, Fee, TxType}; @@ -47,9 +47,6 @@ use crate::wallet::CliWalletUtils; /// Dummy chain id used to sign [`Tx`] objects at pre-genesis. const NAMADA_GENESIS_TX_CHAIN_ID: &str = "namada-genesis"; -/// Timestamp used to sign pre-genesis [`Tx`] objects. -pub const PRE_GENESIS_TX_TIMESTAMP: DateTimeUtc = MIN_UTC; - /// Helper trait to fetch tx data to sign. pub trait TxToSign { /// Return tx data to sign. @@ -94,11 +91,21 @@ fn get_tx_args(use_device: bool) -> TxArgs { } } +/// Timestamp used to sign pre-genesis [`Tx`] objects. +#[inline] +fn pre_genesis_tx_timestamp() -> DateTimeUtc { + DateTimeUtc::from_unix_timestamp( + // Mon Jan 01 2001 01:01:01 UTC+0000 + 978310861, + ) + .unwrap() +} + /// Return a ready to sign genesis [`Tx`]. fn get_tx_to_sign(tag: impl AsRef, data: impl BorshSerialize) -> Tx { let mut tx = Tx::from_type(TxType::Raw); tx.header.chain_id = ChainId(NAMADA_GENESIS_TX_CHAIN_ID.to_string()); - tx.header.timestamp = PRE_GENESIS_TX_TIMESTAMP; + tx.header.timestamp = pre_genesis_tx_timestamp(); tx.set_code(Code { salt: [0; 8], code: Commitment::Hash(Default::default()), diff --git a/core/src/types/time.rs b/core/src/types/time.rs index 99ddd25d6d..f82c9e0fe4 100644 --- a/core/src/types/time.rs +++ b/core/src/types/time.rs @@ -152,6 +152,22 @@ impl DateTimeUtc { Self(Utc::now()) } + /// Returns a [`DateTimeUtc`] corresponding to the provided Unix timestamp. + #[inline] + pub fn from_unix_timestamp(timestamp: i64) -> Option { + Some(Self(chrono::DateTime::from_utc( + chrono::NaiveDateTime::from_timestamp_opt(timestamp, 0)?, + chrono::Utc, + ))) + } + + /// Returns a [`DateTimeUtc`] corresponding to the Unix epoch. + #[inline] + pub fn unix_epoch() -> Self { + Self::from_unix_timestamp(0) + .expect("This operation should be infallible") + } + /// Returns an rfc3339 string or an error. pub fn to_rfc3339(&self) -> String { chrono::DateTime::to_rfc3339(&self.0) From f54d5385a105890b91d6b33a751965a1140a9008 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 15:47:08 +0000 Subject: [PATCH 151/175] Fix localnet template sigs --- genesis/localnet/src/pre-genesis/signed-transactions.toml | 2 +- .../src/pre-genesis/validator-0/signed-transactions.toml | 4 ++-- genesis/localnet/transactions.toml | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/genesis/localnet/src/pre-genesis/signed-transactions.toml b/genesis/localnet/src/pre-genesis/signed-transactions.toml index 1fd02da9ff..3c7191f212 100644 --- a/genesis/localnet/src/pre-genesis/signed-transactions.toml +++ b/genesis/localnet/src/pre-genesis/signed-transactions.toml @@ -19,4 +19,4 @@ validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "20000" [bond.signatures] -tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qqrhz8puehekzc4960f322f2nm9vn9r47wavvqs33f6vv6uerycj8e2x89ljzmuyekn7rfg6enchhn2s0wm2r6czlhep5kj0an5ll4qqqkkgqz" +tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qq48ks6ta5hmsl9z3nwvqdl0g30g7qdkxwzel9j7eyvye9a99aw2sy03ukykgz49pksmw2s640nrl2xw0h5mq7srz2pw4fxljyp77lg9tqdr29" diff --git a/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml b/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml index c3a9a6ec8c..679d74ff7e 100644 --- a/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml +++ b/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml @@ -34,7 +34,7 @@ authorization = "signam1q8pmqdqcqh9v8djeqlrzy4mv845v9harnm9u5z54nwlrhwkyvc9y79sv email = "null@null.net" [validator_account.signatures] -tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qzxx53nx6tptrfp2qhr2du8lmlvhyrxuvcp3razw0yqha45redp7nqsx09d45jads34ecrny5mj2fplru9vyq8ghttksczj86vqx2tg0kwk2f9" +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qz3ylgxm3sr9d68ktwf078vt89dn9v8xj0c7tnytevnsd0v29kh6wmnqsfxd5mke8nrdlwve850l3uwcquxw2e7nltqt8eufds6ns6cqfzastc" [[bond]] source = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" @@ -42,4 +42,4 @@ validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "100000" [bond.signatures] -tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qrzf2xg5m2hudxc7p0zjnnzlnfrlsjkt5j0wpesw9le2nn7u4sgr3y8s9sr7xs5yzs5qt5fhmtmp2j5cmfr8ulzz2rhwmqzfslry56cymvurrg" +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qpe7tlwcl4xdnm67sra9cfc3754mnyvgpxxcdzrz7nuev3lhhv6ngsrhw0cwmumnkjc2f67prx82v650x9gvl609zg7ekspph8unzhs9dkz0st" diff --git a/genesis/localnet/transactions.toml b/genesis/localnet/transactions.toml index 76526a2ca6..3a292cbcf3 100644 --- a/genesis/localnet/transactions.toml +++ b/genesis/localnet/transactions.toml @@ -41,7 +41,7 @@ authorization = "signam1q8pmqdqcqh9v8djeqlrzy4mv845v9harnm9u5z54nwlrhwkyvc9y79sv email = "null@null.net" [validator_account.signatures] -tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qzxx53nx6tptrfp2qhr2du8lmlvhyrxuvcp3razw0yqha45redp7nqsx09d45jads34ecrny5mj2fplru9vyq8ghttksczj86vqx2tg0kwk2f9" +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qz3ylgxm3sr9d68ktwf078vt89dn9v8xj0c7tnytevnsd0v29kh6wmnqsfxd5mke8nrdlwve850l3uwcquxw2e7nltqt8eufds6ns6cqfzastc" [[bond]] source = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" @@ -49,7 +49,7 @@ validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "100000" [bond.signatures] -tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qrzf2xg5m2hudxc7p0zjnnzlnfrlsjkt5j0wpesw9le2nn7u4sgr3y8s9sr7xs5yzs5qt5fhmtmp2j5cmfr8ulzz2rhwmqzfslry56cymvurrg" +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qpe7tlwcl4xdnm67sra9cfc3754mnyvgpxxcdzrz7nuev3lhhv6ngsrhw0cwmumnkjc2f67prx82v650x9gvl609zg7ekspph8unzhs9dkz0st" # 2. @@ -74,4 +74,4 @@ validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "20000" [bond.signatures] -tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qqrhz8puehekzc4960f322f2nm9vn9r47wavvqs33f6vv6uerycj8e2x89ljzmuyekn7rfg6enchhn2s0wm2r6czlhep5kj0an5ll4qqqkkgqz" +tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qq48ks6ta5hmsl9z3nwvqdl0g30g7qdkxwzel9j7eyvye9a99aw2sy03ukykgz49pksmw2s640nrl2xw0h5mq7srz2pw4fxljyp77lg9tqdr29" From 14639f1b2f2cdeb950f42224f5c36e461f9a5d0b Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 16:40:02 +0000 Subject: [PATCH 152/175] Denominate amounts before signing them --- apps/src/lib/config/genesis/templates.rs | 2 +- apps/src/lib/config/genesis/transactions.rs | 45 ++++++++++++--------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/apps/src/lib/config/genesis/templates.rs b/apps/src/lib/config/genesis/templates.rs index fb374c4866..62209dd24d 100644 --- a/apps/src/lib/config/genesis/templates.rs +++ b/apps/src/lib/config/genesis/templates.rs @@ -524,7 +524,7 @@ pub struct Validated {} pub trait TemplateValidation: Serialize { type Amount: for<'a> Deserialize<'a> + Serialize - + Into + + Into + Clone + std::fmt::Debug + BorshSerialize diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 991692e79b..a21759ab10 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -878,7 +878,9 @@ where TX_BOND_WASM, pos::Bond { validator: self.validator.clone(), - amount: self.amount.clone().into(), + amount: denominate_amount::(self.amount.clone()) + .unwrap() + .amount, source: Some(self.source.address()), }, ) @@ -924,29 +926,36 @@ where impl BondTx { /// Add the correct denomination to the contained amount pub fn denominate(self) -> eyre::Result> { - let BondTx { - source, - validator, - amount, - } = self; - let amount = amount - .increase_precision(NATIVE_MAX_DECIMAL_PLACES.into()) - .map_err(|e| { - eprintln!( - "A bond amount in the transactions.toml file was \ - incorrectly formatted:\n{}", - e - ); - e - })?; + let amount = denominate_amount::(self.amount)?; Ok(BondTx { - source, - validator, + source: self.source, + validator: self.validator, amount, }) } } +/// Return the correctly denominated amount of bonded tokens +fn denominate_amount( + amount: T::Amount, +) -> eyre::Result +where + T: TemplateValidation, +{ + let amount = amount + .into() + .increase_precision(NATIVE_MAX_DECIMAL_PLACES.into()) + .map_err(|e| { + eprintln!( + "A bond amount in the transactions.toml file was incorrectly \ + formatted:\n{}", + e + ); + e + })?; + Ok(amount) +} + impl From> for SignedBondTx { #[inline] fn from(bond: BondTx) -> Self { From 1ba67ec9cb8ac5c79de19749ab38f289a9d9072d Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Tue, 5 Dec 2023 16:45:28 +0000 Subject: [PATCH 153/175] Fix signatures once again --- genesis/localnet/src/pre-genesis/signed-transactions.toml | 2 +- .../src/pre-genesis/validator-0/signed-transactions.toml | 2 +- genesis/localnet/transactions.toml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/genesis/localnet/src/pre-genesis/signed-transactions.toml b/genesis/localnet/src/pre-genesis/signed-transactions.toml index 3c7191f212..2337fc7845 100644 --- a/genesis/localnet/src/pre-genesis/signed-transactions.toml +++ b/genesis/localnet/src/pre-genesis/signed-transactions.toml @@ -19,4 +19,4 @@ validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "20000" [bond.signatures] -tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qq48ks6ta5hmsl9z3nwvqdl0g30g7qdkxwzel9j7eyvye9a99aw2sy03ukykgz49pksmw2s640nrl2xw0h5mq7srz2pw4fxljyp77lg9tqdr29" +tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qpnkmht38f4ewksnu2e4kaue9vqynvujs7hghk358rjn5wt6ywm9zdet6m3txrh08qzc5up47vgskt7cz48dpqlpuan7waz7prlxe0sxn9zsn7" diff --git a/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml b/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml index 679d74ff7e..90c00d639c 100644 --- a/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml +++ b/genesis/localnet/src/pre-genesis/validator-0/signed-transactions.toml @@ -42,4 +42,4 @@ validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "100000" [bond.signatures] -tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qpe7tlwcl4xdnm67sra9cfc3754mnyvgpxxcdzrz7nuev3lhhv6ngsrhw0cwmumnkjc2f67prx82v650x9gvl609zg7ekspph8unzhs9dkz0st" +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qp7jrgg0q488vm3m4yzt8c44e40kaklc08fvsktwuayw69wzjgsvr9zlqs60wml5ewpnm8yydg0g5kga76zm3xmtcxauxszftrv7l9cpalu82v" diff --git a/genesis/localnet/transactions.toml b/genesis/localnet/transactions.toml index 3a292cbcf3..49c07a000e 100644 --- a/genesis/localnet/transactions.toml +++ b/genesis/localnet/transactions.toml @@ -49,7 +49,7 @@ validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "100000" [bond.signatures] -tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qpe7tlwcl4xdnm67sra9cfc3754mnyvgpxxcdzrz7nuev3lhhv6ngsrhw0cwmumnkjc2f67prx82v650x9gvl609zg7ekspph8unzhs9dkz0st" +tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj = "signam1qp7jrgg0q488vm3m4yzt8c44e40kaklc08fvsktwuayw69wzjgsvr9zlqs60wml5ewpnm8yydg0g5kga76zm3xmtcxauxszftrv7l9cpalu82v" # 2. @@ -74,4 +74,4 @@ validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" amount = "20000" [bond.signatures] -tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qq48ks6ta5hmsl9z3nwvqdl0g30g7qdkxwzel9j7eyvye9a99aw2sy03ukykgz49pksmw2s640nrl2xw0h5mq7srz2pw4fxljyp77lg9tqdr29" +tpknam1qrnw8mxyqlj60mykgevnldcj5mg2fya7fs5a8xqdkd2gwtxhef0zy8a2wha = "signam1qpnkmht38f4ewksnu2e4kaue9vqynvujs7hghk358rjn5wt6ywm9zdet6m3txrh08qzc5up47vgskt7cz48dpqlpuan7waz7prlxe0sxn9zsn7" From 2deefdacab4836e17bf9ed334daf8277bc5010bc Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 09:20:46 +0000 Subject: [PATCH 154/175] Output unsigned established account txs struct --- apps/src/lib/config/genesis/transactions.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index a21759ab10..a7ceeb24fd 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -227,14 +227,14 @@ pub fn init_established_account( vp: String, public_keys: Vec>, threshold: u8, -) -> (Address, Transactions) { +) -> (Address, UnsignedTransactions) { let unsigned_tx = EstablishedAccountTx { vp, threshold, public_keys, }; let address = unsigned_tx.derive_address(); - let txs = Transactions { + let txs = UnsignedTransactions { established_account: Some(vec![unsigned_tx]), ..Default::default() }; From 2d1288f3af7e8bcdf55b5bf76a024c1695de9b7b Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 10:59:27 +0000 Subject: [PATCH 155/175] Improve genesis tx signing's janky code --- apps/src/lib/client/utils.rs | 156 ++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 76 deletions(-) diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index faa6a249b5..e09701a6c0 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -985,6 +985,58 @@ pub fn validate_genesis_templates( } } +async fn append_signature_to_signed_toml( + input_txs: &Path, + wallet: &mut Wallet, + use_device: bool, +) -> genesis::transactions::Transactions { + // Parse signed txs toml to append new signatures to + let mut genesis_txs = genesis::templates::read_transactions(input_txs) + .unwrap_or_else(|_| { + eprintln!( + "Unable to parse the TOML from path: {}", + input_txs.to_string_lossy() + ); + safe_exit(1) + }); + // Sign bond txs and append signatures to toml file + if let Some(txs) = genesis_txs.bond { + let mut bonds = vec![]; + for tx in txs { + bonds.push( + sign_delegation_bond_tx( + tx, + wallet, + &genesis_txs.established_account, + use_device, + ) + .await, + ); + } + genesis_txs.bond = Some(bonds); + } + // Sign validator txs and append signatures to toml file + if let Some(txs) = genesis_txs.validator_account { + let mut validator_accounts = vec![]; + for tx in txs { + validator_accounts.push( + sign_validator_account_tx( + Either::Right(tx), + wallet, + genesis_txs.established_account.as_ref().expect( + "Established account txs required when signing \ + validator account txs", + ), + use_device, + ) + .await, + ); + } + genesis_txs.validator_account = Some(validator_accounts); + } + genesis_txs +} + /// Sign genesis transactions. pub async fn sign_genesis_tx( global_args: args::Global, @@ -1009,82 +1061,36 @@ pub async fn sign_genesis_tx( ); safe_exit(1) }); - let (signed, append) = - match genesis::transactions::parse_unsigned(&contents) { - Ok(unsigned) => ( - genesis::transactions::sign_txs( - unsigned, - &mut wallet, - maybe_pre_genesis_wallet.as_ref(), - use_device, - ) - .await, - true, - ), - Err(err) => { - let mut genesis_txs = - genesis::templates::read_transactions(&path) - .unwrap_or_else(|e| { - eprintln!( - "Unable to parse the TOML from {}. Could not \ - parse as unsigned with {err}. Could not \ - parse as signed with {e}.", - path.to_string_lossy() - ); - safe_exit(1) - }); - // Sign bond txs - if let Some(txs) = genesis_txs.bond { - let mut bonds = vec![]; - for tx in txs { - bonds.push( - sign_delegation_bond_tx( - tx, - &mut wallet, - &genesis_txs.established_account, - use_device, - ) - .await, - ); - } - genesis_txs.bond = Some(bonds); - } - // Sign validator txs - if let Some(txs) = genesis_txs.validator_account { - let mut validator_accounts = vec![]; - for tx in txs { - validator_accounts.push( - sign_validator_account_tx( - Either::Right(tx), - &mut wallet, - genesis_txs - .established_account - .as_ref() - .expect( - "Established account txs required \ - when signing validator account txs", - ), - use_device, - ) - .await, - ); - } - genesis_txs.validator_account = Some(validator_accounts); - } - (genesis_txs, false) - } - }; + // Sign a subset of the input txs (the ones whose keys we own) + let signed = if let Ok(unsigned) = + genesis::transactions::parse_unsigned(&contents) + { + let signed = genesis::transactions::sign_txs( + unsigned, + &mut wallet, + maybe_pre_genesis_wallet.as_ref(), + use_device, + ) + .await; + if let Some(output_path) = output.as_ref() { + // If the output path contains existing signed txs, we append + // the newly signed txs to the file + let mut prev_txs = + genesis::templates::read_transactions(output_path) + .unwrap_or_default(); + prev_txs.merge(signed); + prev_txs + } else { + signed + } + } else { + // In case we fail to parse unsigned txs, we will attempt to + // parse signed txs and append new signatures to the existing + // toml file + append_signature_to_signed_toml(&path, &mut wallet, use_device).await + }; match output { Some(output_path) => { - let signed = if append { - let mut prev_txs = - genesis::templates::read_transactions(&output_path) - .unwrap_or_default(); - prev_txs.merge(signed); - prev_txs - } else { - signed - }; let transactions = toml::to_vec(&signed).unwrap(); fs::write(&output_path, transactions).unwrap_or_else(|err| { eprintln!( @@ -1100,8 +1106,6 @@ pub async fn sign_genesis_tx( } None => { let transactions = toml::to_string(&signed).unwrap(); - println!("Your public signed transactions TOML:"); - println!(); println!("{transactions}"); } } From 6a53201f6dbddde86ea82ba403f97202d35d3c05 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 11:08:50 +0000 Subject: [PATCH 156/175] Check if two pubkeys are used for the same established acc --- apps/src/lib/config/genesis/transactions.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index a7ceeb24fd..482d305013 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -1250,6 +1250,19 @@ pub fn validate_established_account( ); is_valid = false; } + { + // check for duped pubkeys + let mut used_keys = HashSet::new(); + for key in tx.public_keys.iter() { + if !used_keys.insert(key) { + eprintln!( + "The same public key has been used twice in an \ + established account tx: {key}" + ); + is_valid = false; + } + } + } established_accounts.insert( established_address.clone(), ( From ab2244754be8c5d048299981525738c17a28e2fd Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 11:24:25 +0000 Subject: [PATCH 157/175] Change aliases arg --- apps/src/lib/cli.rs | 11 +++++------ apps/src/lib/cli/utils.rs | 3 ++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 2d645ce25c..c1b7b82eda 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2958,7 +2958,7 @@ pub mod args { pub const ALIAS_OPT: ArgOpt = ALIAS.opt(); pub const ALIAS: Arg = arg("alias"); pub const ALIAS_FORCE: ArgFlag = flag("alias-force"); - pub const ALIAS_MANY: ArgMulti = arg_multi("alias"); + pub const ALIAS_MANY: ArgMulti = arg_multi("aliases"); pub const ALLOW_DUPLICATE_IP: ArgFlag = flag("allow-duplicate-ip"); pub const AMOUNT: Arg = arg("amount"); pub const ARCHIVE_DIR: ArgOpt = arg_opt("archive-dir"); @@ -6822,11 +6822,10 @@ pub mod args { } fn def(app: App) -> App { - app.arg( - ALIAS_MANY - .def() - .help("The aliases of the keys to use from the wallet."), - ) + app.arg(ALIAS_MANY.def().help( + "Comma separated list of aliases of the keys to use from the \ + wallet.", + )) .arg(THRESOLD.def().help( "The minimum number of signatures to be provided for \ authorization. Must be less than or equal to the maximum \ diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index 1a92f97770..eaad2937d1 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -297,7 +297,8 @@ where pub fn def(&self) -> ClapArg { ClapArg::new(self.name) .long(self.name) - .action(ArgAction::Append) + .num_args(1..) + .value_delimiter(',') } pub fn parse(&self, matches: &ArgMatches) -> Vec { From 605bea0ef4405abff3287818e63839cddfc2c44e Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 11:27:13 +0000 Subject: [PATCH 158/175] Fix e2e test setup --- tests/src/e2e/setup.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/e2e/setup.rs b/tests/src/e2e/setup.rs index af810670b2..6c041b67a0 100644 --- a/tests/src/e2e/setup.rs +++ b/tests/src/e2e/setup.rs @@ -200,7 +200,7 @@ where let args = vec![ "utils", "init-genesis-established-account", - "--alias", + "--aliases", &alias, "--path", &pre_genesis_tx_path_str, From 763392a82855d73ae66a144cee46c8d82f63801a Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 11:44:58 +0000 Subject: [PATCH 159/175] Fix bug in cli arg multi --- apps/src/lib/cli/utils.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index eaad2937d1..143227572d 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -252,7 +252,10 @@ where pub fn parse(&self, matches: &ArgMatches) -> Vec> { matches .get_many(self.name) - .unwrap_or_default() + .unwrap_or_else(|| { + eprintln!("Missing at least one argument to `--{}`", self.name); + safe_exit(1) + }) .map(|raw: &String| FromContext::new(raw.to_string())) .collect() } @@ -304,7 +307,10 @@ where pub fn parse(&self, matches: &ArgMatches) -> Vec { matches .get_many(self.name) - .unwrap_or_default() + .unwrap_or_else(|| { + eprintln!("Missing at least one argument to `--{}`", self.name); + safe_exit(1) + }) .map(|raw: &String| { raw.parse().unwrap_or_else(|e| { eprintln!( From 4ec49f2a647d39461bdf133a0a35145b56d61073 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 13:11:39 +0000 Subject: [PATCH 160/175] Revert "Fix bug in cli arg multi" This reverts commit 284b2a0cb62090d3701968e2065d90e96bca3597. --- apps/src/lib/cli/utils.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index 143227572d..eaad2937d1 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -252,10 +252,7 @@ where pub fn parse(&self, matches: &ArgMatches) -> Vec> { matches .get_many(self.name) - .unwrap_or_else(|| { - eprintln!("Missing at least one argument to `--{}`", self.name); - safe_exit(1) - }) + .unwrap_or_default() .map(|raw: &String| FromContext::new(raw.to_string())) .collect() } @@ -307,10 +304,7 @@ where pub fn parse(&self, matches: &ArgMatches) -> Vec { matches .get_many(self.name) - .unwrap_or_else(|| { - eprintln!("Missing at least one argument to `--{}`", self.name); - safe_exit(1) - }) + .unwrap_or_default() .map(|raw: &String| { raw.parse().unwrap_or_else(|e| { eprintln!( From f9d855d8b8127be43526704d22b6e1e6b684f230 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 13:29:37 +0000 Subject: [PATCH 161/175] Add some lobsters or something --- apps/src/lib/cli.rs | 12 ++-- apps/src/lib/cli/utils.rs | 132 ++++++++++++++++++++++++++------------ 2 files changed, 99 insertions(+), 45 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index c1b7b82eda..96b53d8c95 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -2958,7 +2958,7 @@ pub mod args { pub const ALIAS_OPT: ArgOpt = ALIAS.opt(); pub const ALIAS: Arg = arg("alias"); pub const ALIAS_FORCE: ArgFlag = flag("alias-force"); - pub const ALIAS_MANY: ArgMulti = arg_multi("aliases"); + pub const ALIAS_MANY: ArgMulti = arg_multi("aliases"); pub const ALLOW_DUPLICATE_IP: ArgFlag = flag("allow-duplicate-ip"); pub const AMOUNT: Arg = arg("amount"); pub const ARCHIVE_DIR: ArgOpt = arg_opt("archive-dir"); @@ -3106,7 +3106,8 @@ pub mod args { pub const PROTOCOL_KEY: ArgOpt = arg_opt("protocol-key"); pub const PRE_GENESIS_PATH: ArgOpt = arg_opt("pre-genesis-path"); pub const PUBLIC_KEY: Arg = arg("public-key"); - pub const PUBLIC_KEYS: ArgMulti = arg_multi("public-keys"); + pub const PUBLIC_KEYS: ArgMulti = + arg_multi("public-keys"); pub const PROPOSAL_ID: Arg = arg("proposal-id"); pub const PROPOSAL_ID_OPT: ArgOpt = arg_opt("proposal-id"); pub const PROPOSAL_VOTE_PGF_OPT: ArgOpt = arg_opt("pgf"); @@ -3129,8 +3130,9 @@ pub mod args { pub const SIGNER: ArgOpt = arg_opt("signer"); pub const SIGNING_KEY_OPT: ArgOpt = SIGNING_KEY.opt(); pub const SIGNING_KEY: Arg = arg("signing-key"); - pub const SIGNING_KEYS: ArgMulti = arg_multi("signing-keys"); - pub const SIGNATURES: ArgMulti = arg_multi("signatures"); + pub const SIGNING_KEYS: ArgMulti = + arg_multi("signing-keys"); + pub const SIGNATURES: ArgMulti = arg_multi("signatures"); pub const SOURCE: Arg = arg("source"); pub const SOURCE_OPT: ArgOpt = SOURCE.opt(); pub const STEWARD: Arg = arg("steward"); @@ -3154,7 +3156,7 @@ pub mod args { pub const VALIDATOR_OPT: ArgOpt = VALIDATOR.opt(); pub const VALIDATOR_ACCOUNT_KEY: ArgOpt = arg_opt("account-key"); - pub const VALIDATOR_ACCOUNT_KEYS: ArgMulti = + pub const VALIDATOR_ACCOUNT_KEYS: ArgMulti = arg_multi("account-keys"); pub const VALIDATOR_CONSENSUS_KEY: ArgOpt = arg_opt("consensus-key"); diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index eaad2937d1..b0a6493a2b 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -28,6 +28,14 @@ const RELAYER_KEY_ENV_VAR: &str = "NAMADA_RELAYER_KEY"; pub type App = clap::Command; pub type ClapArg = clap::Arg; +/// Mode of operation og [`ArgMulti`] where zero or +/// more arguments may be present (i.e. `*`). +pub enum GlobStar {} + +/// Mode of operation og [`ArgMulti`] where at least +/// one argument must be present (i.e. `+`). +pub enum GlobPlus {} + pub trait Cmd: Sized { fn add_sub(app: App) -> App; fn parse(matches: &ArgMatches) -> Option; @@ -93,9 +101,9 @@ pub struct ArgFlag { } #[allow(dead_code)] -pub struct ArgMulti { +pub struct ArgMulti { pub name: &'static str, - pub r#type: PhantomData, + pub r#type: PhantomData<(T, K)>, } pub const fn arg(name: &'static str) -> Arg { @@ -138,8 +146,7 @@ pub const fn flag(name: &'static str) -> ArgFlag { ArgFlag { name } } -#[allow(dead_code)] -pub const fn arg_multi(name: &'static str) -> ArgMulti { +pub const fn arg_multi(name: &'static str) -> ArgMulti { ArgMulti { name, r#type: PhantomData, @@ -163,7 +170,15 @@ impl Arg { } #[allow(dead_code)] - pub const fn multi(self) -> ArgMulti { + pub const fn multi_glob_star(self) -> ArgMulti { + ArgMulti { + name: self.name, + r#type: PhantomData, + } + } + + #[allow(dead_code)] + pub const fn multi_glob_plus(self) -> ArgMulti { ArgMulti { name: self.name, r#type: PhantomData, @@ -237,18 +252,20 @@ where } } -impl ArgMulti> -where - T: FromStr, - ::Err: Debug, -{ +impl ArgMulti { pub fn def(&self) -> ClapArg { ClapArg::new(self.name) .long(self.name) .num_args(1..) .value_delimiter(',') } +} +impl ArgMulti, GlobStar> +where + T: FromStr, + ::Err: Debug, +{ pub fn parse(&self, matches: &ArgMatches) -> Vec> { matches .get_many(self.name) @@ -258,53 +275,58 @@ where } } -impl ArgDefaultFromCtx> +impl ArgMulti, GlobPlus> where T: FromStr, ::Err: Debug, { - pub fn def(&self) -> ClapArg { - ClapArg::new(self.name).long(self.name).num_args(1) - } - - pub fn parse(&self, matches: &ArgMatches) -> FromContext { - let raw = parse_opt(matches, self.name).unwrap_or_else(|| { - let DefaultFn(default) = self.default; - default() - }); - FromContext::new(raw) + pub fn parse(&self, matches: &ArgMatches) -> Vec> { + matches + .get_many(self.name) + .unwrap_or_else(|| { + eprintln!("Missing at least one argument to `--{}`", self.name); + safe_exit(1) + }) + .map(|raw: &String| FromContext::new(raw.to_string())) + .collect() } } -impl ArgFlag { - pub fn def(&self) -> ClapArg { - ClapArg::new(self.name) - .long(self.name) - .action(ArgAction::SetTrue) - } - - pub fn parse(&self, matches: &ArgMatches) -> bool { - matches.get_flag(self.name) +impl ArgMulti +where + T: FromStr, + ::Err: Debug, +{ + pub fn parse(&self, matches: &ArgMatches) -> Vec { + matches + .get_many(self.name) + .unwrap_or_default() + .map(|raw: &String| { + raw.parse().unwrap_or_else(|e| { + eprintln!( + "Failed to parse the {} argument. Raw value: {}, \ + error: {:?}", + self.name, raw, e + ); + safe_exit(1) + }) + }) + .collect() } } -#[allow(dead_code)] -impl ArgMulti +impl ArgMulti where T: FromStr, ::Err: Debug, { - pub fn def(&self) -> ClapArg { - ClapArg::new(self.name) - .long(self.name) - .num_args(1..) - .value_delimiter(',') - } - pub fn parse(&self, matches: &ArgMatches) -> Vec { matches .get_many(self.name) - .unwrap_or_default() + .unwrap_or_else(|| { + eprintln!("Missing at least one argument to `--{}`", self.name); + safe_exit(1) + }) .map(|raw: &String| { raw.parse().unwrap_or_else(|e| { eprintln!( @@ -319,6 +341,36 @@ where } } +impl ArgDefaultFromCtx> +where + T: FromStr, + ::Err: Debug, +{ + pub fn def(&self) -> ClapArg { + ClapArg::new(self.name).long(self.name).num_args(1) + } + + pub fn parse(&self, matches: &ArgMatches) -> FromContext { + let raw = parse_opt(matches, self.name).unwrap_or_else(|| { + let DefaultFn(default) = self.default; + default() + }); + FromContext::new(raw) + } +} + +impl ArgFlag { + pub fn def(&self) -> ClapArg { + ClapArg::new(self.name) + .long(self.name) + .action(ArgAction::SetTrue) + } + + pub fn parse(&self, matches: &ArgMatches) -> bool { + matches.get_flag(self.name) + } +} + /// Extensions for defining commands and arguments. /// Every function here should have a matcher in [`ArgMatchesExt`]. pub trait AppExt { From c4af96a4ce312b4bcc990e51b50e471d53298a92 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 14:30:53 +0000 Subject: [PATCH 162/175] Make pre-genesis a global arg --- apps/src/lib/bench_utils.rs | 1 + apps/src/lib/cli.rs | 156 ++++-------------- apps/src/lib/cli/context.rs | 11 +- apps/src/lib/cli/wallet.rs | 71 +++----- .../lib/node/ledger/shell/testing/client.rs | 1 + sdk/src/args.rs | 38 ----- tests/src/integration/setup.rs | 1 + 7 files changed, 63 insertions(+), 216 deletions(-) diff --git a/apps/src/lib/bench_utils.rs b/apps/src/lib/bench_utils.rs index e0df703dd3..e122ad3ad1 100644 --- a/apps/src/lib/bench_utils.rs +++ b/apps/src/lib/bench_utils.rs @@ -748,6 +748,7 @@ impl Default for BenchShieldedCtx { wallet.save().unwrap(); let ctx = Context::new::(crate::cli::args::Global { + is_pre_genesis: false, chain_id: Some(shell.inner.chain_id.clone()), base_dir, wasm_dir: Some(WASM_DIR.into()), diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 96b53d8c95..9e4a5c7c30 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -670,7 +670,7 @@ pub mod cmds { GenPayAddr(MaspGenPayAddr), GenSpendKey(MaspGenSpendKey), AddAddrKey(MaspAddAddrKey), - ListPayAddrs(MaspListPayAddrs), + ListPayAddrs, ListKeys(MaspListKeys), FindAddrKey(MaspFindAddrKey), } @@ -683,7 +683,8 @@ pub mod cmds { let genpa = SubCmd::parse(matches).map(Self::GenPayAddr); let gensk = SubCmd::parse(matches).map(Self::GenSpendKey); let addak = SubCmd::parse(matches).map(Self::AddAddrKey); - let listpa = SubCmd::parse(matches).map(Self::ListPayAddrs); + let listpa = ::parse(matches) + .map(|_| Self::ListPayAddrs); let listsk = SubCmd::parse(matches).map(Self::ListKeys); let findak = SubCmd::parse(matches).map(Self::FindAddrKey); gensk.or(genpa).or(addak).or(listpa).or(listsk).or(findak) @@ -750,21 +751,18 @@ pub mod cmds { /// List all known payment addresses #[derive(Clone, Debug)] - pub struct MaspListPayAddrs(pub args::MaspListPayAddrs); + pub struct MaspListPayAddrs; impl SubCmd for MaspListPayAddrs { const CMD: &'static str = "list-addrs"; fn parse(matches: &ArgMatches) -> Option { - matches - .subcommand_matches(Self::CMD) - .map(|matches| Self(args::MaspListPayAddrs::parse(matches))) + matches.subcommand_matches(Self::CMD).map(|_| Self) } fn def() -> App { App::new(Self::CMD) .about("Lists all payment addresses in the wallet") - .add_args::() } } @@ -835,7 +833,7 @@ pub mod cmds { Gen(AddressGen), Derive(AddressDerive), Find(AddressOrAliasFind), - List(AddressList), + List, Add(AddressAdd), } @@ -847,7 +845,8 @@ pub mod cmds { let gen = SubCmd::parse(matches).map(Self::Gen); let restore = SubCmd::parse(matches).map(Self::Derive); let find = SubCmd::parse(matches).map(Self::Find); - let list = SubCmd::parse(matches).map(Self::List); + let list = + ::parse(matches).map(|_| Self::List); let add = SubCmd::parse(matches).map(Self::Add); gen.or(restore).or(find).or(list).or(add) }) @@ -943,21 +942,17 @@ pub mod cmds { /// List known addresses #[derive(Clone, Debug)] - pub struct AddressList(pub args::AddressList); + pub struct AddressList; impl SubCmd for AddressList { const CMD: &'static str = "list"; fn parse(matches: &ArgMatches) -> Option { - matches - .subcommand_matches(Self::CMD) - .map(|matches| Self(args::AddressList::parse(matches))) + matches.subcommand_matches(Self::CMD).map(|_| Self) } fn def() -> App { - App::new(Self::CMD) - .about("List all known addresses.") - .add_args::() + App::new(Self::CMD).about("List all known addresses.") } } @@ -3181,6 +3176,7 @@ pub mod args { /// Global command arguments #[derive(Clone, Debug)] pub struct Global { + pub is_pre_genesis: bool, pub chain_id: Option, pub base_dir: PathBuf, pub wasm_dir: Option, @@ -3189,10 +3185,12 @@ pub mod args { impl Global { /// Parse global arguments pub fn parse(matches: &ArgMatches) -> Self { + let is_pre_genesis = PRE_GENESIS.parse(matches); let chain_id = CHAIN_ID_OPT.parse(matches); let base_dir = BASE_DIR.parse(matches); let wasm_dir = WASM_DIR.parse(matches); Global { + is_pre_genesis, chain_id, base_dir, wasm_dir, @@ -3219,6 +3217,11 @@ pub mod args { `NAMADA_WASM_DIR` environment variable, but the argument \ takes precedence, if specified.", )) + .arg( + PRE_GENESIS + .def() + .help("Dispatch pre-genesis specific logic."), + ) } } @@ -6121,13 +6124,11 @@ pub mod args { let alias = ALIAS.parse(matches); let alias_force = ALIAS_FORCE.parse(matches); let value = MASP_VALUE.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); let unsafe_dont_encrypt = UNSAFE_DONT_ENCRYPT.parse(matches); Self { alias, alias_force, value, - is_pre_genesis, unsafe_dont_encrypt, } } @@ -6146,10 +6147,6 @@ pub mod args { .def() .help("A spending key, viewing key, or payment address."), ) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) .arg(UNSAFE_DONT_ENCRYPT.def().help( "UNSAFE: Do not encrypt the keypair. Do not use this for keys \ used in a live network.", @@ -6161,12 +6158,10 @@ pub mod args { fn parse(matches: &ArgMatches) -> Self { let alias = ALIAS.parse(matches); let alias_force = ALIAS_FORCE.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); let unsafe_dont_encrypt = UNSAFE_DONT_ENCRYPT.parse(matches); Self { alias, alias_force, - is_pre_genesis, unsafe_dont_encrypt, } } @@ -6180,10 +6175,6 @@ pub mod args { .arg(ALIAS_FORCE.def().help( "Override the alias without confirmation if it already exists.", )) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) .arg(UNSAFE_DONT_ENCRYPT.def().help( "UNSAFE: Do not encrypt the keypair. Do not use this for keys \ used in a live network.", @@ -6208,20 +6199,20 @@ pub mod args { safe_exit(1) }) }; - let viewing_key = if self.is_pre_genesis || ctx.chain.is_none() { - let wallet_path = - ctx.global_args.base_dir.join(PRE_GENESIS_DIR); - let mut wallet = crate::wallet::load_or_new(&wallet_path); - find_viewing_key(&mut wallet) - } else { - find_viewing_key(&mut ctx.borrow_mut_chain_or_exit().wallet) - }; + let viewing_key = + if ctx.global_args.is_pre_genesis || ctx.chain.is_none() { + let wallet_path = + ctx.global_args.base_dir.join(PRE_GENESIS_DIR); + let mut wallet = crate::wallet::load_or_new(&wallet_path); + find_viewing_key(&mut wallet) + } else { + find_viewing_key(&mut ctx.borrow_mut_chain_or_exit().wallet) + }; MaspPayAddrGen:: { alias: self.alias, alias_force: self.alias_force, viewing_key, pin: self.pin, - is_pre_genesis: self.is_pre_genesis, } } } @@ -6232,13 +6223,11 @@ pub mod args { let alias_force = ALIAS_FORCE.parse(matches); let viewing_key = VIEWING_KEY.parse(matches); let pin = PIN.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); Self { alias, alias_force, viewing_key, pin, - is_pre_genesis, } } @@ -6256,10 +6245,6 @@ pub mod args { "Require that the single transaction to this address be \ pinned.", )) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) } } @@ -6320,14 +6305,12 @@ pub mod args { let scheme = SCHEME.parse(matches); let alias = ALIAS_OPT.parse(matches); let alias_force = ALIAS_FORCE.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); let unsafe_dont_encrypt = UNSAFE_DONT_ENCRYPT.parse(matches); let derivation_path = HD_WALLET_DERIVATION_PATH.parse(matches); Self { scheme, alias, alias_force, - is_pre_genesis, unsafe_dont_encrypt, derivation_path, } @@ -6346,10 +6329,6 @@ pub mod args { .arg(ALIAS_FORCE.def().help( "Override the alias without confirmation if it already exists.", )) - .arg(PRE_GENESIS.def().help( - "Generate a key for pre-genesis, instead of for the current \ - chain, if any.", - )) .arg(UNSAFE_DONT_ENCRYPT.def().help( "UNSAFE: Do not encrypt the keypair. Do not use this for keys \ used in a live network.", @@ -6371,14 +6350,12 @@ pub mod args { let public_key = RAW_PUBLIC_KEY_OPT.parse(matches); let alias = ALIAS_OPT.parse(matches); let value = VALUE.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); let unsafe_show_secret = UNSAFE_SHOW_SECRET.parse(matches); Self { public_key, alias, value, - is_pre_genesis, unsafe_show_secret, } } @@ -6401,10 +6378,6 @@ pub mod args { .def() .help("A public key or alias associated with the keypair."), ) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) .arg( UNSAFE_SHOW_SECRET .def() @@ -6417,11 +6390,9 @@ pub mod args { fn parse(matches: &ArgMatches) -> Self { let alias = ALIAS.parse(matches); let unsafe_show_secret = UNSAFE_SHOW_SECRET.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); Self { alias, unsafe_show_secret, - is_pre_genesis, } } @@ -6432,31 +6403,21 @@ pub mod args { .def() .help("UNSAFE: Print the spending key values."), ) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current \ - chain, if any.", - )) } } impl Args for MaspKeysList { fn parse(matches: &ArgMatches) -> Self { let decrypt = DECRYPT.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); let unsafe_show_secret = UNSAFE_SHOW_SECRET.parse(matches); Self { decrypt, - is_pre_genesis, unsafe_show_secret, } } fn def(app: App) -> App { app.arg(DECRYPT.def().help("Decrypt keys that are encrypted.")) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current \ - chain, if any.", - )) .arg( UNSAFE_SHOW_SECRET .def() @@ -6465,38 +6426,18 @@ pub mod args { } } - impl Args for MaspListPayAddrs { - fn parse(matches: &ArgMatches) -> Self { - let is_pre_genesis = PRE_GENESIS.parse(matches); - Self { is_pre_genesis } - } - - fn def(app: App) -> App { - app.arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) - } - } - impl Args for KeyList { fn parse(matches: &ArgMatches) -> Self { let decrypt = DECRYPT.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); let unsafe_show_secret = UNSAFE_SHOW_SECRET.parse(matches); Self { decrypt, - is_pre_genesis, unsafe_show_secret, } } fn def(app: App) -> App { app.arg(DECRYPT.def().help("Decrypt keys that are encrypted.")) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current \ - chain, if any.", - )) .arg( UNSAFE_SHOW_SECRET .def() @@ -6508,21 +6449,13 @@ pub mod args { impl Args for KeyExport { fn parse(matches: &ArgMatches) -> Self { let alias = ALIAS.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); - Self { - alias, - is_pre_genesis, - } + Self { alias } } fn def(app: App) -> App { app.arg( ALIAS.def().help("The alias of the key you wish to export."), ) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) } } @@ -6530,12 +6463,7 @@ pub mod args { fn parse(matches: &ArgMatches) -> Self { let alias = ALIAS_OPT.parse(matches); let address = RAW_ADDRESS_OPT.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); - Self { - alias, - address, - is_pre_genesis, - } + Self { alias, address } } fn def(app: App) -> App { @@ -6549,10 +6477,6 @@ pub mod args { .def() .help("The bech32m encoded address string."), ) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) .group( ArgGroup::new("find_flags") .args([ALIAS_OPT.name, RAW_ADDRESS_OPT.name]) @@ -6561,31 +6485,15 @@ pub mod args { } } - impl Args for AddressList { - fn parse(matches: &ArgMatches) -> Self { - let is_pre_genesis = PRE_GENESIS.parse(matches); - Self { is_pre_genesis } - } - - fn def(app: App) -> App { - app.arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) - } - } - impl Args for AddressAdd { fn parse(matches: &ArgMatches) -> Self { let alias = ALIAS.parse(matches); let alias_force = ALIAS_FORCE.parse(matches); let address = RAW_ADDRESS.parse(matches); - let is_pre_genesis = PRE_GENESIS.parse(matches); Self { alias, alias_force, address, - is_pre_genesis, } } @@ -6603,10 +6511,6 @@ pub mod args { .def() .help("The bech32m encoded address string."), ) - .arg(PRE_GENESIS.def().help( - "Use pre-genesis wallet, instead of for the current chain, if \ - any.", - )) } } diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index b17b8a34d4..51dd0c0921 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -96,13 +96,16 @@ impl Context { pub fn new(global_args: args::Global) -> Result { let global_config = read_or_try_new_global_config(&global_args); - let chain_id = std::env::var(ENV_VAR_CHAIN_ID) + let env_var_chain_id = std::env::var(ENV_VAR_CHAIN_ID) .ok() .and_then(|chain_id| ChainId::from_str(&chain_id).ok()); - let chain_id = chain_id.as_ref().or(global_args.chain_id.as_ref()); + let chain_id = env_var_chain_id + .as_ref() + .or(global_args.chain_id.as_ref()) + .or(global_config.default_chain_id.as_ref()); let chain = match chain_id { - Some(chain_id) => { + Some(chain_id) if !global_args.is_pre_genesis => { let mut config = Config::load(&global_args.base_dir, chain_id, None); let chain_dir = global_args.base_dir.join(chain_id.as_str()); @@ -138,7 +141,7 @@ impl Context { native_token, }) } - None => None, + _ => None, }; Ok(Self { diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index e8262ccfbf..6028cf067e 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -77,9 +77,7 @@ impl CliApi { cmds::WalletAddress::Find(cmds::AddressOrAliasFind(args)) => { address_or_alias_find(ctx, io, args) } - cmds::WalletAddress::List(cmds::AddressList(args)) => { - address_list(ctx, io, args) - } + cmds::WalletAddress::List => address_list(ctx, io), cmds::WalletAddress::Add(cmds::AddressAdd(args)) => { address_add(ctx, io, args) } @@ -99,9 +97,9 @@ impl CliApi { cmds::WalletMasp::AddAddrKey(cmds::MaspAddAddrKey(args)) => { address_key_add(ctx, io, args) } - cmds::WalletMasp::ListPayAddrs(cmds::MaspListPayAddrs( - args, - )) => payment_addresses_list(ctx, io, args), + cmds::WalletMasp::ListPayAddrs => { + payment_addresses_list(ctx, io) + } cmds::WalletMasp::ListKeys(cmds::MaspListKeys(args)) => { spending_keys_list(ctx, io, args) } @@ -121,10 +119,9 @@ fn address_key_find( args::AddrKeyFind { alias, unsafe_show_secret, - is_pre_genesis, }: args::AddrKeyFind, ) { - let mut wallet = load_wallet(ctx, is_pre_genesis); + let mut wallet = load_wallet(ctx); let alias = alias.to_lowercase(); if let Ok(viewing_key) = wallet.find_viewing_key(&alias) { // Check if alias is a viewing key @@ -160,11 +157,10 @@ fn spending_keys_list( io: &impl Io, args::MaspKeysList { decrypt, - is_pre_genesis, unsafe_show_secret, }: args::MaspKeysList, ) { - let wallet = load_wallet(ctx, is_pre_genesis); + let wallet = load_wallet(ctx); let known_view_keys = wallet.get_viewing_keys(); let known_spend_keys = wallet.get_spending_keys(); if known_view_keys.is_empty() { @@ -232,12 +228,8 @@ fn spending_keys_list( } /// List payment addresses. -fn payment_addresses_list( - ctx: Context, - io: &impl Io, - args::MaspListPayAddrs { is_pre_genesis }: args::MaspListPayAddrs, -) { - let wallet = load_wallet(ctx, is_pre_genesis); +fn payment_addresses_list(ctx: Context, io: &impl Io) { + let wallet = load_wallet(ctx); let known_addresses = wallet.get_payment_addrs(); if known_addresses.is_empty() { display_line!( @@ -262,11 +254,10 @@ fn spending_key_gen( args::MaspSpendKeyGen { alias, alias_force, - is_pre_genesis, unsafe_dont_encrypt, }: args::MaspSpendKeyGen, ) { - let mut wallet = load_wallet(ctx, is_pre_genesis); + let mut wallet = load_wallet(ctx); let alias = alias.to_lowercase(); let password = read_and_confirm_encryption_password(unsafe_dont_encrypt); let (alias, _key) = @@ -323,12 +314,11 @@ fn address_key_add( alias, alias_force, value, - is_pre_genesis, unsafe_dont_encrypt, }: args::MaspAddrKeyAdd, ) { let alias = alias.to_lowercase(); - let mut wallet = load_wallet(ctx, is_pre_genesis); + let mut wallet = load_wallet(ctx); let (alias, typ) = match value { MaspValue::FullViewingKey(viewing_key) => { let alias = wallet @@ -495,12 +485,11 @@ fn key_and_address_gen( scheme, alias, alias_force, - is_pre_genesis, unsafe_dont_encrypt, derivation_path, }: args::KeyAndAddressGen, ) { - let mut wallet = load_wallet(ctx, is_pre_genesis); + let mut wallet = load_wallet(ctx); let encryption_password = read_and_confirm_encryption_password(unsafe_dont_encrypt); let derivation_path = decode_derivation_path(scheme, derivation_path) @@ -551,11 +540,10 @@ fn key_find( public_key, alias, value, - is_pre_genesis, unsafe_show_secret, }: args::KeyFind, ) { - let mut wallet = load_wallet(ctx, is_pre_genesis); + let mut wallet = load_wallet(ctx); let found_keypair = match public_key { Some(pk) => wallet.find_key_by_pk(&pk, None), None => { @@ -596,11 +584,10 @@ fn key_list( io: &impl Io, args::KeyList { decrypt, - is_pre_genesis, unsafe_show_secret, }: args::KeyList, ) { - let wallet = load_wallet(ctx, is_pre_genesis); + let wallet = load_wallet(ctx); let known_public_keys = wallet.get_public_keys(); if known_public_keys.is_empty() { display_line!( @@ -663,12 +650,9 @@ fn key_list( fn key_export( ctx: Context, io: &impl Io, - args::KeyExport { - alias, - is_pre_genesis, - }: args::KeyExport, + args::KeyExport { alias }: args::KeyExport, ) { - let mut wallet = load_wallet(ctx, is_pre_genesis); + let mut wallet = load_wallet(ctx); wallet .find_secret_key(alias.to_lowercase(), None) .map(|keypair| { @@ -686,12 +670,8 @@ fn key_export( } /// List all known addresses. -fn address_list( - ctx: Context, - io: &impl Io, - args::AddressList { is_pre_genesis }: args::AddressList, -) { - let wallet = load_wallet(ctx, is_pre_genesis); +fn address_list(ctx: Context, io: &impl Io) { + let wallet = load_wallet(ctx); let known_addresses = wallet.get_addresses(); if known_addresses.is_empty() { display_line!( @@ -717,13 +697,9 @@ fn address_list( fn address_or_alias_find( ctx: Context, io: &impl Io, - args::AddressOrAliasFind { - alias, - address, - is_pre_genesis, - }: args::AddressOrAliasFind, + args::AddressOrAliasFind { alias, address }: args::AddressOrAliasFind, ) { - let wallet = load_wallet(ctx, is_pre_genesis); + let wallet = load_wallet(ctx); if address.is_some() && alias.is_some() { panic!( "This should not be happening: clap should emit its own error \ @@ -762,10 +738,9 @@ fn address_add( alias, alias_force, address, - is_pre_genesis, }: args::AddressAdd, ) { - let mut wallet = load_wallet(ctx, is_pre_genesis); + let mut wallet = load_wallet(ctx); if wallet .insert_address(alias.to_lowercase(), address, alias_force) .is_none() @@ -784,9 +759,9 @@ fn address_add( } /// Load wallet for chain when `ctx.chain.is_some()` or pre-genesis wallet when -/// `is_pre_genesis || ctx.chain.is_none()`. -fn load_wallet(ctx: Context, is_pre_genesis: bool) -> Wallet { - if is_pre_genesis || ctx.chain.is_none() { +/// `ctx.global_args.is_pre_genesis || ctx.chain.is_none()`. +fn load_wallet(ctx: Context) -> Wallet { + if ctx.global_args.is_pre_genesis || ctx.chain.is_none() { let wallet_path = ctx.global_args.base_dir.join(PRE_GENESIS_DIR); wallet::load_or_new(&wallet_path) } else { diff --git a/apps/src/lib/node/ledger/shell/testing/client.rs b/apps/src/lib/node/ledger/shell/testing/client.rs index 5e4c04b07f..3ec257710a 100644 --- a/apps/src/lib/node/ledger/shell/testing/client.rs +++ b/apps/src/lib/node/ledger/shell/testing/client.rs @@ -18,6 +18,7 @@ pub fn run( let global = { let locked = node.shell.lock().unwrap(); Global { + is_pre_genesis: false, chain_id: Some(locked.chain_id.clone()), base_dir: locked.base_dir.clone(), wasm_dir: Some(locked.wasm_dir.clone()), diff --git a/sdk/src/args.rs b/sdk/src/args.rs index 23f1643233..7dc708cc60 100644 --- a/sdk/src/args.rs +++ b/sdk/src/args.rs @@ -2047,9 +2047,6 @@ pub struct MaspAddrKeyAdd { pub alias_force: bool, /// Any MASP value pub value: MaspValue, - /// Add a MASP key / address pre-genesis instead - /// of a current chain - pub is_pre_genesis: bool, /// Don't encrypt the keypair pub unsafe_dont_encrypt: bool, } @@ -2061,8 +2058,6 @@ pub struct MaspSpendKeyGen { pub alias: String, /// Whether to force overwrite the alias pub alias_force: bool, - /// Generate spending key pre-genesis instead of a current chain - pub is_pre_genesis: bool, /// Don't encrypt the keypair pub unsafe_dont_encrypt: bool, } @@ -2078,8 +2073,6 @@ pub struct MaspPayAddrGen { pub viewing_key: C::ViewingKey, /// Pin pub pin: bool, - /// Generate an address pre-genesis instead of a current chain - pub is_pre_genesis: bool, } /// Wallet generate key and implicit address arguments @@ -2091,8 +2084,6 @@ pub struct KeyAndAddressGen { pub alias: Option, /// Whether to force overwrite the alias, if provided pub alias_force: bool, - /// Generate a key for pre-genesis, instead of a current chain - pub is_pre_genesis: bool, /// Don't encrypt the keypair pub unsafe_dont_encrypt: bool, /// BIP44 derivation path @@ -2125,8 +2116,6 @@ pub struct KeyFind { pub alias: Option, /// Public key hash to lookup keypair with pub value: Option, - /// Find a key pre-genesis instead of a current chain - pub is_pre_genesis: bool, /// Show secret keys to user pub unsafe_show_secret: bool, } @@ -2138,8 +2127,6 @@ pub struct AddrKeyFind { pub alias: String, /// Show secret keys to user pub unsafe_show_secret: bool, - /// Find shielded address / key pre-genesis instead of a current chain - pub is_pre_genesis: bool, } /// Wallet list shielded keys arguments @@ -2147,27 +2134,15 @@ pub struct AddrKeyFind { pub struct MaspKeysList { /// Don't decrypt spending keys pub decrypt: bool, - /// List shielded keys pre-genesis instead of a current chain - pub is_pre_genesis: bool, /// Show secret keys to user pub unsafe_show_secret: bool, } -/// Wallet list shielded payment addresses arguments -#[derive(Clone, Debug)] -pub struct MaspListPayAddrs { - /// List sheilded payment address pre-genesis instead - /// of a current chain - pub is_pre_genesis: bool, -} - /// Wallet list keys arguments #[derive(Clone, Debug)] pub struct KeyList { /// Don't decrypt keypairs pub decrypt: bool, - /// List keys pre-genesis instead of a current chain - pub is_pre_genesis: bool, /// Show secret keys to user pub unsafe_show_secret: bool, } @@ -2177,8 +2152,6 @@ pub struct KeyList { pub struct KeyExport { /// Key alias pub alias: String, - /// Export key pre-genesis instead of a current chain - pub is_pre_genesis: bool, } /// Wallet address lookup arguments @@ -2188,15 +2161,6 @@ pub struct AddressOrAliasFind { pub alias: Option, /// Address to find pub address: Option
          , - /// Lookup address pre-genesis instead of a current chain - pub is_pre_genesis: bool, -} - -/// List wallet address -#[derive(Clone, Debug)] -pub struct AddressList { - /// List addresses pre-genesis instead of current chain - pub is_pre_genesis: bool, } /// Wallet address add arguments @@ -2208,8 +2172,6 @@ pub struct AddressAdd { pub alias_force: bool, /// Address to add pub address: Address, - /// Add an address pre-genesis instead of current chain - pub is_pre_genesis: bool, } /// Bridge pool batch recommendation. diff --git a/tests/src/integration/setup.rs b/tests/src/integration/setup.rs index c7c2bdbb5a..828f8be112 100644 --- a/tests/src/integration/setup.rs +++ b/tests/src/integration/setup.rs @@ -70,6 +70,7 @@ pub fn initialize_genesis() -> Result<(MockNode, MockServicesController)> { // addresses and update WASM checksums let wasm_checksums_path = working_dir.join("wasm/checksums.json"); let global_args = args::Global { + is_pre_genesis: true, chain_id: Some(chain_id.clone()), base_dir: test_dir.path().to_path_buf(), wasm_dir: Some(test_dir.path().join(chain_id.as_str()).join("wasm")), From 56107eb82a51e16f9b1233bff037a6ca15b75da1 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 14:47:36 +0000 Subject: [PATCH 163/175] Tune error message on invalid chain id --- apps/src/lib/cli/context.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 51dd0c0921..4214144da3 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -197,10 +197,13 @@ impl Context { fn safe_exit_on_missing_chain_context() -> ! { eprintln!( - "No chain-id was provided. If no chain is configured, you may need to \ - run `namada client utils join-network` command. If the chain is \ - configured, set the chain id with `--chain-id ` or - via the env var `{ENV_VAR_CHAIN_ID}`." + "Failed to construct Namada chain context. If no chain is configured, \ + you may need to run `namada client utils join-network`. If the chain \ + is configured, you may need to set the chain id with `--chain-id \ + `, via the env var `{ENV_VAR_CHAIN_ID}`, or configure the \ + default chain id in the `global-config.toml` file. If you do intend \ + to run pre-genesis operations, pass the `--pre-genesis` flag as the \ + first argument to the command." ); utils::safe_exit(1) } From 24591eeaa6af569caae7f823857d7532b53fbd6d Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 14:52:53 +0000 Subject: [PATCH 164/175] Pre-genesis wallet fixes --- apps/src/lib/cli/wallet.rs | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index 6028cf067e..6846339374 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -19,7 +19,6 @@ use namada::types::masp::{MaspValue, PaymentAddress}; use namada_sdk::masp::find_valid_diversifier; use namada_sdk::wallet::{ DecryptionError, DerivationPath, DerivationPathError, FindKeyError, Wallet, - WalletIo, WalletStorage, }; use namada_sdk::{display, display_line, edisplay_line}; use rand_core::OsRng; @@ -42,12 +41,7 @@ impl CliApi { match cmd { cmds::NamadaWallet::Key(sub) => match sub { cmds::WalletKey::Derive(cmds::KeyDerive(args)) => { - key_and_address_derive( - &mut ctx.borrow_mut_chain_or_exit().wallet, - io, - args, - ) - .await + key_and_address_derive(ctx, io, args).await } cmds::WalletKey::Gen(cmds::KeyGen(args)) => { key_and_address_gen(ctx, io, args) @@ -67,12 +61,7 @@ impl CliApi { key_and_address_gen(ctx, io, args) } cmds::WalletAddress::Derive(cmds::AddressDerive(args)) => { - key_and_address_derive( - &mut ctx.borrow_mut_chain_or_exit().wallet, - io, - args, - ) - .await + key_and_address_derive(ctx, io, args).await } cmds::WalletAddress::Find(cmds::AddressOrAliasFind(args)) => { address_or_alias_find(ctx, io, args) @@ -88,11 +77,7 @@ impl CliApi { } cmds::WalletMasp::GenPayAddr(cmds::MaspGenPayAddr(args)) => { let args = args.to_sdk(&mut ctx); - payment_address_gen( - &mut ctx.borrow_mut_chain_or_exit().wallet, - io, - args, - ) + payment_address_gen(ctx, io, args) } cmds::WalletMasp::AddAddrKey(cmds::MaspAddAddrKey(args)) => { address_key_add(ctx, io, args) @@ -272,7 +257,7 @@ fn spending_key_gen( /// Generate a shielded payment address from the given key. fn payment_address_gen( - wallet: &mut Wallet, + ctx: Context, io: &impl Io, args::MaspPayAddrGen { alias, @@ -282,6 +267,7 @@ fn payment_address_gen( .. }: args::MaspPayAddrGen, ) { + let mut wallet = load_wallet(ctx); let alias = alias.to_lowercase(); let viewing_key = ExtendedFullViewingKey::from(viewing_key).fvk.vk; let (div, _g_d) = find_valid_diversifier(&mut OsRng); @@ -384,7 +370,7 @@ pub fn decode_derivation_path( /// Derives a keypair and an implicit address from the mnemonic code in the /// wallet. async fn key_and_address_derive( - wallet: &mut Wallet, + ctx: Context, io: &impl Io, args::KeyAndAddressDerive { scheme, @@ -395,6 +381,7 @@ async fn key_and_address_derive( use_device, }: args::KeyAndAddressDerive, ) { + let mut wallet = load_wallet(ctx); let derivation_path = decode_derivation_path(scheme, derivation_path) .unwrap_or_else(|err| { edisplay_line!(io, "{}", err); From ab92dfdade70154477bf77877fa42870a4565391 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Wed, 6 Dec 2023 14:55:50 +0000 Subject: [PATCH 165/175] Mandatory `--pre-genesis` flag --- apps/src/lib/cli.rs | 17 ++++++++--------- apps/src/lib/cli/wallet.rs | 4 ++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 9e4a5c7c30..b62baea563 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -6199,15 +6199,14 @@ pub mod args { safe_exit(1) }) }; - let viewing_key = - if ctx.global_args.is_pre_genesis || ctx.chain.is_none() { - let wallet_path = - ctx.global_args.base_dir.join(PRE_GENESIS_DIR); - let mut wallet = crate::wallet::load_or_new(&wallet_path); - find_viewing_key(&mut wallet) - } else { - find_viewing_key(&mut ctx.borrow_mut_chain_or_exit().wallet) - }; + let viewing_key = if ctx.global_args.is_pre_genesis { + let wallet_path = + ctx.global_args.base_dir.join(PRE_GENESIS_DIR); + let mut wallet = crate::wallet::load_or_new(&wallet_path); + find_viewing_key(&mut wallet) + } else { + find_viewing_key(&mut ctx.borrow_mut_chain_or_exit().wallet) + }; MaspPayAddrGen:: { alias: self.alias, alias_force: self.alias_force, diff --git a/apps/src/lib/cli/wallet.rs b/apps/src/lib/cli/wallet.rs index 6846339374..136d6e2683 100644 --- a/apps/src/lib/cli/wallet.rs +++ b/apps/src/lib/cli/wallet.rs @@ -746,9 +746,9 @@ fn address_add( } /// Load wallet for chain when `ctx.chain.is_some()` or pre-genesis wallet when -/// `ctx.global_args.is_pre_genesis || ctx.chain.is_none()`. +/// `ctx.global_args.is_pre_genesis`. fn load_wallet(ctx: Context) -> Wallet { - if ctx.global_args.is_pre_genesis || ctx.chain.is_none() { + if ctx.global_args.is_pre_genesis { let wallet_path = ctx.global_args.base_dir.join(PRE_GENESIS_DIR); wallet::load_or_new(&wallet_path) } else { From 3ff75cd89a190bb02830090bf22ac1d15e22b728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 6 Dec 2023 20:35:30 +0000 Subject: [PATCH 166/175] genesis: update README and update files --- genesis/localnet/README.md | 88 ++++++++++++++++--- .../src/pre-genesis/bond/bond-tx-albert.toml | 4 + .../established-account-tx-validator-0.toml | 4 - .../pre-genesis/unsigned-transactions.toml | 11 ++- 4 files changed, 83 insertions(+), 24 deletions(-) create mode 100644 genesis/localnet/src/pre-genesis/bond/bond-tx-albert.toml delete mode 100644 genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml diff --git a/genesis/localnet/README.md b/genesis/localnet/README.md index e14cfdfb61..b50087d243 100644 --- a/genesis/localnet/README.md +++ b/genesis/localnet/README.md @@ -8,9 +8,7 @@ If you're modifying any of the files here, you can run this to ensure that the c cargo watch -x "test test_validate_localnet_genesis_templates" ``` -## balances.toml - -The pre-genesis balances wallet is located at [pre-genesis/wallet.toml](pre-genesis/wallet.toml) was used to setup the [balances.toml](balances.toml) and can be re-generated from the repo's root dir with: +The pre-genesis balances wallet is located at [pre-genesis/wallet.toml](pre-genesis/wallet.toml) and can be re-generated from the repo's root dir with: ```shell cargo run --bin namadaw -- --base-dir "genesis/localnet/src" key gen \ @@ -22,46 +20,108 @@ cargo run --bin namadaw -- --base-dir "genesis/localnet/src" key gen \ cargo run --bin namadaw -- --base-dir "genesis/localnet/src" key gen \ --alias daewon --unsafe-dont-encrypt cargo run --bin namadaw -- --base-dir "genesis/localnet/src" key gen \ - --alias validator-0-balance-key --unsafe-dont-encrypt + --alias validator-0-account-key --unsafe-dont-encrypt cargo run --bin namadaw -- --base-dir "genesis/localnet/src" key gen \ --alias faucet-key --unsafe-dont-encrypt ``` -The [balances.toml file](balances.toml) contains token balances associated with the public keys. The public keys from the wallet can be found with: +Some keys are used to setup established accounts and some are directly assigned balances in the [balances.toml](#balancestoml) file to implicit addresses derived from these keys. + +## transactions.toml + +### Transaction to initialize an established account + +For example, Albert's account is created with: ```shell -cargo run --bin namadaw -- --base-dir "genesis/localnet/src" key list +cargo run --bin namadac -- --base-dir "genesis/localnet/src" utils \ + init-genesis-established-account \ + --path "genesis/localnet/src/pre-genesis/established/established-account-tx-albert.toml" \ + --aliases "albert-key" ``` -## transactions.toml +Note that the command will print out your `Derived established account address`. + +### Validator transactions -The pre-genesis validator wallet used to generate [validator transactions for transactions.toml](src/pre-genesis/validator-0/transactions.toml) is located at [src/pre-genesis/validator-0/validator-wallet.toml](src/pre-genesis/validator-0/validator-wallet.toml) and can be re-generated from the repo's root dir with: +To create a validator's account, first initialize an established account: + +```shell +cargo run --bin namadac -- --base-dir "genesis/localnet/src" utils \ + init-genesis-established-account \ + --path "genesis/localnet/src/pre-genesis/validator-0/unsigned-transactions.toml" \ + --aliases "validator-0-account-key" +``` + +The `Derived established account address` and the transaction added to the TOML file from this command is used in the following command. + +The pre-genesis validator wallet used to generate [validator transactions for transactions.toml](src/pre-genesis/validator-0/transactions.toml) is located at [src/pre-genesis/validator-0/validator-wallet.toml](src/pre-genesis/validator-0/validator-wallet.toml) and can be re-generated: ```shell cargo run --bin namadac -- --base-dir "genesis/localnet/src" utils \ init-genesis-validator \ - --source validator-0-balance-key \ --alias validator-0 \ + --address tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx \ + --path "genesis/localnet/src/pre-genesis/validator-0/unsigned-transactions.toml" \ --net-address "127.0.0.1:27656" \ --commission-rate 0.05 \ --max-commission-rate-change 0.01 \ --email "null@null.net" \ - --transfer-from-source-amount 200000 \ --self-bond-amount 100000 \ --unsafe-dont-encrypt ``` -The rest of the transactions are generated from [src/pre-genesis/unsigned-transactions.toml](src/pre-genesis/unsigned-transactions.toml) using: +### Delegations + +A delegation with e.g. 20 000 NAM tokens to a validator account whose address has to be known beforehand (here the validator-0 created above) is created with: + +```shell +cargo run --bin namadac -- --base-dir "genesis/localnet/src" utils \ + genesis-bond \ + --validator tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx \ + --amount 20000 \ + --path "genesis/localnet/src/pre-genesis/bond/bond-tx-albert.toml" +``` + +### Signing + +The non-validator transactions are manually appended together in [src/pre-genesis/unsigned-transactions.toml](src/pre-genesis/unsigned-transactions.toml) and then signed to produce [src/pre-genesis/signed-transactions.toml](src/pre-genesis/signed-transactions.toml) using: ```shell cargo run --bin namadac -- --base-dir "genesis/localnet/src" utils \ - sign-genesis-tx \ + sign-genesis-txs \ --path "genesis/localnet/src/pre-genesis/unsigned-transactions.toml" \ --output "genesis/localnet/src/pre-genesis/signed-transactions.toml" ``` -This command produces [src/pre-genesis/signed-transactions.toml](src/pre-genesis/signed-transactions.toml), which is then concatenated in [transactions.toml](transactiosn.toml) with the validator transactions. +The validator transactions are signed using (note the extra `--alias` argument needed to find the validator pre-genesis wallet): + +```shell +cargo run --bin namadac -- --base-dir "genesis/localnet/src" utils \ + sign-genesis-txs \ + --path "genesis/localnet/src/pre-genesis/validator-0/unsigned-transactions.toml" \ + --output "genesis/localnet/src/validator-0/signed-transactions.toml" + --alias validator-0 +``` + +This non-validator [src/pre-genesis/signed-transactions.toml](src/pre-genesis/signed-transactions.toml) are joined together with [src/validator-0/signed-transactions.toml](src/validator-0/signed-transactions.toml) in [transactions.toml](transactions.toml). + +## balances.toml + +The [balances.toml file](balances.toml) contains token balances associated with public keys or established addresses which can be derived from genesis transactions. The public keys from the wallet can be found with: + +```shell +cargo run --bin namadaw -- --base-dir "genesis/localnet/src" key list +``` + +If you didn't note the address from your transactions, you can deterministically derive an established address from the TOML file again, run with the `--path` set to a transaction TOML file: + +```shell +cargo run --bin namadac -- --base-dir "genesis/localnet/src" utils \ + derive-genesis-addresses \ + --path "genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml" +``` ## Validation -A unit test `test_localnet_genesis_templates` is setup to check validity of the localnet setup. +A unit test `test_validate_localnet_genesis_templates` is setup to check validity of the localnet setup. diff --git a/genesis/localnet/src/pre-genesis/bond/bond-tx-albert.toml b/genesis/localnet/src/pre-genesis/bond/bond-tx-albert.toml new file mode 100644 index 0000000000..73b2960a07 --- /dev/null +++ b/genesis/localnet/src/pre-genesis/bond/bond-tx-albert.toml @@ -0,0 +1,4 @@ +[[bond]] +source = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +validator = "tnam1q9vhfdur7gadtwx4r223agpal0fvlqhywylf2mzx" +amount = "20000" diff --git a/genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml b/genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml deleted file mode 100644 index 562ffd2ba0..0000000000 --- a/genesis/localnet/src/pre-genesis/established/established-account-tx-validator-0.toml +++ /dev/null @@ -1,4 +0,0 @@ -[[established_account]] -vp = "vp_user" -threshold = 1 -public_keys = ["tpknam1qpg2tsrplvhu3fd7z7tq5ztc2ne3s7e2ahjl2a2cddufrzdyr752g666ytj"] diff --git a/genesis/localnet/src/pre-genesis/unsigned-transactions.toml b/genesis/localnet/src/pre-genesis/unsigned-transactions.toml index c1f290bec5..32dc9fff47 100644 --- a/genesis/localnet/src/pre-genesis/unsigned-transactions.toml +++ b/genesis/localnet/src/pre-genesis/unsigned-transactions.toml @@ -1,15 +1,14 @@ # This file contains hand-written unsigned transactions for localnet with: # -# - MASP account -# - Faucet account that allows anyone to withdraw limited amount of tokens -# - 2 established accounts for "Albert" and "Bertha" +# - 3 established accounts for "Albert", "Bertha" and "Christel" +# - a bond from "Albert"'s established account to validator-0 # -# Note that 2 more localnet user accounts "Christel" and "Daewon" are left as -# implicit accounts, so their tokens are kept in the accounts derived from their +# Note that 1 localnet user account "Daewon" is left as +# implicit account, so their tokens are kept in the accounts derived from their # keys used in `balances.toml`. # # This file is used to produce `signed-transactions.toml` with -# the `sign-genesis-tx` command. +# the `sign-genesis-txs` command. # Albert [[established_account]] From ce7f498ad0aab34381e8055939937b620ec2b9d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 6 Dec 2023 20:36:07 +0000 Subject: [PATCH 167/175] genesis: update starter README --- genesis/starter/README.md | 66 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/genesis/starter/README.md b/genesis/starter/README.md index 258eca8a9a..3d39fa6ca4 100644 --- a/genesis/starter/README.md +++ b/genesis/starter/README.md @@ -37,8 +37,38 @@ The public key can then be given some tokens in the [balances.toml file](balance tpknam1qz5ywdn47sdm8s7rkzjl5dud0k9c9ndd5agn4gu0u0ryrmtmyuxmk0h25th = 1_337_707.50 ``` +## Established accounts + +For example, an established account can be created with: + +```shell +namada client utils \ + init-genesis-established-account \ + --path "{acc_tx_file}.toml" \ + --aliases "{key_aliases_from_wallet}" +``` + +For a multisig also specify a value for `--threshold` (defaults to 1 for single-signature accounts). + +The command will print out a `Derived established account address`. It can be derived from the file again: + +```shell +namada client utils \ + derive-genesis-addresses \ + --path "{acc_tx_file}.toml" +``` + ## Validator accounts +To create a validator's account, first initialize an established account: + +```shell +namada client utils \ + init-genesis-established-account \ + --path "{validator_txs_file}.toml" \ + --aliases "{key_aliases_from_wallet}" +``` + For this step, you'll need to have a key with some native [token balance](#token-balances), from which you can sign the validator account creation genesis transaction. To generate a new validator pre-genesis wallet and produce signed transactions with it, use e.g.: @@ -46,8 +76,9 @@ To generate a new validator pre-genesis wallet and produce signed transactions w ```shell namada client utils \ init-genesis-validator \ - --source "my-key" \ --alias "my-validator" \ + --address "{address_derived_from_previous_cmd}" \ + --path "{validator_txs_file}.toml" \ --net-address "127.0.0.1:26656" \ --commission-rate 0.05 \ --max-commission-rate-change 0.01 \ @@ -57,6 +88,39 @@ namada client utils \ This will print the validator transactions that can be added to the [transactions.toml file](transactions.toml). +## Delegations + +A delegation with native tokens to a validator account whose address has to be known beforehand is created with: + +```shell +namada client utils \ + genesis-bond \ + --validator "{validator_address}" \ + --amount {amount} \ + --path "{bond_tx_file}.toml" +``` + +## Signing + +Non-validator transactions can be signed using: + +```shell +namada client utils \ + sign-genesis-txs \ + --path "{tx_file}.toml" \ + --output "{signed_tx_file}.toml" +``` + +Validator transactions require an extra `--alias` argument to find the validator pre-genesis wallet: + +```shell +namada client utils \ + sign-genesis-txs \ + --path "{validator_txs_file}.toml" \ + --output "{signed_validator_txs_file}.toml" + --alias my-validator +``` + ## Initialize the chain This is sufficient minimal configuration to initialize the chain with the single genesis validator. All that's left is to pick a chain ID prefix and genesis time: From 6df5ae644b7e0506f8caa57c85ba0d14f4c25791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 6 Dec 2023 20:36:19 +0000 Subject: [PATCH 168/175] benches: fix the default validator key for signing txs --- apps/src/lib/wallet/defaults.rs | 9 +++++++-- benches/vps.rs | 12 ++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/src/lib/wallet/defaults.rs b/apps/src/lib/wallet/defaults.rs index 7f5a92c03b..e632fe6269 100644 --- a/apps/src/lib/wallet/defaults.rs +++ b/apps/src/lib/wallet/defaults.rs @@ -4,8 +4,8 @@ pub use dev::{ addresses, albert_address, albert_keypair, bertha_address, bertha_keypair, christel_address, christel_keypair, daewon_address, daewon_keypair, - ester_address, ester_keypair, keys, tokens, validator_address, - validator_keypair, validator_keys, + ester_address, ester_keypair, keys, tokens, validator_account_keypair, + validator_address, validator_keypair, validator_keys, }; #[cfg(any(test, feature = "testing", feature = "benches"))] @@ -176,6 +176,11 @@ mod dev { VALIDATOR_WALLET.consensus_key.clone() } + /// Get the validator account keypair from the wallet. + pub fn validator_account_keypair() -> common::SecretKey { + get_unencrypted_keypair("validator-0-account-key") + } + /// The name of a file that is unique to the project's root directory. const PROJECT_ROOT_UNIQUE_FILE: &str = "rust-toolchain.toml"; diff --git a/benches/vps.rs b/benches/vps.rs index 366887d1fa..f5a035e542 100644 --- a/benches/vps.rs +++ b/benches/vps.rs @@ -341,7 +341,7 @@ fn vp_validator(c: &mut Criterion) { }, None, None, - vec![&defaults::validator_keypair()], + vec![&defaults::validator_account_keypair()], ); let received_transfer = shell.generate_tx( @@ -371,7 +371,7 @@ fn vp_validator(c: &mut Criterion) { .finalize_reset() .into(), )), - public_keys: vec![defaults::validator_keypair().to_public()], + public_keys: vec![defaults::validator_account_keypair().to_public()], threshold: None, }; let vp = shell.generate_tx( @@ -379,7 +379,7 @@ fn vp_validator(c: &mut Criterion) { data, None, Some(vec![extra_section]), - vec![&defaults::validator_keypair()], + vec![&defaults::validator_account_keypair()], ); let commission_rate = shell.generate_tx( @@ -390,7 +390,7 @@ fn vp_validator(c: &mut Criterion) { }, None, None, - vec![&defaults::validator_keypair()], + vec![&defaults::validator_account_keypair()], ); let vote = shell.generate_tx( @@ -403,7 +403,7 @@ fn vp_validator(c: &mut Criterion) { }, None, None, - vec![&defaults::validator_keypair()], + vec![&defaults::validator_account_keypair()], ); let pos = shell.generate_tx( @@ -415,7 +415,7 @@ fn vp_validator(c: &mut Criterion) { }, None, None, - vec![&defaults::validator_keypair()], + vec![&defaults::validator_account_keypair()], ); for (signed_tx, bench_name) in [ From c7e2b423695f567aed17bf68c28a37d887e3ef12 Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 6 Dec 2023 16:46:17 -0500 Subject: [PATCH 169/175] small grammar fixes --- apps/src/lib/cli/utils.rs | 4 ++-- apps/src/lib/client/tx.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/src/lib/cli/utils.rs b/apps/src/lib/cli/utils.rs index b0a6493a2b..0f50a0926a 100644 --- a/apps/src/lib/cli/utils.rs +++ b/apps/src/lib/cli/utils.rs @@ -28,11 +28,11 @@ const RELAYER_KEY_ENV_VAR: &str = "NAMADA_RELAYER_KEY"; pub type App = clap::Command; pub type ClapArg = clap::Arg; -/// Mode of operation og [`ArgMulti`] where zero or +/// Mode of operation of [`ArgMulti`] where zero or /// more arguments may be present (i.e. `*`). pub enum GlobStar {} -/// Mode of operation og [`ArgMulti`] where at least +/// Mode of operation of [`ArgMulti`] where at least /// one argument must be present (i.e. `+`). pub enum GlobPlus {} diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index fef1d52035..181bb4fc6c 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -169,7 +169,7 @@ pub async fn sign<'a, N: Namada<'a>>( let app = NamadaApp::new(TransportNativeHID::new(&hidapi).map_err( |err| { error::Error::Other(format!( - "Unble to connect to Ledger: {}", + "Unable to connect to Ledger: {}", err )) }, From 62730cbeb8862b144f8f790a899e4b6b6b247524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Wed, 6 Dec 2023 21:51:07 +0000 Subject: [PATCH 170/175] changelog: add #2186 --- .../unreleased/improvements/2186-remove-genesis-aliases.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .changelog/unreleased/improvements/2186-remove-genesis-aliases.md diff --git a/.changelog/unreleased/improvements/2186-remove-genesis-aliases.md b/.changelog/unreleased/improvements/2186-remove-genesis-aliases.md new file mode 100644 index 0000000000..ddd071e92d --- /dev/null +++ b/.changelog/unreleased/improvements/2186-remove-genesis-aliases.md @@ -0,0 +1,4 @@ +- Changed pre-genesis established addresses to be derived from their data. + Improved signing of pre-genesis transactions to use the same format as + regular transactions. Genesis token balances now can be directly assigned to + established addresses. ([\#2186](https://github.com/anoma/namada/pull/2186)) \ No newline at end of file From 3d12c845f3313936c15727520ca09f748c6f9c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Thu, 7 Dec 2023 10:45:22 +0000 Subject: [PATCH 171/175] fixup! Merge branch 'tiago/remove-genesis-aliases' (#2186) --- apps/src/lib/cli.rs | 6 +++--- apps/src/lib/client/tx.rs | 6 +++--- apps/src/lib/client/utils.rs | 10 ++++++---- apps/src/lib/config/genesis/transactions.rs | 16 +++++++--------- apps/src/lib/config/genesis/utils.rs | 2 +- sdk/src/lib.rs | 4 ++-- sdk/src/signing.rs | 4 ++-- sdk/src/wallet/store.rs | 2 +- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/apps/src/lib/cli.rs b/apps/src/lib/cli.rs index 8761e85f90..c04f5a531b 100644 --- a/apps/src/lib/cli.rs +++ b/apps/src/lib/cli.rs @@ -3149,7 +3149,7 @@ pub mod args { arg("self-bond-amount"); pub const SENDER: Arg = arg("sender"); pub const SIGNER: ArgOpt = arg_opt("signer"); - pub const SIGNING_KEYS: ArgMulti = + pub const SIGNING_KEYS: ArgMulti = arg_multi("signing-keys"); pub const SIGNATURES: ArgMulti = arg_multi("signatures"); pub const SOURCE: Arg = arg("source"); @@ -6741,7 +6741,7 @@ pub mod args { use crate::config::genesis::utils::VP_USER; let wallet_aliases = ALIAS_MANY.parse(matches); let vp = VP.parse(matches).unwrap_or_else(|| VP_USER.to_string()); - let threshold = THRESOLD.parse(matches).unwrap_or(1); + let threshold = THRESHOLD.parse(matches).unwrap_or(1); let output_path = PATH.parse(matches); Self { wallet_aliases, @@ -6756,7 +6756,7 @@ pub mod args { "Comma separated list of aliases of the keys to use from the \ wallet.", )) - .arg(THRESOLD.def().help( + .arg(THRESHOLD.def().help( "The minimum number of signatures to be provided for \ authorization. Must be less than or equal to the maximum \ number of key aliases provided.", diff --git a/apps/src/lib/client/tx.rs b/apps/src/lib/client/tx.rs index 163ec7142b..74ef2bab4c 100644 --- a/apps/src/lib/client/tx.rs +++ b/apps/src/lib/client/tx.rs @@ -74,7 +74,7 @@ pub async fn with_hardware_wallet<'a, U: WalletIo + Clone>( mut tx: Tx, pubkey: common::PublicKey, parts: HashSet, - (wallet, app): (&RwLock<&'a mut Wallet>, &NamadaApp), + (wallet, app): (&RwLock>, &NamadaApp), ) -> Result { // Obtain derivation path let path = wallet @@ -154,8 +154,8 @@ pub async fn with_hardware_wallet<'a, U: WalletIo + Clone>( } // Sign the given transaction using a hardware wallet as a backup -pub async fn sign( - context: &impl Namada, +pub async fn sign( + context: &N, tx: &mut Tx, args: &args::Tx, signing_data: SigningTxData, diff --git a/apps/src/lib/client/utils.rs b/apps/src/lib/client/utils.rs index e09701a6c0..1d80f71f23 100644 --- a/apps/src/lib/client/utils.rs +++ b/apps/src/lib/client/utils.rs @@ -21,6 +21,7 @@ use namada_sdk::wallet::{alias, Wallet}; use prost::bytes::Bytes; use serde_json::json; use sha2::{Digest, Sha256}; +use tokio::sync::RwLock; use crate::cli::args; use crate::cli::context::ENV_VAR_WASM_DIR; @@ -987,7 +988,7 @@ pub fn validate_genesis_templates( async fn append_signature_to_signed_toml( input_txs: &Path, - wallet: &mut Wallet, + wallet: &RwLock>, use_device: bool, ) -> genesis::transactions::Transactions { // Parse signed txs toml to append new signatures to @@ -1047,8 +1048,9 @@ pub async fn sign_genesis_tx( use_device, }: args::SignGenesisTxs, ) { - let (mut wallet, _wallet_file) = + let (wallet, _wallet_file) = load_pre_genesis_wallet_or_exit(&global_args.base_dir); + let wallet_lock = RwLock::new(wallet); let maybe_pre_genesis_wallet = validator_alias.and_then(|alias| { let pre_genesis_dir = validator_pre_genesis_dir(&global_args.base_dir, &alias); @@ -1067,7 +1069,7 @@ pub async fn sign_genesis_tx( { let signed = genesis::transactions::sign_txs( unsigned, - &mut wallet, + &wallet_lock, maybe_pre_genesis_wallet.as_ref(), use_device, ) @@ -1087,7 +1089,7 @@ pub async fn sign_genesis_tx( // In case we fail to parse unsigned txs, we will attempt to // parse signed txs and append new signatures to the existing // toml file - append_signature_to_signed_toml(&path, &mut wallet, use_device).await + append_signature_to_signed_toml(&path, &wallet_lock, use_device).await }; match output { Some(output_path) => { diff --git a/apps/src/lib/config/genesis/transactions.rs b/apps/src/lib/config/genesis/transactions.rs index 482d305013..191cac088c 100644 --- a/apps/src/lib/config/genesis/transactions.rs +++ b/apps/src/lib/config/genesis/transactions.rs @@ -85,7 +85,6 @@ fn get_tx_args(use_device: bool) -> TxArgs { signing_keys: vec![], signatures: vec![], tx_reveal_code_path: Default::default(), - verification_key: None, password: None, use_device, } @@ -152,7 +151,7 @@ pub struct GenesisValidatorData { /// `init-genesis-validator` command). pub async fn sign_txs( txs: UnsignedTransactions, - wallet: &mut Wallet, + wallet: &RwLock>, validator_wallet: Option<&ValidatorWallet>, use_device: bool, ) -> Transactions { @@ -337,7 +336,7 @@ pub async fn sign_validator_account_tx( (UnsignedValidatorAccountTx, &ValidatorWallet), SignedValidatorAccountTx, >, - wallet: &mut Wallet, + wallet: &RwLock>, established_accounts: &[EstablishedAccountTx], use_device: bool, ) -> SignedValidatorAccountTx { @@ -426,7 +425,7 @@ pub async fn sign_validator_account_tx( pub async fn sign_delegation_bond_tx( mut to_sign: SignedBondTx, - wallet: &mut Wallet, + wallet: &RwLock>, established_accounts: &Option>, use_device: bool, ) -> SignedBondTx { @@ -720,7 +719,7 @@ impl Signed { pub async fn sign( &mut self, established_accounts: &[EstablishedAccountTx], - wallet: &mut Wallet, + wallet_lock: &RwLock>, use_device: bool, ) where T: BorshSerialize + TxToSign, @@ -736,7 +735,6 @@ impl Signed { }; let mut tx = self.data.tx_to_sign(); - let wallet_lock = RwLock::new(wallet); if use_device { let hidapi = HidApi::new().expect("Failed to create Hidapi"); @@ -745,12 +743,12 @@ impl Signed { let app = NamadaApp::new(transport); sign_tx( - &wallet_lock, + wallet_lock, &get_tx_args(use_device), &mut tx, signing_data, utils::with_hardware_wallet, - (&wallet_lock, &app), + (wallet_lock, &app), ) .await .expect("Failed to sign pre-genesis transaction."); @@ -771,7 +769,7 @@ impl Signed { } sign_tx( - &wallet_lock, + wallet_lock, &get_tx_args(use_device), &mut tx, signing_data, diff --git a/apps/src/lib/config/genesis/utils.rs b/apps/src/lib/config/genesis/utils.rs index cfa2dc8d23..a5a012c398 100644 --- a/apps/src/lib/config/genesis/utils.rs +++ b/apps/src/lib/config/genesis/utils.rs @@ -55,7 +55,7 @@ pub(super) async fn with_hardware_wallet<'a>( pubkey: common::PublicKey, parts: HashSet, (wallet, app): ( - &RwLock<&'a mut Wallet>, + &RwLock>, &NamadaApp, ), ) -> Result { diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 22e49ddd57..3f8c607840 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -103,7 +103,7 @@ pub trait Namada: Sized + MaybeSync + MaybeSend { async fn wallet_mut(&self) -> RwLockWriteGuard>; /// Obtain the wallet lock - fn wallet_lock(&self) -> &RwLock<&'a mut Wallet>; + fn wallet_lock(&self) -> &RwLock>; /// Obtain read guard on the shielded context async fn shielded( @@ -731,7 +731,7 @@ where self.shielded.write().await } - fn wallet_lock(&self) -> &RwLock<&'a mut Wallet> { + fn wallet_lock(&self) -> &RwLock> { &self.wallet } } diff --git a/sdk/src/signing.rs b/sdk/src/signing.rs index b900a41ff4..d5e8132af8 100644 --- a/sdk/src/signing.rs +++ b/sdk/src/signing.rs @@ -209,7 +209,7 @@ pub async fn default_sign( /// /// If it is a dry run, it is not put in a wrapper, but returned as is. pub async fn sign_tx<'a, D, F, U>( - wallet: &RwLock<&'a mut Wallet>, + wallet: &RwLock>, args: &args::Tx, tx: &mut Tx, signing_data: SigningTxData, @@ -290,7 +290,7 @@ where // Lock the wallet just long enough to extract a key from it without // interfering with the sign closure call let mut wallet = wallet.write().await; - find_key_by_pk(*wallet, args, &signing_data.fee_payer) + find_key_by_pk(&mut *wallet, args, &signing_data.fee_payer) }; match key { Ok(fee_payer_keypair) => { diff --git a/sdk/src/wallet/store.rs b/sdk/src/wallet/store.rs index 66f5108fbd..2ed2f4d915 100644 --- a/sdk/src/wallet/store.rs +++ b/sdk/src/wallet/store.rs @@ -629,7 +629,7 @@ impl Store { let consensus_pk = other.consensus_key.ref_to(); let tendermint_node_pk = other.tendermint_node_key.ref_to(); let public_keys = [ - (consensus_key_alias.clone(), (&consensus_pk).into()), + (consensus_key_alias.clone(), consensus_pk.clone()), ( tendermint_node_key_alias.clone(), tendermint_node_pk.clone(), From 8d863b1e025a252b200ab3ef06de0b4b7687d7b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Thu, 7 Dec 2023 11:24:59 +0000 Subject: [PATCH 172/175] fixup! Merge branch 'tiago/remove-genesis-aliases' (#2186) --- ...D6D32B22A46CEDD254F52B6C69E813898FE60B.bin | Bin 10382 -> 0 bytes ...27024E9AC79985302DD15C96CB57743A74CC3.bin} | Bin 9941 -> 9941 bytes ...A57D1F470F585C2F4633E5103CB67AE2726938.bin | Bin 7448 -> 0 bytes ...7ECD8CFD237A237C63AA565FC44893414EE7FC.bin | Bin 0 -> 9649 bytes ...27E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin | Bin 0 -> 7448 bytes ...B62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin | Bin 0 -> 7448 bytes ...13CAF693649A17FBEE435298C9C1624C6060F2.bin | Bin 7448 -> 0 bytes ...5DB11F0B17E6564F3AA56244770F24B56FC18B.bin | Bin 7448 -> 0 bytes ...B5464810F6974083CC2FEE2756ED1E97B8143.bin} | Bin 7448 -> 7448 bytes ...BD9698F791D337CEF8DE82C684C1A1279D772E.bin | Bin 9649 -> 0 bytes ...2279865699251D54141F79A4989D5343D72681.bin | Bin 7448 -> 0 bytes ...92A006D0519A21D3F1D72D7D930324584CD2DE.bin | Bin 9941 -> 0 bytes ...ECBE1A9EAF3496A30D69069DE2FBD293EEC978.bin | Bin 0 -> 7448 bytes ...E8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin | Bin 0 -> 24494 bytes ...596406702B1323505211981C8DABB0FDC6B41B.bin | Bin 24494 -> 0 bytes ...6D2AEEF55A6F202D8EB4564017DB5BEF872107.bin | Bin 0 -> 15597 bytes ...4A5C2232840271F032F756953233DB3E53E757.bin | Bin 0 -> 9941 bytes ...5CC6F78791F8954A0219C07B15344AEE0D2E0F.bin | Bin 0 -> 10382 bytes ...0F348721EF5366FDD8E62B9062254B2D286E0F.bin | Bin 15257 -> 0 bytes ...57D436A33F919BC377C8C6EE7A8DC8D210A6D9.bin | Bin 17018 -> 0 bytes ...99481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin | Bin 0 -> 15257 bytes ...699E65D4B40A4E1BC9E7A32D63CF28466A2F20.bin | Bin 0 -> 17018 bytes ...D2D1A30B9CFAD55AA750B6CC36A4BD55D6BD2B.bin | Bin 15597 -> 0 bytes ...81D5DEF92B9A9BB3A159947560514682CC3877.bin | Bin 0 -> 7448 bytes 24 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test_fixtures/masp_proofs/0075192A544500F2AD0C92E1A2D6D32B22A46CEDD254F52B6C69E813898FE60B.bin rename test_fixtures/masp_proofs/{75FB5C5ECE98BF9246CED847F2F1508A065BC804ED18DA58F0064137E1251EED.bin => 30E148B3F9E8D21A41ABB09756027024E9AC79985302DD15C96CB57743A74CC3.bin} (54%) delete mode 100644 test_fixtures/masp_proofs/341E00D564C672701199B58E69A57D1F470F585C2F4633E5103CB67AE2726938.bin create mode 100644 test_fixtures/masp_proofs/473EDF0B2908F047110AC52C7F7ECD8CFD237A237C63AA565FC44893414EE7FC.bin create mode 100644 test_fixtures/masp_proofs/4B412E2EA5AC98758E696AB36327E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin create mode 100644 test_fixtures/masp_proofs/4CCB9ADD3188CD893508CBB4FCB62D08DAA52F4DE496209BDAEFD36E75EAE98D.bin delete mode 100644 test_fixtures/masp_proofs/4F74C729C8F775EF554F4475BD13CAF693649A17FBEE435298C9C1624C6060F2.bin delete mode 100644 test_fixtures/masp_proofs/51034B90AF95B8899A631D37B45DB11F0B17E6564F3AA56244770F24B56FC18B.bin rename test_fixtures/masp_proofs/{F6021F5E0CC7E0346EEF9BDF849AF47822630FC911AF7F91B196C540372EC0E8.bin => 553C507BF748CC2353DCE98EB91B5464810F6974083CC2FEE2756ED1E97B8143.bin} (56%) delete mode 100644 test_fixtures/masp_proofs/5F7D9B39ABA3A1CF6A124CFC26BD9698F791D337CEF8DE82C684C1A1279D772E.bin delete mode 100644 test_fixtures/masp_proofs/650AB811C362FB33B9190DDA9D2279865699251D54141F79A4989D5343D72681.bin delete mode 100644 test_fixtures/masp_proofs/68380B89FFFC47364F7AA8D3F992A006D0519A21D3F1D72D7D930324584CD2DE.bin create mode 100644 test_fixtures/masp_proofs/8BA2DA741BF1FE1CDEC5295AE3ECBE1A9EAF3496A30D69069DE2FBD293EEC978.bin create mode 100644 test_fixtures/masp_proofs/978C35E058808D61F0E265D72DE8DD6A8E6226394EA6E3DFE1CFC10F69C0ACE0.bin delete mode 100644 test_fixtures/masp_proofs/A14785AC0F54CDB43F6DCE5AFB596406702B1323505211981C8DABB0FDC6B41B.bin create mode 100644 test_fixtures/masp_proofs/AE4CEC9192B52E8CE5AB0C25936D2AEEF55A6F202D8EB4564017DB5BEF872107.bin create mode 100644 test_fixtures/masp_proofs/BB9AA71A4227C9E62948CBA8DB4A5C2232840271F032F756953233DB3E53E757.bin create mode 100644 test_fixtures/masp_proofs/C506FA6C2EFB37B06CD5A473AF5CC6F78791F8954A0219C07B15344AEE0D2E0F.bin delete mode 100644 test_fixtures/masp_proofs/CD50FD3DE1D59F43FBD6F3ED220F348721EF5366FDD8E62B9062254B2D286E0F.bin delete mode 100644 test_fixtures/masp_proofs/CEC3CA2BCC727589C923B70A3F57D436A33F919BC377C8C6EE7A8DC8D210A6D9.bin create mode 100644 test_fixtures/masp_proofs/D007D1734AD42D34174F04566899481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin create mode 100644 test_fixtures/masp_proofs/DEDF664AD06184041515677A72699E65D4B40A4E1BC9E7A32D63CF28466A2F20.bin delete mode 100644 test_fixtures/masp_proofs/EDB31EB869290C1252C3395D7ED2D1A30B9CFAD55AA750B6CC36A4BD55D6BD2B.bin create mode 100644 test_fixtures/masp_proofs/F0471ECBD3AF04B4A373D2966781D5DEF92B9A9BB3A159947560514682CC3877.bin diff --git a/test_fixtures/masp_proofs/0075192A544500F2AD0C92E1A2D6D32B22A46CEDD254F52B6C69E813898FE60B.bin b/test_fixtures/masp_proofs/0075192A544500F2AD0C92E1A2D6D32B22A46CEDD254F52B6C69E813898FE60B.bin deleted file mode 100644 index 6e8d6b3ae4fdf9e073b8e193f0299373355ef47e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10382 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 delta 3322 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 UxjpdSRRMC1AHgUZY>EWrKYW>0Y5)KL diff --git a/test_fixtures/masp_proofs/341E00D564C672701199B58E69A57D1F470F585C2F4633E5103CB67AE2726938.bin b/test_fixtures/masp_proofs/341E00D564C672701199B58E69A57D1F470F585C2F4633E5103CB67AE2726938.bin deleted file mode 100644 index d757eb2fb93d20b651ecaf3202e997769bc2b2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 zcmeHMXHZnxwr-+ikf=n-L4t@PQF3aMjUY*h0<9o9H$iAXP*OKR za*`Y*CrM3)tMlHy_r0pAJ5Jr7Ghfv@wNCim$&slqK8~^}7_rvgim|MgP+8bL^ zuAr2ixQf8F#=UR-b%ZSQ8)rEpMN*j@)_|b)?7(O|fXIF0^2bd?Ywx4|Tzx8WW&O!} zKLgpJv|UFn)P8^+QIby4tnDmrs5){~LafyU?0UwgG4^*I#rh zcDj6J+wVK2qxE*o;Xe7kwwBGqTmOlR))YvV)62IOD5~}iW0Uz<)&O;?iL9g}pxYtp zbK}bVPu$<`;ruxMv_B4B(mdGx?DC)ZXT!f`4gkr~$kk-RUil1Y=E!y&|@*V8V z$%w6QaOEDPVQuopwyy~ZdPd>q{BcMBlVu~*&zlzbcJ|)WR3E$&Lb_r+f{_qqqcId!P;#Eam)LwEup8e@X98i1t?t zn*Um~^)*AJ(AsazMubV{+dh}r?=MZM^f1Q`85tu4* z5lxgw>x^=7gHS8$eP&!c>{q|t>P&DsMmae;OO;Ws5L~(5jbFXq zn>`{=JsDXzZj{apH|76^5qy-lIbIDWgOv5keC>P6qBVE4Lsoc zI3g4;@NsF3z#Zm=Z#2@NmkN_>o)P8vet~X>*)&~KC$=2bGE$1Nd4j0hm@QuHN&t5u z>5uvK1iedfLg{9(w#NnFOwXZN%eY(9;cZg{=JC~V>P-vo@fJq5bz73bkDND9OJI8)Qs173_VOkkX9 zAhtD&LBZUQDCnB+Gk94*$Z*%%4bd(cYgD(c*=v{0&^7>Bh%JgLlcX3ZFR#YLW0{%TvtFj&#dzvj4)4h`(8@BJp41p+1r@g% z5VSbyo4LO{N={-aH1h6$w-p{LQ(fP&8)LyfgL#T(*+*%fGbJIZHm@xe7%yiW!aN}{ zPT>@rjrvH!#W0-1SH@!XM7(!zi{h}{hjOQ=vF5gon=40jg0;y`Ss8FOX8@VU{RY{Nn4pBhv#G+C zG=|r_PiYOT%P)gfU4@=TF7P~{@KQN6K%S>U0Hk)SCaD+g8NjteA;bJs#>Ht98vKq znW@lsH!d6%JUuA`V_Zetz-Kwqq*p)3rt9J1GY#F{R~*n3C+O7^I0 zPPOc&P`}nT^3?JM@CeE7UVypXhXXg;_9((0Ob|M^359L4AU*h8N7+E4t|Q!vc_GyG zin7Zaa=2J0I+Cn;Rx4|Cc_?j&=gN8Oq&r6CT{|KDe$fLE8XlJ;Jhb}SE*~{{6R2x= zm8aGFO>!e4E+|GCcdw&rxZG=(Nw%pOm|z;M&3V#8Dnh}aZ(^Lw0Sw7}CjK1e!VF>$ z7p6-qPFfu)KGEYTGjhHeZ&AQjyzO7pg64Ugw-b1j7dl?l!x8#|9kOqx1sZ4b@s(B5 zV)4`%EU8}W@@YwkXLDJc!apNU(s2wDhXWU-ntl_ z)wq@%aRtnfTp^_%F`(RvfJdGyTzg`N->V<66TH&Ueab$a5zF2+!uv9o-85oqE*7D|X0TL!x zZ=Bt~Zh!_>+-%Al9uH|{YCqWLm{H+ktGpR^Z0gxWcJ3FYd21Om77anp#K>)@;yh;C z@NX%#=LsvPF$T=565(YR_RuBgpLWl5EBFy7xc~|sxVOS~?$d@WM{kN0-LnB0Q8fqh zKGqfG(Cp`ytl3)ZXt%139I0_!8Q9|;IlreWX-IUM3jFdl!sMIdDESgzSSko*IpOh) zFxXlX=F}!(nX_59xjdaeGud@OS=UeIU$Hhhp!X45KU-d$vAZe`{PSt*+XkPzNkDD4_hF7NRXTnE?|$-s7TC;*Y6_IGk%B z9&r?w5Bu5@EXf8TYW+JYZz17V7lqIF1{t>I>0W+7uUfWqehqKZL79_dU7TC65 zS!i6E5^(I68glsb;r2_atexH+z(aY9I%oZtC9|8@_YA6=BJ5!?6N7Rl(T`p1VyC~o z(AbQ4FIv6_NqTINM5BEyMgAoUJtFRe7gnlPVQ&RFTf{lM|;#xV#n%Y~nz<+3#ainQ*Wy`bv9{1E4SK z0?gG4X)#6VT#W(rK71GLu<7k2o>=3I7J67#daojto%TcznIdna)-k8@U0Mywx|yMd z1>mSk_pZ>>%2S8YwvX{9c}sm@tgfmu%>}g} zr<*K6moW#D3U|5fUA1wQUP(JT2Vnw??#V5&!QTXZ<;M15B50n6$1ZJT4DE^N)#w1s znddep_(f^wni~aZ){3I>N3i7=*lhnf*FD&YN|5&~cFxQ@Z#O%zJ)AtD%Ul5UY3rtU zBDn3A%Pqc_J>S?UsQZeg*q_)VwbbMSFzxiNg6Ro@$*0C~l-?tHS%TtnARXIzVAV>Y zl37Z>JY;Lij*PZNmWfE>8T%_erDZzcv^&9(Ql7%I5kWm(w-QhledsLMeQA~ zPKDrTR;3@F+DOY7db%xdcS=~Utt)a8o0{UoTDS8aWkY%rSzbii#3alzr_)KO;BFRq zsD@-KzJH<2oSyAV8ZxPX^T(5@|G(9c5U)~z@t~9-7K@c{l=wh5;OvpJspG20c%mW3 z56p!XQ%c-}pQH7Z()f>KsuHx}c4N#-X;`dBEg~kS3q%0y{36eqqW@OVX-#IJFVlCP z%9pH$iUeGI$-(%-=9MHZC0MDL9*$AV!|$>!pH)euXROmSZS*iPn^=|@do{z zJBYx9IBV5DJDOUuMnv5Oj^RBTnzR6P%s9wn1Q9~Q*%MoTywVU+7B=t5T7<3Q&;JSt z_Pg7#bd0M%A8h0pmCzaUT?1T)vm4R=z6jsA?NMj$Jw}j+3w?@`ciagF<4#`%mG7+d zE}yPE59ZECYN!==X3)oNwtBR-p_-d{Un9oQ&?SSZ)rT( ztcO8(x=l8G3%I46vxg5|U0y7Gw0k;qX8HJg^z_^t2IlN%Wzf=KJk)LTc$kaoJpi=W zIm4NegpOSI z-BW^Lk+;Bx#|tvcS4KF4wT&= z8S>8Y&@FC=0KcR|bo|XKB@mG(oA%}QpSbzd2}%b8-74kL;z!(Q6+w2S{1f$lmX({D z!o7)HoyS))^kx%ueEPJq3remNK3YADiHJ1p>ri{nlPA-fuXv`MIo3}MejN+-2YA^% zz@I=~6#85Z&b?8~wO&*}fOa=nIIvijx}Q&!Au50LLAtywa3%1l_^B6$5mtb09(b*# zJ))(XOj{9Nt$iJ#B>#6JLT CT{X)9 diff --git a/test_fixtures/masp_proofs/473EDF0B2908F047110AC52C7F7ECD8CFD237A237C63AA565FC44893414EE7FC.bin b/test_fixtures/masp_proofs/473EDF0B2908F047110AC52C7F7ECD8CFD237A237C63AA565FC44893414EE7FC.bin new file mode 100644 index 0000000000000000000000000000000000000000..2b6a1976a213269ab230b641d7365eabe7a92c5a GIT binary patch literal 9649 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 Fe*klS>3skI literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/4B412E2EA5AC98758E696AB36327E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin b/test_fixtures/masp_proofs/4B412E2EA5AC98758E696AB36327E2CFFC5F8055CE2E2FAFB4DE8E7C2216D5F8.bin new file mode 100644 index 0000000000000000000000000000000000000000..27e6acb10f692cc211a133a9140d2135634e6cdd GIT binary patch literal 7448 zcmeHMbx>T%_8x){5-d0~xFfAcF`hK_Tocnd(ue*@|0KkJEj`G8Uf_g=1p&CvMmcG=~ zZ-X7hY8!PScm!kIl(`Hv_&sreU{wppAJ6HJ*F0dPUgu3l`9v-)CR`Pc4uz!$FU(OR zpxW6CY3kja!VyCPJIx-iygY9sRq?Z8xvYGH)yz-~st^^%30!pLH-8OLAaChpql_YH^9E`u8(M9NrOrR8SEztA)u8;gP=cj*2`?sX(?@9j!(*Ep!<$oq^u{Tay zY0g-S`s2Ew6$R{bFYm-D&wSiF0I4$6oxPOqAJYE*{r;BGUm)$z3Y!0!w20aDTT=BuN#FYs0h#g{^PKK}Rnfn$5`I>^ z{*lc8Sq> zHloug0^1sG|5jS1u;aClEQak+M}wr(Gf0xiRTdXs^=Q`L@Gvk#dU>l53xCMc0hLm6LAAtPv zZM(u6?DrXSDZ_TeUk2E3qWXujaOOK?x{n&iw?~pL%y?Sr%9%Wm-)^>iolc^?g=+?l zznKDs3^ISw8SLy@uf15Av(Or#@QzvEAn4m!|Hyce_KIOiL(o8{b#D?I2%%F`9$(cEj{T%EK*$|H6Nfg1uA&{Bn>#edc(=O8a33oGb z{aYw>E>8$1eTK{Gwp~$K94bqg$V9J(aj$TB1Qz-DYlljr*60K@b<^6XT6tT)1HNqp zR5bAJPpkpj<6WOK*xUo?@IjBI0!@QM_u0VDjh93MYNrN1VikPPZLTUB+*vySI}m{r zbj`YCq)!5tDOW(UEEnl;%q3NyFSSY!^C|R=HB@87Mo@^kkl_-R8lmC0MT_;}z{9|Z z)bbfhcgHpeG4O?TMTnUCn!T0-Ey#YT`_pv~-Vn#(yTp5X!eb~+%&rQKMfdi!=6!-x zI2EQt+@e*(%<^VZHA_&KNrF)3YJ{328;WI`J0@%A=_UR|e&@`^h#04` z^ZlfV^ZSid5lW&ecIan#B*<2BA!2=F5Tm4Ys#*VgYVYK_dBx`AbBRN0kE3PB31j44 z$ycn(JO~UXK5i}~sweIYi87$Pu4!FJaQ{mM>?=@NI;E9zu`|o~q*L5($xPKhe;lWg>j zE>^b*d$eLZn&tA-yaZWkQ`#iNX|B>UV`3O9QX$>*oJxUh{`xF4hG?g+_8LBg_R(_s zJGzXJZjKO2GPuFxB341-ucub>DF{^&Gj26%3mmV-;6p`hpINHb04g+TPTs*J#FpEP zbbg6zf-O!+NrLKrep_n921u>!-~lB44q+rCsyg<5RYwcH_Q6pA%BCK1wx^HX`Hm=IK%AyZ%StyJC!1qu#^3T21Uap)l<99uk&n-ca)ef%N+O=%`wB zwW3Ys-s;r0`P_GwOAZGqSDG=(CWgvk?k4qC=dcr8=a4&;(gn;-Wj9y-8KIBYboDj| z+}mXm5?;H?4MV{Q`lcaI3JbZcA+C-U;bN{DYHi5nt_^?L*rxO+3hmh$#x1pC@y<>hD3#gTgvCR-4 zYDG}dhhW_$-1+=mfnu#)Hr2ccJ7~iJ^=PpM=(4xjDhyeO2$I0*`uzUv(ZDg9AjIe4 zw-D8hDcZ>%CK56elp$5mL*LEDfh(H%)CihS3(SekCLh@J*j;BVls6>9#~?vcRi#c& znqyBi#|zdfM8!R&FmRZh?W#W})YonXB&KUMbI7DV4#wEr2NALWR&*zxqT(>}CoDVA zAIpjpHqmf%ND3$i$iMWHhE%0;KaerQ8ur2$`4|J{6^hh6lSpbwy>5E}ZXaGBu*-!& zi`TreMhx*8j$O%Wx5JyH1bnr&&Z}BM_iK3FFG*})9VMtXwMf;)S9W}@l9S_CdAc3W zL-MrVjj)$9`Q%$SntTH1LQ~)Q3X559{HuDmUGfIGw^rHgU6X}cv0#MhR8t#Sg;39G zyDa`yS{?fO1hFWdS%H!r5-YoO($ad8cp}?NNWVG9lD_r2(Xh>|l83s3`QugTg<*`@ zApeYa%80d0WpDEp?GXc2tEM|{TUit;8r3d@6L4-5|GtM>wKZz_&cf|}p6qMbvu6E_ z-ck`<%2sbXUGd}(c_jd1bI{{{_9nGfKC^4v$>oTP=#gR-&JJ2H331JB7yPwYl<23s z6O=XP4L&iBmRZ!B|JgY2&!*iD{A3la^5kv8l}tfrZ>1Rnq% zWL!NEQM(_5NwB%I`!3+d`wF#$R}=zv`~yrx+f*|)+@O2k%^Pz z;oJLlO|SM1&gaSxyD!c$Z!cvCtDjlhTLzj47GI(k`R+{=xH$(WRI;3mV88H!3QDL? zW@}5cFXQv~(IsT%FsSxu(1&?7S-3vrx?aIhse+``-UT)OTeB^~{AMNUZ%w{L<##9oE*Hg$zBy3tpf*XLL*nY5pq zek6uXp8@&Vl|4o|vZMrBzLMfpZV369JleefHXdCmyJ4Z_(nIh1;>5e{D;b}f!FVf2 z*ZWt-hk_mgsrl>^YHky3{OT2~Xv;?z8RV~*`gr-8EYMbNN*E11eA~g*nc^H4 zC9K=n9lc^T9DXN0M=d9@C(C?1{GhOiES}8Cvn|K2@yQL^BHM?ZU-Z}%Hf-ZS+>N%_ z{QkbC12>mUm0>Nrm38Dgj;b|+s8%g%x3rqz&e-Z}J(+8~E zc^e>KU)?t_n|=q@Tn+nR7ti55ApdY$%!^x9=tewFA3v;gsN$UK9eZ?`mcuiZu2Uyi zP3ZuhhT-WUKiU&CDwO!r`LjZ2e@~_}q7OE%w;nCxdyc}{4N|38>K3RS5059KD2t3L zhj?8I+LtFPL|0Qq7+Wu5^>VLg;HY1+kG5X&?<|y>d3P)f@H5@a5g2_EDJdQo5E;7M zh8G4g%9?6dtI;s0Q{!J>($}rz-CE3DyX0)bn5z;^8M=whp09V&G*29^%1^ny28)_h zQ(v#tw}_-U=K;-46V-EaZIq^Lh=U*Oop7*&rb+vP%WJqq%DE)h$U@Uqk?9$zcD|#o zCkD0+#|fgZwHrv+xoh3B(tHlSLN2VQ z&7;Se9z%A6Eij&qPTf0P6{XU@S4+}{!qCk&5p>lvN{*c57M(-GhIydYz8H!e%mh#q zFbhA5T3{V3G6?uWevdX7Wrz5S~njiCv`m28)`p`^AYS z2WyBq9j)75hKUkcp?6JzC)Xr-3Ds()c@@Jmh+HPQ`nVU$zQ9irdy%X{z0SzV zFe+f0P2n8IkoWekx&g$|qm)u4k>sLQrP*X7&AgnHnvYLPs$hFm7)OhF31irilfUfC z40j6!rjWmoY{A=uH6^vE3rkfMkPcM0aM8+GXUoVn@ZFZ8ZnI$$CsT~)1cyanD8zgf}=!wxaYutMeZC9 zmxu}nQg;>o4sN|=PdtI_C~f@;d^*kp((5vFDiu&~4GISv2VWo<7JGz{s_bzk9gTdw zt^Ibl-cNGT!egBEm-E^Kz6eyK5xWSa>*=G7D^!ivV}Glo&!ZzFt$YJr%fb|G?E;4{ z(J`gE46u-dDN}z!hYPXg%^_LfO2!5XhvEP)w>l6S5>C^SJYkJ=Lga>pU+2>MuQs>f zglX_zyZeUEdE;&8zBRi&(4+~N4XGhJtG!A5es+UZEnP$CD&%@5g@|C3IpVl6=zf~g zSZQJUqNw>rXS4z*t88fqeGI4T$39~VI{VDq@*)h!CIo{I7+uo|rUAs?kzrL{b9&-H z7dbt8l`{e;QA5Tr>!Rqyu2(>wpL?;3ky2}2utK!!^~}xSg*DOrBmzM0r8~Lsn){qB z#=;tjR)ScW0^pgLxceTxj7ec2%G1bLRYJs{8!rOwTk1005x+q1ZnZG2;5oDH)>D`cUEo zGE>3xFevjpqC++Z63J3*I`Z)fuyTU)<28WMWCIn5Wm6~}dx%~^N}?_X52{ijR>-}4 zf0^L5+>LZph>t#1s&NXCy-v0%>8|a*$*6?XitA2-W@~Eeh5din z-`X&KTz~2xI?qgqy8aLOXUD%q4zRNvM?=4p?wzDP0uaJioLVNK(AhY3h)viOTw*1A zYwywksL47b5y|u{`@@0$5#?^Qr*$scw#7NDSh@M-0L6QKd{9M!%IJ{_>fx6WIfFkM z2Q$!-XQWn&tJT+rJtol)V}P2Fe-yJj6ZgaEMj4X_BI)#BF8po$B_r@BNc*eP`@beF zx$nxNb|#Y?Yo9YS`C(4~O>Zm;^{`9PH;=F1(Z9bp^fzh$l2rY-(|>}rzq+pc*Q6~E zB+05QnCR3NLq@Er5}ySGrq1{mlU@U8HK4vcmAC&U?Z3a@U()&$r2W-|=D#LwYtsag zFLIqx2R9jg=yiSio6x&IMr`%U%`E_37F0s$MoH98;wX4Wf!21OJ5?WNy%dU5 zuIG{lcd&1JNm5J)eW*h2dgE}q)>g37J-GNldO<2Ex-2ZxG+Gh2aa&Z^AggDlOQ`D` z;PX~kO^eXs)CQm@+57Pw2TXvzF!WeH+%huykem6j*$OzUX=b>QsN`E=M_t*--o_VZ zS4!p-1M7Z8g_E#V#x!3r$sW0N{>F@uqr4lF@x44axC%URY=CpzY;Y`Hmx z@F@IcX7wDSuUj{Sn$Y}dO_Y@Oh6~)473eZLFm(BbY?SZlMJlGD!~}LbhqtO*8Rh|e zF(^Xwp6aY-yy!K_9YB$+Jg^ePs_nL_g*pw ziHwpZYe`$E&SOFe7Ch5A?lrEYMMI>E-6u2!2K7Oo!38%(v5+QS-XzAGy4z@E?v zs13t8b)g%SZud@%8B*QWW)ghFp9XlpKT$Kq0g^n}od~Jc9m{DL!^ME*jP6hb@-X#2 zIlJws`y9%TE6T&_cp1MfCXXRL=<@Z-Oy%BSDptH0>mkG>9r95&{qw84eQiS}pU&Nk zt-#k}gT(B(pFR`I1j$Z%pypN?wA-$I+$k#$6&(`4bH!Z=j<5HOG5gJb&n|mUQMkpm z{fW*$)wzlS$VrE=z6t-}ZA;`3syw)^kAaP?4MTuGHTWXaO%6{43#%8kBcz=v`ef^v zCG+vN`ni0jTyV>sZmm|I7NsaDShA+Io))SaSEM=5`cAz2Cl{Td zQkQsTqdfxI)Sl`?}Rs@d0e&)w(|1dE>R4D3n_}_HYv7 zZzRX@%+Cx!TkWrKmsIrGBQiH;O1l%bKo>P^P79R`T!DD!EMe$?;#e$(%}Ni_rC6aY z|2?3IEp#$5wjo>V3grNvT(rrKJKGQa`mH~~bUp5sNr3iA7BWU=SN;YW*%{IfT)kHG5nlXFBqFAxFsgni9VVoY|SDE_w-&+wOU zYL^o`AVDl@z_Qno1}mhC#f75f@O^Gr(Mu<2%NLgMavdP*ZHGMq>pmqU<(~KB8}na> zkMo|E6-#fL%k;aL4;JbYq*-8(!u*edx7&sF%yOA*nlAvQhIu#$O(vgx$lbzA>e_X*(=68{WaEm?;*CzkLY2$(dpzu+616 zwV?Yb0ryOTjV`>2T;&O~Dh*cSXYx_}cIBk?6yY0@$_#1!!QM>@7T+pwVo?yLKFVNL z60sofAJu}EZv^CxnULQ(_NHsvjcJz`4TkTW)pY@HGzj^kXdJD+roh@e<&nv?y`Soo zl|?kAcVkQ|uk462NHhmm2kzZsX@iwQZACOs>s5@bB@hGINY^KSiazB9#+VHIyJ>4|@;4rW5r|oJZ zwyv=B0e?OsH0Omz>qf3dpv{`zm@&-0{aV0L37hE_tiRQraABMLhM!jbQ=IC(rK`gt zB~O({9Y#5CE5W3UU4c#pGU>02Dge|rK(RrdcC9X9>r2P!)tBe-W96FndRYTxWpsDF z$Tt$Pd^RXq55dx{EXlVrFgUc(Nh<@a0~Hr6i!+2!BmNlM`TJZ=gAnc zc>q*gR(m>MPl0EZT;$#Dl)QpFupnV8Lb4Y#-08@?;MvxzywG=7mroOq4OEUwd8~J% zk9Xez2^L7Vl#?c&epv3d=L{qv67-w(2rw*owr5<@#=_J^=f`}kn6Tp*Cy(DHWVGP{ zA*|Zdd)kp9KvAZeTJ06fwnk5T0R%Pm(pf{d1l3t8b6ynCk^^3R;7T!0C(|vwr$t_d zQ(T`1(QRv`G$_lDYV<2e0CmoVB4n&!hSiP_^>Y;7vL8;?YxkVmnzor*zFK6ck{=vF z6O^1WF+0pWkSoF2UkUEkLxAVTcPAbV+~O5w+95miU%7nOsv2RQJP78+wdoI?Bo48M z#Pm4;^}<&~lnIsa$4ZwX$*Zy-7I)>{SAw>m%DFu=0H4wx?V=-q)B&Z*4#-mT0lc-2 z%>^zywk5Wl%S~sv)fo{~ulg2R1?|eI z)y}lc)K^(`vQ|pRVm$@&o{?br!I>9ps2pNQS8|u1; zxdnV$5qs!BDEtojnVH+DmuR7ZXQW^7Xc16+G%FP#0K1QtNirfwRF2l1@xS1SN5EYl zY4)GGt29&&lj)e89*N*e;xb_;S1x`p^$7K6|4#YZ!TZXuQ|7=;BELnxl1SSYrV?G5_n%6Op~8O6$PhrC||v^a6$H5V)dz zQWQLj+I23C04Z7O)ob12$YvqGM6n^)imq%IF1-r2RXFNWE$<9aTR-0Hztu5ywEl3$ z$CLSiMLo;qT5~5j%cF?U#xhmApwK~m#(_GL>fnTr2RKXnF0#6TA6(5Zw?P-34Z~u) z!?gDeXEQat`$LjA-bRnH0@4?L#dYgFVvxF210MZK+spJvwkL%}+Fr+eJgXAQh8wh~ zYH4!rN~}5BF_T+C6)g=?I8@2mco!BQKfFYGgDcnedAcUrskrAEQLUEd+`hp);cL_< zagWJ3rG}Vi(-!L+wKctgNU>@Ds#cu>76XH~D$z4uXP0O6aYjRySG~2s&B^D>ZLs

          ?xW!HIMXP5y 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 diff --git a/test_fixtures/masp_proofs/51034B90AF95B8899A631D37B45DB11F0B17E6564F3AA56244770F24B56FC18B.bin b/test_fixtures/masp_proofs/51034B90AF95B8899A631D37B45DB11F0B17E6564F3AA56244770F24B56FC18B.bin deleted file mode 100644 index e64778b23802f2989e244dede85f5d6543acef70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 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 diff --git a/test_fixtures/masp_proofs/5F7D9B39ABA3A1CF6A124CFC26BD9698F791D337CEF8DE82C684C1A1279D772E.bin b/test_fixtures/masp_proofs/5F7D9B39ABA3A1CF6A124CFC26BD9698F791D337CEF8DE82C684C1A1279D772E.bin deleted file mode 100644 index 4ff46ab0b35d86cce94c270e6cac5bfb64c5afef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9649 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%0A}3TGI3Vry3_g!@x_#UbXQeN%B}b}S^1GTq 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 diff --git a/test_fixtures/masp_proofs/8BA2DA741BF1FE1CDEC5295AE3ECBE1A9EAF3496A30D69069DE2FBD293EEC978.bin b/test_fixtures/masp_proofs/8BA2DA741BF1FE1CDEC5295AE3ECBE1A9EAF3496A30D69069DE2FBD293EEC978.bin new file mode 100644 index 0000000000000000000000000000000000000000..b66df7cf31a34f34271f0b259a82705966c68a3e GIT binary patch literal 7448 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/A14785AC0F54CDB43F6DCE5AFB596406702B1323505211981C8DABB0FDC6B41B.bin b/test_fixtures/masp_proofs/A14785AC0F54CDB43F6DCE5AFB596406702B1323505211981C8DABB0FDC6B41B.bin deleted file mode 100644 index 31ef7d9e76e5e5249854b997dadb5f431db2f266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24494 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 RzPIoH>u>&k^=*pAe*+GM4_^QP diff --git a/test_fixtures/masp_proofs/AE4CEC9192B52E8CE5AB0C25936D2AEEF55A6F202D8EB4564017DB5BEF872107.bin b/test_fixtures/masp_proofs/AE4CEC9192B52E8CE5AB0C25936D2AEEF55A6F202D8EB4564017DB5BEF872107.bin new file mode 100644 index 0000000000000000000000000000000000000000..dec88f41416aca8edc27d9324487fe5bbb2dc43b GIT binary patch literal 15597 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/C506FA6C2EFB37B06CD5A473AF5CC6F78791F8954A0219C07B15344AEE0D2E0F.bin b/test_fixtures/masp_proofs/C506FA6C2EFB37B06CD5A473AF5CC6F78791F8954A0219C07B15344AEE0D2E0F.bin new file mode 100644 index 0000000000000000000000000000000000000000..2c2038c8102a3ab06707686e9a2d3976eb1a57fc GIT binary patch literal 10382 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/CD50FD3DE1D59F43FBD6F3ED220F348721EF5366FDD8E62B9062254B2D286E0F.bin b/test_fixtures/masp_proofs/CD50FD3DE1D59F43FBD6F3ED220F348721EF5366FDD8E62B9062254B2D286E0F.bin deleted file mode 100644 index 85cb2f2bf8e6afc2b55e84bf8a6f665c3beb40ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15257 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 diff --git a/test_fixtures/masp_proofs/CEC3CA2BCC727589C923B70A3F57D436A33F919BC377C8C6EE7A8DC8D210A6D9.bin b/test_fixtures/masp_proofs/CEC3CA2BCC727589C923B70A3F57D436A33F919BC377C8C6EE7A8DC8D210A6D9.bin deleted file mode 100644 index 3f3374c98bf75f51e4f37abbf5aa29931822c009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17018 zcmeI3Wl)^k+NQDK?iw0*5AN;|+?@c8Td)AZ-GjTkySux)H3Sme-DdAOJ5y(-zN-D> zoIg`LtE%gMt84XI?|S;KtDa@xU|?Wae|&xwZ~`MUKf}x0TMDCdU`1`_1fGEOF*MFW zro^IP9Z+)WJ@{WW!M|g9wJ+2bBO&=qTrq4rV8f<#2tD(B{Rg6igqoy;Rk^^`SveYAZ5;LhBFA%qN25^xSEdaDWDW>@aS8)l`U z#AYQ%H-6Aumxq*V6d;VMlJ%Hg3iLMy<%sFKAHiAFNJcejM>`|YJps?$G zET&_@cJ__K<2Xe)=1x%5kK2|J0SW-v6nz+TJk|jp;d#UJEgWVv-TWD=$< z(bL3B#`ZDwQgB;ou>|=xvH_xQ73kX_7pk;a#cEZ``VQplTCmBtTg5W)-*-H~hxuALh+T%p zJ~F$AsS*H|!`tV?>?O{y<#stbS{7%sM9pXKOTD;F6@o{4jz`}C7+hiNQ^T6XdvAzM zf}{uY)dFbk6rkWM<&y(dO*qN50HMxg7IZez>d!xP9{P*!P}sMMxNOxFJk{}yi`o0~ z%mC88%V$>y-37VeUV9$(J3Wkt^ykLZ=wB%{Q4~w6)X4z0OXi*FW~*Ly-mOZw4lAoh z;)aw>SEwL;Hm!2u<2XaW1~N=Ia|N~=bWB+#3&A!9B5f)p64IyP3)*8=)0046K9DIVF?nWelRIGPtnjD-w z@K`ko>hs)|gk`eALFE!m5+blYA==gmka-gF{h`f#UhSc>qp?ikzQL?okPH@T=*ABd zig*6I1Au-Oq;0EApm^^*L`ghWjNt00Y)58w_kn#9aD-ta#|986B6EJVP_T?@m`{dg zBZgy=|BUB!pNFX;YkK;J0kynU*9Z8 z63J6?h!ztCz&#a-kusUxR!h(F_I^fopLWdthXF<@j7D#UON(fM0KnYwZMG(`bZ`c# zn?h-2Gt)l4K{YB9qnK?qvfnia0sv@VC`u9MFoq^3y0%m?S9K@nWlbfM0kIb}NG5PB z)bIg}_BhIIRAtFQ)Ze&jSzG5j8SiCIn+}EU8QyS1(k7sPk?Q~G|3?%~g+vFK#9*v< zF~&_BxUDAVBaUPE=c#G9QtIxIZ8?{M#k0HqIj;Yh!e8y^Cu#+0+r9v)qT)Tl2eIK< zrXYGUpr>#5%7|RT6TEv4e_k+o0^9rKe1q2f%!!K03fJ+41v)~DnklJ>y3a2p-DUkUS{`7mVI6RL}%la@Cu zMn{%9<55!BdbZ!l$`{-B-<^-T2?;H;gML;27qtHlgNE*}Z~tDd@Jjb6>ve?{<ap z#8Rs{uH9KHOT2F`NH^@|9(Wx3zgq_b8xAaGq-2x;`39g#l{|QrP1-J-9PUB9EosuM zHJ-E|0~G%C9=|E~n{vM?_diiCaMsOn+K)0OB1bYdwxxIAF?=>xv9V`F*h%6A3^r5* z0B~gviVyZTT%Hkg;_M$le#B-ANU?=Croi031O`cA12iVROEIgV^BlAa+kIj-+v1XM zKWC5w5|%H~|KcJKB$cUg0YY@Mq9Jm7Y~fHV=Z$owAx8 zA@Gz##a1&_gZ-=KU-Eav!hQaCzP-K8D<{x?uiPpW>#m+CLnC=vOzHx7PoHed>>l(T=N=k zGC5g6Z->iNGyo982xAW~UDg(eX{KU3$OGxK?* zAGazjyq>EO^SltceQGyjj=ueCfWPIR8G-+%smV{-tJg9XwH-Nqt@-h=U!UZD?Cjr@ zuo^4MInco|ZTyPxe{AX_%cLsegdr-^?6_ukx!r{t#WR;AID-#Y0tOhxm=iv~P5mp> z|4jXFn!1umPn$iS9v&ZNXR){I`1t2tPzES>C{MIUWG&t5MEO^Q|6@}}D(Hiz!$tF! zp)|VSwi7&<;^;JgBuZ@4QqYWfrtEJ1HubMi|1BYt9d;B(XG%R9B<1 zhJTw=+jz?V8RgQopQfV=X^9oSQz~rIHt^#9vCmB!$5K_!#U7kk^qYUz4}{}5g4}8H z#$iFWu?ZTxUPU|**$B0A88YcGZidIN8SS^J|Cwg~HR}JSssC=JEWhwyz5d6h-hClj zqc#%EtVjmd#XS;d#CBek8LPh=u^3`fK`(bL{cY-BfA2q2|J<2^rz)Z>{QP$CX9WIr z9t$UT>SjR2wbTGLhd{q}OS3=$PG_AP@MY;7vWl0mvgc=L*k^BJP*n^MX_j8K~zKtOrdWoOqQD>{Y^S3 z1`>@}_FGf}2jZzqR}tPFArr%VBf-;O5E~I^Og@bqi?z=q!j^9LFA zyHsQQ3OSkyN^gK9f#>fChkB^=n}nzqzq7kgTEn2uw11QimJc(o5hsiYjz9yZPoM=R z-FN&{Z!pgB1$}HeLvrwAUnWDKhoT$#QZoT?xoOR2@KpCoAiHH!G__c|VqoB+WK)MA zn&Q?*tV|PICra6|GCLx>R_fH4mVrF$nYy+@q#9ll`6jf#Zk2P|S)RJ}o+Nm!I=B^g z&WdmyHks1;b<2%G5oEr6NAJi|B$GE=1v$QZBRooE?z zrMWo~fDu;MJb3betrV3q+S0sRCyl;{CL+lr#rG-xBY0R;E3Emu9~6hz9+}U`5lr(- z%Zk<|8~n~|DWWSrvzmE$FlVk9BkdY(=%wW@Z*&+^0-_={V-uV6?{JNRr)1SbvwzH7 zUvKQ1z0Hv{ILW`9s;5w2i^wON=sYt~) zv>q|82~}+>+TF}COEeBQSbjjf$7stBh!1vEmr_^n@8*@#(8?E!Ip(i$m5K|#jeD#V z&;3f_D5S0&+KOm!gqhs3Nitvj6C`f?IWKOKjs;5zy6m8yAfX42D!5E=nRwmhjsC26 z5y4T8x1JeCjh)lDBYkdCLHsax5B$bMv9qsPxY%Xm?nWY=c%M?Z?O^VO z3GvmuNJvz#uat(AI0~%-Z6ac$nzmrBz!;|Y8JK`;#PD7d^>C(5*#=ZED1^l?nVcyJ zFJyJDu9|-y;DN*9hyfGrstKq2E~THAqq@+NYDGYT42r(u^2fM#S~A;&G{%~U<2xx% zYu%|N3EX^qq7_$uckk##pMk?=uS5hKj5$u@KHS;(&VhFvuk*EBu-&s+Nn_J7v?5sx zM(<9dG+NlD-Fd3JF1|ZDN0{k`5q_^hoC_~f>k5V11V(NgA^VIBlHaVh$*9iFex&Eh z2xuoNOT4@PoViwWV}J5wF!1(Dz<{mX2^`zWrr&& zt~&}F5=BQ#M{0Xw1}d|YmXe?Tz(7N8LD`9qWRw`{1%yy0L$N6`GFFLhX7^C2(X>o4B*IVu1xm zKKTIhY9yaaw^Nsa?JP2=*#gHU=8C(bRD7|uM~ zH4^7t)R=*0p9#h@uYb3uZ}`I(<-sg5_;Ln3n9s?Jd{a7f>m?Rm@(Gl@wwwBF zfzhwb<)7f@=trE_+Oka+Vd^3{58Eh0#WI?4t#GS!@_N~34h!47_vcQ#khe(nD$u$} zQJ-8{BmJYbn`R+YOWky-bo|s(_)w&7Z%aPmpE~sBjD^{?HlOA$F}|V&HnIwB_cUo1 zR9~E7XJel;#fp zLBy7xWAYjIqXT1OPkRLISm5Q2%pEOD z`!Q)XGyByqu-;$vyE^r0pcPRWnjafBl$oV+;bttxgP)O*(i+lNj;Rso4@UgNA8z~F z!{#kw(7nvan)2C>E0)inQBOhOy+}K`MFY;vIaPTD?H_T9)AwR(;y<-{&b{-01`|~A zQBq0va$sgynD`us8p#*7V6zA$gpVd0J*{Hh+yxUJ=A*?E<@^mijnkVder_(0c z1Fq)U=7bk4XAIk>~8DF8P z?5ImzCBWN{1;ksw@TFCEBo>4dMfLIqrxvKx+P&%t0QQiA+_je(ir0>Fk-_Sd*h&nE z;wL0LtuA#AR&Dd^VexXrk5cWjrMd6Ihz(QErmj~T^)dGA4K#G16-Fn`cIsY3U&W;K z1z)+i@LqRx1USiUM1Ka0Ck|+c4u`c!8qQZqD+0BNDtwtuem0Sf0a8XUELrHH9-k;{ zci2=KjL*>mz3$GTQLg-Y`(n_W-_X0cj;$#rS3+n-{O!#!A!|ExQ-x)@Klkj8R>9#x zmR@xSEOmw*ljO2t{K#6w!8%)aGsTb5=g8e0YrE4lAH7Ua)$MD7s{;bIwWYSa;GO5p ze8xFWJzZmaFZTk7%2uCVTp#^7nXB{IPd2Hazz1-nz3b^wR*`Fl#U*)g&=S9OQZxyB z5cD-?zq4Y>mmKkSDZk=bce&xYLF`VABDIm5=UVuTlC~Q7QB&y z+*r^+4rC*JY!95dsfGD8*+D~ZR;$}jV6Wp5CUemv^*JggT5%_L?U}qhWq}ZfB&qLJ zxjEP)e|?*Bkrq*DxP8`gLELt{`JU@Zwy>=DkjK}B+=$px{l()YH!x9F(v@A3wJsT! znv@bbQkIg?91Z{Zdvb@JONLfTlE*3I_z6dMtP;|$L+69`^X2*5Qt#mxE4L2#BbM0U-}@N2uxoM_t%vDXF@1r8MD6o3pC-pU2sKw6mw2{Q_=DkPjKP! zV7Mu@lMEjSATr?SGQuWn#a^`)vlL{g4?^O`7xCAV+nMso4g}@jX3agH<2Yx?as-;j z_B-vI+I_c2X4&0tWCG?LHgXe+S6%xCEQuxAzG-O_qQ|0aVh*|RAzI(X`uQ69cZH%{ zNw-pHiR^0gmKUXxw7?EwJRQG=td1Y(B5QPRnAxN zh1bW8a8^+HTG8nsRLY(N%(-042xj(}d;u#ooPpg)`XlqGgrV^5f))CBZp=js*2rDP zw05;uH6UPIuIp%4rYjd|LY*%aDOVr!@Ex0J0KS+31sseCPvsNq7H@-K&mV{CKHVg% zvb5$N8g=z&l`(9}sm zw;5*WTFt_nSw^%bEl?UFTHOsog^bASe~cmnjYem#f3e&uB^;L1Hg#uxfPBD`KU-{qZJe6j8}BZAMqr%aO| zl_^5BD}2ZOjeI*uMB2X=j8V37)>iX`ju7j+o%pidf^BzFk)Ni692p;%VWq21qT0<8 z|6+D-&(vvN`C#)>Ot6)MtD+&mDj6La$dHe$dyAF^3p?G}<>TJU7cXQk_-uq$!hO$y zZooU^9&%ABOof{BWmsmz?UDoWNT?sfOn}S_N*%4P$B#uJMe!Z}frR|N8nFSblpkKU zm4uw|kJe9nNy1_e+?b2=2p+7!eP2bP-JCNtE+-@E-t%Y%nQSi1qIC%ko}s;c$H{lZ$in8fW80Jsu>M1u zh?zp}OS*hv=fH4UFR~PI6a?Q?4hDuoB})% zPS2rQLxdX0%Bfz}({b53>q~4}3Ah5!W%F6J%yoSH;qV`XAF@O-dX|+f8P0s`!nkaS zZqY1hh@U3-SeJ`khV9CA=1-`SXNoYGoWx_yo)n7vbdYWqz2CBcTg4AfCceTaH&b0o z(tMAy%KZRlSb_u?+i>>?S8^+Uh23s*3QM}CSZ9<6gJe*+yz@cd24h(Hv_@89YRiUU z@>k2YE|rxR@%R`U-rcYD)^SXI8S2Rk9N*D!VBg$j;on_;%XPs$6SDRDazvPPrSOUS zOw3C?PyIsOp;+72(?&r*$?WdsmZLSBF?KI^2>ULc`KesZ=```8xaRuK8I3wiRq$f& zh%028@5!^IA=yIN=Pc)A7d|!R*o6&7F6Aw4w}V2Q@;>MBJgdOx;G2$q1A1yWCBrXM zB={GAsr!}|pw~i>-Dej1zC7`Ixd57&Zc9Oy@V<#b)TnwVL|s!XxBL%$>nIb6d&fPI z8LTU7OV1zQzBJ9{4mq^+=m=G~qJ_#B3Akoi1{b(R4En66ShPiT{mnr%A-wqbHE-_LD<7it)hoX-IjGUZ!v){k( z>+gzIMXBV`|HFs($c`yXQZ<{V61ebw1g*yBJr6wM{v+u!8M%AYOI$Zufy@GIs{CK& zy35y$&~gkoEF)S9AQ;spKJ`|8sbT)$G#6kxlpce;K`py$UGm*07sg`Yp3_K+NnL3; zR!llu{|rlkMRw$EIw2<$p*#}O=_mQ@FuJwzsJ^J6F1u` zpi2#b5@PsHxpn%mOU$&*vRcd8R6-I@RERmW{+PjV4|vA|$&wMAuLNQEg|P@GSC#E| zPdiqs9yo3tuWzbPB6bL*cck&NRZkAd^t-iy#`5RIsd8^FRNp&3bI5$E;iqr z&JG4;VuWBFg)Lcel-MgRp&n14WT+5* z{fZ?ehG6ne(8;18mib&TOY}HI5cZ-^sXtv&d-17-iTKty=%}Drls|(;Ky@3|6vD0F zC_w<%)_cTPP@0vn!g`APlSb&IS0b$OumRK7Gw4MzM6Z-Ka(BT}|QHp@Ise zaNzjLBIcao7U?b&?RhgvWGZFs*AnP8({+R0`IgUgg(|lteN@{PeXaGO%F~h1#`+eN z+7S9~Zow(EUHdR_C|m25#?afn5S@jo*BAPMrI1H`P()-@v-T&h_VSWaX~`tgM@fnY zs$skB~4D5>qWb)+G(52ZpbK@3xOcrYq}c)|i*m?~C>jt!XGZ>*$4^iIguWdcUc zWZOIV_A!eQBRr2F7@G1jGawK%;|B?E^^}nr!*L|V=q*cc=IxiBQ2Dg0&~vX?81HmJ zKN*suG!Il$>WOxQ=<1?KarL*AwC`#e@#WYl5*XZ^=CfNIR|Upizx2)A$#IJsSQ#LB z4pW@M>THF4vqqgu?9bxF+-y@xJ+_5K)7aj>z4;MwK;64#6y{B63$m`8Wg0N07RGie zp-IM1gg^PoJf;qox7cj?$27(()Sbc5 zZ*xo=!9e?~`7PwO8;;dT-4C<8t2+NsjPibkT>axco7xah9KAlqbft^)=|}ZTwUe3>@sqFO`GaReOs| zK*hbjIWcd51Blnb{||v3KYT*40sd?@m=l_$z5lCR_SisZheW=@g2Mtr3BhRV2wEm^Re#fC^Ekc6niKtzw)^H+z5D@ zX(!N z(_weSmB<{`7R!uwpKmm3Rtn#SzkpiH_bOo628c)a5_VTfAmLz^E70QlPuYpy>>|l< zsuNPRRR~a1at5iDV$Iq3u~Og)@$JJs69kQ+`=Qj7WJNw8&iaS>lK1C)EAltQT$}}x zm|z!lK=UCU;i>2tD(P8tuXOOR#z5uuuwmqN^2Sw(arzW>spcEvVhk%gB9SMtB_MNv%n2*}S{LVe4DIClBi@bL# zU2)jFeKKSuCn}a~KJ>k(GZZ(B#`oEX_2S9!P)&f>r)4occsCdKwP9sB8me^<3!k)E z7-&CSel>-?&Z<%0LoEJ|ts2pVpkOxYnbxT4w3A@B3C=4P)yJdKBMfYe3S~Wt_A@X9 z#w4pW*8gQpC@H5g34xKF5!a$DW;N;B55Z{yY_6pvxfN43WgNnMnu ztD6F+Q1P^Le}WOOPJF-nk+?;msx3l2Q@Dpy>geg|inam6h7X*m8dGHGmNE(ac!plF zx1Qq`vYzj*2ahGPh^5z^s^>#qL8V-8(Tt`bC6`s0_^>v&%mUEX(_@TXByPK9d-3_< z_-MM!#=4Y2nC$^re~3@(cXnPdTKgm{z7<-BI*yHS$`=k#dt;7RMV`|7n60p9)VUU# zi{_-47bgndGpQ?a`aL|*xH?8F6|B%5ylrhXT%EIARiUR)xQB{%S3QXg>%-T2vyCgS zoXFd+SXme2Gr+J=N8O_%g=T`hZR^~FjkG7jv%?)4fkKQ1v%T&a*H28edWZrOa rq(65A|KF=(|I>H>`|R|eTZaEup#FM>{7e7*-Jj*%zXa^pwdDT=jZ{Ot diff --git a/test_fixtures/masp_proofs/D007D1734AD42D34174F04566899481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin b/test_fixtures/masp_proofs/D007D1734AD42D34174F04566899481AB5F7C8F57502C5EAB2BF7594EA6CED8F.bin new file mode 100644 index 0000000000000000000000000000000000000000..bd697324827f4a1b921abc24206dea4d781a2f10 GIT binary patch literal 15257 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 literal 0 HcmV?d00001 From 0c3a2f7ed2d8f94a7758beb31de3ada1a2d11adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Thu, 7 Dec 2023 11:52:03 +0000 Subject: [PATCH 173/175] fixup! Merge branch 'adrian/upgrade_borsh' (#2233) --- core/src/types/time.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/types/time.rs b/core/src/types/time.rs index f82c9e0fe4..cb36844583 100644 --- a/core/src/types/time.rs +++ b/core/src/types/time.rs @@ -155,9 +155,8 @@ impl DateTimeUtc { /// Returns a [`DateTimeUtc`] corresponding to the provided Unix timestamp. #[inline] pub fn from_unix_timestamp(timestamp: i64) -> Option { - Some(Self(chrono::DateTime::from_utc( - chrono::NaiveDateTime::from_timestamp_opt(timestamp, 0)?, - chrono::Utc, + Some(Self(chrono::Utc.from_utc_datetime( + &chrono::NaiveDateTime::from_timestamp_opt(timestamp, 0)?, ))) } From 0a87998ac029e8822a130c43e7142b1d4fc767d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Thu, 7 Dec 2023 11:52:24 +0000 Subject: [PATCH 174/175] fixup! Merge branch 'adrian/upgrade_borsh' (#2233) --- Cargo.toml | 4 +- core/Cargo.toml | 2 +- proof_of_stake/Cargo.toml | 2 +- shared/Cargo.toml | 2 +- wasm/Cargo.lock | 1 + wasm/wasm_source/Cargo.toml | 3 +- wasm_for_tests/wasm_source/Cargo.lock | 1581 +++++++++++++------------ 7 files changed, 806 insertions(+), 789 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 80157f8f8f..3b99922155 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ orion = "0.16.0" paste = "1.0.9" pretty_assertions = "1.4.0" primitive-types = "0.12.1" -proptest = "1.2.0" +proptest = "1.4.0" proptest-state-machine = "0.1.0" prost = "0.12.0" prost-types = "0.12.0" @@ -134,7 +134,7 @@ tendermint-config = "0.34.0" tendermint-light-client = "0.34.0" tendermint-proto = "0.34.0" tendermint-rpc = {version = "0.34.0", default-features = false} -test-log = {version = "0.2.7", default-features = false, features = ["trace"]} +test-log = {version = "0.2.14", default-features = false, features = ["trace"]} tiny-bip39 = {git = "https://github.com/anoma/tiny-bip39.git", rev = "bf0f6d8713589b83af7a917366ec31f5275c0e57"} tiny-hderive = "0.3.0" thiserror = "1.0.38" diff --git a/core/Cargo.toml b/core/Cargo.toml index 143e4400e6..df25f86120 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -57,7 +57,7 @@ num-integer = "0.1.45" num-rational.workspace = true num-traits.workspace = true primitive-types.workspace = true -proptest = {version = "1.2.0", optional = true} +proptest = {workspace = true, optional = true} prost.workspace = true prost-types.workspace = true rand = {version = "0.8", optional = true} diff --git a/proof_of_stake/Cargo.toml b/proof_of_stake/Cargo.toml index 700dccb7fc..391c8ddb8f 100644 --- a/proof_of_stake/Cargo.toml +++ b/proof_of_stake/Cargo.toml @@ -23,7 +23,7 @@ borsh.workspace = true data-encoding.workspace = true derivative.workspace = true once_cell.workspace = true -proptest = {version = "1.2.0", optional = true} +proptest = {workspace = true, optional = true} serde.workspace = true thiserror.workspace = true tracing.workspace = true diff --git a/shared/Cargo.toml b/shared/Cargo.toml index 946d172175..36ebe3c144 100644 --- a/shared/Cargo.toml +++ b/shared/Cargo.toml @@ -104,7 +104,7 @@ owo-colors = "3.5.0" parity-wasm = {version = "0.45.0", features = ["sign_ext"], optional = true} parse_duration = "2.1.1" paste.workspace = true -proptest = {version = "1.2.0", optional = true} +proptest = {workspace = true, optional = true} prost.workspace = true rand.workspace = true rand_core.workspace = true diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index d65f0d3f5a..3e4f8a616f 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -3600,6 +3600,7 @@ dependencies = [ "once_cell", "proptest", "ripemd", + "test-log", "tracing", "tracing-subscriber", "wee_alloc", diff --git a/wasm/wasm_source/Cargo.toml b/wasm/wasm_source/Cargo.toml index b6b9d131fc..6dfecec625 100644 --- a/wasm/wasm_source/Cargo.toml +++ b/wasm/wasm_source/Cargo.toml @@ -56,6 +56,7 @@ namada_tests = {path = "../../tests"} namada_test_utils = {path = "../../test_utils"} namada_tx_prelude = {path = "../../tx_prelude"} namada_vp_prelude = {path = "../../vp_prelude"} -proptest = "1.2.0" +proptest = "1.4.0" +test-log = {version = "0.2.14", default-features = false, features = ["trace"]} tracing = "0.1.30" tracing-subscriber = {version = "0.3.7", default-features = false, features = ["env-filter", "fmt"]} diff --git a/wasm_for_tests/wasm_source/Cargo.lock b/wasm_for_tests/wasm_source/Cargo.lock index 296d3632f8..93b2e80a36 100644 --- a/wasm_for_tests/wasm_source/Cargo.lock +++ b/wasm_for_tests/wasm_source/Cargo.lock @@ -14,11 +14,11 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.27.2", + "gimli 0.28.1", ] [[package]] @@ -50,24 +50,30 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", "once_cell", "version_check", ] [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -79,58 +85,57 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ark-bls12-381" @@ -168,7 +173,7 @@ dependencies = [ "ark-serialize", "ark-std", "derivative", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-traits", "paste", "rustc_version 0.3.3", @@ -191,7 +196,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-traits", "quote", "syn 1.0.109", @@ -225,19 +230,19 @@ checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -271,16 +276,16 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.30.3", + "object 0.32.1", "rustc-demangle", ] @@ -304,9 +309,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -316,15 +321,15 @@ checksum = "8a32fd6af2b5827bce66c29053ba0e7c42b9dcab01835835058558c10851a46b" [[package]] name = "bech32" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" +checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" [[package]] name = "bech32" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bellman" @@ -332,7 +337,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afceed28bac7f9f5a508bca8aeeff51cdfa4770c0b967ac55c621e2ddfd6171" dependencies = [ - "bitvec 1.0.1", + "bitvec", "blake2s_simd", "byteorder", "ff", @@ -351,15 +356,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bip0039" version = "0.10.1" @@ -396,14 +392,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bitvec" -version = "0.17.4" +name = "bitflags" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium 0.3.0", -] +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "bitvec" @@ -412,16 +404,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", - "radium 0.7.0", + "radium", "tap", "wyz", ] [[package]] name = "blake2b_simd" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", "arrayvec", @@ -430,9 +422,9 @@ dependencies = [ [[package]] name = "blake2s_simd" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" +checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" dependencies = [ "arrayref", "arrayvec", @@ -441,16 +433,15 @@ dependencies = [ [[package]] name = "blake3" -version = "1.3.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if 1.0.0", "constant_time_eq", - "digest 0.10.7", ] [[package]] @@ -507,9 +498,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf617fabf5cdbdc92f774bfe5062d870f228b80056d41180797abf48bed4056e" +checksum = "9897ef0f1bd2362169de6d7e436ea2237dc1085d7d1e4db75f4be34d86f309d1" dependencies = [ "borsh-derive", "cfg_aliases", @@ -517,15 +508,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f404657a7ea7b5249e36808dff544bc88a28f26e0ac40009f674b7a009d14be3" +checksum = "478b41ff04256c5c8330f3dfdaaae2a5cc976a8e75088bafa4625b0d0208de8c" dependencies = [ "once_cell", - "proc-macro-crate 2.0.0", + "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "syn_derive", ] @@ -539,18 +530,19 @@ dependencies = [ [[package]] name = "bs58" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2 0.9.9", + "sha2 0.10.8", + "tinyvec", ] [[package]] name = "bumpalo" -version = "3.12.2" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-slice-cast" @@ -566,9 +558,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "bytecheck" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -577,9 +569,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" dependencies = [ "proc-macro2", "quote", @@ -588,9 +580,9 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -603,31 +595,31 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.4" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" dependencies = [ "serde", ] [[package]] name = "cargo-platform" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" -version = "0.15.4" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.17", + "semver 1.0.20", "serde", "serde_json", "thiserror", @@ -695,14 +687,14 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ + "android-tzdata", "iana-time-zone", - "num-integer", "num-traits", - "winapi", + "windows-targets 0.48.5", ] [[package]] @@ -727,18 +719,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.19" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd304a20bff958a57f04c4e96a2e7594cc4490a0e809cbd48bb6437edaa452d" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.3.19" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c6a3f08f1fe5662a35cfe393aec09c4df95f60ee93b7556505260f75eee9e1" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" dependencies = [ "anstream", "anstyle", @@ -748,9 +740,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "clru" @@ -759,18 +751,15 @@ source = "git+https://github.com/marmeladema/clru-rs.git?rev=71ca566#71ca566915f [[package]] name = "coins-bip32" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30a84aab436fcb256a2ab3c80663d8aec686e6bae12827bb05fef3e1e439c9f" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ - "bincode", "bs58", "coins-core", "digest 0.10.7", - "getrandom 0.2.10", "hmac 0.12.1", "k256", - "lazy_static", "serde", "sha2 0.10.8", "thiserror", @@ -778,16 +767,15 @@ dependencies = [ [[package]] name = "coins-bip39" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f4d04ee18e58356accd644896aeb2094ddeafb6a713e056cef0c0a8e468c15" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "bitvec 0.17.4", + "bitvec", "coins-bip32", - "getrandom 0.2.10", "hmac 0.12.1", "once_cell", - "pbkdf2 0.12.1", + "pbkdf2 0.12.2", "rand 0.8.5", "sha2 0.10.8", "thiserror", @@ -795,12 +783,12 @@ dependencies = [ [[package]] name = "coins-core" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b949a1c63fb7eb591eb7ba438746326aedf0ae843e51ec92ba6bec5bb382c4f" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" dependencies = [ - "base64 0.21.0", - "bech32 0.7.3", + "base64 0.21.5", + "bech32 0.9.1", "bs58", "digest 0.10.7", "generic-array 0.14.7", @@ -821,25 +809,38 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "concat-idents" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe0e1d9f7de897d18e590a7496b5facbe87813f746cf4b8db596ba77e07e832" +checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.39", +] + +[[package]] +name = "const-hex" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "hex", + "proptest", + "serde", ] [[package]] name = "const-oid" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6340df57935414636969091153f35f68d9f00bbc8fb4a9c6054706c213e6c6bc" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "constant_time_eq" -version = "0.2.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "contracts" @@ -863,9 +864,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -873,15 +874,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "corosensei" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9847f90f32a50b0dcbd68bc23ff242798b13080b97b0569f6ed96a45ce4cf2cd" +checksum = "80128832c58ea9cbd041d2a759ec449224487b2c1e400453d99d244eead87a8e" dependencies = [ "autocfg", "cfg-if 1.0.0", @@ -892,9 +893,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -977,16 +978,6 @@ dependencies = [ "maybe-uninit", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils 0.8.15", -] - [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -995,19 +986,19 @@ checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", - "crossbeam-utils 0.8.15", + "crossbeam-utils 0.8.16", ] [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if 1.0.0", - "crossbeam-utils 0.8.15", - "memoffset 0.8.0", + "crossbeam-utils 0.8.16", + "memoffset 0.9.0", "scopeguard", ] @@ -1024,9 +1015,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if 1.0.0", ] @@ -1039,9 +1030,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", @@ -1109,9 +1100,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -1119,45 +1110,54 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "darling_macro" -version = "0.20.1" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivation-path" version = "0.2.0" @@ -1244,7 +1244,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1259,7 +1259,7 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "byteorder", "lazy_static", "proc-macro-error", @@ -1281,9 +1281,9 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.16.7" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", "digest 0.10.7", @@ -1334,15 +1334,15 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -1360,20 +1360,20 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "enr" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf56acd72bb22d2824e66ae8e9e5ada4d0de17a69c7fd35569dde2ada8ec9116" +checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" dependencies = [ - "base64 0.13.1", + "base64 0.21.5", "bytes", "hex", "k256", @@ -1407,9 +1407,9 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" +checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d" dependencies = [ "enumset_derive", ] @@ -1423,34 +1423,23 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "equivalent" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.1" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1472,7 +1461,7 @@ dependencies = [ "sha2 0.10.8", "sha3", "thiserror", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -1572,9 +1561,9 @@ dependencies = [ [[package]] name = "ethers-addressbook" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b856b7b8ff5c961093cb8efe151fbcce724b451941ce20781de11a531ccd578" +checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09" dependencies = [ "ethers-core", "once_cell", @@ -1584,16 +1573,16 @@ dependencies = [ [[package]] name = "ethers-contract" -version = "2.0.4" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa43e2e69632492d7b38e59465d125a0066cf4c477390ece00d3acbd11b338b" +checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" dependencies = [ + "const-hex", "ethers-contract-abigen", "ethers-contract-derive", "ethers-core", "ethers-providers", "futures-util", - "hex", "once_cell", "pin-project", "serde", @@ -1603,70 +1592,66 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c113e3e86b6bc16d98484b2c3bb2d01d6fed9f489fe2e592e5cc87c3024d616b" +checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" dependencies = [ "Inflector", + "const-hex", "dunce", "ethers-core", - "ethers-etherscan", "eyre", - "hex", - "prettyplease 0.2.9", + "prettyplease 0.2.15", "proc-macro2", "quote", "regex", - "reqwest", "serde", "serde_json", - "syn 2.0.38", - "tokio", - "toml 0.7.5", - "url", + "syn 2.0.39", + "toml 0.8.2", "walkdir", ] [[package]] name = "ethers-contract-derive" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3fb5adee25701c79ec58fcf2c63594cd8829bc9ad6037ff862d5a111101ed2" +checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" dependencies = [ "Inflector", + "const-hex", "ethers-contract-abigen", "ethers-core", - "hex", "proc-macro2", "quote", "serde_json", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "ethers-core" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" +checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" dependencies = [ "arrayvec", "bytes", "cargo_metadata", "chrono", + "const-hex", "elliptic-curve", "ethabi", "generic-array 0.14.7", - "hex", "k256", - "num_enum 0.6.1", + "num_enum", "once_cell", "open-fastrlp", "rand 0.8.5", "rlp", "serde", "serde_json", - "strum", - "syn 2.0.38", + "strum 0.25.0", + "syn 2.0.39", "tempfile", "thiserror", "tiny-keccak", @@ -1675,13 +1660,14 @@ dependencies = [ [[package]] name = "ethers-etherscan" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84ebb401ba97c6f5af278c2c9936c4546cad75dec464b439ae6df249906f4caa" +checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" dependencies = [ + "chrono", "ethers-core", "reqwest", - "semver 1.0.17", + "semver 1.0.20", "serde", "serde_json", "thiserror", @@ -1690,15 +1676,14 @@ dependencies = [ [[package]] name = "ethers-middleware" -version = "2.0.3" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6f3543b4f6679b2558901c4b323cecb06b19239439d2588fa8b489bac9675d" +checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93" dependencies = [ "async-trait", "auto_impl", "ethers-contract", "ethers-core", - "ethers-etherscan", "ethers-providers", "ethers-signers", "futures-channel", @@ -1717,24 +1702,24 @@ dependencies = [ [[package]] name = "ethers-providers" -version = "2.0.4" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1009041f40476b972b5d79346cc512e97c662b1a0a2f78285eabe9a122909783" +checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" dependencies = [ "async-trait", "auto_impl", - "base64 0.21.0", + "base64 0.21.5", "bytes", + "const-hex", "enr", "ethers-core", "futures-core", "futures-timer", "futures-util", - "getrandom 0.2.10", "hashers", - "hex", "http", "instant", + "jsonwebtoken", "once_cell", "pin-project", "reqwest", @@ -1753,17 +1738,17 @@ dependencies = [ [[package]] name = "ethers-signers" -version = "2.0.7" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c4b7e15f212fa7cc2e1251868320221d4ff77a3d48068e69f47ce1c491df2d" +checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532" dependencies = [ "async-trait", "coins-bip32", "coins-bip39", + "const-hex", "elliptic-curve", "eth-keystore", "ethers-core", - "hex", "rand 0.8.5", "sha2 0.10.8", "thiserror", @@ -1772,9 +1757,9 @@ dependencies = [ [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" dependencies = [ "indenter", "once_cell", @@ -1794,12 +1779,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "ff" @@ -1807,7 +1789,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec 1.0.1", + "bitvec", "rand_core 0.6.4", "subtle 2.4.1", ] @@ -1848,9 +1830,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1864,7 +1846,7 @@ dependencies = [ "cbc", "cipher", "libm", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-integer", "num-traits", ] @@ -1877,9 +1859,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1892,9 +1874,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1902,15 +1884,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1919,9 +1901,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-locks" @@ -1935,26 +1917,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-timer" @@ -1968,9 +1950,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -2028,9 +2010,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -2052,9 +2034,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.2" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gloo-timers" @@ -2102,9 +2084,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.18" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -2112,7 +2094,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -2145,9 +2127,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hashers" @@ -2166,18 +2148,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -2231,11 +2204,20 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77e806677ce663d0a199541030c816847b36e8dc095f70dae4a4f4ad63da5383" +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -2261,15 +2243,15 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -2282,7 +2264,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2305,16 +2287,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.56" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -2387,7 +2369,7 @@ dependencies = [ "ibc-core-handler-types", "ibc-core-host", "ibc-primitives", - "prost 0.12.1", + "prost 0.12.3", "serde", "tendermint", "tendermint-light-client-verifier", @@ -2406,7 +2388,7 @@ dependencies = [ "ibc-core-host-types", "ibc-primitives", "ibc-proto", - "prost 0.12.1", + "prost 0.12.3", "serde", "tendermint", "tendermint-light-client-verifier", @@ -2452,7 +2434,7 @@ dependencies = [ "ibc-core-host", "ibc-core-router", "ibc-primitives", - "prost 0.12.1", + "prost 0.12.3", ] [[package]] @@ -2469,7 +2451,7 @@ dependencies = [ "ibc-core-host-types", "ibc-primitives", "ibc-proto", - "prost 0.12.1", + "prost 0.12.3", "serde", "sha2 0.10.8", "subtle-encoding", @@ -2488,7 +2470,7 @@ dependencies = [ "ibc-core-handler-types", "ibc-core-host", "ibc-primitives", - "prost 0.12.1", + "prost 0.12.3", ] [[package]] @@ -2505,7 +2487,7 @@ dependencies = [ "ibc-core-host-types", "ibc-derive", "ibc-primitives", - "prost 0.12.1", + "prost 0.12.3", "subtle-encoding", "tendermint", ] @@ -2522,7 +2504,7 @@ dependencies = [ "ibc-core-host-types", "ibc-primitives", "ibc-proto", - "prost 0.12.1", + "prost 0.12.3", "serde", "subtle-encoding", "tendermint", @@ -2539,7 +2521,7 @@ dependencies = [ "ibc-primitives", "ibc-proto", "ics23", - "prost 0.12.1", + "prost 0.12.3", "serde", "subtle-encoding", ] @@ -2555,7 +2537,7 @@ dependencies = [ "ibc-core-handler-types", "ibc-core-host", "ibc-primitives", - "prost 0.12.1", + "prost 0.12.3", ] [[package]] @@ -2571,7 +2553,7 @@ dependencies = [ "ibc-core-host-types", "ibc-primitives", "ibc-proto", - "prost 0.12.1", + "prost 0.12.3", "serde", "subtle-encoding", "tendermint", @@ -2609,7 +2591,7 @@ dependencies = [ "ibc-core-router-types", "ibc-primitives", "ibc-proto", - "prost 0.12.1", + "prost 0.12.3", "serde", "subtle-encoding", "tendermint", @@ -2631,7 +2613,7 @@ dependencies = [ "ibc-core-handler-types", "ibc-core-host-types", "ibc-primitives", - "prost 0.12.1", + "prost 0.12.3", "subtle-encoding", ] @@ -2653,7 +2635,7 @@ dependencies = [ "ibc-core-host-types", "ibc-primitives", "ibc-proto", - "prost 0.12.1", + "prost 0.12.3", "serde", "sha2 0.10.8", "subtle-encoding", @@ -2684,7 +2666,7 @@ dependencies = [ "ibc-core-host-types", "ibc-core-router-types", "ibc-primitives", - "prost 0.12.1", + "prost 0.12.3", "subtle-encoding", ] @@ -2700,7 +2682,7 @@ dependencies = [ "ibc-primitives", "ibc-proto", "ics23", - "prost 0.12.1", + "prost 0.12.3", "serde", "subtle-encoding", "tendermint", @@ -2715,7 +2697,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -2727,7 +2709,7 @@ dependencies = [ "derive_more", "displaydoc", "ibc-proto", - "prost 0.12.1", + "prost 0.12.3", "serde", "tendermint", "time", @@ -2739,11 +2721,11 @@ version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93cbf4cbe9e5113cc7c70f3208a7029b2205c629502cbb2ae7ea0a09a97d3005" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "bytes", "flex-error", "ics23", - "prost 0.12.1", + "prost 0.12.3", "serde", "subtle-encoding", "tendermint-proto", @@ -2762,7 +2744,7 @@ dependencies = [ "ibc-proto", "parking_lot", "primitive-types", - "prost 0.12.1", + "prost 0.12.3", "subtle-encoding", "tendermint", "tendermint-testgen", @@ -2780,7 +2762,7 @@ dependencies = [ "bytes", "hex", "informalsystems-pbjson", - "prost 0.12.1", + "prost 0.12.3", "ripemd", "serde", "sha2 0.10.8", @@ -2795,9 +2777,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2889,12 +2871,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.3", ] [[package]] @@ -2934,34 +2916,11 @@ dependencies = [ "num-traits", ] -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "is-terminal" -version = "0.4.7" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" -dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix", - "windows-sys 0.48.0", -] +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itertools" @@ -2983,26 +2942,40 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.62" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.5", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "jubjub" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8499f7a74008aafbecb2a2e608a3e13e4dd3e84df198b604451efe93f2de6e61" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bls12_381", "ff", "group", @@ -3012,9 +2985,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" dependencies = [ "cfg-if 1.0.0", "ecdsa", @@ -3048,9 +3021,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libloading" @@ -3064,9 +3037,20 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] [[package]] name = "libsecp256k1" @@ -3086,15 +3070,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.3.7" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -3102,9 +3086,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "loupe" @@ -3156,7 +3140,7 @@ source = "git+https://github.com/anoma/masp?tag=v1.0.0#c3c6047a9c9da54058afc7121 dependencies = [ "aes", "bip0039", - "bitvec 1.0.1", + "bitvec", "blake2b_simd", "blake2s_simd", "bls12_381", @@ -3189,7 +3173,7 @@ dependencies = [ "blake2b_simd", "bls12_381", "directories", - "getrandom 0.2.10", + "getrandom 0.2.11", "group", "itertools 0.11.0", "jubjub", @@ -3207,7 +3191,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -3218,9 +3202,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" @@ -3242,9 +3226,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -3275,9 +3259,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] @@ -3297,14 +3281,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -3351,7 +3334,7 @@ dependencies = [ "parse_duration", "paste", "proptest", - "prost 0.12.1", + "prost 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "rayon", @@ -3410,11 +3393,11 @@ dependencies = [ "num-rational 0.4.1", "num-traits", "num256", - "num_enum 0.7.0", + "num_enum", "primitive-types", "proptest", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "rayon", @@ -3502,7 +3485,7 @@ dependencies = [ "owo-colors", "parse_duration", "paste", - "prost 0.12.1", + "prost 0.12.3", "rand 0.8.5", "rand_core 0.6.4", "ripemd", @@ -3527,7 +3510,7 @@ version = "0.27.0" dependencies = [ "borsh", "namada_core", - "strum", + "strum 0.24.1", ] [[package]] @@ -3551,7 +3534,7 @@ dependencies = [ "namada_tx_prelude", "namada_vp_prelude", "num-traits", - "prost 0.12.1", + "prost 0.12.3", "regex", "serde", "serde_json", @@ -3607,7 +3590,7 @@ name = "namada_wasm_for_tests" version = "0.27.0" dependencies = [ "borsh", - "getrandom 0.2.10", + "getrandom 0.2.11", "namada_test_utils", "namada_tests", "namada_tx_prelude", @@ -3637,12 +3620,12 @@ dependencies = [ [[package]] name = "num" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" dependencies = [ - "num-bigint 0.4.3", - "num-complex 0.4.3", + "num-bigint 0.4.4", + "num-complex 0.4.4", "num-integer", "num-iter", "num-rational 0.4.1", @@ -3662,9 +3645,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -3683,9 +3666,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ "num-traits", ] @@ -3741,16 +3724,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -3763,7 +3746,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9b5179e82f0867b23e0b9b822493821f9345561f271364f409c8e4a058367d" dependencies = [ "lazy_static", - "num 0.4.0", + "num 0.4.1", "num-derive", "num-traits", "serde", @@ -3772,54 +3755,33 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] [[package]] name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb" -dependencies = [ - "num_enum_derive 0.7.0", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 2.0.38", + "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3836,18 +3798,18 @@ dependencies = [ [[package]] name = "object" -version = "0.30.3" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -3899,7 +3861,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6624905ddd92e460ff0685567539ed1ac985b2dee4c92c7edcd64fce905b00c" dependencies = [ "ct-codecs", - "getrandom 0.2.10", + "getrandom 0.2.11", "subtle 2.4.1", "zeroize", ] @@ -3921,12 +3883,12 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.5.0" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ddb756ca205bd108aee3c62c6d3c994e1df84a59b9d6d4a5ea42ee1fd5a9a28" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec", - "bitvec 1.0.1", + "bitvec", "byte-slice-cast", "impl-trait-for-tuples", "parity-scale-codec-derive", @@ -3935,11 +3897,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.1.4" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 2.0.1", "proc-macro2", "quote", "syn 1.0.109", @@ -3963,15 +3925,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.16", + "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets 0.48.5", ] [[package]] @@ -4011,9 +3973,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pbkdf2" @@ -4045,9 +4007,9 @@ dependencies = [ [[package]] name = "pbkdf2" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0ca0b5a68607598bf3bad68f32227a8164f6254833f84eafaac409cd6746c31" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", "hmac 0.12.1", @@ -4080,30 +4042,40 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.6.0" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 1.9.3", + "indexmap 2.1.0", ] [[package]] @@ -4118,29 +4090,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -4169,6 +4141,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -4187,12 +4165,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.9" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4216,16 +4194,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit 0.19.11", + "toml_edit 0.19.15", ] [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" dependencies = [ - "toml_edit 0.20.7", + "toml_datetime", + "toml_edit 0.20.2", ] [[package]] @@ -4254,28 +4233,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", - "bitflags", - "byteorder", + "bit-vec", + "bitflags 2.4.1", "lazy_static", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax 0.8.2", "rusty-fork", "tempfile", "unarray", @@ -4293,12 +4272,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive 0.12.1", + "prost-derive 0.12.3", ] [[package]] @@ -4338,15 +4317,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4360,11 +4339,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" dependencies = [ - "prost 0.12.1", + "prost 0.12.3", ] [[package]] @@ -4402,12 +4381,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - [[package]] name = "radium" version = "0.7.0" @@ -4473,7 +4446,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", ] [[package]] @@ -4508,14 +4481,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel 0.5.8", "crossbeam-deque", - "crossbeam-utils 0.8.15", - "num_cpus", + "crossbeam-utils 0.8.16", ] [[package]] @@ -4551,30 +4522,21 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", + "getrandom 0.2.11", + "libredox", "thiserror", ] @@ -4591,13 +4553,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -4609,6 +4572,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -4617,9 +4591,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "region" @@ -4627,7 +4601,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" dependencies = [ - "bitflags", + "bitflags 1.3.2", "libc", "mach", "winapi", @@ -4635,9 +4609,9 @@ dependencies = [ [[package]] name = "rend" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" +checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" dependencies = [ "bytecheck", ] @@ -4648,7 +4622,7 @@ version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -4709,12 +4683,12 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", - "getrandom 0.2.10", + "getrandom 0.2.11", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -4732,23 +4706,26 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.41" +version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" dependencies = [ + "bitvec", "bytecheck", "hashbrown 0.12.3", "ptr_meta", "rend", "rkyv_derive", "seahash", + "tinyvec", + "uuid 1.6.1", ] [[package]] name = "rkyv_derive" -version = "0.7.41" +version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" dependencies = [ "proc-macro2", "quote", @@ -4810,31 +4787,30 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.17", + "semver 1.0.20", ] [[package]] name = "rustix" -version = "0.37.19" +version = "0.38.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" dependencies = [ - "bitflags", + "bitflags 2.4.1", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring 0.17.5", + "ring 0.17.7", "rustls-webpki", "sct", ] @@ -4853,11 +4829,11 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", ] [[package]] @@ -4866,15 +4842,15 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", + "ring 0.17.7", "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "rusty-fork" @@ -4890,9 +4866,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "salsa20" @@ -4914,9 +4890,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.8.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad560913365790f17cbf12479491169f01b9d46d29cfc7422bf8c64bdc61b731" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" dependencies = [ "cfg-if 1.0.0", "derive_more", @@ -4926,9 +4902,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.8.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19df9bd9ace6cc2fe19387c96ce677e823e07d017ceed253e7bb3d1d1bd9c73b" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -4938,18 +4914,18 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scrypt" @@ -4965,12 +4941,12 @@ dependencies = [ [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] @@ -4981,9 +4957,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -4996,11 +4972,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -5009,9 +4985,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -5028,9 +5004,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" dependencies = [ "serde", ] @@ -5058,9 +5034,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -5076,9 +5052,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.9" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" dependencies = [ "serde", ] @@ -5095,20 +5071,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -5117,20 +5093,20 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.12" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] @@ -5205,9 +5181,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] @@ -5223,9 +5199,9 @@ dependencies = [ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -5243,11 +5219,23 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc47a29ce97772ca5c927f75bac34866b16d64e07f330c3248e2d7226623901b" +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "thiserror", + "time", +] + [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -5263,20 +5251,30 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "sparse-merkle-tree" version = "0.3.1-pre" @@ -5302,9 +5300,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -5334,7 +5332,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros 0.25.3", ] [[package]] @@ -5350,6 +5357,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.39", +] + [[package]] name = "subtle" version = "1.0.0" @@ -5390,9 +5410,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -5401,14 +5421,14 @@ dependencies = [ [[package]] name = "syn_derive" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6eef0000c4a12ecdfd7873ea84a8b5aab5e44db72e38e07b028a25386f29a5" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5417,7 +5437,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] @@ -5440,21 +5460,21 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.7" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tempfile" -version = "3.5.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if 1.0.0", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -5472,8 +5492,8 @@ dependencies = [ "k256", "num-traits", "once_cell", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "ripemd", "serde", "serde_bytes", @@ -5509,7 +5529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94aecbdccbc4b557649b2d1b1a4bfc27ec85205e00fb8020fce044245a4c9e3f" dependencies = [ "contracts", - "crossbeam-channel 0.4.4", + "crossbeam-channel", "derive_more", "flex-error", "futures", @@ -5550,8 +5570,8 @@ dependencies = [ "flex-error", "num-derive", "num-traits", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "serde", "serde_bytes", "subtle-encoding", @@ -5568,11 +5588,11 @@ dependencies = [ "bytes", "flex-error", "futures", - "getrandom 0.2.10", + "getrandom 0.2.11", "peg", "pin-project", "reqwest", - "semver 1.0.17", + "semver 1.0.20", "serde", "serde_bytes", "serde_json", @@ -5586,7 +5606,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid", + "uuid 0.8.2", "walkdir", ] @@ -5608,33 +5628,43 @@ dependencies = [ [[package]] name = "test-log" -version = "0.2.11" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6159ab4116165c99fc88cce31f99fa2c9dbe08d3691cb38da02fc3b45f357d2b" +dependencies = [ + "test-log-macros", + "tracing-subscriber", +] + +[[package]] +name = "test-log-macros" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f0c854faeb68a048f0f2dc410c5ddae3bf83854ef0e4977d58306a5edef50e" +checksum = "7ba277e77219e9eea169e8508942db1bf5d8a41ff2db9b20aab5a5aadc9fa25d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5649,10 +5679,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", + "itoa", + "powerfmt", "serde", "time-core", "time-macros", @@ -5660,15 +5693,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] @@ -5730,11 +5763,11 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.1" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -5742,20 +5775,20 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5770,9 +5803,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -5793,47 +5826,47 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebafdf5ad1220cb59e7d17cf4d2c72015297b75b19a10472f99b89225089240" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.19.11", + "toml_edit 0.20.2", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.11" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.0", - "serde", - "serde_spanned", + "indexmap 2.1.0", "toml_datetime", - "winnow 0.4.6", + "winnow", ] [[package]] name = "toml_edit" -version = "0.20.7" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.1.0", + "serde", + "serde_spanned", "toml_datetime", - "winnow 0.5.19", + "winnow", ] [[package]] @@ -5875,7 +5908,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5899,9 +5932,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "once_cell", @@ -5935,20 +5968,20 @@ checksum = "982ee4197351b5c9782847ef5ec1fdcaf50503fb19d68f9771adae314e72b492" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uint" @@ -5970,15 +6003,15 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -5991,9 +6024,9 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -6003,9 +6036,9 @@ checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle 2.4.1", @@ -6025,9 +6058,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -6046,10 +6079,16 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", "serde", ] +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" + [[package]] name = "version_check" version = "0.9.4" @@ -6067,9 +6106,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -6077,11 +6116,10 @@ dependencies = [ [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -6099,9 +6137,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -6109,24 +6147,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.35" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -6136,9 +6174,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6146,28 +6184,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.26.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05d0b6fcd0aeb98adf16e7975331b3c17222aa815148f5b976370ce589d80ef" +checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" dependencies = [ "leb128", ] @@ -6442,7 +6480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29e3ac9b780c7dda0cac7a52a5d6d2d6707cc6e3451c9db209b6c758f40d7acb" dependencies = [ "indexmap 1.9.3", - "semver 1.0.17", + "semver 1.0.20", ] [[package]] @@ -6461,9 +6499,9 @@ dependencies = [ [[package]] name = "wast" -version = "57.0.0" +version = "69.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb0f5ed17ac4421193c7477da05892c2edafd67f9639e3c11a82086416662dc" +checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" dependencies = [ "leb128", "memchr", @@ -6473,18 +6511,18 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.63" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9ab0d87337c3be2bb6fc5cd331c4ba9fd6bcb4ee85048a0dd59ed9ecf92e53" +checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.62" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -6510,13 +6548,14 @@ dependencies = [ [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] @@ -6537,9 +6576,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -6551,12 +6590,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.5", ] [[package]] @@ -6574,78 +6613,63 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.52.0", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" @@ -6655,15 +6679,15 @@ checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" @@ -6673,15 +6697,15 @@ checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" @@ -6691,15 +6715,15 @@ checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" @@ -6709,27 +6733,27 @@ checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" @@ -6739,30 +6763,21 @@ checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "winnow" -version = "0.4.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" -dependencies = [ - "memchr", -] +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "b7e87b8dfbe3baffbe687eef2e164e32286eff31a5ee16463ce03d991643ec94" dependencies = [ "memchr", ] @@ -6816,9 +6831,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -6831,5 +6846,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] From 857d55539998a7797608ef713c15c4ff6ef7c987 Mon Sep 17 00:00:00 2001 From: Tiago Carvalho Date: Thu, 7 Dec 2023 13:10:41 +0000 Subject: [PATCH 175/175] fixup! Merge branch 'adrian/upgrade_borsh' (#2233) --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c11d3a6414..168be17e12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7881,9 +7881,9 @@ checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.38.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +checksum = "d05d0b6fcd0aeb98adf16e7975331b3c17222aa815148f5b976370ce589d80ef" dependencies = [ "leb128", ] @@ -8177,9 +8177,9 @@ dependencies = [ [[package]] name = "wast" -version = "69.0.1" +version = "57.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +checksum = "6eb0f5ed17ac4421193c7477da05892c2edafd67f9639e3c11a82086416662dc" dependencies = [ "leb128", "memchr", @@ -8189,9 +8189,9 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.82" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +checksum = "ab9ab0d87337c3be2bb6fc5cd331c4ba9fd6bcb4ee85048a0dd59ed9ecf92e53" dependencies = [ "wast", ]