Skip to content

Commit

Permalink
GH-781: New Testnet Polygon Amoy (#431)
Browse files Browse the repository at this point in the history
* GH-781: experimenting with a test utility

* GH-781: task might be complete now

* GH-781: debugging for windows

* GH-781: trying to satisfy Win

* GH-781: clippy

* GH-781: removed bad solution for issue that now a new card was written for

* GH-781: cargo.toml change

* GH-781: review answered

---------

Co-authored-by: Bert <[email protected]>
  • Loading branch information
bertllll and Bert authored Apr 3, 2024
1 parent 79e34c3 commit 60d46da
Show file tree
Hide file tree
Showing 27 changed files with 290 additions and 253 deletions.
4 changes: 2 additions & 2 deletions masq/src/commands/configuration_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ mod tests {
blockchain_service_url_opt: Some("https://infura.io/ID".to_string()),
current_schema_version: "schema version".to_string(),
clandestine_port: 1234,
chain_name: "mumbai".to_string(),
chain_name: "amoy".to_string(),
gas_price: 2345,
max_block_count_opt: Some(100_000),
neighborhood_mode: "zero-hop".to_string(),
Expand Down Expand Up @@ -467,7 +467,7 @@ mod tests {
"\
|NAME VALUE\n\
|Blockchain service URL: https://infura.io/ID\n\
|Chain: mumbai\n\
|Chain: amoy\n\
|Clandestine port: 1234\n\
|Consuming wallet private key: [?]\n\
|Current schema version: schema version\n\
Expand Down
14 changes: 7 additions & 7 deletions masq/src/commands/setup_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -391,10 +391,10 @@ ip No sir, I don't like it.\n\
status_data_dir: UiSetupResponseValueStatus::Default,
},
SetupCommandData {
chain_str: Some("polygon-mumbai".to_owned()),
chain_str: Some("polygon-amoy".to_owned()),
data_directory: None,
chain_name_expected: Some("polygon-mumbai"),
data_directory_expected: Some("/home/cooga/.local/MASQ/polygon-mumbai"),
chain_name_expected: Some("polygon-amoy"),
data_directory_expected: Some("/home/cooga/.local/MASQ/polygon-amoy"),
note_expected: true,
status_chain: UiSetupResponseValueStatus::Set,
status_data_dir: UiSetupResponseValueStatus::Default,
Expand All @@ -409,10 +409,10 @@ ip No sir, I don't like it.\n\
status_data_dir: UiSetupResponseValueStatus::Set,
},
SetupCommandData {
chain_str: Some("polygon-mumbai".to_owned()),
data_directory: Some("booga/polygon-mumbai".to_owned()),
chain_name_expected: Some("polygon-mumbai"),
data_directory_expected: Some("booga/polygon-mumbai/polygon-mumbai"),
chain_str: Some("polygon-amoy".to_owned()),
data_directory: Some("booga/polygon-amoy".to_owned()),
chain_name_expected: Some("polygon-amoy"),
data_directory_expected: Some("booga/polygon-amoy/polygon-amoy"),
note_expected: true,
status_chain: UiSetupResponseValueStatus::Set,
status_data_dir: UiSetupResponseValueStatus::Set,
Expand Down
75 changes: 36 additions & 39 deletions masq_lib/src/blockchains/blockchain_records.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@

use crate::blockchains::chains::Chain;
use crate::constants::{
DEV_CHAIN_FULL_IDENTIFIER, ETH_MAINNET_CONTRACT_CREATION_BLOCK, ETH_MAINNET_FULL_IDENTIFIER,
ETH_ROPSTEN_FULL_IDENTIFIER, MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK,
MUMBAI_TESTNET_CONTRACT_CREATION_BLOCK, POLYGON_MAINNET_CONTRACT_CREATION_BLOCK,
POLYGON_MAINNET_FULL_IDENTIFIER, POLYGON_MUMBAI_FULL_IDENTIFIER,
AMOY_TESTNET_CONTRACT_CREATION_BLOCK, DEV_CHAIN_FULL_IDENTIFIER,
ETH_MAINNET_CONTRACT_CREATION_BLOCK, ETH_MAINNET_FULL_IDENTIFIER, ETH_ROPSTEN_FULL_IDENTIFIER,
MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK, POLYGON_AMOY_FULL_IDENTIFIER,
POLYGON_MAINNET_CONTRACT_CREATION_BLOCK, POLYGON_MAINNET_FULL_IDENTIFIER,
ROPSTEN_TESTNET_CONTRACT_CREATION_BLOCK,
};
use ethereum_types::{Address, H160};

//chains are ordered by their significance for the community of users (the order reflects in some error or help messages)
pub const CHAINS: [BlockchainRecord; 5] = [
BlockchainRecord {
self_id: Chain::PolyMainnet,
Expand All @@ -27,11 +26,11 @@ pub const CHAINS: [BlockchainRecord; 5] = [
contract_creation_block: ETH_MAINNET_CONTRACT_CREATION_BLOCK,
},
BlockchainRecord {
self_id: Chain::PolyMumbai,
num_chain_id: 80001,
literal_identifier: POLYGON_MUMBAI_FULL_IDENTIFIER,
contract: MUMBAI_TESTNET_CONTRACT_ADDRESS,
contract_creation_block: MUMBAI_TESTNET_CONTRACT_CREATION_BLOCK,
self_id: Chain::PolyAmoy,
num_chain_id: 80002,
literal_identifier: POLYGON_AMOY_FULL_IDENTIFIER,
contract: AMOY_TESTNET_CONTRACT_ADDRESS,
contract_creation_block: AMOY_TESTNET_CONTRACT_CREATION_BLOCK,
},
BlockchainRecord {
self_id: Chain::EthRopsten,
Expand All @@ -58,6 +57,22 @@ pub struct BlockchainRecord {
pub contract_creation_block: u64,
}

const POLYGON_MAINNET_CONTRACT_ADDRESS: Address = H160([
0xee, 0x9a, 0x35, 0x2f, 0x6a, 0xac, 0x4a, 0xf1, 0xa5, 0xb9, 0xf4, 0x67, 0xf6, 0xa9, 0x3e, 0x0f,
0xfb, 0xe9, 0xdd, 0x35,
]);

const ETH_MAINNET_CONTRACT_ADDRESS: Address = H160([
0x06, 0xf3, 0xc3, 0x23, 0xf0, 0x23, 0x8c, 0x72, 0xbf, 0x35, 0x01, 0x10, 0x71, 0xf2, 0xb5, 0xb7,
0xf4, 0x3a, 0x05, 0x4c,
]);

// $tMASQ (Amoy)
const AMOY_TESTNET_CONTRACT_ADDRESS: Address = H160([
0xd9, 0x8c, 0x3e, 0xbd, 0x6b, 0x7f, 0x9b, 0x7c, 0xda, 0x24, 0x49, 0xec, 0xac, 0x00, 0xd1, 0xe5,
0xf4, 0x7a, 0x81, 0x93,
]);

// SHRD (Ropsten)
const ROPSTEN_TESTNET_CONTRACT_ADDRESS: Address = H160([
0x38, 0x4d, 0xec, 0x25, 0xe0, 0x3f, 0x94, 0x93, 0x17, 0x67, 0xce, 0x4c, 0x35, 0x56, 0x16, 0x84,
Expand All @@ -69,30 +84,12 @@ const MULTINODE_TESTNET_CONTRACT_ADDRESS: Address = H160([
0xf1, 0xb3, 0xe6, 0x64,
]);

const ETH_MAINNET_CONTRACT_ADDRESS: Address = H160([
0x06, 0xF3, 0xC3, 0x23, 0xf0, 0x23, 0x8c, 0x72, 0xBF, 0x35, 0x01, 0x10, 0x71, 0xf2, 0xb5, 0xB7,
0xF4, 0x3A, 0x05, 0x4c,
]);

#[allow(clippy::mixed_case_hex_literals)]
const POLYGON_MAINNET_CONTRACT_ADDRESS: Address = H160([
0xEe, 0x9A, 0x35, 0x2F, 0x6a, 0xAc, 0x4a, 0xF1, 0xA5, 0xB9, 0xf4, 0x67, 0xF6, 0xa9, 0x3E, 0x0f,
0xfB, 0xe9, 0xDd, 0x35,
]);

// $tMASQ (Mumbai)
#[allow(clippy::mixed_case_hex_literals)]
const MUMBAI_TESTNET_CONTRACT_ADDRESS: Address = H160([
0x9B, 0x27, 0x03, 0x4a, 0xca, 0xBd, 0x44, 0x22, 0x3f, 0xB2, 0x3d, 0x62, 0x8B, 0xa4, 0x84, 0x98,
0x67, 0xcE, 0x1D, 0xB2,
]);

#[cfg(test)]
mod tests {
use super::*;
use crate::blockchains::chains::chain_from_chain_identifier_opt;
use crate::constants::{
MUMBAI_TESTNET_CONTRACT_CREATION_BLOCK, POLYGON_MAINNET_CONTRACT_CREATION_BLOCK,
AMOY_TESTNET_CONTRACT_CREATION_BLOCK, POLYGON_MAINNET_CONTRACT_CREATION_BLOCK,
};
use std::collections::HashSet;
use std::iter::FromIterator;
Expand All @@ -104,7 +101,7 @@ mod tests {
assert_returns_correct_record(Chain::Dev, 2),
assert_returns_correct_record(Chain::EthRopsten, 3),
assert_returns_correct_record(Chain::PolyMainnet, 137),
assert_returns_correct_record(Chain::PolyMumbai, 80001),
assert_returns_correct_record(Chain::PolyAmoy, 80002),
];
assert_exhaustive(&test_array)
}
Expand All @@ -118,7 +115,7 @@ mod tests {
fn from_str_works() {
let test_array = [
assert_from_str(Chain::PolyMainnet),
assert_from_str(Chain::PolyMumbai),
assert_from_str(Chain::PolyAmoy),
assert_from_str(Chain::EthMainnet),
assert_from_str(Chain::EthRopsten),
assert_from_str(Chain::Dev),
Expand All @@ -142,7 +139,7 @@ mod tests {
let test_array = [
assert_chain_significance(0, Chain::PolyMainnet),
assert_chain_significance(1, Chain::EthMainnet),
assert_chain_significance(2, Chain::PolyMumbai),
assert_chain_significance(2, Chain::PolyAmoy),
assert_chain_significance(3, Chain::EthRopsten),
assert_chain_significance(4, Chain::Dev),
];
Expand Down Expand Up @@ -203,17 +200,17 @@ mod tests {
}

#[test]
fn mumbai_record_is_properly_declared() {
let examined_chain = Chain::PolyMumbai;
fn amoy_record_is_properly_declared() {
let examined_chain = Chain::PolyAmoy;
let chain_record = return_examined(examined_chain);
assert_eq!(
chain_record,
&BlockchainRecord {
num_chain_id: 80001,
num_chain_id: 80002,
self_id: examined_chain,
literal_identifier: "polygon-mumbai",
contract: MUMBAI_TESTNET_CONTRACT_ADDRESS,
contract_creation_block: MUMBAI_TESTNET_CONTRACT_CREATION_BLOCK,
literal_identifier: "polygon-amoy",
contract: AMOY_TESTNET_CONTRACT_ADDRESS,
contract_creation_block: AMOY_TESTNET_CONTRACT_CREATION_BLOCK,
}
);
}
Expand Down Expand Up @@ -245,7 +242,7 @@ mod tests {
assert_chain_from_chain_identifier_opt("eth-ropsten", Some(Chain::EthRopsten)),
assert_chain_from_chain_identifier_opt("dev", Some(Chain::Dev)),
assert_chain_from_chain_identifier_opt("polygon-mainnet", Some(Chain::PolyMainnet)),
assert_chain_from_chain_identifier_opt("polygon-mumbai", Some(Chain::PolyMumbai)),
assert_chain_from_chain_identifier_opt("polygon-amoy", Some(Chain::PolyAmoy)),
];
assert_exhaustive(&test_array)
}
Expand Down
8 changes: 4 additions & 4 deletions masq_lib/src/blockchains/chains.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use crate::blockchains::blockchain_records::{BlockchainRecord, CHAINS};
use crate::constants::{
DEFAULT_CHAIN, DEV_CHAIN_FULL_IDENTIFIER, ETH_MAINNET_FULL_IDENTIFIER,
ETH_ROPSTEN_FULL_IDENTIFIER, POLYGON_MAINNET_FULL_IDENTIFIER, POLYGON_MUMBAI_FULL_IDENTIFIER,
ETH_ROPSTEN_FULL_IDENTIFIER, POLYGON_AMOY_FULL_IDENTIFIER, POLYGON_MAINNET_FULL_IDENTIFIER,
};
use serde_derive::{Deserialize, Serialize};

Expand All @@ -12,7 +12,7 @@ pub enum Chain {
EthMainnet,
EthRopsten,
PolyMainnet,
PolyMumbai,
PolyAmoy,
Dev,
}

Expand All @@ -28,8 +28,8 @@ impl From<&str> for Chain {
Chain::PolyMainnet
} else if str == ETH_MAINNET_FULL_IDENTIFIER {
Chain::EthMainnet
} else if str == POLYGON_MUMBAI_FULL_IDENTIFIER {
Chain::PolyMumbai
} else if str == POLYGON_AMOY_FULL_IDENTIFIER {
Chain::PolyAmoy
} else if str == ETH_ROPSTEN_FULL_IDENTIFIER {
Chain::EthRopsten
} else if str == DEV_CHAIN_FULL_IDENTIFIER {
Expand Down
20 changes: 10 additions & 10 deletions masq_lib/src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ pub const WEIS_IN_GWEI: i128 = 1_000_000_000;

pub const ETH_MAINNET_CONTRACT_CREATION_BLOCK: u64 = 11_170_708;
pub const ROPSTEN_TESTNET_CONTRACT_CREATION_BLOCK: u64 = 8_688_171;
pub const MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK: u64 = 0;
pub const POLYGON_MAINNET_CONTRACT_CREATION_BLOCK: u64 = 14_863_650;
pub const MUMBAI_TESTNET_CONTRACT_CREATION_BLOCK: u64 = 24_638_838;
pub const AMOY_TESTNET_CONTRACT_CREATION_BLOCK: u64 = 5_323_366;
pub const MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK: u64 = 0;

//Migration versions
////////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -87,15 +87,15 @@ pub const CENTRAL_DELIMITER: char = '@';
pub const CHAIN_IDENTIFIER_DELIMITER: char = ':';

//chains
const MAINNET: &str = "mainnet";
const POLYGON_FAMILY: &str = "polygon";
const ETH_FAMILY: &str = "eth";
const MAINNET: &str = "mainnet";
const LINK: char = '-';
pub const POLYGON_MAINNET_FULL_IDENTIFIER: &str = concatcp!(POLYGON_FAMILY, LINK, MAINNET);
pub const POLYGON_MUMBAI_FULL_IDENTIFIER: &str = concatcp!(POLYGON_FAMILY, LINK, "mumbai");
pub const DEV_CHAIN_FULL_IDENTIFIER: &str = "dev";
pub const POLYGON_AMOY_FULL_IDENTIFIER: &str = concatcp!(POLYGON_FAMILY, LINK, "amoy");
pub const ETH_MAINNET_FULL_IDENTIFIER: &str = concatcp!(ETH_FAMILY, LINK, MAINNET);
pub const ETH_ROPSTEN_FULL_IDENTIFIER: &str = concatcp!(ETH_FAMILY, LINK, "ropsten");
pub const DEV_CHAIN_FULL_IDENTIFIER: &str = "dev";

#[cfg(test)]
mod tests {
Expand All @@ -119,9 +119,9 @@ mod tests {
assert_eq!(WEIS_IN_GWEI, 1_000_000_000);
assert_eq!(ETH_MAINNET_CONTRACT_CREATION_BLOCK, 11_170_708);
assert_eq!(ROPSTEN_TESTNET_CONTRACT_CREATION_BLOCK, 8_688_171);
assert_eq!(MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK, 0);
assert_eq!(POLYGON_MAINNET_CONTRACT_CREATION_BLOCK, 14_863_650);
assert_eq!(MUMBAI_TESTNET_CONTRACT_CREATION_BLOCK, 24_638_838);
assert_eq!(AMOY_TESTNET_CONTRACT_CREATION_BLOCK, 5_323_366);
assert_eq!(MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK, 0);
assert_eq!(CONFIGURATOR_PREFIX, 0x0001_0000_0000_0000);
assert_eq!(CONFIGURATOR_READ_ERROR, CONFIGURATOR_PREFIX | 1);
assert_eq!(CONFIGURATOR_WRITE_ERROR, CONFIGURATOR_PREFIX | 2);
Expand Down Expand Up @@ -157,15 +157,15 @@ mod tests {
assert_eq!(VALUE_EXCEEDS_ALLOWED_LIMIT, ACCOUNTANT_PREFIX | 3);
assert_eq!(CENTRAL_DELIMITER, '@');
assert_eq!(CHAIN_IDENTIFIER_DELIMITER, ':');
assert_eq!(MAINNET, "mainnet");
assert_eq!(POLYGON_FAMILY, "polygon");
assert_eq!(ETH_FAMILY, "eth");
assert_eq!(MAINNET, "mainnet");
assert_eq!(LINK, '-');
assert_eq!(POLYGON_MAINNET_FULL_IDENTIFIER, "polygon-mainnet");
assert_eq!(POLYGON_MUMBAI_FULL_IDENTIFIER, "polygon-mumbai");
assert_eq!(DEV_CHAIN_FULL_IDENTIFIER, "dev");
assert_eq!(POLYGON_AMOY_FULL_IDENTIFIER, "polygon-amoy");
assert_eq!(ETH_MAINNET_FULL_IDENTIFIER, "eth-mainnet");
assert_eq!(ETH_ROPSTEN_FULL_IDENTIFIER, "eth-ropsten");
assert_eq!(DEV_CHAIN_FULL_IDENTIFIER, "dev");
assert_eq!(
CLIENT_REQUEST_PAYLOAD_CURRENT_VERSION,
DataVersion { major: 0, minor: 1 }
Expand Down
10 changes: 5 additions & 5 deletions masq_lib/src/shared_schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use crate::constants::{
DEFAULT_GAS_PRICE, DEFAULT_UI_PORT, DEV_CHAIN_FULL_IDENTIFIER, ETH_MAINNET_FULL_IDENTIFIER,
ETH_ROPSTEN_FULL_IDENTIFIER, HIGHEST_USABLE_PORT, LOWEST_USABLE_INSECURE_PORT,
POLYGON_MAINNET_FULL_IDENTIFIER, POLYGON_MUMBAI_FULL_IDENTIFIER,
POLYGON_AMOY_FULL_IDENTIFIER, POLYGON_MAINNET_FULL_IDENTIFIER,
};
use crate::crash_point::CrashPoint;
use clap::{App, Arg};
Expand Down Expand Up @@ -64,7 +64,7 @@ pub const NEIGHBORS_HELP: &str = "One or more Node descriptors for running Nodes
on startup. A Node descriptor looks similar to one of these:\n\n\
masq://polygon-mainnet:[email protected]:9342\n\
masq://eth-mainnet:[email protected]:5542\n\
masq://polygon-mumbai:[email protected]:10504\n\
masq://polygon-amoy:[email protected]:10504\n\
masq://eth-ropsten:[email protected]:6642/4789/5254\n\n\
Notice each of the different chain identifiers in the masq protocol prefix - they determine a family of chains \
and also the network the descriptor belongs to (mainnet or a testnet). See also the last descriptor which shows \
Expand Down Expand Up @@ -256,7 +256,7 @@ pub fn official_chain_names() -> &'static [&'static str] {
&[
POLYGON_MAINNET_FULL_IDENTIFIER,
ETH_MAINNET_FULL_IDENTIFIER,
POLYGON_MUMBAI_FULL_IDENTIFIER,
POLYGON_AMOY_FULL_IDENTIFIER,
ETH_ROPSTEN_FULL_IDENTIFIER,
DEV_CHAIN_FULL_IDENTIFIER,
]
Expand Down Expand Up @@ -757,7 +757,7 @@ mod tests {
on startup. A Node descriptor looks similar to one of these:\n\n\
masq://polygon-mainnet:[email protected]:9342\n\
masq://eth-mainnet:[email protected]:5542\n\
masq://polygon-mumbai:[email protected]:10504\n\
masq://polygon-amoy:[email protected]:10504\n\
masq://eth-ropsten:[email protected]:6642/4789/5254\n\n\
Notice each of the different chain identifiers in the masq protocol prefix - they determine a family of chains \
and also the network the descriptor belongs to (mainnet or a testnet). See also the last descriptor which shows \
Expand Down Expand Up @@ -1144,7 +1144,7 @@ mod tests {
let mut iterator = official_chain_names().iter();
assert_eq!(Chain::from(*iterator.next().unwrap()), Chain::PolyMainnet);
assert_eq!(Chain::from(*iterator.next().unwrap()), Chain::EthMainnet);
assert_eq!(Chain::from(*iterator.next().unwrap()), Chain::PolyMumbai);
assert_eq!(Chain::from(*iterator.next().unwrap()), Chain::PolyAmoy);
assert_eq!(Chain::from(*iterator.next().unwrap()), Chain::EthRopsten);
assert_eq!(Chain::from(*iterator.next().unwrap()), Chain::Dev);
assert_eq!(iterator.next(), None)
Expand Down
12 changes: 10 additions & 2 deletions masq_lib/src/test_utils/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,16 @@ pub fn ensure_node_home_directory_exists(module: &str, name: &str) -> PathBuf {
}

pub fn is_running_under_github_actions() -> bool {
if let Ok(value) = std::env::var("GITHUB_ACTIONS") {
&value == "true"
is_env_variable_set("GITHUB_ACTIONS", "true")
}

pub fn is_test_generated_data_allowed_to_escape_project_dir() -> bool {
is_env_variable_set("ALLOW_TEST_DATA_ESCAPE_PROJECT_DIR", "true")
}

fn is_env_variable_set(var_name: &str, searched_value: &str) -> bool {
if let Ok(value) = std::env::var(var_name) {
value == searched_value
} else {
false
}
Expand Down
8 changes: 4 additions & 4 deletions masq_lib/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@ fn compute_data_directory_help() -> String {
let polygon_mainnet_dir = Path::new(&data_dir.to_str().unwrap())
.join("MASQ")
.join("polygon-mainnet");
let polygon_mumbai_dir = Path::new(&data_dir.to_str().unwrap())
let polygon_amoy_dir = Path::new(&data_dir.to_str().unwrap())
.join("MASQ")
.join("polygon-mumbai");
.join("polygon-amoy");
format!("Directory in which the Node will store its persistent state, including at least its database \
and by default its configuration file as well. By default, your data-directory is located in \
your application directory, under your home directory e.g.: '{}'.\n\n\
In case you change your chain to a different one, the data-directory path is automatically changed \
to end with the name of your chain: e.g.: if you choose polygon-mumbai, then data-directory is \
to end with the name of your chain: e.g.: if you choose polygon-amoy, then data-directory is \
automatically changed to: '{}'.\n\n\
You can specify your own data-directory to the Daemon in two different ways: \n\n\
1. If you provide a path without the chain name on the end, the Daemon will automatically change \
Expand All @@ -65,7 +65,7 @@ fn compute_data_directory_help() -> String {
2. If you provide your data directory with the corresponding chain name on the end, eg: {}/masq_home/polygon-mainnet, \
there will be no change until you set the chain parameter to a different value.",
polygon_mainnet_dir.to_string_lossy().to_string().as_str(),
polygon_mumbai_dir.to_string_lossy().to_string().as_str(),
polygon_amoy_dir.to_string_lossy().to_string().as_str(),
&home_dir.to_string_lossy().to_string().as_str(),
&home_dir.to_string_lossy().to_string().as_str(),
home_dir.to_string_lossy().to_string().as_str()
Expand Down
Loading

0 comments on commit 60d46da

Please sign in to comment.