From 6fcc1cd263c540f8f0b73ef954650d60e3289212 Mon Sep 17 00:00:00 2001 From: MASQrauder <60554948+masqrauder@users.noreply.github.com> Date: Sun, 29 Sep 2024 18:31:53 -0400 Subject: [PATCH 1/3] GH-813: Correctly parse max block range error message (#531) --- node/src/blockchain/blockchain_bridge.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/node/src/blockchain/blockchain_bridge.rs b/node/src/blockchain/blockchain_bridge.rs index b23d597bf..0bb34fbfd 100644 --- a/node/src/blockchain/blockchain_bridge.rs +++ b/node/src/blockchain/blockchain_bridge.rs @@ -456,7 +456,7 @@ impl BlockchainBridge { pub fn extract_max_block_count(&self, error: BlockchainError) -> Option { let regex_result = - Regex::new(r".* (max: |allowed for your plan: |is limited to |block range limit \()(?P\d+).*") + Regex::new(r".* (max: |allowed for your plan: |is limited to |block range limit \(|exceeds max block range )(?P\d+).*") .expect("Invalid regex"); let max_block_count = match error { BlockchainError::QueryFailed(msg) => match regex_result.captures(msg.as_str()) { @@ -1755,6 +1755,19 @@ mod tests { assert_eq!(None, max_block_count); } + #[test] + fn extract_max_block_range_for_nodies_error_response() { + let result = BlockchainError::QueryFailed("RPC error: Error { code: InvalidParams, message: \"query exceeds max block range 100000\", data: None }".to_string()); + let subject = BlockchainBridge::new( + Box::new(BlockchainInterfaceMock::default()), + Box::new(PersistentConfigurationMock::default()), + false, + ); + let max_block_count = subject.extract_max_block_count(result); + + assert_eq!(Some(100000), max_block_count); + } + #[test] fn extract_max_block_range_for_expected_batch_got_single_error_response() { let result = BlockchainError::QueryFailed( From a4fb720b339aff8e24ad576c8b0b2aae8abd984b Mon Sep 17 00:00:00 2001 From: Bert <65427484+bertllll@users.noreply.github.com> Date: Wed, 2 Oct 2024 05:05:28 +0200 Subject: [PATCH 2/3] GH-500: Adding Base chains (#510) * GH-500: ready for an urged live test * GH-500: probably finished the deployment of Base, let's get the QA going * GH-500: removed an eprintln! * GH-500: version changed to 0.8.1 --------- Co-authored-by: Bert --- automap/Cargo.lock | 4 +- automap/Cargo.toml | 2 +- dns_utility/Cargo.lock | 4 +- dns_utility/Cargo.toml | 2 +- masq/Cargo.toml | 2 +- masq_lib/Cargo.toml | 2 +- .../src/blockchains/blockchain_records.rs | 127 +++++++++++++----- masq_lib/src/blockchains/chains.rs | 13 +- masq_lib/src/constants.rs | 17 ++- masq_lib/src/shared_schema.rs | 55 ++++++-- multinode_integration_tests/Cargo.toml | 2 +- node/Cargo.lock | 10 +- node/Cargo.toml | 2 +- .../blockchain_interface_web3/mod.rs | 91 +++++++++---- node/src/db_config/config_dao.rs | 4 +- node/src/sub_lib/neighborhood.rs | 4 +- node/tests/contract_test.rs | 26 ++++ port_exposer/Cargo.lock | 2 +- port_exposer/Cargo.toml | 2 +- 19 files changed, 271 insertions(+), 100 deletions(-) diff --git a/automap/Cargo.lock b/automap/Cargo.lock index c970dc200..63c58616e 100644 --- a/automap/Cargo.lock +++ b/automap/Cargo.lock @@ -137,7 +137,7 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "automap" -version = "0.8.0" +version = "0.8.1" dependencies = [ "crossbeam-channel 0.5.8", "flexi_logger", @@ -1051,7 +1051,7 @@ dependencies = [ [[package]] name = "masq_lib" -version = "0.8.0" +version = "0.8.1" dependencies = [ "actix", "clap", diff --git a/automap/Cargo.toml b/automap/Cargo.toml index c89c47ced..1275d9e8d 100644 --- a/automap/Cargo.toml +++ b/automap/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "automap" -version = "0.8.0" +version = "0.8.1" authors = ["Dan Wiebe ", "MASQ"] license = "GPL-3.0-only" description = "Library full of code to make routers map ports through firewalls" diff --git a/dns_utility/Cargo.lock b/dns_utility/Cargo.lock index 52a3ec6b3..970263d93 100644 --- a/dns_utility/Cargo.lock +++ b/dns_utility/Cargo.lock @@ -430,7 +430,7 @@ dependencies = [ [[package]] name = "dns_utility" -version = "0.8.0" +version = "0.8.1" dependencies = [ "core-foundation", "ipconfig 0.2.2", @@ -854,7 +854,7 @@ dependencies = [ [[package]] name = "masq_lib" -version = "0.8.0" +version = "0.8.1" dependencies = [ "actix", "clap", diff --git a/dns_utility/Cargo.toml b/dns_utility/Cargo.toml index f8ce5620f..21e5cbc8c 100644 --- a/dns_utility/Cargo.toml +++ b/dns_utility/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dns_utility" -version = "0.8.0" +version = "0.8.1" license = "GPL-3.0-only" authors = ["Dan Wiebe ", "MASQ"] copyright = "Copyright (c) 2019, MASQ (https://masq.ai) and/or its affiliates. All rights reserved." diff --git a/masq/Cargo.toml b/masq/Cargo.toml index 87a20ad67..9f3e2ab46 100644 --- a/masq/Cargo.toml +++ b/masq/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "masq" -version = "0.8.0" +version = "0.8.1" authors = ["Dan Wiebe ", "MASQ"] license = "GPL-3.0-only" description = "Reference implementation of user interface for MASQ Node" diff --git a/masq_lib/Cargo.toml b/masq_lib/Cargo.toml index f87de81a1..7917eb744 100644 --- a/masq_lib/Cargo.toml +++ b/masq_lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "masq_lib" -version = "0.8.0" +version = "0.8.1" authors = ["Dan Wiebe ", "MASQ"] license = "GPL-3.0-only" description = "Code common to Node and masq; also, temporarily, to dns_utility" diff --git a/masq_lib/src/blockchains/blockchain_records.rs b/masq_lib/src/blockchains/blockchain_records.rs index 5227195f7..67a8870e2 100644 --- a/masq_lib/src/blockchains/blockchain_records.rs +++ b/masq_lib/src/blockchains/blockchain_records.rs @@ -2,15 +2,17 @@ use crate::blockchains::chains::Chain; use crate::constants::{ - 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, + BASE_MAINNET_CONTRACT_CREATION_BLOCK, BASE_MAINNET_FULL_IDENTIFIER, + BASE_SEPOLIA_CONTRACT_CREATION_BLOCK, BASE_SEPOLIA_FULL_IDENTIFIER, DEV_CHAIN_FULL_IDENTIFIER, + ETH_MAINNET_CONTRACT_CREATION_BLOCK, ETH_MAINNET_FULL_IDENTIFIER, + ETH_ROPSTEN_CONTRACT_CREATION_BLOCK, ETH_ROPSTEN_FULL_IDENTIFIER, + MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK, POLYGON_AMOY_CONTRACT_CREATION_BLOCK, + POLYGON_AMOY_FULL_IDENTIFIER, POLYGON_MAINNET_CONTRACT_CREATION_BLOCK, + POLYGON_MAINNET_FULL_IDENTIFIER, }; use ethereum_types::{Address, H160}; -pub const CHAINS: [BlockchainRecord; 5] = [ +pub const CHAINS: [BlockchainRecord; 7] = [ BlockchainRecord { self_id: Chain::PolyMainnet, num_chain_id: 137, @@ -25,19 +27,33 @@ pub const CHAINS: [BlockchainRecord; 5] = [ contract: ETH_MAINNET_CONTRACT_ADDRESS, contract_creation_block: ETH_MAINNET_CONTRACT_CREATION_BLOCK, }, + BlockchainRecord { + self_id: Chain::BaseMainnet, + num_chain_id: 8453, + literal_identifier: BASE_MAINNET_FULL_IDENTIFIER, + contract: BASE_MAINNET_CONTRACT_ADDRESS, + contract_creation_block: BASE_MAINNET_CONTRACT_CREATION_BLOCK, + }, + BlockchainRecord { + self_id: Chain::BaseSepolia, + num_chain_id: 84532, + literal_identifier: BASE_SEPOLIA_FULL_IDENTIFIER, + contract: BASE_SEPOLIA_TESTNET_CONTRACT_ADDRESS, + contract_creation_block: BASE_SEPOLIA_CONTRACT_CREATION_BLOCK, + }, BlockchainRecord { 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, + contract: POLYGON_AMOY_TESTNET_CONTRACT_ADDRESS, + contract_creation_block: POLYGON_AMOY_CONTRACT_CREATION_BLOCK, }, BlockchainRecord { self_id: Chain::EthRopsten, num_chain_id: 3, literal_identifier: ETH_ROPSTEN_FULL_IDENTIFIER, - contract: ROPSTEN_TESTNET_CONTRACT_ADDRESS, - contract_creation_block: ROPSTEN_TESTNET_CONTRACT_CREATION_BLOCK, + contract: ETH_ROPSTEN_TESTNET_CONTRACT_ADDRESS, + contract_creation_block: ETH_ROPSTEN_CONTRACT_CREATION_BLOCK, }, BlockchainRecord { self_id: Chain::Dev, @@ -68,17 +84,27 @@ const ETH_MAINNET_CONTRACT_ADDRESS: Address = H160([ ]); // $tMASQ (Amoy) -const AMOY_TESTNET_CONTRACT_ADDRESS: Address = H160([ +const POLYGON_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([ +const ETH_ROPSTEN_TESTNET_CONTRACT_ADDRESS: Address = H160([ 0x38, 0x4d, 0xec, 0x25, 0xe0, 0x3f, 0x94, 0x93, 0x17, 0x67, 0xce, 0x4c, 0x35, 0x56, 0x16, 0x84, 0x68, 0xba, 0x24, 0xc3, ]); +const BASE_MAINNET_CONTRACT_ADDRESS: Address = H160([ + 0x45, 0xD9, 0xC1, 0x01, 0xa3, 0x87, 0x0C, 0xa5, 0x02, 0x45, 0x82, 0xfd, 0x78, 0x8F, 0x4E, 0x1e, + 0x8F, 0x79, 0x71, 0xc3, +]); + +const BASE_SEPOLIA_TESTNET_CONTRACT_ADDRESS: Address = H160([ + 0x89, 0x8e, 0x1c, 0xe7, 0x20, 0x08, 0x4A, 0x90, 0x2b, 0xc3, 0x7d, 0xd8, 0x22, 0xed, 0x6d, 0x6a, + 0x5f, 0x02, 0x7e, 0x10, +]); + const MULTINODE_TESTNET_CONTRACT_ADDRESS: Address = H160([ 0x59, 0x88, 0x2e, 0x4a, 0x8f, 0x5d, 0x24, 0x64, 0x3d, 0x4d, 0xda, 0x42, 0x29, 0x22, 0xa8, 0x70, 0xf1, 0xb3, 0xe6, 0x64, @@ -88,9 +114,7 @@ const MULTINODE_TESTNET_CONTRACT_ADDRESS: Address = H160([ mod tests { use super::*; use crate::blockchains::chains::chain_from_chain_identifier_opt; - use crate::constants::{ - AMOY_TESTNET_CONTRACT_CREATION_BLOCK, POLYGON_MAINNET_CONTRACT_CREATION_BLOCK, - }; + use crate::constants::BASE_MAINNET_CONTRACT_CREATION_BLOCK; use std::collections::HashSet; use std::iter::FromIterator; @@ -98,10 +122,12 @@ mod tests { fn record_returns_correct_blockchain_record() { let test_array = [ assert_returns_correct_record(Chain::EthMainnet, 1), - 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::PolyAmoy, 80002), + assert_returns_correct_record(Chain::BaseMainnet, 8453), + assert_returns_correct_record(Chain::BaseSepolia, 84532), + assert_returns_correct_record(Chain::Dev, 2), ]; assert_exhaustive(&test_array) } @@ -118,6 +144,8 @@ mod tests { assert_from_str(Chain::PolyAmoy), assert_from_str(Chain::EthMainnet), assert_from_str(Chain::EthRopsten), + assert_from_str(Chain::BaseMainnet), + assert_from_str(Chain::BaseSepolia), assert_from_str(Chain::Dev), ]; assert_exhaustive(&test_array) @@ -137,18 +165,23 @@ mod tests { #[test] fn chains_are_ordered_by_their_significance_for_users() { let test_array = [ - assert_chain_significance(0, Chain::PolyMainnet), - assert_chain_significance(1, Chain::EthMainnet), - assert_chain_significance(2, Chain::PolyAmoy), - assert_chain_significance(3, Chain::EthRopsten), - assert_chain_significance(4, Chain::Dev), + Chain::PolyMainnet, + Chain::EthMainnet, + Chain::BaseMainnet, + Chain::BaseSepolia, + Chain::PolyAmoy, + Chain::EthRopsten, + Chain::Dev, ]; + test_array + .iter() + .enumerate() + .for_each(assert_chain_significance); assert_exhaustive(&test_array) } - fn assert_chain_significance(idx: usize, chain: Chain) -> Chain { - assert_eq!(CHAINS[idx].self_id, chain, "Error at index {}", idx); - chain + fn assert_chain_significance((idx, chain): (usize, &Chain)) { + assert_eq!(CHAINS[idx].self_id, *chain, "Error at index {}", idx); } #[test] @@ -177,8 +210,8 @@ mod tests { num_chain_id: 3, self_id: examined_chain, literal_identifier: "eth-ropsten", - contract: ROPSTEN_TESTNET_CONTRACT_ADDRESS, - contract_creation_block: ROPSTEN_TESTNET_CONTRACT_CREATION_BLOCK, + contract: ETH_ROPSTEN_TESTNET_CONTRACT_ADDRESS, + contract_creation_block: ETH_ROPSTEN_CONTRACT_CREATION_BLOCK, } ); } @@ -209,8 +242,40 @@ mod tests { num_chain_id: 80002, self_id: examined_chain, literal_identifier: "polygon-amoy", - contract: AMOY_TESTNET_CONTRACT_ADDRESS, - contract_creation_block: AMOY_TESTNET_CONTRACT_CREATION_BLOCK, + contract: POLYGON_AMOY_TESTNET_CONTRACT_ADDRESS, + contract_creation_block: POLYGON_AMOY_CONTRACT_CREATION_BLOCK, + } + ); + } + + #[test] + fn base_mainnet_record_is_properly_declared() { + let examined_chain = Chain::BaseMainnet; + let chain_record = return_examined(examined_chain); + assert_eq!( + chain_record, + &BlockchainRecord { + num_chain_id: 8453, + self_id: examined_chain, + literal_identifier: "base-mainnet", + contract: BASE_MAINNET_CONTRACT_ADDRESS, + contract_creation_block: BASE_MAINNET_CONTRACT_CREATION_BLOCK, + } + ); + } + + #[test] + fn base_sepolia_record_is_properly_declared() { + let examined_chain = Chain::BaseSepolia; + let chain_record = return_examined(examined_chain); + assert_eq!( + chain_record, + &BlockchainRecord { + num_chain_id: 84532, + self_id: examined_chain, + literal_identifier: "base-sepolia", + contract: BASE_SEPOLIA_TESTNET_CONTRACT_ADDRESS, + contract_creation_block: BASE_SEPOLIA_CONTRACT_CREATION_BLOCK, } ); } @@ -226,7 +291,7 @@ mod tests { self_id: examined_chain, literal_identifier: "dev", contract: MULTINODE_TESTNET_CONTRACT_ADDRESS, - contract_creation_block: 0, + contract_creation_block: MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK, } ); } @@ -240,9 +305,11 @@ mod tests { let test_array = [ assert_chain_from_chain_identifier_opt("eth-mainnet", Some(Chain::EthMainnet)), 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-amoy", Some(Chain::PolyAmoy)), + assert_chain_from_chain_identifier_opt("base-mainnet", Some(Chain::BaseMainnet)), + assert_chain_from_chain_identifier_opt("base-sepolia", Some(Chain::BaseSepolia)), + assert_chain_from_chain_identifier_opt("dev", Some(Chain::Dev)), ]; assert_exhaustive(&test_array) } diff --git a/masq_lib/src/blockchains/chains.rs b/masq_lib/src/blockchains/chains.rs index 433d5524c..b7733b842 100644 --- a/masq_lib/src/blockchains/chains.rs +++ b/masq_lib/src/blockchains/chains.rs @@ -2,8 +2,9 @@ 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_AMOY_FULL_IDENTIFIER, POLYGON_MAINNET_FULL_IDENTIFIER, + BASE_MAINNET_FULL_IDENTIFIER, BASE_SEPOLIA_FULL_IDENTIFIER, DEFAULT_CHAIN, + DEV_CHAIN_FULL_IDENTIFIER, ETH_MAINNET_FULL_IDENTIFIER, ETH_ROPSTEN_FULL_IDENTIFIER, + POLYGON_AMOY_FULL_IDENTIFIER, POLYGON_MAINNET_FULL_IDENTIFIER, }; use serde_derive::{Deserialize, Serialize}; @@ -13,6 +14,8 @@ pub enum Chain { EthRopsten, PolyMainnet, PolyAmoy, + BaseMainnet, + BaseSepolia, Dev, } @@ -28,6 +31,10 @@ impl From<&str> for Chain { Chain::PolyMainnet } else if str == ETH_MAINNET_FULL_IDENTIFIER { Chain::EthMainnet + } else if str == BASE_MAINNET_FULL_IDENTIFIER { + Chain::BaseMainnet + } else if str == BASE_SEPOLIA_FULL_IDENTIFIER { + Chain::BaseSepolia } else if str == POLYGON_AMOY_FULL_IDENTIFIER { Chain::PolyAmoy } else if str == ETH_ROPSTEN_FULL_IDENTIFIER { @@ -56,7 +63,7 @@ impl Chain { } fn mainnets() -> &'static [Chain] { - &[Chain::PolyMainnet, Chain::EthMainnet] + &[Chain::PolyMainnet, Chain::BaseMainnet, Chain::EthMainnet] } } diff --git a/masq_lib/src/constants.rs b/masq_lib/src/constants.rs index 1a0542837..9cfdc90c6 100644 --- a/masq_lib/src/constants.rs +++ b/masq_lib/src/constants.rs @@ -25,9 +25,11 @@ pub const MASQ_TOTAL_SUPPLY: u64 = 37_500_000; 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 ETH_ROPSTEN_CONTRACT_CREATION_BLOCK: u64 = 8_688_171; pub const POLYGON_MAINNET_CONTRACT_CREATION_BLOCK: u64 = 14_863_650; -pub const AMOY_TESTNET_CONTRACT_CREATION_BLOCK: u64 = 5_323_366; +pub const POLYGON_AMOY_CONTRACT_CREATION_BLOCK: u64 = 5_323_366; +pub const BASE_MAINNET_CONTRACT_CREATION_BLOCK: u64 = 19_711_235; +pub const BASE_SEPOLIA_CONTRACT_CREATION_BLOCK: u64 = 14_732_730; pub const MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK: u64 = 0; //Migration versions @@ -89,12 +91,15 @@ pub const CHAIN_IDENTIFIER_DELIMITER: char = ':'; //chains const POLYGON_FAMILY: &str = "polygon"; const ETH_FAMILY: &str = "eth"; +const BASE_FAMILY: &str = "base"; const MAINNET: &str = "mainnet"; const LINK: char = '-'; pub const POLYGON_MAINNET_FULL_IDENTIFIER: &str = concatcp!(POLYGON_FAMILY, LINK, MAINNET); 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 BASE_MAINNET_FULL_IDENTIFIER: &str = concatcp!(BASE_FAMILY, LINK, MAINNET); +pub const BASE_SEPOLIA_FULL_IDENTIFIER: &str = concatcp!(BASE_FAMILY, LINK, "sepolia"); pub const DEV_CHAIN_FULL_IDENTIFIER: &str = "dev"; #[cfg(test)] @@ -118,9 +123,11 @@ mod tests { assert_eq!(MASQ_TOTAL_SUPPLY, 37_500_000); 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!(ETH_ROPSTEN_CONTRACT_CREATION_BLOCK, 8_688_171); assert_eq!(POLYGON_MAINNET_CONTRACT_CREATION_BLOCK, 14_863_650); - assert_eq!(AMOY_TESTNET_CONTRACT_CREATION_BLOCK, 5_323_366); + assert_eq!(POLYGON_AMOY_CONTRACT_CREATION_BLOCK, 5_323_366); + assert_eq!(BASE_MAINNET_CONTRACT_CREATION_BLOCK, 19_711_235); + assert_eq!(BASE_SEPOLIA_CONTRACT_CREATION_BLOCK, 14_732_730); assert_eq!(MULTINODE_TESTNET_CONTRACT_CREATION_BLOCK, 0); assert_eq!(CONFIGURATOR_PREFIX, 0x0001_0000_0000_0000); assert_eq!(CONFIGURATOR_READ_ERROR, CONFIGURATOR_PREFIX | 1); @@ -159,12 +166,14 @@ mod tests { assert_eq!(CHAIN_IDENTIFIER_DELIMITER, ':'); assert_eq!(POLYGON_FAMILY, "polygon"); assert_eq!(ETH_FAMILY, "eth"); + assert_eq!(BASE_FAMILY, "base"); assert_eq!(MAINNET, "mainnet"); assert_eq!(LINK, '-'); assert_eq!(POLYGON_MAINNET_FULL_IDENTIFIER, "polygon-mainnet"); 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!(BASE_SEPOLIA_FULL_IDENTIFIER, "base-sepolia"); assert_eq!(DEV_CHAIN_FULL_IDENTIFIER, "dev"); assert_eq!( CLIENT_REQUEST_PAYLOAD_CURRENT_VERSION, diff --git a/masq_lib/src/shared_schema.rs b/masq_lib/src/shared_schema.rs index cc3e34b54..276108d2e 100644 --- a/masq_lib/src/shared_schema.rs +++ b/masq_lib/src/shared_schema.rs @@ -1,9 +1,10 @@ // Copyright (c) 2019, MASQ (https://masq.ai) and/or its affiliates. All rights reserved. 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_AMOY_FULL_IDENTIFIER, POLYGON_MAINNET_FULL_IDENTIFIER, + BASE_MAINNET_FULL_IDENTIFIER, BASE_SEPOLIA_FULL_IDENTIFIER, 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_AMOY_FULL_IDENTIFIER, + POLYGON_MAINNET_FULL_IDENTIFIER, }; use crate::crash_point::CrashPoint; use clap::{App, Arg}; @@ -13,6 +14,7 @@ pub const BLOCKCHAIN_SERVICE_HELP: &str = "The Ethereum client you wish to use to provide Blockchain \ exit services from your MASQ Node (e.g. http://localhost:8545, \ https://ropsten.infura.io/v3/YOUR-PROJECT-ID, https://mainnet.infura.io/v3/YOUR-PROJECT-ID), \ + https://base-mainnet.g.alchemy.com/v2/d66UL0lPrltmweEqVsv3opBSVI3wkL8I, \ https://polygon-mainnet.infura.io/v3/YOUR-PROJECT-ID"; pub const CHAIN_HELP: &str = "The blockchain network MASQ Node will configure itself to use. You must ensure the \ @@ -64,8 +66,9 @@ 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:d2U3Dv1BqtS5t_Zz3mt9_sCl7AgxUlnkB4jOMElylrU@172.50.48.6:9342\n\ masq://eth-mainnet:gBviQbjOS3e5ReFQCvIhUM3i02d1zPleo1iXg_EN6zQ@86.75.30.9:5542\n\ + masq://base-mainnet:ZjPLnb9RrgsRM1D9edqH8jx9DkbPZSWqqFqLnmdKhsk@112.55.78.0:7878\n\ masq://polygon-amoy:A6PGHT3rRjaeFpD_rFi3qGEXAVPq7bJDfEUZpZaIyq8@14.10.50.6:10504\n\ - masq://eth-ropsten:OHsC2CAm4rmfCkaFfiynwxflUgVTJRb2oY5mWxNCQkY@150.60.42.72:6642/4789/5254\n\n\ + masq://base-sepolia:OHsC2CAm4rmfCkaFfiynwxflUgVTJRb2oY5mWxNCQkY@150.60.42.72: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 \ a configuration with multiple clandestine ports.\n\n\ @@ -256,6 +259,8 @@ pub fn official_chain_names() -> &'static [&'static str] { &[ POLYGON_MAINNET_FULL_IDENTIFIER, ETH_MAINNET_FULL_IDENTIFIER, + BASE_MAINNET_FULL_IDENTIFIER, + BASE_SEPOLIA_FULL_IDENTIFIER, POLYGON_AMOY_FULL_IDENTIFIER, ETH_ROPSTEN_FULL_IDENTIFIER, DEV_CHAIN_FULL_IDENTIFIER, @@ -670,11 +675,11 @@ impl ConfiguratorError { #[cfg(test)] mod tests { - use super::*; use crate::blockchains::chains::Chain; use crate::shared_schema::common_validators::validate_non_zero_u16; use crate::shared_schema::{common_validators, official_chain_names}; + use std::collections::HashSet; #[test] fn constants_have_correct_values() { @@ -683,6 +688,7 @@ mod tests { "The Ethereum client you wish to use to provide Blockchain \ exit services from your MASQ Node (e.g. http://localhost:8545, \ https://ropsten.infura.io/v3/YOUR-PROJECT-ID, https://mainnet.infura.io/v3/YOUR-PROJECT-ID), \ + https://base-mainnet.g.alchemy.com/v2/d66UL0lPrltmweEqVsv3opBSVI3wkL8I, \ https://polygon-mainnet.infura.io/v3/YOUR-PROJECT-ID" ); assert_eq!( @@ -757,8 +763,9 @@ mod tests { on startup. A Node descriptor looks similar to one of these:\n\n\ masq://polygon-mainnet:d2U3Dv1BqtS5t_Zz3mt9_sCl7AgxUlnkB4jOMElylrU@172.50.48.6:9342\n\ masq://eth-mainnet:gBviQbjOS3e5ReFQCvIhUM3i02d1zPleo1iXg_EN6zQ@86.75.30.9:5542\n\ + masq://base-mainnet:ZjPLnb9RrgsRM1D9edqH8jx9DkbPZSWqqFqLnmdKhsk@112.55.78.0:7878\n\ masq://polygon-amoy:A6PGHT3rRjaeFpD_rFi3qGEXAVPq7bJDfEUZpZaIyq8@14.10.50.6:10504\n\ - masq://eth-ropsten:OHsC2CAm4rmfCkaFfiynwxflUgVTJRb2oY5mWxNCQkY@150.60.42.72:6642/4789/5254\n\n\ + masq://base-sepolia:OHsC2CAm4rmfCkaFfiynwxflUgVTJRb2oY5mWxNCQkY@150.60.42.72: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 \ a configuration with multiple clandestine ports.\n\n\ @@ -1141,12 +1148,34 @@ mod tests { #[test] fn official_chain_names_are_reliable() { - 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::PolyAmoy); - assert_eq!(Chain::from(*iterator.next().unwrap()), Chain::EthRopsten); - assert_eq!(Chain::from(*iterator.next().unwrap()), Chain::Dev); - assert_eq!(iterator.next(), None) + let expected_supported_chains = [ + Chain::PolyMainnet, + Chain::EthMainnet, + Chain::BaseMainnet, + Chain::BaseSepolia, + Chain::PolyAmoy, + Chain::EthRopsten, + Chain::Dev, + ] + .into_iter() + .collect::>(); + + let chain_names_recognizable_by_clap = official_chain_names(); + + let chains_from_clap = chain_names_recognizable_by_clap + .into_iter() + .map(|chain_name| Chain::from(*chain_name)) + .collect::>(); + let differences = chains_from_clap + .symmetric_difference(&expected_supported_chains) + .collect::>(); + assert!( + differences.is_empty(), + "There are differences in the Clap schema in the collection of supported chains, \ + between the expected values {:?} and actual {:?}, specifically {:?}", + expected_supported_chains, + chains_from_clap, + differences + ); } } diff --git a/multinode_integration_tests/Cargo.toml b/multinode_integration_tests/Cargo.toml index edf7a03f4..05bb47051 100644 --- a/multinode_integration_tests/Cargo.toml +++ b/multinode_integration_tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "multinode_integration_tests" -version = "0.8.0" +version = "0.8.1" authors = ["Dan Wiebe ", "MASQ"] license = "GPL-3.0-only" description = "" diff --git a/node/Cargo.lock b/node/Cargo.lock index 04806d093..20fda85c6 100644 --- a/node/Cargo.lock +++ b/node/Cargo.lock @@ -182,7 +182,7 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "automap" -version = "0.8.0" +version = "0.8.1" dependencies = [ "crossbeam-channel 0.5.1", "flexi_logger 0.17.1", @@ -1802,7 +1802,7 @@ dependencies = [ [[package]] name = "masq" -version = "0.8.0" +version = "0.8.1" dependencies = [ "atty", "clap", @@ -1822,7 +1822,7 @@ dependencies = [ [[package]] name = "masq_lib" -version = "0.8.0" +version = "0.8.1" dependencies = [ "actix", "clap", @@ -1999,7 +1999,7 @@ dependencies = [ [[package]] name = "multinode_integration_tests" -version = "0.8.0" +version = "0.8.1" dependencies = [ "base64 0.13.0", "crossbeam-channel 0.5.1", @@ -2092,7 +2092,7 @@ dependencies = [ [[package]] name = "node" -version = "0.8.0" +version = "0.8.1" dependencies = [ "actix", "automap", diff --git a/node/Cargo.toml b/node/Cargo.toml index 4ae89971d..44dadafe5 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node" -version = "0.8.0" +version = "0.8.1" license = "GPL-3.0-only" authors = ["Dan Wiebe ", "MASQ"] description = "MASQ Node is the foundation of MASQ Network, an open-source network that allows anyone to allocate spare computing resources to make the internet a free and fair place for the entire world." diff --git a/node/src/blockchain/blockchain_interface/blockchain_interface_web3/mod.rs b/node/src/blockchain/blockchain_interface/blockchain_interface_web3/mod.rs index 09d54ad89..b9bfa37bf 100644 --- a/node/src/blockchain/blockchain_interface/blockchain_interface_web3/mod.rs +++ b/node/src/blockchain/blockchain_interface/blockchain_interface_web3/mod.rs @@ -579,7 +579,9 @@ where fn web3_gas_limit_const_part(chain: Chain) -> u64 { match chain { Chain::EthMainnet | Chain::EthRopsten | Chain::Dev => 55_000, - Chain::PolyMainnet | Chain::PolyAmoy => 70_000, + Chain::PolyMainnet | Chain::PolyAmoy | Chain::BaseMainnet | Chain::BaseSepolia => { + 70_000 + } } } @@ -676,6 +678,7 @@ mod tests { BlockchainTransaction, RpcPayablesFailure, }; use indoc::indoc; + use sodiumoxide::hex; use std::str::FromStr; use std::sync::{Arc, Mutex}; use std::time::SystemTime; @@ -1629,6 +1632,10 @@ mod tests { 70_000 ); assert_eq!(Subject::web3_gas_limit_const_part(Chain::PolyAmoy), 70_000); + assert_eq!( + Subject::web3_gas_limit_const_part(Chain::BaseSepolia), + 70_000 + ); assert_eq!(Subject::web3_gas_limit_const_part(Chain::Dev), 55_000); } @@ -1842,8 +1849,11 @@ mod tests { let gas_price = match chain { Chain::EthMainnet | Chain::EthRopsten | Chain::Dev => 110, Chain::PolyMainnet | Chain::PolyAmoy => 55, + // It performs on even cheaper fees, but we're + // limited by the units here + Chain::BaseMainnet | Chain::BaseSepolia => 1, }; - let payment_size_wei = 1_000_000_000_000; + let payment_size_wei = gwei_to_wei(1_000_u64); let payable_account = make_payable_account_with_wallet_and_balance_and_timestamp_opt( recipient_wallet, payment_size_wei, @@ -1861,7 +1871,13 @@ mod tests { .unwrap(); let byte_set_to_compare = signed_transaction.raw_transaction.0; - assert_eq!(byte_set_to_compare.as_slice(), template) + assert_eq!( + byte_set_to_compare, + template, + "Actual signed transaction {} does not match {} as expected", + hex::encode(byte_set_to_compare.clone()), + hex::encode(template.to_vec()) + ) } // Transaction with this input was verified on the test network @@ -1879,6 +1895,20 @@ mod tests { assert_that_signed_transactions_agrees_with_template(chain, nonce, &in_bytes) } + #[test] + fn web3_interface_signing_a_transaction_works_for_base_sepolia() { + let chain = Chain::BaseSepolia; + let nonce = 2; + let signed_transaction_data = "\ + f8ac02843b9aca008301198094898e1ce720084a902bc37dd822ed6d6a5f027e1080b844a9059cbb00000000000\ + 00000000000007788df76bbd9a0c7c3e5bf0f77bb28c60a167a7b00000000000000000000000000000000000000\ + 0000000000000000e8d4a510008302948ca07b57223b566ade08ec817770c8b9ae94373edbefc13372c3463cf7b\ + 6ce542231a020991f2ff180a12cbc2745465a4e710da294b890901a3887519b191c3a69cd4f"; + let in_bytes = decode_hex(signed_transaction_data).unwrap(); + + assert_that_signed_transactions_agrees_with_template(chain, nonce, &in_bytes) + } + // Transaction with this input was verified on the test network #[test] fn web3_interface_signing_a_transaction_works_for_eth_ropsten() { @@ -1899,20 +1929,14 @@ mod tests { fn web3_interface_signing_a_transaction_for_polygon_mainnet() { let chain = Chain::PolyMainnet; let nonce = 10; - // Generated locally - let signed_transaction_data = [ - 248, 172, 10, 133, 12, 206, 65, 102, 0, 131, 1, 25, 128, 148, 238, 154, 53, 47, 106, - 172, 74, 241, 165, 185, 244, 103, 246, 169, 62, 15, 251, 233, 221, 53, 128, 184, 68, - 169, 5, 156, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 136, 223, 118, 187, 217, - 160, 199, 195, 229, 191, 15, 119, 187, 40, 198, 10, 22, 122, 123, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 212, 165, 16, 0, 130, - 1, 53, 160, 200, 159, 77, 202, 128, 195, 67, 122, 35, 204, 26, 65, 171, 89, 253, 82, 6, - 176, 192, 225, 41, 61, 151, 82, 66, 232, 72, 44, 68, 131, 140, 117, 160, 117, 66, 154, - 132, 183, 97, 219, 131, 214, 72, 220, 66, 152, 72, 15, 107, 44, 237, 193, 16, 193, 52, - 6, 94, 216, 149, 94, 102, 199, 80, 68, 105, - ]; + let signed_transaction_data = "f8ac0a850cce4166008301198094ee9a352f6aac4af1a5b9f467f6a\ + 93e0ffbe9dd3580b844a9059cbb0000000000000000000000007788df76bbd9a0c7c3e5bf0f77bb28c60a167a7b\ + 000000000000000000000000000000000000000000000000000000e8d4a51000820135a0c89f4dca80c3437a23c\ + c1a41ab59fd5206b0c0e1293d975242e8482c44838c75a075429a84b761db83d648dc4298480f6b2cedc110c134\ + 065ed8955e66c7504469"; + let in_bytes = decode_hex(signed_transaction_data).unwrap(); - assert_that_signed_transactions_agrees_with_template(chain, nonce, &signed_transaction_data) + assert_that_signed_transactions_agrees_with_template(chain, nonce, &in_bytes) } // Unconfirmed on the real network @@ -1920,20 +1944,29 @@ mod tests { fn web3_interface_signing_a_transaction_for_eth_mainnet() { let chain = Chain::EthMainnet; let nonce = 10; - // Generated locally - let signed_transaction_data = [ - 248, 169, 10, 133, 25, 156, 130, 204, 0, 130, 222, 232, 148, 6, 243, 195, 35, 240, 35, - 140, 114, 191, 53, 1, 16, 113, 242, 181, 183, 244, 58, 5, 76, 128, 184, 68, 169, 5, - 156, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 136, 223, 118, 187, 217, 160, 199, - 195, 229, 191, 15, 119, 187, 40, 198, 10, 22, 122, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 212, 165, 16, 0, 38, 160, 199, - 155, 76, 106, 39, 227, 3, 151, 90, 117, 245, 211, 86, 98, 187, 117, 120, 103, 165, 131, - 99, 72, 36, 211, 10, 224, 252, 104, 51, 200, 230, 158, 160, 84, 18, 140, 248, 119, 22, - 193, 14, 148, 253, 48, 59, 185, 11, 38, 152, 103, 150, 120, 60, 74, 56, 159, 206, 22, - 15, 73, 173, 153, 11, 76, 74, - ]; + let signed_transaction_data = "f8a90a85199c82cc0082dee89406f3c323f0238c72bf35011071f2b\ + 5b7f43a054c80b844a9059cbb0000000000000000000000007788df76bbd9a0c7c3e5bf0f77bb28c60a167a7b00\ + 0000000000000000000000000000000000000000000000000000e8d4a5100026a0c79b4c6a27e303975a75f5d35\ + 662bb757867a583634824d30ae0fc6833c8e69ea054128cf87716c10e94fd303bb90b26986796783c4a389fce16\ + 0f49ad990b4c4a"; + let in_bytes = decode_hex(signed_transaction_data).unwrap(); - assert_that_signed_transactions_agrees_with_template(chain, nonce, &signed_transaction_data) + assert_that_signed_transactions_agrees_with_template(chain, nonce, &in_bytes) + } + + // Unconfirmed on the real network + #[test] + fn web3_interface_signing_a_transaction_for_base_mainnet() { + let chain = Chain::BaseMainnet; + let nonce = 124; + let signed_transaction_data = "f8ab7c843b9aca00830119809445d9c101a3870ca5024582fd788f4\ + e1e8f7971c380b844a9059cbb0000000000000000000000007788df76bbd9a0c7c3e5bf0f77bb28c60a167a7b00\ + 0000000000000000000000000000000000000000000000000000e8d4a5100082422da0587b5f8401225d5cf6267\ + 6f51f376f085805851e2e59c5253eb2834612295bdba05b6963872bac7eeafb38191079e8c8df919c193839022b\ + d57b91ace5a8638034"; + let in_bytes = decode_hex(signed_transaction_data).unwrap(); + + assert_that_signed_transactions_agrees_with_template(chain, nonce, &in_bytes) } // Adapted test from old times when we had our own signing method. diff --git a/node/src/db_config/config_dao.rs b/node/src/db_config/config_dao.rs index 23bd1fce5..759440c42 100644 --- a/node/src/db_config/config_dao.rs +++ b/node/src/db_config/config_dao.rs @@ -180,7 +180,7 @@ mod tests { use crate::database::db_initializer::{DbInitializer, DbInitializerReal}; use crate::database::test_utils::ConnectionWrapperMock; use crate::test_utils::assert_contains; - use masq_lib::constants::{CURRENT_SCHEMA_VERSION, ROPSTEN_TESTNET_CONTRACT_CREATION_BLOCK}; + use masq_lib::constants::{CURRENT_SCHEMA_VERSION, ETH_ROPSTEN_CONTRACT_CREATION_BLOCK}; use masq_lib::test_utils::utils::ensure_node_home_directory_exists; use rusqlite::Connection; use std::path::Path; @@ -205,7 +205,7 @@ mod tests { &result, &ConfigDaoRecord::new( "start_block", - Some(&ROPSTEN_TESTNET_CONTRACT_CREATION_BLOCK.to_string()), + Some(Ð_ROPSTEN_CONTRACT_CREATION_BLOCK.to_string()), false, ), ); diff --git a/node/src/sub_lib/neighborhood.rs b/node/src/sub_lib/neighborhood.rs index dc4872273..d3acc5655 100644 --- a/node/src/sub_lib/neighborhood.rs +++ b/node/src/sub_lib/neighborhood.rs @@ -752,7 +752,7 @@ mod tests { assert_eq!( result, Err( - "Chain identifier 'bitcoin' is not valid; possible values are 'polygon-mainnet', 'eth-mainnet', 'polygon-amoy', 'eth-ropsten' while formatted as 'masq://:@'" + "Chain identifier 'bitcoin' is not valid; possible values are 'polygon-mainnet', 'eth-mainnet', 'base-mainnet', 'base-sepolia', 'polygon-amoy', 'eth-ropsten' while formatted as 'masq://:@'" .to_string() ) ); @@ -851,7 +851,7 @@ mod tests { let result = DescriptorParsingError::WrongChainIdentifier("blah").to_string(); - assert_eq!(result, "Chain identifier 'blah' is not valid; possible values are 'polygon-mainnet', 'eth-mainnet', 'polygon-amoy', 'eth-ropsten' while formatted as 'masq://:@'") + assert_eq!(result, "Chain identifier 'blah' is not valid; possible values are 'polygon-mainnet', 'eth-mainnet', 'base-mainnet', 'base-sepolia', 'polygon-amoy', 'eth-ropsten' while formatted as 'masq://:@'") } #[test] diff --git a/node/tests/contract_test.rs b/node/tests/contract_test.rs index 8e9e74395..42d6fce37 100644 --- a/node/tests/contract_test.rs +++ b/node/tests/contract_test.rs @@ -140,6 +140,32 @@ fn masq_erc20_contract_exists_on_ethereum_mainnet_integration() { assert_contract(blockchain_urls, &chain, assertion_body) } +#[test] +fn masq_erc20_contract_exists_on_base_mainnet_integration() { + let blockchain_urls = vec![ + "https://base-rpc.publicnode.com", + "https://base.drpc.org", + "https://base-pokt.nodies.app", + ]; + let chain = Chain::BaseMainnet; + + let assertion_body = |url, chain| assert_contract_existence(url, chain, "MASQ", 18); + assert_contract(blockchain_urls, &chain, assertion_body) +} + +#[test] +fn masq_erc20_contract_exists_on_base_sepolia_integration() { + let blockchain_urls = vec![ + "https://rpc.ankr.com/base_sepolia", + "https://base-sepolia-rpc.publicnode.com", + "https://base-sepolia.public.blastapi.io", + ]; + let chain = Chain::BaseSepolia; + + let assertion_body = |url, chain| assert_contract_existence(url, chain, "tMASQ", 18); + assert_contract(blockchain_urls, &chain, assertion_body) +} + fn assert_total_supply( blockchain_service_url: &str, chain: &Chain, diff --git a/port_exposer/Cargo.lock b/port_exposer/Cargo.lock index 1f2db3a9d..52e735fac 100644 --- a/port_exposer/Cargo.lock +++ b/port_exposer/Cargo.lock @@ -20,7 +20,7 @@ checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" [[package]] name = "port_exposer" -version = "0.8.0" +version = "0.8.1" dependencies = [ "default-net", ] diff --git a/port_exposer/Cargo.toml b/port_exposer/Cargo.toml index 042deb104..6f77da5e1 100644 --- a/port_exposer/Cargo.toml +++ b/port_exposer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "port_exposer" -version = "0.8.0" +version = "0.8.1" authors = ["Dan Wiebe ", "MASQ"] license = "GPL-3.0-only" copyright = "Copyright (c) 2019, MASQ (https://masq.ai) and/or its affiliates. All rights reserved." From 91f3b8cb8d0ce26661d8b82059dffcb075ba2cef Mon Sep 17 00:00:00 2001 From: KauriHero Date: Thu, 3 Oct 2024 13:47:51 +1300 Subject: [PATCH 3/3] update readme and tag v0.8.1 (#532) Signed-off-by: KauriHero --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 404cd7573..84fb5ac44 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,7 @@ stage - MASQ Network and it's developers are not responsible for any activity, o ## Source The MASQ project was forked from Substratum's Node project in order to carry on development after Substratum ceased operations in October of 2019. In 2021, Substratum's Node repositories were removed from GitHub, so the fork link -with MASQ was broken, but all credit for the original idea, the original design, and the first two years of MASQ's -development belongs to Substratum. +with MASQ was broken, but all credit for the original idea and the original design belongs to Substratum (and properly attributed through GPLv3 license) ## Running the MASQ Node @@ -452,6 +451,4 @@ recommend using a 64-bit version to build. We do plan to release binaries that will run on 32-bit Windows, but they will likely be built on 64-bit Windows. -Copyright (c) 2019-2022, MASQ Network - -Copyright (c) 2017-2019, Substratum LLC and/or its affiliates. All rights reserved. +Copyright (c) 2019-2024, MASQ Network