Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
0637769
GH-598: second QA fix: the main thing done
Oct 7, 2025
0e53e04
GH-598: second QA fix: added logging
Oct 8, 2025
bc95399
GH-598: second QA fix: formatting
Oct 8, 2025
b9f6c64
GH-598: second QA fix: finished all.sh
Oct 8, 2025
1acd12d
GH-598: second QA fix: fix according to rev advice
Oct 8, 2025
f77eaa9
GH-598: fixed test to be OS agnostic
Oct 8, 2025
738ead8
GH-598: add 5 mins interval for retry scan
utkarshg6 Oct 16, 2025
af1a075
GH-598: tests in accountant are passing
utkarshg6 Oct 19, 2025
268eeba
GH-598: retry payable scan interval is half the duration of payable s…
utkarshg6 Oct 20, 2025
77a1d1c
GH-598: add public rpc url for eth mainnet
utkarshg6 Oct 20, 2025
25af8cb
GH-598: transaction count param from pending to latest
Nov 2, 2025
a151e96
Breaking change to remove RRID from CORES packages (#740)
dnwiebe Nov 5, 2025
a71cd1f
Revert "Breaking change to remove RRID from CORES packages (#740)" (#…
czarte Nov 6, 2025
42eebcc
Update ci-matrix to test new runners (#741)
kauri-hero Nov 10, 2025
e82da77
Refine regex for max block count extraction and add test (#735)
kauri-hero Nov 13, 2025
858adfa
GH-598-hot-fix-panic-bug: fixed (#746)
bertllll Nov 19, 2025
dd3bd6b
Merge branch 'master' into GH-598
bertllll Nov 19, 2025
6dab798
GH-598: fixed a flaw from last merge
Nov 20, 2025
1ba4317
GH-754: Gas Price Optimisation - Hot Fix (#751)
utkarshg6 Dec 11, 2025
06dd374
GH-598: Receivables scheduling hot fix (#750)
bertllll Dec 17, 2025
422038f
immediate fix for screwed GH-598-receivables-scheduling-hot-fix
Dec 17, 2025
a654025
GH-598: fix for a bug found by Cursor
jan-havlin-dev Feb 23, 2026
3b9d70f
GH-598: minor fix in a test
jan-havlin-dev Feb 23, 2026
69877fe
GH-623: Direct Node to pick new public key on the command line (#679)
dnwiebe Mar 4, 2026
ef08892
v0.9.1: version bump (#760)
czarte Mar 4, 2026
93e3d7e
GH-598: merged master in
bertllll Mar 6, 2026
8bd5a40
GH-598: little reassurance on scan intervals parsing and some cosmetics
bertllll Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
matrix:
target:
- { name: linux, os: ubuntu-22.04 }
- { name: macos, os: macos-13 }
- { name: macos, os: macos-latest }
- { name: windows, os: windows-2022 }

name: Build node on ${{ matrix.target.os }}
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ Temporary Items
**/.idea/markdown-navigator/**
**/.idea/aws.xml
**/.idea/scopes/*.xml
**/.idea/copilot*

# Sensitive or high-churn files:
**/.idea/**/dataSources/
Expand Down
8 changes: 4 additions & 4 deletions automap/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion automap/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "automap"
version = "0.9.0"
version = "0.9.1"
authors = ["Dan Wiebe <dnwiebe@gmail.com>", "MASQ"]
license = "GPL-3.0-only"
description = "Library full of code to make routers map ports through firewalls"
Expand Down
8 changes: 4 additions & 4 deletions dns_utility/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dns_utility/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "dns_utility"
version = "0.9.0"
version = "0.9.1"
license = "GPL-3.0-only"
authors = ["Dan Wiebe <dnwiebe@gmail.com>", "MASQ"]
copyright = "Copyright (c) 2019, MASQ (https://masq.ai) and/or its affiliates. All rights reserved."
Expand Down
2 changes: 1 addition & 1 deletion ip_country/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "ip_country"
version = "0.1.0"
version = "0.9.1"
edition = "2021"
license = "GPL-3.0-only"
authors = ["Dan Wiebe <dnwiebe@gmail.com>", "MASQ"]
Expand Down
2 changes: 1 addition & 1 deletion masq/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "masq"
version = "0.9.0"
version = "0.9.1"
authors = ["Dan Wiebe <dnwiebe@gmail.com>", "MASQ"]
license = "GPL-3.0-only"
description = "Reference implementation of user interface for MASQ Node"
Expand Down
6 changes: 3 additions & 3 deletions masq/src/commands/configuration_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,8 @@ impl ConfigurationCommand {
let scan_intervals = Self::preprocess_combined_parameters({
let s_i = &configuration.scan_intervals;
&[
("Pending payable:", &s_i.pending_payable_sec, "s"),
("Payable:", &s_i.payable_sec, "s"),
("Pending payable:", &s_i.pending_payable_sec, "s"),
("Receivable:", &s_i.receivable_sec, "s"),
]
});
Expand Down Expand Up @@ -397,8 +397,8 @@ mod tests {
| Exit byte rate: 129,000,000 wei\n\
| Exit service rate: 160,000,000 wei\n\
|Scan intervals: \n\
| Pending payable: 150,500 s\n\
| Payable: 155,000 s\n\
| Pending payable: 150,500 s\n\
| Receivable: 250,666 s\n"
)
.replace('|', "")
Expand Down Expand Up @@ -494,8 +494,8 @@ mod tests {
| Exit byte rate: 20 wei\n\
| Exit service rate: 30 wei\n\
|Scan intervals: \n\
| Pending payable: 1,000 s\n\
| Payable: 1,000 s\n\
| Pending payable: 1,000 s\n\
| Receivable: 1,000 s\n",
)
.replace('|', "")
Expand Down
2 changes: 1 addition & 1 deletion masq_lib/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "masq_lib"
version = "0.9.0"
version = "0.9.1"
authors = ["Dan Wiebe <dnwiebe@gmail.com>", "MASQ"]
license = "GPL-3.0-only"
description = "Code common to Node and masq; also, temporarily, to dns_utility"
Expand Down
6 changes: 4 additions & 2 deletions masq_lib/src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ pub const VALUE_EXCEEDS_ALLOWED_LIMIT: u64 = ACCOUNTANT_PREFIX | 3;
pub const MASQ_TOTAL_SUPPLY: u64 = 37_500_000;

pub const DEFAULT_GAS_PRICE: u64 = 1; //TODO ?? Really
pub const DEFAULT_GAS_PRICE_MARGIN: u64 = 30;
pub const DEFAULT_GAS_PRICE_RETRY_PERCENTAGE: u64 = 30;
pub const DEFAULT_GAS_PRICE_RETRY_CONSTANT: u128 = 5_000;
pub const DEFAULT_MAX_BLOCK_COUNT: u64 = 100_000;

//chains
Expand Down Expand Up @@ -142,7 +143,8 @@ mod tests {
assert_eq!(CURRENT_LOGFILE_NAME, "MASQNode_rCURRENT.log");
assert_eq!(MASQ_PROMPT, "masq> ");
assert_eq!(DEFAULT_GAS_PRICE, 1);
assert_eq!(DEFAULT_GAS_PRICE_MARGIN, 30);
assert_eq!(DEFAULT_GAS_PRICE_RETRY_PERCENTAGE, 30);
assert_eq!(DEFAULT_GAS_PRICE_RETRY_CONSTANT, 5_000);
assert_eq!(WALLET_ADDRESS_LENGTH, 42);
assert_eq!(MASQ_TOTAL_SUPPLY, 37_500_000);
assert_eq!(WEIS_IN_GWEI, 1_000_000_000);
Expand Down
33 changes: 31 additions & 2 deletions masq_lib/src/shared_schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use crate::constants::{
POLYGON_MAINNET_FULL_IDENTIFIER,
};
use crate::crash_point::CrashPoint;
use clap::{App, Arg};
use clap::{arg_enum, App, Arg};
use lazy_static::lazy_static;

pub const BLOCKCHAIN_SERVICE_HELP: &str =
Expand Down Expand Up @@ -81,6 +81,17 @@ pub const NEIGHBORS_HELP: &str = "One or more Node descriptors for running Nodes
if you don't specify a neighbor, your Node will start without being connected to any MASQ \
Network, although other Nodes will be able to connect to yours if they know your Node's descriptor. \
--neighbors is meaningless in --neighborhood-mode zero-hop.";
pub const NEW_PUBLIC_KEY_HELP: &str = "Whenever you start it, the Node will try to use the same public key \
it used last time. That's '--new-public-key off'. If you want it to select a new public key when it \
starts, then specify '--new-public-key on', and you'll get a different one this time...which it will \
reuse next time unless you specify '--new-public-key on' again.\n\n\
You should be careful about restarting your Node with the same public key too quickly. If your new \
Node tries to join the Network before the Network has forgotten your old Node, every Node you try \
to connect to will ignore you.\n\n\
There are some conditions under which the Node cannot use the same public key it used last time: \
for example, if there was no last time, or if you don't specify a `--db-password`. Normally, in \
these situations, the Node will select a new public key and store it for future use; but if you \
explicitly demand the old public key with `--new-public-key off`, the Node will refuse to start.";

// generated valid encoded keys for future needs
// UJNoZW5p/PDVqEjpr3b+8jZ/93yPG8i5dOAgE1bhK+A
Expand Down Expand Up @@ -225,6 +236,14 @@ lazy_static! {
DEFAULT_GAS_PRICE);
}

arg_enum! {
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum OnOff {
On,
Off,
}
}

// These Args are needed in more than one clap schema. To avoid code duplication, they're defined here and referred
// to from multiple places.
pub fn chain_arg<'a>() -> Arg<'a, 'a> {
Expand Down Expand Up @@ -466,13 +485,23 @@ pub fn shared_app(head: App<'static, 'static>) -> App<'static, 'static> {
.min_values(0)
.help(NEIGHBORS_HELP),
)
.arg(
Arg::with_name("new-public-key")
.long("new-public-key")
.value_name("NEW-PUBLIC-KEY")
.takes_value(true)
.possible_values(&OnOff::variants())
.case_insensitive(true)
.help(NEW_PUBLIC_KEY_HELP),
)
.arg(real_user_arg())
.arg(
Arg::with_name("scans")
.long("scans")
.value_name("SCANS")
.takes_value(true)
.possible_values(&["on", "off"])
.possible_values(&OnOff::variants())
.case_insensitive(true)
.help(SCANS_HELP),
)
.arg(common_parameter_with_separate_u64_values(
Expand Down
2 changes: 1 addition & 1 deletion multinode_integration_tests/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "multinode_integration_tests"
version = "0.9.0"
version = "0.9.1"
authors = ["Dan Wiebe <dnwiebe@gmail.com>", "MASQ"]
license = "GPL-3.0-only"
description = ""
Expand Down
57 changes: 38 additions & 19 deletions multinode_integration_tests/tests/bookkeeping_test.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// Copyright (c) 2019, MASQ (https://masq.ai) and/or its affiliates. All rights reserved.
use itertools::Itertools;
use multinode_integration_tests_lib::masq_node::{MASQNode, NodeReference};
use multinode_integration_tests_lib::masq_node_cluster::MASQNodeCluster;
use multinode_integration_tests_lib::masq_real_node::{
Expand Down Expand Up @@ -30,54 +31,72 @@ fn provided_and_consumed_services_are_recorded_in_databases() {

let mut client = originating_node.make_client(8080, STANDARD_CLIENT_TIMEOUT_MILLIS);
client.set_timeout(Duration::from_secs(10));
let request = "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n".as_bytes();
let request = "GET /index.html HTTP/1.1\r\nHost: www.testingmcafeesites.com\r\n\r\n".as_bytes();

client.send_chunk(request);
let response = String::from_utf8(client.wait_for_chunk()).unwrap();
assert!(
response.contains("<h1>Example Domain</h1>"),
"Not from www.example.com:\n{}",
response.contains("<title>URL for testing.</title>"),
"Not from www.testingmcafeesites.com:\n{}",
response
);

// Waiting until everybody has finished generating payables and receivables
thread::sleep(Duration::from_secs(10));

// get all payables from originating node
let payables = retrieve_payables(&originating_node);

// Waiting until the serving nodes have finished accruing their receivables
thread::sleep(Duration::from_secs(10));

// get all receivables from all other nodes
let receivable_balances = non_originating_nodes
let receivable_nodes = non_originating_nodes
.iter()
.flat_map(|node| {
receivables(node)
.into_iter()
.map(move |receivable_account| {
(node.earning_wallet(), receivable_account.balance_wei)
(
node.earning_wallet(),
(node.name().to_string(), receivable_account.balance_wei),
)
})
})
.collect::<HashMap<Wallet, i128>>();
.collect::<HashMap<Wallet, (String, i128)>>();

// check that each payable has a receivable
assert_eq!(
payables.len(),
receivable_balances.len(),
receivable_nodes.len(),
"Lengths of payables and receivables should match.\nPayables: {:?}\nReceivables: {:?}",
payables,
receivable_balances
receivable_nodes
);
assert!(
receivable_balances.len() >= 3, // minimum service list: route, route, exit.
receivable_nodes.len() >= 3, // minimum service list: route, route, exit.
"not enough receivables found {:?}",
receivable_balances
receivable_nodes
);

payables.iter().for_each(|payable| {
assert_eq!(
payable.balance_wei,
*receivable_balances.get(&payable.wallet).unwrap() as u128,
);
});
let messages = payables
.iter()
.flat_map(|payable| {
let payable_balance = payable.balance_wei;
let (non_originating_node_name, receivable_balance) =
receivable_nodes.get(&payable.wallet).unwrap().clone();
if payable_balance != receivable_balance as u128 {
Some(format!(
"Payable for {} ({}) does not match receivable for {} ({})",
originating_node.name(),
payable_balance,
non_originating_node_name,
receivable_balance
))
} else {
None
}
})
.collect_vec();

assert!(messages.is_empty(), "{:#?}", messages);
}

fn retrieve_payables(node: &MASQRealNode) -> Vec<PayableAccount> {
Expand Down
Loading
Loading