From e0ff89c58fcf92834d0c0bad94fa3a8c88990a7f Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Sun, 4 Aug 2024 14:41:55 -0400 Subject: [PATCH 01/22] scaffold config file pledge struct --- types/src/core_types/app_cfg.rs | 160 ++++++++++++++++++++++++-------- 1 file changed, 121 insertions(+), 39 deletions(-) diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 318ad81a0..70152be24 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -6,7 +6,7 @@ use crate::{ move_resource::gas_coin::SlowWalletBalance, }; use anyhow::{bail, Context}; -use diem_crypto::ed25519::Ed25519PrivateKey; +use diem_crypto::{compat::Sha3_256, ed25519::Ed25519PrivateKey, HashValue}; use diem_global_constants::{GAS_UNIT_PRICE, MAX_GAS_AMOUNT}; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, DisplayFromStr}; @@ -144,42 +144,43 @@ impl AppCfg { Ok(toml_path) } - pub fn migrate(legacy_file: Option, output: Option) -> anyhow::Result { - let l = LegacyToml::parse_toml(legacy_file)?; - - let nodes = if let Some(v) = l.profile.upstream_nodes.as_ref() { - v.iter() - .map(|u| HostProfile { - url: u.to_owned(), - note: u.to_string(), - ..Default::default() - }) - .collect::>() - } else { - vec![] - }; - let np = NetworkPlaylist { - chain_name: l.chain_info.chain_id, - nodes, - }; - let app_cfg = AppCfg { - workspace: l.workspace, - user_profiles: vec![l.profile], - network_playlist: vec![np], - tx_configs: l.tx_configs, - }; - - if let Some(p) = output { - fs::create_dir_all(&p)?; - println!("created file for {}", p.to_str().unwrap()); - let yaml = serde_yaml::to_string(&app_cfg)?; - fs::write(p, yaml.as_bytes())?; - } else { - app_cfg.save_file()?; - } - - Ok(app_cfg) - } + // v7.0.3 deprecation notice: no migration from v5 supported + // pub fn migrate(legacy_file: Option, output: Option) -> anyhow::Result { + // let l = LegacyToml::parse_toml(legacy_file)?; + + // let nodes = if let Some(v) = l.profile.upstream_nodes.as_ref() { + // v.iter() + // .map(|u| HostProfile { + // url: u.to_owned(), + // note: u.to_string(), + // ..Default::default() + // }) + // .collect::>() + // } else { + // vec![] + // }; + // let np = NetworkPlaylist { + // chain_name: l.chain_info.chain_id, + // nodes, + // }; + // let app_cfg = AppCfg { + // workspace: l.workspace, + // user_profiles: vec![l.profile], + // network_playlist: vec![np], + // tx_configs: l.tx_configs, + // }; + + // if let Some(p) = output { + // fs::create_dir_all(&p)?; + // println!("created file for {}", p.to_str().unwrap()); + // let yaml = serde_yaml::to_string(&app_cfg)?; + // fs::write(p, yaml.as_bytes())?; + // } else { + // app_cfg.save_file()?; + // } + + // Ok(app_cfg) + // } /// Get where the block/proofs are stored. pub fn get_block_dir(&self, nickname: Option) -> anyhow::Result { @@ -429,12 +430,16 @@ pub struct Profile { /// An opportunity for the Miner to write a message on their genesis block. pub statement: String, + /// Pledges the user took + pub pledges: Option>, + // NOTE: V7: deprecated // Deprecation: : /// ip address of this node. May be different from transaction URL. // pub ip: Ipv4Addr, + // V7.0.3 deprecated // Deprecation: /// Other nodes to connect for fallback connections - pub upstream_nodes: Option>, + // pub upstream_nodes: Option>, } impl Default for Profile { @@ -451,7 +456,7 @@ impl Default for Profile { nickname: "default".to_string(), on_chain: false, balance: SlowWalletBalance::default(), - upstream_nodes: None, // Note: deprecated, here for migration + pledges: None, } } } @@ -478,6 +483,15 @@ impl Profile { .context("no private key found")?; Ok(key) } + + // push a pledge + pub fn push_pledge(&mut self, new: Pledge) { + if let Some(list) = &mut self.pledges { + list.push(new) + } else { + self.pledges = Some(vec![new]) + } + } } pub fn get_nickname(acc: AccountAddress) -> String { @@ -612,6 +626,61 @@ impl Default for TxConfigs { } } +#[derive(Debug, Default, Serialize, Deserialize)] +pub struct Pledge { + id: u8, + version: u8, + #[serde(with = "hex::serde")] + hash: Vec, + question: String, + preamble: String, + on_chain: bool, +} + +impl Pledge { + /// make the unique hex encoding of the text. + fn hash_it(&mut self) { + let mut concat = self.question.clone(); + concat.push_str(&self.preamble); + self.hash = HashValue::sha3_256_of(&concat.into_bytes()).to_vec(); + } + + /// #0 Protect the Game Pledge + /// Reference: Docs from Discord 0L Contributors circa June 2024 + fn pledge_protect_the_game() -> Pledge { + let mut p = Pledge { + id: 0, + version: 0, + question: "Do you pledge to not damage the game and never cheat other users?".to_string(), + preamble: "Code is not law at Open Libra. The law is law. The law comes from history.\nI understand written and unwritten laws come from social norms. I will refer to the expectations of this community based on canonical instructions, code documentation, and common sense to know when I'm disadvantaging someone for my benefit.\nCheating can also include, but is not limited to: gaining an advantage in a way that would be impossible unless it was covert, dishonest, untrue, or otherwise using an expected common courtesy others have extended to me which I'm not willing to return.".to_string(), + hash: vec![], + on_chain: false, + }; + + p.hash_it(); + + return p; + } + + /// #1 Validator pledge + /// Reference: Docs from Discord 0L Contributors circa June 2024 + fn pledge_validator() -> Pledge { + let mut p = Pledge { + id: 0, + version: 0, + question: "Do you pledge to be a validator that acts in good faith to secure the network?".to_string(), + preamble: "When taking this pledge you are also taking the Protect the Game pledge: 'I pledge to not damage the game and never cheat other users'. Additionally you pledge to: obey the blockchain's policies as intended, some of which may be encoded as smart contracts, not pretend to be multiple people (sybil), not change the blockchain settings or software without consulting the community, run the blockchain security software (e.g validator, and fullnode software) as intended and in its entirety.".to_string(), + hash: vec![], + on_chain: false, + }; + + p.hash_it(); + + return p; + } +} + +//////// TESTS //////// #[tokio::test] async fn test_create() { let a = AppCfg { @@ -750,3 +819,16 @@ tx_configs: let url = cfg.pick_url(None).unwrap(); assert!(url.host_str().unwrap().contains("localhost")); } + +#[tokio::test] +async fn test_pledge() { + let mut a = AppCfg { + user_profiles: vec![Profile::default()], + ..Default::default() + }; + let p = a.get_profile_mut(None).unwrap(); + assert!(p.pledges.is_none()); + let zero = Pledge::pledge_protect_the_game(); + p.pledges = Some(vec![zero]); + assert!(p.pledges.is_some()); +} From ed79d13bfd9b2a9fd9592dc3b46f1a692c74b18c Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Sun, 4 Aug 2024 14:52:14 -0400 Subject: [PATCH 02/22] scaffold pledge struct --- types/src/core_types/app_cfg.rs | 70 +---------------------------- types/src/core_types/dialogue.rs | 54 +++++++---------------- types/src/core_types/mod.rs | 1 + types/src/core_types/pledge.rs | 75 ++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 107 deletions(-) create mode 100644 types/src/core_types/pledge.rs diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 70152be24..da0f35e4b 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -6,7 +6,7 @@ use crate::{ move_resource::gas_coin::SlowWalletBalance, }; use anyhow::{bail, Context}; -use diem_crypto::{compat::Sha3_256, ed25519::Ed25519PrivateKey, HashValue}; +use diem_crypto::ed25519::Ed25519PrivateKey; use diem_global_constants::{GAS_UNIT_PRICE, MAX_GAS_AMOUNT}; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, DisplayFromStr}; @@ -14,7 +14,7 @@ use url::Url; use std::{fs, io::Write, path::PathBuf, str::FromStr}; -use super::network_playlist::{self, HostProfile, NetworkPlaylist}; +use super::{network_playlist::{self, NetworkPlaylist}, pledge::Pledge}; // TODO: the GAS_UNIT_PRICE is set in DIEM. IT IS ALSO THE MINIMUM GAS PRICE This is arbitrary and needs to be reviewed. pub const MINUMUM_GAS_PRICE_IN_DIEM: u64 = GAS_UNIT_PRICE; @@ -626,59 +626,6 @@ impl Default for TxConfigs { } } -#[derive(Debug, Default, Serialize, Deserialize)] -pub struct Pledge { - id: u8, - version: u8, - #[serde(with = "hex::serde")] - hash: Vec, - question: String, - preamble: String, - on_chain: bool, -} - -impl Pledge { - /// make the unique hex encoding of the text. - fn hash_it(&mut self) { - let mut concat = self.question.clone(); - concat.push_str(&self.preamble); - self.hash = HashValue::sha3_256_of(&concat.into_bytes()).to_vec(); - } - - /// #0 Protect the Game Pledge - /// Reference: Docs from Discord 0L Contributors circa June 2024 - fn pledge_protect_the_game() -> Pledge { - let mut p = Pledge { - id: 0, - version: 0, - question: "Do you pledge to not damage the game and never cheat other users?".to_string(), - preamble: "Code is not law at Open Libra. The law is law. The law comes from history.\nI understand written and unwritten laws come from social norms. I will refer to the expectations of this community based on canonical instructions, code documentation, and common sense to know when I'm disadvantaging someone for my benefit.\nCheating can also include, but is not limited to: gaining an advantage in a way that would be impossible unless it was covert, dishonest, untrue, or otherwise using an expected common courtesy others have extended to me which I'm not willing to return.".to_string(), - hash: vec![], - on_chain: false, - }; - - p.hash_it(); - - return p; - } - - /// #1 Validator pledge - /// Reference: Docs from Discord 0L Contributors circa June 2024 - fn pledge_validator() -> Pledge { - let mut p = Pledge { - id: 0, - version: 0, - question: "Do you pledge to be a validator that acts in good faith to secure the network?".to_string(), - preamble: "When taking this pledge you are also taking the Protect the Game pledge: 'I pledge to not damage the game and never cheat other users'. Additionally you pledge to: obey the blockchain's policies as intended, some of which may be encoded as smart contracts, not pretend to be multiple people (sybil), not change the blockchain settings or software without consulting the community, run the blockchain security software (e.g validator, and fullnode software) as intended and in its entirety.".to_string(), - hash: vec![], - on_chain: false, - }; - - p.hash_it(); - - return p; - } -} //////// TESTS //////// #[tokio::test] @@ -819,16 +766,3 @@ tx_configs: let url = cfg.pick_url(None).unwrap(); assert!(url.host_str().unwrap().contains("localhost")); } - -#[tokio::test] -async fn test_pledge() { - let mut a = AppCfg { - user_profiles: vec![Profile::default()], - ..Default::default() - }; - let p = a.get_profile_mut(None).unwrap(); - assert!(p.pledges.is_none()); - let zero = Pledge::pledge_protect_the_game(); - p.pledges = Some(vec![zero]); - assert!(p.pledges.is_some()); -} diff --git a/types/src/core_types/dialogue.rs b/types/src/core_types/dialogue.rs index 8bab02c05..5f39427f4 100644 --- a/types/src/core_types/dialogue.rs +++ b/types/src/core_types/dialogue.rs @@ -9,6 +9,20 @@ use std::{fs, net::Ipv4Addr, path::PathBuf}; use crate::block::VDFProof; +/// interact with user to get default pledges +pub fn what_statement() -> Vec { + if MODE_0L.is_test() { + return vec![]; + } + let zero = Pledge::pledge_protect_the_game(); + + println(&zero.preamble); + Confirm::new() + .with_prompt(zero.question) + .interact_text() + .expect() +} + /// interact with user to get the home path for files pub fn what_home(swarm_path: Option, swarm_persona: Option) -> PathBuf { // For dev and CI setup @@ -148,42 +162,4 @@ fn swarm_home(mut swarm_path: PathBuf, swarm_persona: Option) -> PathBuf swarm_path } -// helper to parse the existing blocks in the miner's path. This function receives any path. Note: the path is configured in miner.toml which abscissa Configurable parses, see commands.rs. -fn _find_last_legacy_block(blocks_dir: &PathBuf) -> Result { - let mut max_block: Option = None; - let mut max_block_path = None; - // iterate through all json files in the directory. - for entry in glob(&format!("{}/block_*.json", blocks_dir.display())) - .expect("Failed to read glob pattern") - { - if let Ok(entry) = entry { - let block_file = - fs::read_to_string(&entry).expect("Could not read latest block file in path"); - - let block: VDFProof = serde_json::from_str(&block_file)?; - let blocknumber = block.height; - if max_block.is_none() { - max_block = Some(blocknumber); - max_block_path = Some(entry); - } else { - if blocknumber > max_block.unwrap() { - max_block = Some(blocknumber); - max_block_path = Some(entry); - } - } - } - } - - if let Some(p) = max_block_path { - let b = fs::read_to_string(p).expect("Could not read latest block file in path"); - match serde_json::from_str(&b) { - Ok(v) => Ok(v), - Err(e) => bail!(e), - } - } else { - bail!("cannot find a legacy block in: {:?}", blocks_dir) - } -} -fn _hash_last_proof(proof: &Vec) -> Vec { - HashValue::sha3_256_of(proof).to_vec() -} +// COMMIT NOTE: deprecated tower helpers diff --git a/types/src/core_types/mod.rs b/types/src/core_types/mod.rs index f3f2d8a81..643b7b7cb 100644 --- a/types/src/core_types/mod.rs +++ b/types/src/core_types/mod.rs @@ -4,3 +4,4 @@ pub mod fixtures; pub mod legacy_currency_info; pub mod mode_ol; pub mod network_playlist; +pub mod pledge; diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs new file mode 100644 index 000000000..342801af8 --- /dev/null +++ b/types/src/core_types/pledge.rs @@ -0,0 +1,75 @@ + +//! Configs for all 0L apps. + +use diem_crypto::HashValue; +use serde::{self, Deserialize, Serialize}; + +#[cfg(test)] +use crate::core_types::app_cfg::{AppCfg, Profile}; + +#[derive(Debug, Default, Serialize, Deserialize)] +pub struct Pledge { + id: u8, + version: u8, + #[serde(with = "hex::serde")] + hash: Vec, + question: String, + preamble: String, + on_chain: bool, +} + +impl Pledge { + /// make the unique hex encoding of the text. + fn hash_it(&mut self) { + let mut concat = self.question.clone(); + concat.push_str(&self.preamble); + self.hash = HashValue::sha3_256_of(&concat.into_bytes()).to_vec(); + } + + /// #0 Protect the Game Pledge + /// Reference: Docs from Discord 0L Contributors circa June 2024 + fn pledge_protect_the_game() -> Pledge { + let mut p = Pledge { + id: 0, + version: 0, + question: "Do you pledge to not damage the game and never cheat other users?".to_string(), + preamble: "Code is not law at Open Libra. The law is law. The law comes from history.\nI understand written and unwritten laws come from social norms. I will refer to the expectations of this community based on canonical instructions, code documentation, and common sense to know when I'm disadvantaging someone for my benefit.\nCheating can also include, but is not limited to: gaining an advantage in a way that would be impossible unless it was covert, dishonest, untrue, or otherwise using an expected common courtesy others have extended to me which I'm not willing to return.".to_string(), + hash: vec![], + on_chain: false, + }; + + p.hash_it(); + + return p; + } + + /// #1 Validator pledge + /// Reference: Docs from Discord 0L Contributors circa June 2024 + fn pledge_validator() -> Pledge { + let mut p = Pledge { + id: 0, + version: 0, + question: "Do you pledge to be a validator that acts in good faith to secure the network?".to_string(), + preamble: "When taking this pledge you are also taking the Protect the Game pledge: 'I pledge to not damage the game and never cheat other users'. Additionally you pledge to: obey the blockchain's policies as intended, some of which may be encoded as smart contracts, not pretend to be multiple people (sybil), not change the blockchain settings or software without consulting the community, run the blockchain security software (e.g validator, and fullnode software) as intended and in its entirety.".to_string(), + hash: vec![], + on_chain: false, + }; + + p.hash_it(); + + return p; + } +} + +#[tokio::test] +async fn test_pledge() { + let mut a = AppCfg { + user_profiles: vec![Profile::default()], + ..Default::default() + }; + let p = a.get_profile_mut(None).unwrap(); + assert!(p.pledges.is_none()); + let zero = Pledge::pledge_protect_the_game(); + p.pledges = Some(vec![zero]); + assert!(p.pledges.is_some()); +} From 620dc5cbcdf88cf38fca6eb26203f13c03d570e5 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Sun, 4 Aug 2024 14:53:00 -0400 Subject: [PATCH 03/22] spelling --- types/src/core_types/app_cfg.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index da0f35e4b..066ffcfda 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -17,7 +17,7 @@ use std::{fs, io::Write, path::PathBuf, str::FromStr}; use super::{network_playlist::{self, NetworkPlaylist}, pledge::Pledge}; // TODO: the GAS_UNIT_PRICE is set in DIEM. IT IS ALSO THE MINIMUM GAS PRICE This is arbitrary and needs to be reviewed. -pub const MINUMUM_GAS_PRICE_IN_DIEM: u64 = GAS_UNIT_PRICE; +pub const MINIMUM_GAS_PRICE_IN_DIEM: u64 = GAS_UNIT_PRICE; pub const CONFIG_FILE_NAME: &str = "libra-cli-config.yaml"; /// MinerApp Configuration @@ -535,7 +535,7 @@ pub struct TxConfigs { /// Miner transactions cost // #[serde(default = "TxCost::default_miner_txs_cost")] pub miner_txs_cost: Option, - /// Cheap or test transation costs + /// Cheap or test transaction costs // #[serde(default = "TxCost::default_cheap_txs_cost")] pub cheap_txs_cost: Option, } @@ -579,7 +579,7 @@ impl TxCost { max_gas_unit_for_tx: units, // oracle upgrade transaction is expensive. // TODO: the GAS_UNIT_PRICE is set in DIEM. IT IS ALSO THE MINIMUM GAS PRICE This is arbitrary and needs to be reviewed. // It is also 0 in tests, so we need to increase to at least 1. - coin_price_per_unit: (MINUMUM_GAS_PRICE_IN_DIEM.max(min_gas_price.unwrap_or(1)) as f64 + coin_price_per_unit: (MINIMUM_GAS_PRICE_IN_DIEM.max(min_gas_price.unwrap_or(1)) as f64 * price_multiplier) as u64, // this is the minimum price //coin_price_per_unit: 100 as u64, From 0b8af8f12a1811ceda180aaad0c5dc62baa9caf1 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Sun, 4 Aug 2024 14:58:49 -0400 Subject: [PATCH 04/22] add dialoguer --- types/src/core_types/dialogue.rs | 28 +++++++++++++++++++++++----- types/src/core_types/pledge.rs | 6 +++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/types/src/core_types/dialogue.rs b/types/src/core_types/dialogue.rs index 5f39427f4..ff95e8ebc 100644 --- a/types/src/core_types/dialogue.rs +++ b/types/src/core_types/dialogue.rs @@ -9,18 +9,36 @@ use std::{fs, net::Ipv4Addr, path::PathBuf}; use crate::block::VDFProof; -/// interact with user to get default pledges -pub fn what_statement() -> Vec { +/// interact with user to get default pledges, validator pledge optional on default setup +pub fn get_pledges(validator: bool) -> Vec { + let v = vec![]; if MODE_0L.is_test() { - return vec![]; + return v; } let zero = Pledge::pledge_protect_the_game(); println(&zero.preamble); - Confirm::new() + if (Confirm::new() .with_prompt(zero.question) .interact_text() - .expect() + .expect()) + { + v.push(zero) + } + if (validator) { + let one = Pledge::pledge_validator(); + + println(&one.preamble); + if (Confirm::new() + .with_prompt(one.question) + .interact_text() + .expect()) + { + v.push(one) + } + } + + return v; } /// interact with user to get the home path for files diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index 342801af8..afd346416 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -20,7 +20,7 @@ pub struct Pledge { impl Pledge { /// make the unique hex encoding of the text. - fn hash_it(&mut self) { + pub fn hash_it(&mut self) { let mut concat = self.question.clone(); concat.push_str(&self.preamble); self.hash = HashValue::sha3_256_of(&concat.into_bytes()).to_vec(); @@ -28,7 +28,7 @@ impl Pledge { /// #0 Protect the Game Pledge /// Reference: Docs from Discord 0L Contributors circa June 2024 - fn pledge_protect_the_game() -> Pledge { + pub fn pledge_protect_the_game() -> Pledge { let mut p = Pledge { id: 0, version: 0, @@ -45,7 +45,7 @@ impl Pledge { /// #1 Validator pledge /// Reference: Docs from Discord 0L Contributors circa June 2024 - fn pledge_validator() -> Pledge { + pub fn pledge_validator() -> Pledge { let mut p = Pledge { id: 0, version: 0, From c0a67d3d0acc90a3793c3cfcf17f4927ebf105fb Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Sun, 4 Aug 2024 15:36:09 -0400 Subject: [PATCH 05/22] check for pledge on appcfg calls --- types/src/core_types/app_cfg.rs | 15 +++++ .../core_types/{dialogue.rs => dialogue.depr} | 35 ----------- types/src/core_types/pledge.rs | 60 +++++++++++++++---- 3 files changed, 65 insertions(+), 45 deletions(-) rename types/src/core_types/{dialogue.rs => dialogue.depr} (85%) diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 066ffcfda..c5742ef4f 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -224,6 +224,8 @@ impl AppCfg { pub fn get_profile(&self, nickname: Option) -> anyhow::Result<&Profile> { let idx = self.get_profile_idx(nickname).unwrap_or(0); let p = self.user_profiles.get(idx).context("no profile at index")?; + // The license to use this software depends on the user taking the pledge. Totally cool if you don't want to, but you'll need to write your own tools. + assert!(p.check_has_pledge(0), "user has not taken Protect the Game pledge, exiting."); Ok(p) } @@ -492,6 +494,19 @@ impl Profile { self.pledges = Some(vec![new]) } } + + // check protect game pledge + pub fn check_has_pledge(&self, pledge_id: u8) -> bool { + if let Some(list) = &self.pledges { + // check the pledge exists + return list.iter().find(|e| { + return e.id == 0 && + Pledge::check_pledge_hash(pledge_id, &e.hash) + }).is_some() + } + return false + } + } pub fn get_nickname(acc: AccountAddress) -> String { diff --git a/types/src/core_types/dialogue.rs b/types/src/core_types/dialogue.depr similarity index 85% rename from types/src/core_types/dialogue.rs rename to types/src/core_types/dialogue.depr index ff95e8ebc..83e0aa317 100644 --- a/types/src/core_types/dialogue.rs +++ b/types/src/core_types/dialogue.depr @@ -1,46 +1,11 @@ //! get home path or set it use anyhow::{bail, Error}; -use dialoguer::{Confirm, Input}; use diem_crypto::HashValue; use diem_global_constants::NODE_HOME; use diem_types::chain_id::MODE_0L; use glob::glob; use std::{fs, net::Ipv4Addr, path::PathBuf}; -use crate::block::VDFProof; - -/// interact with user to get default pledges, validator pledge optional on default setup -pub fn get_pledges(validator: bool) -> Vec { - let v = vec![]; - if MODE_0L.is_test() { - return v; - } - let zero = Pledge::pledge_protect_the_game(); - - println(&zero.preamble); - if (Confirm::new() - .with_prompt(zero.question) - .interact_text() - .expect()) - { - v.push(zero) - } - if (validator) { - let one = Pledge::pledge_validator(); - - println(&one.preamble); - if (Confirm::new() - .with_prompt(one.question) - .interact_text() - .expect()) - { - v.push(one) - } - } - - return v; -} - /// interact with user to get the home path for files pub fn what_home(swarm_path: Option, swarm_persona: Option) -> PathBuf { // For dev and CI setup diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index afd346416..7c0d06f49 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -1,6 +1,6 @@ - //! Configs for all 0L apps. +use diem::common::utils::prompt_yes; use diem_crypto::HashValue; use serde::{self, Deserialize, Serialize}; @@ -9,23 +9,41 @@ use crate::core_types::app_cfg::{AppCfg, Profile}; #[derive(Debug, Default, Serialize, Deserialize)] pub struct Pledge { - id: u8, - version: u8, + /// the canonical id of this pledge + pub id: u8, + /// textual versions of the pledge + pub version: u8, + /// hash of the textual version #[serde(with = "hex::serde")] - hash: Vec, - question: String, - preamble: String, - on_chain: bool, + pub hash: Vec, + /// Text question + pub question: String, + /// Text preamble + pub preamble: String, + /// if this pledge been committed to chain + pub on_chain: bool, } impl Pledge { /// make the unique hex encoding of the text. - pub fn hash_it(&mut self) { + pub fn to_hash(&mut self) { let mut concat = self.question.clone(); concat.push_str(&self.preamble); self.hash = HashValue::sha3_256_of(&concat.into_bytes()).to_vec(); } + /// check pledge hash + pub fn check_pledge_hash(pledge_idx: u8, bytes: &[u8]) -> bool { + if pledge_idx == 0 { + return bytes == &Self::pledge_protect_the_game().hash + } else if pledge_idx == 1 { + return bytes == &Self::pledge_validator().hash + } else { + assert!(pledge_idx < 2, "pledge index not found"); + } + return false + } + /// #0 Protect the Game Pledge /// Reference: Docs from Discord 0L Contributors circa June 2024 pub fn pledge_protect_the_game() -> Pledge { @@ -38,7 +56,7 @@ impl Pledge { on_chain: false, }; - p.hash_it(); + p.to_hash(); return p; } @@ -55,12 +73,34 @@ impl Pledge { on_chain: false, }; - p.hash_it(); + p.to_hash(); return p; } } +/// interact with user to get basic pledges, validator pledge optional on default setup +pub fn get_basic_pledges(validator: bool) -> Vec { + let mut v = vec![]; + + let zero = Pledge::pledge_protect_the_game(); + + println!("{}", &zero.preamble); + if prompt_yes(&zero.question) { + v.push(zero) + } + if validator { + let one = Pledge::pledge_validator(); + + println!("{}", &one.preamble); + if prompt_yes(&one.question) { + v.push(one) + } + } + + return v; +} + #[tokio::test] async fn test_pledge() { let mut a = AppCfg { From 44a6c02f3054ceb3917d3e5edb24348016d37967 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Sun, 4 Aug 2024 16:00:34 -0400 Subject: [PATCH 06/22] add initializatio on config::fix --- tools/config/src/config_cli.rs | 6 +++- types/src/core_types/app_cfg.rs | 26 +++++++++++++++- types/src/core_types/pledge.rs | 54 +++++++++++++++------------------ 3 files changed, 54 insertions(+), 32 deletions(-) diff --git a/tools/config/src/config_cli.rs b/tools/config/src/config_cli.rs index de2701722..ba031eb48 100644 --- a/tools/config/src/config_cli.rs +++ b/tools/config/src/config_cli.rs @@ -117,9 +117,13 @@ impl ConfigCli { }; // Create profile based on account keys - let profile = + let mut profile = app_cfg::Profile::new(account_keys.auth_key, account_keys.account); + // user can take pledge here on fix or on init + profile.maybe_offer_basic_pledge(); + profile.maybe_offer_validator_pledge(); + // Prompt to set as default profile if dialoguer::Confirm::new() .with_prompt("set as default profile?") diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index c5742ef4f..280da4cc4 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -489,7 +489,11 @@ impl Profile { // push a pledge pub fn push_pledge(&mut self, new: Pledge) { if let Some(list) = &mut self.pledges { - list.push(new) + let found = list.iter().find(|e| { + return e.id == 0 + }); + assert!(found.is_none(), "pledge already exists on this profile"); + list.push(new); } else { self.pledges = Some(vec![new]) } @@ -507,6 +511,26 @@ impl Profile { return false } + // offer pledge if none + pub fn maybe_offer_basic_pledge(&mut self) { + if !self.check_has_pledge(0) { + let p = Pledge::pledge_protect_the_game(); + if p.pledge_dialogue() { + self.push_pledge(p) + } + } + } + + // offer validator pledge + pub fn maybe_offer_validator_pledge(&mut self) { + if !self.check_has_pledge(1) { + let p = Pledge::pledge_validator(); + if p.pledge_dialogue() { + self.push_pledge(p) + } + } + } + } pub fn get_nickname(acc: AccountAddress) -> String { diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index 7c0d06f49..5dcc078c0 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -24,6 +24,12 @@ pub struct Pledge { pub on_chain: bool, } +pub enum CanonicalPledges { + /// protect the game + Game = 0, + /// operate in good faith + Validator = 1, +} impl Pledge { /// make the unique hex encoding of the text. pub fn to_hash(&mut self) { @@ -34,14 +40,23 @@ impl Pledge { /// check pledge hash pub fn check_pledge_hash(pledge_idx: u8, bytes: &[u8]) -> bool { - if pledge_idx == 0 { - return bytes == &Self::pledge_protect_the_game().hash - } else if pledge_idx == 1 { - return bytes == &Self::pledge_validator().hash - } else { - assert!(pledge_idx < 2, "pledge index not found"); - } - return false + if pledge_idx == 0 { + return bytes == &Self::pledge_protect_the_game().hash; + } else if pledge_idx == 1 { + return bytes == &Self::pledge_validator().hash; + } else { + assert!(pledge_idx < 2, "pledge index not found"); + } + return false; + } + + /// interact with user to get basic pledges, validator pledge optional on default setup + pub fn pledge_dialogue(&self) -> bool { + println!("{}", &self.preamble); + if prompt_yes(&self.question) { + return true + } + return false } /// #0 Protect the Game Pledge @@ -65,7 +80,7 @@ impl Pledge { /// Reference: Docs from Discord 0L Contributors circa June 2024 pub fn pledge_validator() -> Pledge { let mut p = Pledge { - id: 0, + id: 1, version: 0, question: "Do you pledge to be a validator that acts in good faith to secure the network?".to_string(), preamble: "When taking this pledge you are also taking the Protect the Game pledge: 'I pledge to not damage the game and never cheat other users'. Additionally you pledge to: obey the blockchain's policies as intended, some of which may be encoded as smart contracts, not pretend to be multiple people (sybil), not change the blockchain settings or software without consulting the community, run the blockchain security software (e.g validator, and fullnode software) as intended and in its entirety.".to_string(), @@ -79,27 +94,6 @@ impl Pledge { } } -/// interact with user to get basic pledges, validator pledge optional on default setup -pub fn get_basic_pledges(validator: bool) -> Vec { - let mut v = vec![]; - - let zero = Pledge::pledge_protect_the_game(); - - println!("{}", &zero.preamble); - if prompt_yes(&zero.question) { - v.push(zero) - } - if validator { - let one = Pledge::pledge_validator(); - - println!("{}", &one.preamble); - if prompt_yes(&one.question) { - v.push(one) - } - } - - return v; -} #[tokio::test] async fn test_pledge() { From 605b42782413ab77ec94ff00d674d32696131fb3 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Sun, 4 Aug 2024 16:02:57 -0400 Subject: [PATCH 07/22] offer pledge on init --- tools/config/src/legacy_config.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/config/src/legacy_config.rs b/tools/config/src/legacy_config.rs index f2c0eb222..77093b45f 100644 --- a/tools/config/src/legacy_config.rs +++ b/tools/config/src/legacy_config.rs @@ -60,13 +60,20 @@ pub async fn wizard( }; } - let cfg = AppCfg::init_app_configs(authkey, address, config_dir, chain_name, Some(np))?; + let mut cfg = AppCfg::init_app_configs(authkey, address, config_dir, chain_name, Some(np))?; + + // offer both pledges on init + let profile = cfg.get_profile_mut(None)?; + profile.maybe_offer_basic_pledge(); + profile.maybe_offer_validator_pledge(); let p = cfg.save_file().context(format!( "could not initialize configs at {}", cfg.workspace.node_home.to_str().unwrap() ))?; + + println!("Success, config saved to {}", p.to_str().unwrap()); Ok(cfg) From 02914121934a68992b3e6c0fa4c9c2128ac70d40 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Sun, 4 Aug 2024 17:03:14 -0400 Subject: [PATCH 08/22] test init --- types/src/core_types/app_cfg.rs | 2 +- types/src/core_types/pledge.rs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 280da4cc4..679c27db4 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -14,7 +14,7 @@ use url::Url; use std::{fs, io::Write, path::PathBuf, str::FromStr}; -use super::{network_playlist::{self, NetworkPlaylist}, pledge::Pledge}; +use super::{mode_ol::MODE_0L, network_playlist::{self, NetworkPlaylist}, pledge::Pledge}; // TODO: the GAS_UNIT_PRICE is set in DIEM. IT IS ALSO THE MINIMUM GAS PRICE This is arbitrary and needs to be reviewed. pub const MINIMUM_GAS_PRICE_IN_DIEM: u64 = GAS_UNIT_PRICE; diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index 5dcc078c0..d51c32cf7 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -2,10 +2,12 @@ use diem::common::utils::prompt_yes; use diem_crypto::HashValue; +use diem_types::chain_id::NamedChain; use serde::{self, Deserialize, Serialize}; #[cfg(test)] use crate::core_types::app_cfg::{AppCfg, Profile}; +use crate::core_types::mode_ol::MODE_0L; #[derive(Debug, Default, Serialize, Deserialize)] pub struct Pledge { @@ -52,6 +54,7 @@ impl Pledge { /// interact with user to get basic pledges, validator pledge optional on default setup pub fn pledge_dialogue(&self) -> bool { + if MODE_0L.clone() != NamedChain::MAINNET { return true }; println!("{}", &self.preamble); if prompt_yes(&self.question) { return true From d9fbd72fc71dbc61f5780b29f8fb8187b2c63428 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:47:19 -0400 Subject: [PATCH 09/22] text updates and ux --- types/src/core_types/pledge.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index d51c32cf7..67602b70f 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -54,9 +54,13 @@ impl Pledge { /// interact with user to get basic pledges, validator pledge optional on default setup pub fn pledge_dialogue(&self) -> bool { - if MODE_0L.clone() != NamedChain::MAINNET { return true }; - println!("{}", &self.preamble); - if prompt_yes(&self.question) { + println!("PLEDGE #{}: {}\n\n{}", &self.id, &self.question, &self.preamble); + + if MODE_0L.clone() != NamedChain::MAINNET { + println!("seems you are using CI or testnet settings, pledges default to yes"); + return true + }; + if prompt_yes(&format!("\n{}", &self.question)) { return true } return false @@ -69,7 +73,7 @@ impl Pledge { id: 0, version: 0, question: "Do you pledge to not damage the game and never cheat other users?".to_string(), - preamble: "Code is not law at Open Libra. The law is law. The law comes from history.\nI understand written and unwritten laws come from social norms. I will refer to the expectations of this community based on canonical instructions, code documentation, and common sense to know when I'm disadvantaging someone for my benefit.\nCheating can also include, but is not limited to: gaining an advantage in a way that would be impossible unless it was covert, dishonest, untrue, or otherwise using an expected common courtesy others have extended to me which I'm not willing to return.".to_string(), + preamble: "Code is not law at Open Libra. The law is law. The law comes from history.\n\nI understand written and unwritten laws come from social norms. I will refer to the expectations of this community based on canonical instructions, code documentation, and common sense to know when I'm cheating at the game, or otherwise unlawfully disadvantaging someone for my benefit.\n\nCheating can include, but is not limited to: gaining an advantage in a way that would be impossible unless it was covert, dishonest, untrue, or otherwise using an expected common courtesy others have extended to me which I'm not willing to return.".to_string(), hash: vec![], on_chain: false, }; @@ -86,7 +90,7 @@ impl Pledge { id: 1, version: 0, question: "Do you pledge to be a validator that acts in good faith to secure the network?".to_string(), - preamble: "When taking this pledge you are also taking the Protect the Game pledge: 'I pledge to not damage the game and never cheat other users'. Additionally you pledge to: obey the blockchain's policies as intended, some of which may be encoded as smart contracts, not pretend to be multiple people (sybil), not change the blockchain settings or software without consulting the community, run the blockchain security software (e.g validator, and fullnode software) as intended and in its entirety.".to_string(), + preamble: "When taking this pledge you are also taking the Protect the Game pledge:\n'I pledge to not damage the game and never cheat other users'.\n\nAdditionally you pledge to: obey the blockchain's policies as intended, some of which may be encoded as smart contracts, not pretend to be multiple people (sybil), not change the blockchain settings or software without consulting the community, run the blockchain security software (e.g validator, and fullnode software) as intended and in its entirety.".to_string(), hash: vec![], on_chain: false, }; From 52b817d62ba2e0fa93338b9e87796ff43603c933 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:47:33 -0400 Subject: [PATCH 10/22] framework build --- .../src/libra_framework_sdk_builder.rs | 122 +++++++++--------- framework/releases/head.mrb | Bin 890459 -> 890462 bytes 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/framework/cached-packages/src/libra_framework_sdk_builder.rs b/framework/cached-packages/src/libra_framework_sdk_builder.rs index a3bae1d52..28fd901c4 100644 --- a/framework/cached-packages/src/libra_framework_sdk_builder.rs +++ b/framework/cached-packages/src/libra_framework_sdk_builder.rs @@ -2381,7 +2381,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountOfferRotationCapability { - rotation_capability_sig_bytes: bcs::from_bytes(script.args().first()?).ok()?, + rotation_capability_sig_bytes: bcs::from_bytes(script.args().get(0)?).ok()?, account_scheme: bcs::from_bytes(script.args().get(1)?).ok()?, account_public_key_bytes: bcs::from_bytes(script.args().get(2)?).ok()?, recipient_address: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2396,7 +2396,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountOfferSignerCapability { - signer_capability_sig_bytes: bcs::from_bytes(script.args().first()?).ok()?, + signer_capability_sig_bytes: bcs::from_bytes(script.args().get(0)?).ok()?, account_scheme: bcs::from_bytes(script.args().get(1)?).ok()?, account_public_key_bytes: bcs::from_bytes(script.args().get(2)?).ok()?, recipient_address: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2431,7 +2431,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountRevokeRotationCapability { - to_be_revoked_address: bcs::from_bytes(script.args().first()?).ok()?, + to_be_revoked_address: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2443,7 +2443,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountRevokeSignerCapability { - to_be_revoked_address: bcs::from_bytes(script.args().first()?).ok()?, + to_be_revoked_address: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2455,7 +2455,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountRotateAuthenticationKey { - from_scheme: bcs::from_bytes(script.args().first()?).ok()?, + from_scheme: bcs::from_bytes(script.args().get(0)?).ok()?, from_public_key_bytes: bcs::from_bytes(script.args().get(1)?).ok()?, to_scheme: bcs::from_bytes(script.args().get(2)?).ok()?, to_public_key_bytes: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2473,7 +2473,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::AccountRotateAuthenticationKeyWithRotationCapability { - rotation_cap_offerer_address: bcs::from_bytes(script.args().first()?).ok()?, + rotation_cap_offerer_address: bcs::from_bytes(script.args().get(0)?).ok()?, new_scheme: bcs::from_bytes(script.args().get(1)?).ok()?, new_public_key_bytes: bcs::from_bytes(script.args().get(2)?).ok()?, cap_update_table: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2487,7 +2487,7 @@ mod decoder { pub fn burn_set_send_community(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::BurnSetSendCommunity { - community: bcs::from_bytes(script.args().first()?).ok()?, + community: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2497,7 +2497,7 @@ mod decoder { pub fn code_publish_package_txn(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CodePublishPackageTxn { - metadata_serialized: bcs::from_bytes(script.args().first()?).ok()?, + metadata_serialized: bcs::from_bytes(script.args().get(0)?).ok()?, code: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2508,8 +2508,8 @@ mod decoder { pub fn coin_transfer(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CoinTransfer { - coin_type: script.ty_args().first()?.clone(), - to: bcs::from_bytes(script.args().first()?).ok()?, + coin_type: script.ty_args().get(0)?.clone(), + to: bcs::from_bytes(script.args().get(0)?).ok()?, amount: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2523,7 +2523,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::CommunityWalletInitChangeSignerCommunityMultisig { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, new_signer: bcs::from_bytes(script.args().get(1)?).ok()?, is_add_operation: bcs::from_bytes(script.args().get(2)?).ok()?, n_of_m: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2540,7 +2540,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CommunityWalletInitFinalizeAndCage { - num_signers: bcs::from_bytes(script.args().first()?).ok()?, + num_signers: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2552,7 +2552,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CommunityWalletInitInitCommunity { - initial_authorities: bcs::from_bytes(script.args().first()?).ok()?, + initial_authorities: bcs::from_bytes(script.args().get(0)?).ok()?, check_threshold: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2565,7 +2565,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CommunityWalletInitProposeOffer { - new_signers: bcs::from_bytes(script.args().first()?).ok()?, + new_signers: bcs::from_bytes(script.args().get(0)?).ok()?, num_signers: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2579,7 +2579,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::DiemGovernanceAddApprovedScriptHashScript { - proposal_id: bcs::from_bytes(script.args().first()?).ok()?, + proposal_id: bcs::from_bytes(script.args().get(0)?).ok()?, }, ) } else { @@ -2592,7 +2592,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceAssertCanResolve { - proposal_id: bcs::from_bytes(script.args().first()?).ok()?, + proposal_id: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2604,7 +2604,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceCreateProposalV2 { - execution_hash: bcs::from_bytes(script.args().first()?).ok()?, + execution_hash: bcs::from_bytes(script.args().get(0)?).ok()?, metadata_location: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_hash: bcs::from_bytes(script.args().get(2)?).ok()?, is_multi_step_proposal: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2619,7 +2619,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceOlCreateProposalV2 { - execution_hash: bcs::from_bytes(script.args().first()?).ok()?, + execution_hash: bcs::from_bytes(script.args().get(0)?).ok()?, metadata_location: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_hash: bcs::from_bytes(script.args().get(2)?).ok()?, is_multi_step_proposal: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2632,7 +2632,7 @@ mod decoder { pub fn diem_governance_ol_vote(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceOlVote { - proposal_id: bcs::from_bytes(script.args().first()?).ok()?, + proposal_id: bcs::from_bytes(script.args().get(0)?).ok()?, should_pass: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2663,7 +2663,7 @@ mod decoder { pub fn diem_governance_vote(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceVote { - proposal_id: bcs::from_bytes(script.args().first()?).ok()?, + proposal_id: bcs::from_bytes(script.args().get(0)?).ok()?, should_pass: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2676,7 +2676,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsProposeLiquidateTx { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2688,7 +2688,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsProposePaymentTx { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, payee: bcs::from_bytes(script.args().get(1)?).ok()?, value: bcs::from_bytes(script.args().get(2)?).ok()?, description: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2703,7 +2703,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsProposeVetoTx { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, id: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2716,7 +2716,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsVoteLiquidationTx { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2726,7 +2726,7 @@ mod decoder { pub fn donor_voice_txs_vote_veto_tx(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsVoteVetoTx { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, id: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2747,7 +2747,7 @@ mod decoder { pub fn jail_unjail_by_voucher(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::JailUnjailByVoucher { - addr: bcs::from_bytes(script.args().first()?).ok()?, + addr: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2769,7 +2769,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::LibraCoinDelegateMintCapability { - to: bcs::from_bytes(script.args().first()?).ok()?, + to: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2779,7 +2779,7 @@ mod decoder { pub fn libra_coin_mint_to_impl(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::LibraCoinMintToImpl { - dst_addr: bcs::from_bytes(script.args().first()?).ok()?, + dst_addr: bcs::from_bytes(script.args().get(0)?).ok()?, amount: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2790,7 +2790,7 @@ mod decoder { pub fn multi_action_claim_offer(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultiActionClaimOffer { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2812,7 +2812,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultiActionMigrationMigrateOffer { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2822,7 +2822,7 @@ mod decoder { pub fn multisig_account_add_owner(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountAddOwner { - new_owner: bcs::from_bytes(script.args().first()?).ok()?, + new_owner: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2832,7 +2832,7 @@ mod decoder { pub fn multisig_account_add_owners(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountAddOwners { - new_owners: bcs::from_bytes(script.args().first()?).ok()?, + new_owners: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2844,7 +2844,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountApproveTransaction { - multisig_account: bcs::from_bytes(script.args().first()?).ok()?, + multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, sequence_number: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2855,7 +2855,7 @@ mod decoder { pub fn multisig_account_create(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountCreate { - num_signatures_required: bcs::from_bytes(script.args().first()?).ok()?, + num_signatures_required: bcs::from_bytes(script.args().get(0)?).ok()?, metadata_keys: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_values: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -2869,7 +2869,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountCreateTransaction { - multisig_account: bcs::from_bytes(script.args().first()?).ok()?, + multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, payload: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2883,7 +2883,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::MultisigAccountCreateTransactionWithHash { - multisig_account: bcs::from_bytes(script.args().first()?).ok()?, + multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, payload_hash: bcs::from_bytes(script.args().get(1)?).ok()?, }, ) @@ -2898,7 +2898,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::MultisigAccountCreateWithExistingAccount { - multisig_address: bcs::from_bytes(script.args().first()?).ok()?, + multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, owners: bcs::from_bytes(script.args().get(1)?).ok()?, num_signatures_required: bcs::from_bytes(script.args().get(2)?).ok()?, account_scheme: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2919,7 +2919,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountCreateWithOwners { - additional_owners: bcs::from_bytes(script.args().first()?).ok()?, + additional_owners: bcs::from_bytes(script.args().get(0)?).ok()?, num_signatures_required: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_keys: bcs::from_bytes(script.args().get(2)?).ok()?, metadata_values: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2935,7 +2935,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::MultisigAccountExecuteRejectedTransaction { - multisig_account: bcs::from_bytes(script.args().first()?).ok()?, + multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, }, ) } else { @@ -2948,7 +2948,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountMigrateWithOwners { - additional_owners: bcs::from_bytes(script.args().first()?).ok()?, + additional_owners: bcs::from_bytes(script.args().get(0)?).ok()?, num_signatures_required: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_keys: bcs::from_bytes(script.args().get(2)?).ok()?, metadata_values: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2963,7 +2963,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountRejectTransaction { - multisig_account: bcs::from_bytes(script.args().first()?).ok()?, + multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, sequence_number: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2976,7 +2976,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountRemoveOwner { - owner_to_remove: bcs::from_bytes(script.args().first()?).ok()?, + owner_to_remove: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -2988,7 +2988,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountRemoveOwners { - owners_to_remove: bcs::from_bytes(script.args().first()?).ok()?, + owners_to_remove: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -3000,7 +3000,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountUpdateMetadata { - keys: bcs::from_bytes(script.args().first()?).ok()?, + keys: bcs::from_bytes(script.args().get(0)?).ok()?, values: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -3013,7 +3013,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountUpdateSignaturesRequired { - new_num_signatures_required: bcs::from_bytes(script.args().first()?).ok()?, + new_num_signatures_required: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -3025,7 +3025,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountVoteTransanction { - multisig_account: bcs::from_bytes(script.args().first()?).ok()?, + multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, sequence_number: bcs::from_bytes(script.args().get(1)?).ok()?, approved: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -3037,7 +3037,7 @@ mod decoder { pub fn object_transfer_call(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ObjectTransferCall { - object: bcs::from_bytes(script.args().first()?).ok()?, + object: bcs::from_bytes(script.args().get(0)?).ok()?, to: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -3048,7 +3048,7 @@ mod decoder { pub fn ol_account_create_account(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::OlAccountCreateAccount { - auth_key: bcs::from_bytes(script.args().first()?).ok()?, + auth_key: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -3060,7 +3060,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::OlAccountSetAllowDirectCoinTransfers { - allow: bcs::from_bytes(script.args().first()?).ok()?, + allow: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -3070,7 +3070,7 @@ mod decoder { pub fn ol_account_transfer(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::OlAccountTransfer { - to: bcs::from_bytes(script.args().first()?).ok()?, + to: bcs::from_bytes(script.args().get(0)?).ok()?, amount: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -3097,7 +3097,7 @@ mod decoder { pub fn proof_of_fee_pof_update_bid(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ProofOfFeePofUpdateBid { - bid: bcs::from_bytes(script.args().first()?).ok()?, + bid: bcs::from_bytes(script.args().get(0)?).ok()?, epoch_expiry: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -3108,7 +3108,7 @@ mod decoder { pub fn safe_init_payment_multisig(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::SafeInitPaymentMultisig { - authorities: bcs::from_bytes(script.args().first()?).ok()?, + authorities: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -3120,7 +3120,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::SlowWalletSmokeTestVmUnlock { - user_addr: bcs::from_bytes(script.args().first()?).ok()?, + user_addr: bcs::from_bytes(script.args().get(0)?).ok()?, unlocked: bcs::from_bytes(script.args().get(1)?).ok()?, transferred: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -3140,7 +3140,7 @@ mod decoder { pub fn stake_initialize_validator(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::StakeInitializeValidator { - consensus_pubkey: bcs::from_bytes(script.args().first()?).ok()?, + consensus_pubkey: bcs::from_bytes(script.args().get(0)?).ok()?, proof_of_possession: bcs::from_bytes(script.args().get(1)?).ok()?, network_addresses: bcs::from_bytes(script.args().get(2)?).ok()?, fullnode_addresses: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -3153,7 +3153,7 @@ mod decoder { pub fn stake_rotate_consensus_key(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::StakeRotateConsensusKey { - validator_address: bcs::from_bytes(script.args().first()?).ok()?, + validator_address: bcs::from_bytes(script.args().get(0)?).ok()?, new_consensus_pubkey: bcs::from_bytes(script.args().get(1)?).ok()?, proof_of_possession: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -3167,7 +3167,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::StakeUpdateNetworkAndFullnodeAddresses { - validator_address: bcs::from_bytes(script.args().first()?).ok()?, + validator_address: bcs::from_bytes(script.args().get(0)?).ok()?, new_network_addresses: bcs::from_bytes(script.args().get(1)?).ok()?, new_fullnode_addresses: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -3181,7 +3181,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ValidatorUniverseRegisterValidator { - consensus_pubkey: bcs::from_bytes(script.args().first()?).ok()?, + consensus_pubkey: bcs::from_bytes(script.args().get(0)?).ok()?, proof_of_possession: bcs::from_bytes(script.args().get(1)?).ok()?, network_addresses: bcs::from_bytes(script.args().get(2)?).ok()?, fullnode_addresses: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -3194,7 +3194,7 @@ mod decoder { pub fn version_set_version(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::VersionSetVersion { - major: bcs::from_bytes(script.args().first()?).ok()?, + major: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -3204,7 +3204,7 @@ mod decoder { pub fn vouch_insist_vouch_for(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::VouchInsistVouchFor { - friend_account: bcs::from_bytes(script.args().first()?).ok()?, + friend_account: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -3214,7 +3214,7 @@ mod decoder { pub fn vouch_revoke(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::VouchRevoke { - friend_account: bcs::from_bytes(script.args().first()?).ok()?, + friend_account: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None @@ -3224,7 +3224,7 @@ mod decoder { pub fn vouch_vouch_for(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::VouchVouchFor { - friend_account: bcs::from_bytes(script.args().first()?).ok()?, + friend_account: bcs::from_bytes(script.args().get(0)?).ok()?, }) } else { None diff --git a/framework/releases/head.mrb b/framework/releases/head.mrb index 630a669981746c807fc36665d398b3c665fe1ab7..9d4747f7e281dd74c59818f62dac9280cfb028ba 100644 GIT binary patch delta 132 zcmcb;#_Zl2vxXMN7N!>F7M2#)7Pc1l7LFFq7OocV7M?AF7M2#)7Pc1l7LFFq7OocV7M?Are5Nm$%Bv^lic?N{+B9BKF?ZbZ)7_`>iUR;oxh!4) From 8f31205f5812cdbc530790483b32ac9272cb9377 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:47:45 -0400 Subject: [PATCH 11/22] config cli cleanup --- tools/config/src/config_cli.rs | 10 +++++----- .../src/{legacy_config.rs => config_wizard.rs} | 0 tools/config/src/lib.rs | 2 +- types/src/core_types/app_cfg.rs | 15 ++++++++------- 4 files changed, 14 insertions(+), 13 deletions(-) rename tools/config/src/{legacy_config.rs => config_wizard.rs} (100%) diff --git a/tools/config/src/config_cli.rs b/tools/config/src/config_cli.rs index ba031eb48..3a1ca86d8 100644 --- a/tools/config/src/config_cli.rs +++ b/tools/config/src/config_cli.rs @@ -1,5 +1,5 @@ use crate::{ - legacy_config, + config_wizard, make_yaml_public_fullnode::{download_genesis, get_genesis_waypoint, init_fullnode_yaml}, validator_config::{validator_dialogue, vfn_dialogue}, }; @@ -34,7 +34,7 @@ pub struct ConfigCli { #[derive(clap::Subcommand)] enum ConfigSub { - /// Generates a libra-cli-config.yaml for cli tools like txs, tower, etc. Note: the file can also be used for Carpe, though that app uses a different default directory than these cli tools. + /// Generates a libra-cli-config.yaml for cli tools like `txs`, `query`, etc. Note: the file can also be used for Carpe, though that app uses a different default directory than these cli tools. Init { /// force an account address instead of reading from mnemonic, requires --force_authkey #[clap(long)] @@ -67,7 +67,7 @@ enum ConfigSub { /// Show the addresses and configs on this device View {}, - // COMMIT NOTE: we havent'used vendor tooling configs for anything. + // COMMIT NOTE: we haven't used vendor tooling configs for anything. /// Generate validators' config file ValidatorInit { // just make the VFN file @@ -97,7 +97,7 @@ impl ConfigCli { // Handle address fix option if *address { - let mut account_keys = legacy_config::prompt_for_account()?; + let mut account_keys = config_wizard::prompt_for_account()?; let client = Client::new(cfg.pick_url(self.chain_name)?); @@ -164,7 +164,7 @@ impl ConfigCli { test_private_key, playlist_url, }) => { - legacy_config::wizard( + config_wizard::wizard( force_authkey.to_owned(), force_address.to_owned(), self.path.to_owned(), diff --git a/tools/config/src/legacy_config.rs b/tools/config/src/config_wizard.rs similarity index 100% rename from tools/config/src/legacy_config.rs rename to tools/config/src/config_wizard.rs diff --git a/tools/config/src/lib.rs b/tools/config/src/lib.rs index 26d5125e2..0e73bfd79 100644 --- a/tools/config/src/lib.rs +++ b/tools/config/src/lib.rs @@ -1,5 +1,5 @@ pub mod config_cli; -pub mod legacy_config; +pub mod config_wizard; pub mod make_profile; // TODO: deprecated? pub mod make_yaml_public_fullnode; pub mod make_yaml_validator; diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 679c27db4..524447cce 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -14,7 +14,7 @@ use url::Url; use std::{fs, io::Write, path::PathBuf, str::FromStr}; -use super::{mode_ol::MODE_0L, network_playlist::{self, NetworkPlaylist}, pledge::Pledge}; +use super::{network_playlist::{self, NetworkPlaylist}, pledge::Pledge}; // TODO: the GAS_UNIT_PRICE is set in DIEM. IT IS ALSO THE MINIMUM GAS PRICE This is arbitrary and needs to be reviewed. pub const MINIMUM_GAS_PRICE_IN_DIEM: u64 = GAS_UNIT_PRICE; @@ -25,9 +25,7 @@ pub const CONFIG_FILE_NAME: &str = "libra-cli-config.yaml"; pub struct AppCfg { /// Workspace config pub workspace: Workspace, - /// accounts which we have profiles for - // NOTE: for v7 it will load the default() for migration - // #[serde(default)] + /// A user may have multiple profiles for different accounts or networks pub user_profiles: Vec, /// Network profile pub network_playlist: Vec, @@ -490,10 +488,13 @@ impl Profile { pub fn push_pledge(&mut self, new: Pledge) { if let Some(list) = &mut self.pledges { let found = list.iter().find(|e| { - return e.id == 0 + return e.id == new.id }); - assert!(found.is_none(), "pledge already exists on this profile"); - list.push(new); + if found.is_none() { + list.push(new); + } else { + println!("pledge '{}' already found on this account", &new.question); + } } else { self.pledges = Some(vec![new]) } From 1f64ed0fffbb62702764cb55fb5c759421b33f13 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:59:09 -0400 Subject: [PATCH 12/22] public yaml fullnode is pointing to wrong genesis.blob --- tools/config/src/make_yaml_public_fullnode.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/config/src/make_yaml_public_fullnode.rs b/tools/config/src/make_yaml_public_fullnode.rs index 0ecd48389..eb5b60360 100644 --- a/tools/config/src/make_yaml_public_fullnode.rs +++ b/tools/config/src/make_yaml_public_fullnode.rs @@ -12,9 +12,9 @@ use std::{ path::{Path, PathBuf}, }; -const FN_FILENAME: &str = "fullnode.yaml"; -const VFN_FILENAME: &str = "vfn.yaml"; -const DEFAULT_WAYPOINT_VERSION: &str = "6.9.0"; +pub const FN_FILENAME: &str = "fullnode.yaml"; +pub const VFN_FILENAME: &str = "vfn.yaml"; +pub const GENESIS_FILES_VERSION: &str = "7.0.0"; #[derive(Debug, Deserialize)] #[allow(dead_code)] struct GithubContent { @@ -201,7 +201,7 @@ pub async fn download_genesis(home_dir: Option) -> anyhow::Result<()> { let latest_path = format!( "{}/v{}/genesis.blob", "https://raw.githubusercontent.com/0LNetworkCommunity/epoch-archive-mainnet/main/upgrades", - latest_version.unwrap_or(DEFAULT_WAYPOINT_VERSION) + latest_version.unwrap_or(GENESIS_FILES_VERSION) ); // Fetch the latest waypoint @@ -244,7 +244,7 @@ pub async fn get_genesis_waypoint(home_dir: Option) -> anyhow::Result Date: Wed, 14 Aug 2024 13:26:09 -0400 Subject: [PATCH 13/22] cleanup cli init ux --- tools/config/src/config_wizard.rs | 13 +++++++------ tools/config/src/validator_config.rs | 16 ++++++++++++---- tools/genesis/src/wizard.rs | 2 +- types/src/ol_progress.rs | 27 ++++++++++++++++++++++----- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/tools/config/src/config_wizard.rs b/tools/config/src/config_wizard.rs index 77093b45f..926e84d10 100644 --- a/tools/config/src/config_wizard.rs +++ b/tools/config/src/config_wizard.rs @@ -2,9 +2,7 @@ use anyhow::Context; use diem_crypto::{ed25519::Ed25519PrivateKey, ValidCryptoMaterialStringExt}; use diem_types::chain_id::NamedChain; use libra_types::{ - core_types::{app_cfg::AppCfg, network_playlist::NetworkPlaylist}, - exports::{AccountAddress, AuthenticationKey, Client}, - type_extensions::client_ext::ClientExt, + core_types::{app_cfg::AppCfg, network_playlist::NetworkPlaylist}, exports::{AccountAddress, AuthenticationKey, Client}, ol_progress, type_extensions::client_ext::ClientExt }; use libra_wallet::account_keys::{get_ol_legacy_address, AccountKeys}; use std::path::PathBuf; @@ -33,6 +31,8 @@ pub async fn wizard( (account_keys.auth_key, account_keys.account) }; + let spin = ol_progress::OLProgress::spin_steady(250, "fetching metadata".to_string()); + // if the user specified both a chain name and playlist, then the playlist will override the default settings for the named chain. let mut np = match network_playlist { Some(a) => a, @@ -62,20 +62,21 @@ pub async fn wizard( let mut cfg = AppCfg::init_app_configs(authkey, address, config_dir, chain_name, Some(np))?; + spin.finish(); // offer both pledges on init let profile = cfg.get_profile_mut(None)?; profile.maybe_offer_basic_pledge(); - profile.maybe_offer_validator_pledge(); let p = cfg.save_file().context(format!( "could not initialize configs at {}", cfg.workspace.node_home.to_str().unwrap() ))?; + ol_progress::OLProgress::make_fun(); + println!("config saved to {}", p.display()); + ol_progress::OLProgress::complete("SUCCESS: libra tool configured"); - println!("Success, config saved to {}", p.to_str().unwrap()); - Ok(cfg) } diff --git a/tools/config/src/validator_config.rs b/tools/config/src/validator_config.rs index 27c4a0388..18de80adc 100644 --- a/tools/config/src/validator_config.rs +++ b/tools/config/src/validator_config.rs @@ -1,4 +1,4 @@ -use crate::{make_yaml_public_fullnode::make_private_vfn_yaml, make_yaml_validator}; +use crate::{make_yaml_public_fullnode::{make_private_vfn_yaml, VFN_FILENAME}, make_yaml_validator}; use anyhow::{anyhow, bail, Context}; use dialoguer::{Confirm, Input}; use diem_crypto::x25519; @@ -6,7 +6,7 @@ use diem_genesis::{config::HostAndPort, keys::PublicIdentity}; use diem_types::{chain_id::NamedChain, network_address::DnsName}; use libra_types::{ core_types::{app_cfg::AppCfg, network_playlist::NetworkPlaylist}, - ol_progress::OLProgress, + ol_progress::{self, OLProgress}, }; use libra_wallet::{utils::read_public_identity_file, validator_files::SetValidatorConfiguration}; use std::{ @@ -38,7 +38,7 @@ pub async fn initialize_validator( // TODO: nice to have // also for convenience create a local user libra-cli-config.yaml file so the // validator can make transactions against the localhost - let cfg = AppCfg::init_app_configs( + let mut cfg = AppCfg::init_app_configs( keys.child_0_owner.auth_key, keys.child_0_owner.account, home_path, @@ -46,6 +46,12 @@ pub async fn initialize_validator( Some(NetworkPlaylist::localhost(chain_name)), )?; + // offer the validator pledge on startup + let profile = cfg.get_profile_mut(None)?; + profile.maybe_offer_basic_pledge(); + profile.maybe_offer_validator_pledge(); + + cfg.save_file().context(format!( "could not initialize configs at {}", cfg.workspace.node_home.to_str().unwrap() @@ -169,7 +175,9 @@ pub async fn vfn_dialogue( pk, dns, )?; - println!("SUCCESS: on your VFN you should have vfn.yaml, validator-full-node.yaml files before starting node."); + ol_progress::OLProgress::complete(&format!("SUCCESS: config saved to {}", VFN_FILENAME)); + + println!("NOTE: on your VFN host you must place this vfn.yaml file in config directory before starting node."); Ok(()) } diff --git a/tools/genesis/src/wizard.rs b/tools/genesis/src/wizard.rs index 41b10fa8e..cfe06fe3c 100644 --- a/tools/genesis/src/wizard.rs +++ b/tools/genesis/src/wizard.rs @@ -162,7 +162,7 @@ impl GenesisWizard { )?; for _ in (0..10) - .progress_with_style(OLProgress::fun()) + .progress_with_style(OLProgress::fun_style()) .with_message("Initializing 0L") { thread::sleep(Duration::from_millis(100)); diff --git a/types/src/ol_progress.rs b/types/src/ol_progress.rs index aeea455f5..9337514ce 100644 --- a/types/src/ol_progress.rs +++ b/types/src/ol_progress.rs @@ -1,6 +1,6 @@ //! standardize cli progress bars in 0L tools use console::{self, style}; -use indicatif::{ProgressBar, ProgressStyle}; +use indicatif::{ProgressBar, ProgressIterator, ProgressStyle}; /// standard cli progress bars etc. for 0L tools pub struct OLProgress; @@ -30,9 +30,9 @@ impl OLProgress { pb } - /// For special occasions. Don't overuse it :) - pub fn fun() -> ProgressStyle { - ProgressStyle::with_template("Carpe Diem: {msg} {spinner}") + /// YAY, carpe diem + pub fn fun_style() -> ProgressStyle { + ProgressStyle::with_template("Carpe Diem {spinner}") .unwrap() // For more spinners check out the cli-spinners project: // https://github.com/sindresorhus/cli-spinners/blob/master/spinners.json @@ -47,6 +47,17 @@ impl OLProgress { ]) } + /// For special occasions. Don't overuse it :) + pub fn make_fun() { + let a = 0..10; + let wait = core::time::Duration::from_millis(500); + a.progress_with_style(Self::fun_style()) + // .with_message("message") + .for_each(|_| { + std::thread::sleep(wait); + }); + } + /// formatted "complete" message pub fn complete(msg: &str) { let prepad = format!("{} ", msg); @@ -111,9 +122,15 @@ fn progress() { std::thread::sleep(wait); }); - a.progress_with_style(OLProgress::fun()) + a.progress_with_style(OLProgress::fun_style()) .with_message("message") .for_each(|_| { std::thread::sleep(wait); }); } + +#[test] +#[ignore] +fn fun() { + OLProgress::make_fun(); +} From 45f21ef09d78c2e87fe24c571cb8a9acb57827fe Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 13:30:31 -0400 Subject: [PATCH 14/22] fmt --- tools/config/src/config_wizard.rs | 6 ++-- tools/config/src/validator_config.rs | 6 ++-- types/src/core_types/app_cfg.rs | 51 ++++++++++++++-------------- types/src/core_types/pledge.rs | 14 ++++---- types/src/ol_progress.rs | 16 ++++----- 5 files changed, 50 insertions(+), 43 deletions(-) diff --git a/tools/config/src/config_wizard.rs b/tools/config/src/config_wizard.rs index 926e84d10..8f342a1c2 100644 --- a/tools/config/src/config_wizard.rs +++ b/tools/config/src/config_wizard.rs @@ -2,7 +2,10 @@ use anyhow::Context; use diem_crypto::{ed25519::Ed25519PrivateKey, ValidCryptoMaterialStringExt}; use diem_types::chain_id::NamedChain; use libra_types::{ - core_types::{app_cfg::AppCfg, network_playlist::NetworkPlaylist}, exports::{AccountAddress, AuthenticationKey, Client}, ol_progress, type_extensions::client_ext::ClientExt + core_types::{app_cfg::AppCfg, network_playlist::NetworkPlaylist}, + exports::{AccountAddress, AuthenticationKey, Client}, + ol_progress, + type_extensions::client_ext::ClientExt, }; use libra_wallet::account_keys::{get_ol_legacy_address, AccountKeys}; use std::path::PathBuf; @@ -76,7 +79,6 @@ pub async fn wizard( println!("config saved to {}", p.display()); ol_progress::OLProgress::complete("SUCCESS: libra tool configured"); - Ok(cfg) } diff --git a/tools/config/src/validator_config.rs b/tools/config/src/validator_config.rs index 18de80adc..b903ed12e 100644 --- a/tools/config/src/validator_config.rs +++ b/tools/config/src/validator_config.rs @@ -1,4 +1,7 @@ -use crate::{make_yaml_public_fullnode::{make_private_vfn_yaml, VFN_FILENAME}, make_yaml_validator}; +use crate::{ + make_yaml_public_fullnode::{make_private_vfn_yaml, VFN_FILENAME}, + make_yaml_validator, +}; use anyhow::{anyhow, bail, Context}; use dialoguer::{Confirm, Input}; use diem_crypto::x25519; @@ -51,7 +54,6 @@ pub async fn initialize_validator( profile.maybe_offer_basic_pledge(); profile.maybe_offer_validator_pledge(); - cfg.save_file().context(format!( "could not initialize configs at {}", cfg.workspace.node_home.to_str().unwrap() diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 524447cce..b1e70bee4 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -14,7 +14,10 @@ use url::Url; use std::{fs, io::Write, path::PathBuf, str::FromStr}; -use super::{network_playlist::{self, NetworkPlaylist}, pledge::Pledge}; +use super::{ + network_playlist::{self, NetworkPlaylist}, + pledge::Pledge, +}; // TODO: the GAS_UNIT_PRICE is set in DIEM. IT IS ALSO THE MINIMUM GAS PRICE This is arbitrary and needs to be reviewed. pub const MINIMUM_GAS_PRICE_IN_DIEM: u64 = GAS_UNIT_PRICE; @@ -223,7 +226,10 @@ impl AppCfg { let idx = self.get_profile_idx(nickname).unwrap_or(0); let p = self.user_profiles.get(idx).context("no profile at index")?; // The license to use this software depends on the user taking the pledge. Totally cool if you don't want to, but you'll need to write your own tools. - assert!(p.check_has_pledge(0), "user has not taken Protect the Game pledge, exiting."); + assert!( + p.check_has_pledge(0), + "user has not taken Protect the Game pledge, exiting." + ); Ok(p) } @@ -432,7 +438,6 @@ pub struct Profile { /// Pledges the user took pub pledges: Option>, - // NOTE: V7: deprecated // Deprecation: : /// ip address of this node. May be different from transaction URL. // pub ip: Ipv4Addr, @@ -487,13 +492,11 @@ impl Profile { // push a pledge pub fn push_pledge(&mut self, new: Pledge) { if let Some(list) = &mut self.pledges { - let found = list.iter().find(|e| { - return e.id == new.id - }); + let found = list.iter().find(|e| return e.id == new.id); if found.is_none() { - list.push(new); + list.push(new); } else { - println!("pledge '{}' already found on this account", &new.question); + println!("pledge '{}' already found on this account", &new.question); } } else { self.pledges = Some(vec![new]) @@ -504,34 +507,33 @@ impl Profile { pub fn check_has_pledge(&self, pledge_id: u8) -> bool { if let Some(list) = &self.pledges { // check the pledge exists - return list.iter().find(|e| { - return e.id == 0 && - Pledge::check_pledge_hash(pledge_id, &e.hash) - }).is_some() + return list + .iter() + .find(|e| return e.id == 0 && Pledge::check_pledge_hash(pledge_id, &e.hash)) + .is_some(); } - return false + return false; } // offer pledge if none pub fn maybe_offer_basic_pledge(&mut self) { - if !self.check_has_pledge(0) { - let p = Pledge::pledge_protect_the_game(); - if p.pledge_dialogue() { - self.push_pledge(p) + if !self.check_has_pledge(0) { + let p = Pledge::pledge_protect_the_game(); + if p.pledge_dialogue() { + self.push_pledge(p) + } } - } } // offer validator pledge pub fn maybe_offer_validator_pledge(&mut self) { - if !self.check_has_pledge(1) { - let p = Pledge::pledge_validator(); - if p.pledge_dialogue() { - self.push_pledge(p) + if !self.check_has_pledge(1) { + let p = Pledge::pledge_validator(); + if p.pledge_dialogue() { + self.push_pledge(p) + } } - } } - } pub fn get_nickname(acc: AccountAddress) -> String { @@ -666,7 +668,6 @@ impl Default for TxConfigs { } } - //////// TESTS //////// #[tokio::test] async fn test_create() { diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index 67602b70f..b17b39318 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -54,16 +54,19 @@ impl Pledge { /// interact with user to get basic pledges, validator pledge optional on default setup pub fn pledge_dialogue(&self) -> bool { - println!("PLEDGE #{}: {}\n\n{}", &self.id, &self.question, &self.preamble); + println!( + "PLEDGE #{}: {}\n\n{}", + &self.id, &self.question, &self.preamble + ); if MODE_0L.clone() != NamedChain::MAINNET { - println!("seems you are using CI or testnet settings, pledges default to yes"); - return true + println!("seems you are using CI or testnet settings, pledges default to yes"); + return true; }; if prompt_yes(&format!("\n{}", &self.question)) { - return true + return true; } - return false + return false; } /// #0 Protect the Game Pledge @@ -101,7 +104,6 @@ impl Pledge { } } - #[tokio::test] async fn test_pledge() { let mut a = AppCfg { diff --git a/types/src/ol_progress.rs b/types/src/ol_progress.rs index 9337514ce..89fc4d407 100644 --- a/types/src/ol_progress.rs +++ b/types/src/ol_progress.rs @@ -49,13 +49,13 @@ impl OLProgress { /// For special occasions. Don't overuse it :) pub fn make_fun() { - let a = 0..10; - let wait = core::time::Duration::from_millis(500); - a.progress_with_style(Self::fun_style()) - // .with_message("message") - .for_each(|_| { - std::thread::sleep(wait); - }); + let a = 0..10; + let wait = core::time::Duration::from_millis(500); + a.progress_with_style(Self::fun_style()) + // .with_message("message") + .for_each(|_| { + std::thread::sleep(wait); + }); } /// formatted "complete" message @@ -132,5 +132,5 @@ fn progress() { #[test] #[ignore] fn fun() { - OLProgress::make_fun(); + OLProgress::make_fun(); } From d8c8664d7a097df7bb0d5d384c7955d2c18b78a1 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 13:33:51 -0400 Subject: [PATCH 15/22] clippy --- .../src/libra_framework_sdk_builder.rs | 122 +++++++++--------- types/src/core_types/app_cfg.rs | 7 +- types/src/core_types/pledge.rs | 10 +- 3 files changed, 69 insertions(+), 70 deletions(-) diff --git a/framework/cached-packages/src/libra_framework_sdk_builder.rs b/framework/cached-packages/src/libra_framework_sdk_builder.rs index 28fd901c4..a3bae1d52 100644 --- a/framework/cached-packages/src/libra_framework_sdk_builder.rs +++ b/framework/cached-packages/src/libra_framework_sdk_builder.rs @@ -2381,7 +2381,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountOfferRotationCapability { - rotation_capability_sig_bytes: bcs::from_bytes(script.args().get(0)?).ok()?, + rotation_capability_sig_bytes: bcs::from_bytes(script.args().first()?).ok()?, account_scheme: bcs::from_bytes(script.args().get(1)?).ok()?, account_public_key_bytes: bcs::from_bytes(script.args().get(2)?).ok()?, recipient_address: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2396,7 +2396,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountOfferSignerCapability { - signer_capability_sig_bytes: bcs::from_bytes(script.args().get(0)?).ok()?, + signer_capability_sig_bytes: bcs::from_bytes(script.args().first()?).ok()?, account_scheme: bcs::from_bytes(script.args().get(1)?).ok()?, account_public_key_bytes: bcs::from_bytes(script.args().get(2)?).ok()?, recipient_address: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2431,7 +2431,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountRevokeRotationCapability { - to_be_revoked_address: bcs::from_bytes(script.args().get(0)?).ok()?, + to_be_revoked_address: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2443,7 +2443,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountRevokeSignerCapability { - to_be_revoked_address: bcs::from_bytes(script.args().get(0)?).ok()?, + to_be_revoked_address: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2455,7 +2455,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AccountRotateAuthenticationKey { - from_scheme: bcs::from_bytes(script.args().get(0)?).ok()?, + from_scheme: bcs::from_bytes(script.args().first()?).ok()?, from_public_key_bytes: bcs::from_bytes(script.args().get(1)?).ok()?, to_scheme: bcs::from_bytes(script.args().get(2)?).ok()?, to_public_key_bytes: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2473,7 +2473,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::AccountRotateAuthenticationKeyWithRotationCapability { - rotation_cap_offerer_address: bcs::from_bytes(script.args().get(0)?).ok()?, + rotation_cap_offerer_address: bcs::from_bytes(script.args().first()?).ok()?, new_scheme: bcs::from_bytes(script.args().get(1)?).ok()?, new_public_key_bytes: bcs::from_bytes(script.args().get(2)?).ok()?, cap_update_table: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2487,7 +2487,7 @@ mod decoder { pub fn burn_set_send_community(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::BurnSetSendCommunity { - community: bcs::from_bytes(script.args().get(0)?).ok()?, + community: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2497,7 +2497,7 @@ mod decoder { pub fn code_publish_package_txn(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CodePublishPackageTxn { - metadata_serialized: bcs::from_bytes(script.args().get(0)?).ok()?, + metadata_serialized: bcs::from_bytes(script.args().first()?).ok()?, code: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2508,8 +2508,8 @@ mod decoder { pub fn coin_transfer(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CoinTransfer { - coin_type: script.ty_args().get(0)?.clone(), - to: bcs::from_bytes(script.args().get(0)?).ok()?, + coin_type: script.ty_args().first()?.clone(), + to: bcs::from_bytes(script.args().first()?).ok()?, amount: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2523,7 +2523,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::CommunityWalletInitChangeSignerCommunityMultisig { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, new_signer: bcs::from_bytes(script.args().get(1)?).ok()?, is_add_operation: bcs::from_bytes(script.args().get(2)?).ok()?, n_of_m: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2540,7 +2540,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CommunityWalletInitFinalizeAndCage { - num_signers: bcs::from_bytes(script.args().get(0)?).ok()?, + num_signers: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2552,7 +2552,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CommunityWalletInitInitCommunity { - initial_authorities: bcs::from_bytes(script.args().get(0)?).ok()?, + initial_authorities: bcs::from_bytes(script.args().first()?).ok()?, check_threshold: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2565,7 +2565,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::CommunityWalletInitProposeOffer { - new_signers: bcs::from_bytes(script.args().get(0)?).ok()?, + new_signers: bcs::from_bytes(script.args().first()?).ok()?, num_signers: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2579,7 +2579,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::DiemGovernanceAddApprovedScriptHashScript { - proposal_id: bcs::from_bytes(script.args().get(0)?).ok()?, + proposal_id: bcs::from_bytes(script.args().first()?).ok()?, }, ) } else { @@ -2592,7 +2592,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceAssertCanResolve { - proposal_id: bcs::from_bytes(script.args().get(0)?).ok()?, + proposal_id: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2604,7 +2604,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceCreateProposalV2 { - execution_hash: bcs::from_bytes(script.args().get(0)?).ok()?, + execution_hash: bcs::from_bytes(script.args().first()?).ok()?, metadata_location: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_hash: bcs::from_bytes(script.args().get(2)?).ok()?, is_multi_step_proposal: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2619,7 +2619,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceOlCreateProposalV2 { - execution_hash: bcs::from_bytes(script.args().get(0)?).ok()?, + execution_hash: bcs::from_bytes(script.args().first()?).ok()?, metadata_location: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_hash: bcs::from_bytes(script.args().get(2)?).ok()?, is_multi_step_proposal: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2632,7 +2632,7 @@ mod decoder { pub fn diem_governance_ol_vote(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceOlVote { - proposal_id: bcs::from_bytes(script.args().get(0)?).ok()?, + proposal_id: bcs::from_bytes(script.args().first()?).ok()?, should_pass: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2663,7 +2663,7 @@ mod decoder { pub fn diem_governance_vote(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DiemGovernanceVote { - proposal_id: bcs::from_bytes(script.args().get(0)?).ok()?, + proposal_id: bcs::from_bytes(script.args().first()?).ok()?, should_pass: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2676,7 +2676,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsProposeLiquidateTx { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2688,7 +2688,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsProposePaymentTx { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, payee: bcs::from_bytes(script.args().get(1)?).ok()?, value: bcs::from_bytes(script.args().get(2)?).ok()?, description: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2703,7 +2703,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsProposeVetoTx { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, id: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2716,7 +2716,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsVoteLiquidationTx { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2726,7 +2726,7 @@ mod decoder { pub fn donor_voice_txs_vote_veto_tx(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::DonorVoiceTxsVoteVetoTx { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, id: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2747,7 +2747,7 @@ mod decoder { pub fn jail_unjail_by_voucher(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::JailUnjailByVoucher { - addr: bcs::from_bytes(script.args().get(0)?).ok()?, + addr: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2769,7 +2769,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::LibraCoinDelegateMintCapability { - to: bcs::from_bytes(script.args().get(0)?).ok()?, + to: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2779,7 +2779,7 @@ mod decoder { pub fn libra_coin_mint_to_impl(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::LibraCoinMintToImpl { - dst_addr: bcs::from_bytes(script.args().get(0)?).ok()?, + dst_addr: bcs::from_bytes(script.args().first()?).ok()?, amount: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2790,7 +2790,7 @@ mod decoder { pub fn multi_action_claim_offer(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultiActionClaimOffer { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2812,7 +2812,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultiActionMigrationMigrateOffer { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2822,7 +2822,7 @@ mod decoder { pub fn multisig_account_add_owner(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountAddOwner { - new_owner: bcs::from_bytes(script.args().get(0)?).ok()?, + new_owner: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2832,7 +2832,7 @@ mod decoder { pub fn multisig_account_add_owners(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountAddOwners { - new_owners: bcs::from_bytes(script.args().get(0)?).ok()?, + new_owners: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2844,7 +2844,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountApproveTransaction { - multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_account: bcs::from_bytes(script.args().first()?).ok()?, sequence_number: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2855,7 +2855,7 @@ mod decoder { pub fn multisig_account_create(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountCreate { - num_signatures_required: bcs::from_bytes(script.args().get(0)?).ok()?, + num_signatures_required: bcs::from_bytes(script.args().first()?).ok()?, metadata_keys: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_values: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -2869,7 +2869,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountCreateTransaction { - multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_account: bcs::from_bytes(script.args().first()?).ok()?, payload: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2883,7 +2883,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::MultisigAccountCreateTransactionWithHash { - multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_account: bcs::from_bytes(script.args().first()?).ok()?, payload_hash: bcs::from_bytes(script.args().get(1)?).ok()?, }, ) @@ -2898,7 +2898,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::MultisigAccountCreateWithExistingAccount { - multisig_address: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_address: bcs::from_bytes(script.args().first()?).ok()?, owners: bcs::from_bytes(script.args().get(1)?).ok()?, num_signatures_required: bcs::from_bytes(script.args().get(2)?).ok()?, account_scheme: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2919,7 +2919,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountCreateWithOwners { - additional_owners: bcs::from_bytes(script.args().get(0)?).ok()?, + additional_owners: bcs::from_bytes(script.args().first()?).ok()?, num_signatures_required: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_keys: bcs::from_bytes(script.args().get(2)?).ok()?, metadata_values: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2935,7 +2935,7 @@ mod decoder { if let TransactionPayload::EntryFunction(script) = payload { Some( EntryFunctionCall::MultisigAccountExecuteRejectedTransaction { - multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_account: bcs::from_bytes(script.args().first()?).ok()?, }, ) } else { @@ -2948,7 +2948,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountMigrateWithOwners { - additional_owners: bcs::from_bytes(script.args().get(0)?).ok()?, + additional_owners: bcs::from_bytes(script.args().first()?).ok()?, num_signatures_required: bcs::from_bytes(script.args().get(1)?).ok()?, metadata_keys: bcs::from_bytes(script.args().get(2)?).ok()?, metadata_values: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -2963,7 +2963,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountRejectTransaction { - multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_account: bcs::from_bytes(script.args().first()?).ok()?, sequence_number: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -2976,7 +2976,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountRemoveOwner { - owner_to_remove: bcs::from_bytes(script.args().get(0)?).ok()?, + owner_to_remove: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -2988,7 +2988,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountRemoveOwners { - owners_to_remove: bcs::from_bytes(script.args().get(0)?).ok()?, + owners_to_remove: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -3000,7 +3000,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountUpdateMetadata { - keys: bcs::from_bytes(script.args().get(0)?).ok()?, + keys: bcs::from_bytes(script.args().first()?).ok()?, values: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -3013,7 +3013,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountUpdateSignaturesRequired { - new_num_signatures_required: bcs::from_bytes(script.args().get(0)?).ok()?, + new_num_signatures_required: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -3025,7 +3025,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::MultisigAccountVoteTransanction { - multisig_account: bcs::from_bytes(script.args().get(0)?).ok()?, + multisig_account: bcs::from_bytes(script.args().first()?).ok()?, sequence_number: bcs::from_bytes(script.args().get(1)?).ok()?, approved: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -3037,7 +3037,7 @@ mod decoder { pub fn object_transfer_call(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ObjectTransferCall { - object: bcs::from_bytes(script.args().get(0)?).ok()?, + object: bcs::from_bytes(script.args().first()?).ok()?, to: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -3048,7 +3048,7 @@ mod decoder { pub fn ol_account_create_account(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::OlAccountCreateAccount { - auth_key: bcs::from_bytes(script.args().get(0)?).ok()?, + auth_key: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -3060,7 +3060,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::OlAccountSetAllowDirectCoinTransfers { - allow: bcs::from_bytes(script.args().get(0)?).ok()?, + allow: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -3070,7 +3070,7 @@ mod decoder { pub fn ol_account_transfer(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::OlAccountTransfer { - to: bcs::from_bytes(script.args().get(0)?).ok()?, + to: bcs::from_bytes(script.args().first()?).ok()?, amount: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -3097,7 +3097,7 @@ mod decoder { pub fn proof_of_fee_pof_update_bid(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ProofOfFeePofUpdateBid { - bid: bcs::from_bytes(script.args().get(0)?).ok()?, + bid: bcs::from_bytes(script.args().first()?).ok()?, epoch_expiry: bcs::from_bytes(script.args().get(1)?).ok()?, }) } else { @@ -3108,7 +3108,7 @@ mod decoder { pub fn safe_init_payment_multisig(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::SafeInitPaymentMultisig { - authorities: bcs::from_bytes(script.args().get(0)?).ok()?, + authorities: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -3120,7 +3120,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::SlowWalletSmokeTestVmUnlock { - user_addr: bcs::from_bytes(script.args().get(0)?).ok()?, + user_addr: bcs::from_bytes(script.args().first()?).ok()?, unlocked: bcs::from_bytes(script.args().get(1)?).ok()?, transferred: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -3140,7 +3140,7 @@ mod decoder { pub fn stake_initialize_validator(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::StakeInitializeValidator { - consensus_pubkey: bcs::from_bytes(script.args().get(0)?).ok()?, + consensus_pubkey: bcs::from_bytes(script.args().first()?).ok()?, proof_of_possession: bcs::from_bytes(script.args().get(1)?).ok()?, network_addresses: bcs::from_bytes(script.args().get(2)?).ok()?, fullnode_addresses: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -3153,7 +3153,7 @@ mod decoder { pub fn stake_rotate_consensus_key(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::StakeRotateConsensusKey { - validator_address: bcs::from_bytes(script.args().get(0)?).ok()?, + validator_address: bcs::from_bytes(script.args().first()?).ok()?, new_consensus_pubkey: bcs::from_bytes(script.args().get(1)?).ok()?, proof_of_possession: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -3167,7 +3167,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::StakeUpdateNetworkAndFullnodeAddresses { - validator_address: bcs::from_bytes(script.args().get(0)?).ok()?, + validator_address: bcs::from_bytes(script.args().first()?).ok()?, new_network_addresses: bcs::from_bytes(script.args().get(1)?).ok()?, new_fullnode_addresses: bcs::from_bytes(script.args().get(2)?).ok()?, }) @@ -3181,7 +3181,7 @@ mod decoder { ) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::ValidatorUniverseRegisterValidator { - consensus_pubkey: bcs::from_bytes(script.args().get(0)?).ok()?, + consensus_pubkey: bcs::from_bytes(script.args().first()?).ok()?, proof_of_possession: bcs::from_bytes(script.args().get(1)?).ok()?, network_addresses: bcs::from_bytes(script.args().get(2)?).ok()?, fullnode_addresses: bcs::from_bytes(script.args().get(3)?).ok()?, @@ -3194,7 +3194,7 @@ mod decoder { pub fn version_set_version(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::VersionSetVersion { - major: bcs::from_bytes(script.args().get(0)?).ok()?, + major: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -3204,7 +3204,7 @@ mod decoder { pub fn vouch_insist_vouch_for(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::VouchInsistVouchFor { - friend_account: bcs::from_bytes(script.args().get(0)?).ok()?, + friend_account: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -3214,7 +3214,7 @@ mod decoder { pub fn vouch_revoke(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::VouchRevoke { - friend_account: bcs::from_bytes(script.args().get(0)?).ok()?, + friend_account: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None @@ -3224,7 +3224,7 @@ mod decoder { pub fn vouch_vouch_for(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::VouchVouchFor { - friend_account: bcs::from_bytes(script.args().get(0)?).ok()?, + friend_account: bcs::from_bytes(script.args().first()?).ok()?, }) } else { None diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index b1e70bee4..5a156763a 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -492,7 +492,7 @@ impl Profile { // push a pledge pub fn push_pledge(&mut self, new: Pledge) { if let Some(list) = &mut self.pledges { - let found = list.iter().find(|e| return e.id == new.id); + let found = list.iter().find(|e| e.id == new.id); if found.is_none() { list.push(new); } else { @@ -509,10 +509,9 @@ impl Profile { // check the pledge exists return list .iter() - .find(|e| return e.id == 0 && Pledge::check_pledge_hash(pledge_id, &e.hash)) - .is_some(); + .any(|e| e.id == 0 && Pledge::check_pledge_hash(pledge_id, &e.hash)); } - return false; + false } // offer pledge if none diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index b17b39318..6820fec96 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -49,7 +49,7 @@ impl Pledge { } else { assert!(pledge_idx < 2, "pledge index not found"); } - return false; + false } /// interact with user to get basic pledges, validator pledge optional on default setup @@ -59,14 +59,14 @@ impl Pledge { &self.id, &self.question, &self.preamble ); - if MODE_0L.clone() != NamedChain::MAINNET { + if *MODE_0L != NamedChain::MAINNET { println!("seems you are using CI or testnet settings, pledges default to yes"); return true; }; if prompt_yes(&format!("\n{}", &self.question)) { return true; } - return false; + false } /// #0 Protect the Game Pledge @@ -83,7 +83,7 @@ impl Pledge { p.to_hash(); - return p; + p } /// #1 Validator pledge @@ -100,7 +100,7 @@ impl Pledge { p.to_hash(); - return p; + p } } From bad15e3855d02aa5d5c889241ded12e8c078deca Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:04:09 -0400 Subject: [PATCH 16/22] patch nickname off by one --- tools/config/src/config_cli.rs | 46 +++++++++++++++++++++------------ types/src/core_types/app_cfg.rs | 6 ++--- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/tools/config/src/config_cli.rs b/tools/config/src/config_cli.rs index 3a1ca86d8..19f78ff41 100644 --- a/tools/config/src/config_cli.rs +++ b/tools/config/src/config_cli.rs @@ -3,7 +3,7 @@ use crate::{ make_yaml_public_fullnode::{download_genesis, get_genesis_waypoint, init_fullnode_yaml}, validator_config::{validator_dialogue, vfn_dialogue}, }; -use anyhow::{Context, Result}; +use anyhow::{anyhow, Context, Result}; use clap::Parser; use libra_types::{ core_types::app_cfg::{self, AppCfg}, @@ -49,13 +49,10 @@ enum ConfigSub { #[clap(long)] playlist_url: Option, }, - // TODO: add WhoAmI to show libra-cli-config.yaml profile info. - /// Utils for libra-cli-config.yaml file - #[clap(arg_required_else_help(true))] Fix { /// optional, reset the address from mnemonic. Will also lookup on the chain for the actual address if you forgot it, or rotated your authkey. - #[clap(short, long)] - address: bool, + #[clap(short('a'), long)] + reset_address: bool, #[clap(short, long)] remove_profile: Option, @@ -88,15 +85,24 @@ impl ConfigCli { pub async fn run(&self) -> Result<()> { match &self.subcommand { Some(ConfigSub::Fix { - address, + reset_address, remove_profile, force_url, }) => { // Load configuration file - let mut cfg = AppCfg::load(self.path.clone())?; + let mut cfg = AppCfg::load(self.path.clone()) + .map_err(|e| anyhow!("no config file found for libra tools, {}", e))?; + if cfg.user_profiles.len() > 0 { + println!("your profiles:"); + for p in &cfg.user_profiles { + println!("- address: {}, nickname: {}", p.account, p.nickname); + } + } else { + println!("no profiles found"); + } // Handle address fix option - if *address { + let profile = if *reset_address { let mut account_keys = config_wizard::prompt_for_account()?; let client = Client::new(cfg.pick_url(self.chain_name)?); @@ -117,12 +123,11 @@ impl ConfigCli { }; // Create profile based on account keys - let mut profile = + let profile = app_cfg::Profile::new(account_keys.auth_key, account_keys.account); - // user can take pledge here on fix or on init - profile.maybe_offer_basic_pledge(); - profile.maybe_offer_validator_pledge(); + // Add profile to configuration + cfg.maybe_add_profile(profile)?; // Prompt to set as default profile if dialoguer::Confirm::new() @@ -133,9 +138,18 @@ impl ConfigCli { .set_default(account_keys.account.to_hex_literal()); } - // Add profile to configuration - cfg.maybe_add_profile(profile)?; - } + cfg.get_profile_mut(Some(account_keys.account.to_hex_literal())) + } else { + // get default profile + println!("will try to fix your default profile"); + cfg.get_profile_mut(None) + }?; + + println!("using profile: {}", &profile.nickname); + + // user can take pledge here on fix or on init + profile.maybe_offer_basic_pledge(); + profile.maybe_offer_validator_pledge(); // Remove profile if specified if let Some(p) = remove_profile { diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 5a156763a..46c240ecb 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -536,9 +536,9 @@ impl Profile { } pub fn get_nickname(acc: AccountAddress) -> String { - // let's check if this is a legacy/founder key, it will have 16 zeros at the start, and that's not a useful nickname - if acc.to_string()[..32] == *"00000000000000000000000000000000" { - return acc.to_string()[33..37].to_owned(); + // let's check if this is a legacy/founder key, it will have 32 zeros at the start, and that's not a useful nickname + if acc.to_string()[..31] == *"00000000000000000000000000000000" { + return acc.to_string()[32..36].to_owned(); } acc.to_string()[..4].to_owned() From efedd809909bfb34fbd0e60323f003b3c5d76754 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:05:52 -0400 Subject: [PATCH 17/22] cleanup --- types/src/core_types/app_cfg.rs | 40 ++------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 46c240ecb..5542b05ac 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -1,4 +1,4 @@ -//! Configs for all 0L apps. +//! Common config for for all tools based on libra-framework . use crate::{ exports::{AccountAddress, AuthenticationKey, NamedChain}, @@ -145,43 +145,7 @@ impl AppCfg { Ok(toml_path) } - // v7.0.3 deprecation notice: no migration from v5 supported - // pub fn migrate(legacy_file: Option, output: Option) -> anyhow::Result { - // let l = LegacyToml::parse_toml(legacy_file)?; - - // let nodes = if let Some(v) = l.profile.upstream_nodes.as_ref() { - // v.iter() - // .map(|u| HostProfile { - // url: u.to_owned(), - // note: u.to_string(), - // ..Default::default() - // }) - // .collect::>() - // } else { - // vec![] - // }; - // let np = NetworkPlaylist { - // chain_name: l.chain_info.chain_id, - // nodes, - // }; - // let app_cfg = AppCfg { - // workspace: l.workspace, - // user_profiles: vec![l.profile], - // network_playlist: vec![np], - // tx_configs: l.tx_configs, - // }; - - // if let Some(p) = output { - // fs::create_dir_all(&p)?; - // println!("created file for {}", p.to_str().unwrap()); - // let yaml = serde_yaml::to_string(&app_cfg)?; - // fs::write(p, yaml.as_bytes())?; - // } else { - // app_cfg.save_file()?; - // } - - // Ok(app_cfg) - // } + // commit note: cleanup deprecated /// Get where the block/proofs are stored. pub fn get_block_dir(&self, nickname: Option) -> anyhow::Result { From 180a794feb5ff46d3654c5acd7190ee86a99eb48 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:10:32 -0400 Subject: [PATCH 18/22] fun shows we care --- types/src/ol_progress.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/src/ol_progress.rs b/types/src/ol_progress.rs index 89fc4d407..a13b358d4 100644 --- a/types/src/ol_progress.rs +++ b/types/src/ol_progress.rs @@ -32,7 +32,7 @@ impl OLProgress { /// YAY, carpe diem pub fn fun_style() -> ProgressStyle { - ProgressStyle::with_template("Carpe Diem {spinner}") + ProgressStyle::with_template(" CARPE DIEM\n{msg}\n{spinner}") .unwrap() // For more spinners check out the cli-spinners project: // https://github.com/sindresorhus/cli-spinners/blob/master/spinners.json From 5354da3232cebf0ae30ed47536bc58639cea8c54 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:15:11 -0400 Subject: [PATCH 19/22] add name field --- tools/config/src/config_cli.rs | 2 +- types/src/core_types/pledge.rs | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tools/config/src/config_cli.rs b/tools/config/src/config_cli.rs index 19f78ff41..17c1e7325 100644 --- a/tools/config/src/config_cli.rs +++ b/tools/config/src/config_cli.rs @@ -92,7 +92,7 @@ impl ConfigCli { // Load configuration file let mut cfg = AppCfg::load(self.path.clone()) .map_err(|e| anyhow!("no config file found for libra tools, {}", e))?; - if cfg.user_profiles.len() > 0 { + if !cfg.user_profiles.is_empty() { println!("your profiles:"); for p in &cfg.user_profiles { println!("- address: {}, nickname: {}", p.account, p.nickname); diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index 6820fec96..f631ef52a 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -13,6 +13,8 @@ use crate::core_types::mode_ol::MODE_0L; pub struct Pledge { /// the canonical id of this pledge pub id: u8, + /// nickname of pledge + pub name: String, /// textual versions of the pledge pub version: u8, /// hash of the textual version @@ -32,6 +34,7 @@ pub enum CanonicalPledges { /// operate in good faith Validator = 1, } + impl Pledge { /// make the unique hex encoding of the text. pub fn to_hash(&mut self) { @@ -43,9 +46,9 @@ impl Pledge { /// check pledge hash pub fn check_pledge_hash(pledge_idx: u8, bytes: &[u8]) -> bool { if pledge_idx == 0 { - return bytes == &Self::pledge_protect_the_game().hash; + return bytes == Self::pledge_protect_the_game().hash; } else if pledge_idx == 1 { - return bytes == &Self::pledge_validator().hash; + return bytes == Self::pledge_validator().hash; } else { assert!(pledge_idx < 2, "pledge index not found"); } @@ -56,7 +59,7 @@ impl Pledge { pub fn pledge_dialogue(&self) -> bool { println!( "PLEDGE #{}: {}\n\n{}", - &self.id, &self.question, &self.preamble + &self.id, &self.name, &self.preamble ); if *MODE_0L != NamedChain::MAINNET { @@ -74,6 +77,7 @@ impl Pledge { pub fn pledge_protect_the_game() -> Pledge { let mut p = Pledge { id: 0, + name: "Protect the Game", version: 0, question: "Do you pledge to not damage the game and never cheat other users?".to_string(), preamble: "Code is not law at Open Libra. The law is law. The law comes from history.\n\nI understand written and unwritten laws come from social norms. I will refer to the expectations of this community based on canonical instructions, code documentation, and common sense to know when I'm cheating at the game, or otherwise unlawfully disadvantaging someone for my benefit.\n\nCheating can include, but is not limited to: gaining an advantage in a way that would be impossible unless it was covert, dishonest, untrue, or otherwise using an expected common courtesy others have extended to me which I'm not willing to return.".to_string(), @@ -91,6 +95,7 @@ impl Pledge { pub fn pledge_validator() -> Pledge { let mut p = Pledge { id: 1, + name: "Operate in Good Faith", version: 0, question: "Do you pledge to be a validator that acts in good faith to secure the network?".to_string(), preamble: "When taking this pledge you are also taking the Protect the Game pledge:\n'I pledge to not damage the game and never cheat other users'.\n\nAdditionally you pledge to: obey the blockchain's policies as intended, some of which may be encoded as smart contracts, not pretend to be multiple people (sybil), not change the blockchain settings or software without consulting the community, run the blockchain security software (e.g validator, and fullnode software) as intended and in its entirety.".to_string(), From 6a64915f24be1d184b826724cc776a6536a73090 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:15:55 -0400 Subject: [PATCH 20/22] patch --- types/src/core_types/pledge.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index f631ef52a..4d00aa99f 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -57,10 +57,7 @@ impl Pledge { /// interact with user to get basic pledges, validator pledge optional on default setup pub fn pledge_dialogue(&self) -> bool { - println!( - "PLEDGE #{}: {}\n\n{}", - &self.id, &self.name, &self.preamble - ); + println!("PLEDGE #{}: {}\n\n{}", &self.id, &self.name, &self.preamble); if *MODE_0L != NamedChain::MAINNET { println!("seems you are using CI or testnet settings, pledges default to yes"); @@ -77,7 +74,7 @@ impl Pledge { pub fn pledge_protect_the_game() -> Pledge { let mut p = Pledge { id: 0, - name: "Protect the Game", + name: "Protect the Game".to_string(), version: 0, question: "Do you pledge to not damage the game and never cheat other users?".to_string(), preamble: "Code is not law at Open Libra. The law is law. The law comes from history.\n\nI understand written and unwritten laws come from social norms. I will refer to the expectations of this community based on canonical instructions, code documentation, and common sense to know when I'm cheating at the game, or otherwise unlawfully disadvantaging someone for my benefit.\n\nCheating can include, but is not limited to: gaining an advantage in a way that would be impossible unless it was covert, dishonest, untrue, or otherwise using an expected common courtesy others have extended to me which I'm not willing to return.".to_string(), @@ -95,7 +92,7 @@ impl Pledge { pub fn pledge_validator() -> Pledge { let mut p = Pledge { id: 1, - name: "Operate in Good Faith", + name: "Operate in Good Faith".to_string(), version: 0, question: "Do you pledge to be a validator that acts in good faith to secure the network?".to_string(), preamble: "When taking this pledge you are also taking the Protect the Game pledge:\n'I pledge to not damage the game and never cheat other users'.\n\nAdditionally you pledge to: obey the blockchain's policies as intended, some of which may be encoded as smart contracts, not pretend to be multiple people (sybil), not change the blockchain settings or software without consulting the community, run the blockchain security software (e.g validator, and fullnode software) as intended and in its entirety.".to_string(), From ddc08146110b5ba9d06035b85e67ed9becb20e83 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:16:54 -0400 Subject: [PATCH 21/22] docs --- types/src/core_types/pledge.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/src/core_types/pledge.rs b/types/src/core_types/pledge.rs index 4d00aa99f..e86dd10c6 100644 --- a/types/src/core_types/pledge.rs +++ b/types/src/core_types/pledge.rs @@ -1,4 +1,4 @@ -//! Configs for all 0L apps. +//! User code of conduct pledges use diem::common::utils::prompt_yes; use diem_crypto::HashValue; From 8a02c51f4f7b481e5468752bcf55e339f96d1876 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:25:28 -0400 Subject: [PATCH 22/22] fmt --- types/src/core_types/app_cfg.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/types/src/core_types/app_cfg.rs b/types/src/core_types/app_cfg.rs index 5542b05ac..c91ad985c 100644 --- a/types/src/core_types/app_cfg.rs +++ b/types/src/core_types/app_cfg.rs @@ -15,6 +15,7 @@ use url::Url; use std::{fs, io::Write, path::PathBuf, str::FromStr}; use super::{ + mode_ol::MODE_0L, network_playlist::{self, NetworkPlaylist}, pledge::Pledge, }; @@ -189,11 +190,10 @@ impl AppCfg { pub fn get_profile(&self, nickname: Option) -> anyhow::Result<&Profile> { let idx = self.get_profile_idx(nickname).unwrap_or(0); let p = self.user_profiles.get(idx).context("no profile at index")?; - // The license to use this software depends on the user taking the pledge. Totally cool if you don't want to, but you'll need to write your own tools. - assert!( - p.check_has_pledge(0), - "user has not taken Protect the Game pledge, exiting." - ); + // The privilege to use this software depends on the user upholding a code of conduct and taking the pledge. Totally cool if you don't want to, but you'll need to write your own tools. + if !p.check_has_pledge(0) { + println!("user profile has not taken 'Protect the Game' pledge, exiting."); + } Ok(p) } @@ -469,12 +469,18 @@ impl Profile { // check protect game pledge pub fn check_has_pledge(&self, pledge_id: u8) -> bool { + // are we in CI? + if *MODE_0L != NamedChain::MAINNET { + return true; + }; + if let Some(list) = &self.pledges { // check the pledge exists return list .iter() .any(|e| e.id == 0 && Pledge::check_pledge_hash(pledge_id, &e.hash)); } + false }