Skip to content

Commit

Permalink
Merge pull request #1352 from jbesraa/2025-01-16-avoid-unwrap-jdc
Browse files Browse the repository at this point in the history
Handle unwrap when shutting down JDC server
  • Loading branch information
plebhash authored Jan 22, 2025
2 parents 150360c + 6deea02 commit e228c19
Show file tree
Hide file tree
Showing 31 changed files with 140 additions and 129 deletions.
8 changes: 4 additions & 4 deletions benches/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ edition = "2021"
async-std={version = "1.10.0", features = ["attributes"]}
criterion = "0.5.1"
async-channel = "1.4.0"
v1 = { path="../protocols/v1", package="sv1_api", version = "^1.0.0" }
v1 = { path="../protocols/v1", package="sv1_api" }
serde_json = { version = "1.0.64", default-features = false, features = ["alloc"] }
iai="0.1"
mining_sv2 = { path = "../protocols/v2/subprotocols/mining", version = "^2.0.0" }
roles_logic_sv2 = { path = "../protocols/v2/roles-logic-sv2", version = "^1.0.0" }
framing_sv2 = { version = "3.0.0", path = "../protocols/v2/framing-sv2" }
mining_sv2 = { path = "../protocols/v2/subprotocols/mining" }
roles_logic_sv2 = { path = "../protocols/v2/roles-logic-sv2" }
framing_sv2 = { path = "../protocols/v2/framing-sv2" }
serde = { version = "1.0.89", default-features = false, features = ["derive", "alloc"] }
num-bigint = "0.4.3"
num-traits = "0.2.15"
Expand Down
10 changes: 5 additions & 5 deletions examples/ping-pong-with-noise/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ publish = false

[dependencies]
rand = "0.8.3"
serde = { version = "1.0.89", features = ["derive", "alloc"], default-features = false, optional = true}
serde = { version = "1.0.89", features = ["derive", "alloc"], default-features = false, optional = true }
async-channel = "1.5.1"
async-std="1.8.0"
bytes = "1.0.1"
binary_sv2 = { version = "^1.0.0", path = "../../protocols/v2/binary-sv2/binary-sv2" }
codec_sv2 = { version = "^2.0.0", path = "../../protocols/v2/codec-sv2", features=["noise_sv2"] }
network_helpers_sv2 = { version = "^2.0.0", path = "../../roles/roles-utils/network-helpers", features=["async_std"] }
key-utils = { version = "^1.0.0", path = "../../utils/key-utils" }
binary_sv2 = { path = "../../protocols/v2/binary-sv2/binary-sv2" }
codec_sv2 = { path = "../../protocols/v2/codec-sv2", features=["noise_sv2"] }
network_helpers_sv2 = { path = "../../roles/roles-utils/network-helpers", features=["async_std"] }
key-utils = { path = "../../utils/key-utils" }
[profile.dev]
panic = "unwind"

Expand Down
8 changes: 4 additions & 4 deletions examples/template-provider-test/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ publish = false
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
codec_sv2 = { version = "2.0", path = "../../protocols/v2/codec-sv2", features=["noise_sv2"] }
roles_logic_sv2 = { version = "^0.1.0", path = "../../protocols/v2/roles-logic-sv2" }
network_helpers_sv2 = { version = "^0.1.0", path = "../../roles/roles-utils/network-helpers", features=["async_std"] }
codec_sv2 = { path = "../../protocols/v2/codec-sv2", features=["noise_sv2"] }
roles_logic_sv2 = { path = "../../protocols/v2/roles-logic-sv2" }
network_helpers_sv2 = { path = "../../roles/roles-utils/network-helpers", features=["async_std"] }
async-channel = "1.5.1"
async-std={version = "1.8.0", features = ["attributes"]}
async-std={ version = "1.8.0", features = ["attributes"] }
6 changes: 3 additions & 3 deletions protocols/fuzz-tests/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ cargo-fuzz = true
libfuzzer-sys = { version = "0.4.0", features = ["arbitrary-derive"] }
arbitrary = { version = "1", features = ["derive"] }
rand = "0.8.3"
binary_codec_sv2 = { version = "1.0.0", path = "../v2/binary-sv2/no-serde-sv2/codec"}
codec_sv2 = { version = "2.0.0", path = "../v2/codec-sv2", features = ["noise_sv2"]}
roles_logic_sv2 = { version = "1.0.0", path = "../v2/roles-logic-sv2"}
binary_codec_sv2 = { path = "../v2/binary-sv2/no-serde-sv2/codec"}
codec_sv2 = { path = "../v2/codec-sv2", features = ["noise_sv2"]}
roles_logic_sv2 = { path = "../v2/roles-logic-sv2"}
affinity = "0.1.1"
threadpool = "1.8.1"
lazy_static = "1.4.0"
Expand Down
2 changes: 1 addition & 1 deletion protocols/v1/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ hex = "0.4.3"
serde = { version = "1.0.89", default-features = false, features = ["derive", "alloc"] }
serde_json = { version = "1.0.64", default-features = false, features = ["alloc"] }
tracing = {version = "0.1"}
binary_sv2 = { version = "^1.0.0", path = "../v2/binary-sv2/binary-sv2"}
binary_sv2 = { path = "../v2/binary-sv2/binary-sv2" }

[dev-dependencies]
quickcheck = "1"
Expand Down
8 changes: 4 additions & 4 deletions protocols/v2/binary-sv2/binary-sv2/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
serde_sv2 = {version = "^2.0.0", path = "../serde-sv2", optional = true}
serde_sv2 = { path = "../serde-sv2", optional = true }
serde = { version = "1.0.89", features = ["derive", "alloc"], default-features = false, optional = true }
binary_codec_sv2 = {version = "^1.0.0", path = "../no-serde-sv2/codec", optional = true}
derive_codec_sv2 = {version = "^1.0.0", path = "../no-serde-sv2/derive_codec", optional = true}
binary_codec_sv2 = { path = "../no-serde-sv2/codec", optional = true }
derive_codec_sv2 = { path = "../no-serde-sv2/derive_codec", optional = true }
tracing = { version = "0.1", default-features = false }

[features]
Expand All @@ -28,4 +28,4 @@ prop_test = ["binary_codec_sv2/prop_test", "derive_codec_sv2"]
with_buffer_pool = ["binary_codec_sv2/with_buffer_pool", "derive_codec_sv2"]

[package.metadata.docs.rs]
features = ["core", "with_buffer_pool"]
features = ["core", "with_buffer_pool"]
6 changes: 3 additions & 3 deletions protocols/v2/binary-sv2/no-serde-sv2/codec/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
quickcheck = {version = "1.0.0", optional = true}
buffer_sv2 = { version = "^1.0.0", path = "../../../../../utils/buffer", optional=true}
quickcheck = { version = "1.0.0", optional = true }
buffer_sv2 = { path = "../../../../../utils/buffer", optional=true }

[features]
no_std = []
Expand All @@ -24,4 +24,4 @@ prop_test = ["quickcheck"]
with_buffer_pool = ["buffer_sv2"]

[package.metadata.docs.rs]
features = ["with_buffer_pool"]
features = ["with_buffer_pool"]
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
binary_codec_sv2 = {version = "^1.0.0", path="../codec"}
binary_codec_sv2 = { path="../codec"}

[lib]
proc-macro = true
2 changes: 1 addition & 1 deletion protocols/v2/binary-sv2/serde-sv2/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]

[dependencies]
serde = { version = "1.0.89", features = ["derive", "alloc"], default-features = false }
buffer_sv2 = {version = "^1.0.0", path = "../../../../utils/buffer"}
buffer_sv2 = { path = "../../../../utils/buffer"}
16 changes: 8 additions & 8 deletions protocols/v2/codec-sv2/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]

[dependencies]
serde = { version = "1.0.89", default-features = false, optional = true }
framing_sv2 = { version = "^3.0.0", path = "../../../protocols/v2/framing-sv2" }
noise_sv2 = { version = "1.0", path = "../../../protocols/v2/noise-sv2", default-features = false, optional = true }
binary_sv2 = { version = "1.0.0", path = "../../../protocols/v2/binary-sv2/binary-sv2" }
const_sv2 = { version = "3.0.0", path = "../../../protocols/v2/const-sv2"}
buffer_sv2 = { version = "1.0.0", path = "../../../utils/buffer"}
rand = {version = "0.8.5", default-features = false }
framing_sv2 = { path = "../../../protocols/v2/framing-sv2" }
noise_sv2 = { path = "../../../protocols/v2/noise-sv2", default-features = false, optional = true }
binary_sv2 = { path = "../../../protocols/v2/binary-sv2/binary-sv2" }
const_sv2 = { path = "../../../protocols/v2/const-sv2"}
buffer_sv2 = { path = "../../../utils/buffer"}
rand = { version = "0.8.5", default-features = false }
tracing = { version = "0.1"}

[dev-dependencies]
key-utils = { version = "^1.0.0", path = "../../../utils/key-utils" }
key-utils = { path = "../../../utils/key-utils" }

[features]
default = ["std"]
Expand All @@ -31,4 +31,4 @@ with_serde = ["binary_sv2/with_serde", "serde", "framing_sv2/with_serde", "buffe
with_buffer_pool = ["framing_sv2/with_buffer_pool"]

[package.metadata.docs.rs]
features = ["with_buffer_pool", "noise_sv2"]
features = ["with_buffer_pool", "noise_sv2"]
10 changes: 5 additions & 5 deletions protocols/v2/framing-sv2/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]

[dependencies]
serde = { version = "1.0.89", default-features = false, optional = true }
const_sv2 = { version = "^3.0.0", path = "../../../protocols/v2/const-sv2"}
binary_sv2 = { version = "^1.0.0", path = "../../../protocols/v2/binary-sv2/binary-sv2" }
buffer_sv2 = { version = "^1.0.0", path = "../../../utils/buffer", optional=true }
const_sv2 = { path = "../../../protocols/v2/const-sv2" }
binary_sv2 = { path = "../../../protocols/v2/binary-sv2/binary-sv2" }
buffer_sv2 = { path = "../../../utils/buffer", optional=true }

[dev-dependencies]
noise_sv2 = { version = "1.0", path = "../../../protocols/v2/noise-sv2"}
noise_sv2 = { path = "../../../protocols/v2/noise-sv2" }
rand = "0.8.3"
secp256k1 = { version = "0.28.2", default-features = false, features =["alloc","rand","rand-std"] }

Expand All @@ -29,4 +29,4 @@ with_serde = ["binary_sv2/with_serde", "serde", "buffer_sv2?/with_serde"]
with_buffer_pool = ["binary_sv2/with_buffer_pool", "buffer_sv2"]

[package.metadata.docs.rs]
features = ["with_buffer_pool"]
features = ["with_buffer_pool"]
2 changes: 1 addition & 1 deletion protocols/v2/noise-sv2/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ rand = {version = "0.8.5", default-features = false }
aes-gcm = "0.10.2"
chacha20poly1305 = "0.10.1"
rand_chacha = { version = "0.3.1", default-features = false }
const_sv2 = { version = "^3.0.0", path = "../../../protocols/v2/const-sv2"}
const_sv2 = { path = "../../../protocols/v2/const-sv2"}

[features]
default = ["std"]
Expand Down
18 changes: 9 additions & 9 deletions protocols/v2/roles-logic-sv2/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "roles_logic_sv2"
version = "1.2.3"
version = "2.0.0"
authors = ["The Stratum V2 Developers"]
edition = "2018"
description = "Common handlers for use within SV2 roles"
Expand All @@ -13,15 +13,15 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
stratum-common = { version="1.0.0", path = "../../../common", features=["bitcoin"]}
stratum-common = { path = "../../../common", features=["bitcoin"]}
serde = { version = "1.0.89", features = ["derive", "alloc"], default-features = false, optional = true}
binary_sv2 = {version = "^1.0.0", path = "../../../protocols/v2/binary-sv2/binary-sv2", default-features = true }
common_messages_sv2 = { path = "../../../protocols/v2/subprotocols/common-messages", version = "^3.0.0" }
mining_sv2 = { path = "../../../protocols/v2/subprotocols/mining", version = "^2.0.0" }
template_distribution_sv2 = { path = "../../../protocols/v2/subprotocols/template-distribution", version = "^2.0.0" }
job_declaration_sv2 = { path = "../../../protocols/v2/subprotocols/job-declaration", version = "^2.0.0" }
const_sv2 = { version = "^3.0.0", path = "../../../protocols/v2/const-sv2"}
framing_sv2 = { version = "^3.0.0", path = "../../../protocols/v2/framing-sv2" }
binary_sv2 = { path = "../../../protocols/v2/binary-sv2/binary-sv2", default-features = true }
common_messages_sv2 = { path = "../../../protocols/v2/subprotocols/common-messages" }
mining_sv2 = { path = "../../../protocols/v2/subprotocols/mining" }
template_distribution_sv2 = { path = "../../../protocols/v2/subprotocols/template-distribution" }
job_declaration_sv2 = { path = "../../../protocols/v2/subprotocols/job-declaration" }
const_sv2 = { path = "../../../protocols/v2/const-sv2"}
framing_sv2 = { path = "../../../protocols/v2/framing-sv2" }
tracing = { version = "0.1"}
chacha20poly1305 = { version = "0.10.1"}
nohash-hasher = "0.2.0"
Expand Down
8 changes: 8 additions & 0 deletions protocols/v2/roles-logic-sv2/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ pub enum Error {
LogicErrorMessage(std::boxed::Box<AllMessages<'static>>),
/// JD server cannot propagate the block due to missing transactions
JDSMissingTransactions,
IoError(std::io::Error),
}

impl From<BinarySv2Error> for Error {
Expand All @@ -121,6 +122,12 @@ impl From<BinarySv2Error> for Error {
}
}

impl From<std::io::Error> for Error {
fn from(v: std::io::Error) -> Error {
Error::IoError(v)
}
}

impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
use Error::*;
Expand Down Expand Up @@ -205,6 +212,7 @@ impl Display for Error {
HashrateError(e) => write!(f, "Impossible to get Hashrate: {:?}", e),
LogicErrorMessage(e) => write!(f, "Message is well formatted but can not be handled: {:?}", e),
JDSMissingTransactions => write!(f, "JD server cannot propagate the block: missing transactions"),
IoError(e) => write!(f, "IO error: {:?}", e),
}
}
}
4 changes: 2 additions & 2 deletions protocols/v2/subprotocols/common-messages/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]

[dependencies]
serde = { version = "1.0.89", default-features = false, optional = true }
binary_sv2 = { version = "^1.0.0", path = "../../binary-sv2/binary-sv2" }
const_sv2 = { version = "^3.0.0", path = "../../const-sv2" }
binary_sv2 = { path = "../../binary-sv2/binary-sv2" }
const_sv2 = { path = "../../const-sv2" }
quickcheck = { version = "1.0.3", optional = true }
quickcheck_macros = { version = "1", optional = true }
serde_repr = { version= "0.1.10", optional = true }
Expand Down
4 changes: 2 additions & 2 deletions protocols/v2/subprotocols/job-declaration/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]

[dependencies]
serde = { version = "1.0.89", default-features = false, optional= true }
binary_sv2 = {version = "^1.0.0", path = "../../binary-sv2/binary-sv2" }
const_sv2 = {version = "^3.0.0", path = "../../const-sv2"}
binary_sv2 = { path = "../../binary-sv2/binary-sv2" }
const_sv2 = { path = "../../const-sv2" }

[features]
with_serde = ["binary_sv2/with_serde", "serde"]
4 changes: 2 additions & 2 deletions protocols/v2/subprotocols/mining/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]

[dependencies]
serde = { version = "1.0.89", default-features = false, optional= true }
binary_sv2 = {version = "^1.0.0", path = "../../binary-sv2/binary-sv2" }
const_sv2 = {version = "^3.0.0", path = "../../const-sv2"}
binary_sv2 = { path = "../../binary-sv2/binary-sv2" }
const_sv2 = { path = "../../const-sv2"}

[dev-dependencies]
quickcheck = "1.0.3"
Expand Down
4 changes: 2 additions & 2 deletions protocols/v2/subprotocols/template-distribution/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]

[dependencies]
serde = { version = "1.0.89", default-features = false, optional= true }
binary_sv2 = { version = "^1.0.1", path = "../../binary-sv2/binary-sv2" }
const_sv2 = { version = "^3.0.0", path = "../../const-sv2"}
binary_sv2 = { path = "../../binary-sv2/binary-sv2" }
const_sv2 = { path = "../../const-sv2"}
quickcheck = { version = "1.0.3", optional=true }
quickcheck_macros = { version = "1", optional=true }

Expand Down
10 changes: 5 additions & 5 deletions protocols/v2/sv2-ffi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ keywords = ["stratum", "mining", "bitcoin", "protocol"]
crate-type = ["staticlib"]

[dependencies]
codec_sv2 = { path = "../../../protocols/v2/codec-sv2", version = "^2.0.0" }
const_sv2 = { path = "../../../protocols/v2/const-sv2", version = "^3.0.0" }
binary_sv2 = { path = "../../../protocols/v2/binary-sv2/binary-sv2", version = "^1.0.0" }
common_messages_sv2 = { path = "../../../protocols/v2/subprotocols/common-messages", version = "^3.0.0" }
template_distribution_sv2 = { path = "../../../protocols/v2/subprotocols/template-distribution", version = "^2.0.0" }
codec_sv2 = { path = "../../../protocols/v2/codec-sv2" }
const_sv2 = { path = "../../../protocols/v2/const-sv2" }
binary_sv2 = { path = "../../../protocols/v2/binary-sv2/binary-sv2" }
common_messages_sv2 = { path = "../../../protocols/v2/subprotocols/common-messages" }
template_distribution_sv2 = { path = "../../../protocols/v2/subprotocols/template-distribution" }

[dev-dependencies]
quickcheck = "1.0.3"
Expand Down
2 changes: 1 addition & 1 deletion roles/Cargo.lock

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

18 changes: 9 additions & 9 deletions roles/jd-client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,21 @@ name = "jd_client"
path = "src/lib/mod.rs"

[dependencies]
stratum-common = { version = "1.0.0", path = "../../common" }
stratum-common = { path = "../../common" }
async-channel = "1.5.1"
async-recursion = "0.3.2"
binary_sv2 = { version = "^1.0.0", path = "../../protocols/v2/binary-sv2/binary-sv2" }
buffer_sv2 = { version = "^1.0.0", path = "../../utils/buffer" }
codec_sv2 = { version = "^2.0.0", path = "../../protocols/v2/codec-sv2", features = ["noise_sv2", "with_buffer_pool"] }
framing_sv2 = { version = "^3.0.0", path = "../../protocols/v2/framing-sv2" }
network_helpers_sv2 = { version = "2.0.0", path = "../roles-utils/network-helpers", features=["with_tokio", "with_buffer_pool"] }
roles_logic_sv2 = { version = "^1.0.0", path = "../../protocols/v2/roles-logic-sv2" }
binary_sv2 = { path = "../../protocols/v2/binary-sv2/binary-sv2" }
buffer_sv2 = { path = "../../utils/buffer" }
codec_sv2 = { path = "../../protocols/v2/codec-sv2", features = ["noise_sv2", "with_buffer_pool"] }
framing_sv2 = { path = "../../protocols/v2/framing-sv2" }
network_helpers_sv2 = { path = "../roles-utils/network-helpers", features=["with_tokio", "with_buffer_pool"] }
roles_logic_sv2 = { path = "../../protocols/v2/roles-logic-sv2" }
serde = { version = "1.0.89", default-features = false, features = ["derive", "alloc"] }
futures = "0.3.25"
tokio = { version = "1", features = ["full"] }
ext-config = { version = "0.14.0", features = ["toml"], package = "config" }
tracing = { version = "0.1" }
tracing-subscriber = { version = "0.3" }
error_handling = { version = "1.0.0", path = "../../utils/error-handling" }
error_handling = { path = "../../utils/error-handling" }
nohash-hasher = "0.2.0"
key-utils = { version = "^1.0.0", path = "../../utils/key-utils" }
key-utils = { path = "../../utils/key-utils" }
2 changes: 1 addition & 1 deletion roles/jd-client/src/lib/downstream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,7 @@ pub async fn listen_for_downstream_mining(
jd: Option<Arc<Mutex<JobDeclarator>>>,
) -> Result<Arc<Mutex<DownstreamMiningNode>>, Error> {
info!("Listening for downstream mining connections on {}", address);
let listner = TcpListener::bind(address).await.unwrap();
let listner = TcpListener::bind(address).await?;

if let Ok((stream, _)) = listner.accept().await {
let responder = Responder::from_authority_kp(
Expand Down
7 changes: 5 additions & 2 deletions roles/jd-client/src/lib/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ impl JobDeclaratorClient {
};

// Wait for downstream to connect
let downstream = downstream::listen_for_downstream_mining(
let downstream = match downstream::listen_for_downstream_mining(
downstream_addr,
Some(upstream),
send_solution,
Expand All @@ -351,7 +351,10 @@ impl JobDeclaratorClient {
Some(jd.clone()),
)
.await
.unwrap();
{
Ok(d) => d,
Err(_e) => return,
};

TemplateRx::connect(
SocketAddr::new(IpAddr::from_str(ip_tp.as_str()).unwrap(), port_tp),
Expand Down
Loading

0 comments on commit e228c19

Please sign in to comment.