Skip to content

Commit 6c526d1

Browse files
committed
add legacy solo mining compatibility
1 parent 890afa9 commit 6c526d1

3 files changed

Lines changed: 13 additions & 2 deletions

File tree

pool-apps/pool/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ Miners must specify their payout mode via `user_identity`:
101101
|---------|------|-------------|
102102
| `sri/donate/worker_name` | Pool | Full reward goes to pool |
103103
| `sri/solo/payout_address/worker_name` | Solo | Full reward goes to miner's address |
104+
| `bc1qtzqxqaxyy6lda2fhdtp5dp0v56vlf6g0tljy2x` | Solo | Full reward goes to miner's address |
104105
| `sri/donate/percentage/payout_address/worker_name` | Donate | Pool gets %, miner gets remainder *(not yet implemented)* |
105106

106107
### Error Scenarios

pool-apps/pool/src/lib/channel_manager/mining_message_handler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ impl HandleMiningMessagesFromClientAsync for ChannelManager {
147147
let payout_mode = match validate_user_identity(&user_identity, self.solo_mining_mode) {
148148
Ok(mode) => mode,
149149
Err(_) => {
150-
error!("Invalid user_identity '{}': must be 'sri/donate/<worker_name>' or 'sri/solo/<payout_address>/<worker_name>'", user_identity);
150+
error!("Invalid user_identity '{}': must be 'sri/donate/<worker_name>', 'sri/solo/<payout_address>/<worker_name>' or `<bitcoin_address>`", user_identity);
151151
let open_standard_mining_channel_error = OpenMiningChannelError {
152152
request_id,
153153
error_code: "invalid-user-identity"
@@ -358,7 +358,7 @@ impl HandleMiningMessagesFromClientAsync for ChannelManager {
358358
let payout_mode = match validate_user_identity(&user_identity, self.solo_mining_mode) {
359359
Ok(mode) => mode,
360360
Err(_) => {
361-
error!("Invalid user_identity '{}': must be 'sri/donate/<worker_name>' or 'sri/solo/<payout_address>/<worker_name>'", user_identity);
361+
error!("Invalid user_identity '{}': must be 'sri/donate/<worker_name>', 'sri/solo/<payout_address>/<worker_name>' or <bitcoin_address>", user_identity);
362362
let open_extended_mining_channel_error = OpenMiningChannelError {
363363
request_id,
364364
error_code: "invalid-user-identity"

pool-apps/pool/src/lib/utils.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::net::SocketAddr;
22
use stratum_apps::{
3+
config_helpers::CoinbaseRewardScript,
34
stratum_core::{
45
binary_sv2::Str0255,
56
common_messages_sv2::{Protocol, SetupConnection},
@@ -116,6 +117,11 @@ pub fn validate_user_identity(
116117
return Ok(PayoutMode::Pool);
117118
}
118119

120+
let descriptor = format!("addr({user_identity})");
121+
if CoinbaseRewardScript::from_descriptor(&descriptor).is_ok() {
122+
return Ok(PayoutMode::Solo(user_identity.to_string()));
123+
}
124+
119125
let parts: Vec<&str> = user_identity.split('/').collect();
120126

121127
if parts.is_empty() || parts[0] != "sri" || parts.len() < 2 {
@@ -207,6 +213,10 @@ mod tests {
207213
validate_user_identity("sri/solo/tb1qxyz/worker/subworker", true),
208214
Ok(PayoutMode::Solo(addr)) if addr == "tb1qxyz"
209215
));
216+
assert!(matches!(
217+
validate_user_identity("bc1qtzqxqaxyy6lda2fhdtp5dp0v56vlf6g0tljy2x", true),
218+
Ok(PayoutMode::Solo(addr)) if addr == "bc1qtzqxqaxyy6lda2fhdtp5dp0v56vlf6g0tljy2x"
219+
));
210220
}
211221

212222
#[test]

0 commit comments

Comments
 (0)