From cef4216df7a75ed4dea7ae76d97c3bb38292b4a1 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 13 Apr 2026 11:21:40 -0400 Subject: [PATCH 1/4] fix(wasm-sdk): update stale default testnet DAPI node addresses All 8 previously hardcoded testnet IPs were no longer present on the network, causing js-evo-sdk connections to time out. Replaced with current enabled nodes from quorums.testnet.networks.dash.org/masternodes, distributed across the 68.67.122.x range. Closes #3484 Co-Authored-By: Claude Sonnet 4.6 --- packages/wasm-sdk/src/sdk.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/wasm-sdk/src/sdk.rs b/packages/wasm-sdk/src/sdk.rs index cf42e313a53..318030e960b 100644 --- a/packages/wasm-sdk/src/sdk.rs +++ b/packages/wasm-sdk/src/sdk.rs @@ -31,14 +31,14 @@ fn default_mainnet_addresses() -> Vec
{ // Testnet addresses from https://quorums.testnet.networks.dash.org/masternodes fn default_testnet_addresses() -> Vec
{ parse_addresses(&[ - "https://52.12.176.90:1443", - "https://35.82.197.197:1443", - "https://44.240.98.102:1443", - "https://52.34.144.50:1443", - "https://44.239.39.153:1443", - "https://34.214.48.68:1443", - "https://54.149.33.167:1443", - "https://52.24.124.162:1443", + "https://68.67.122.1:1443", + "https://68.67.122.4:1443", + "https://68.67.122.7:1443", + "https://68.67.122.10:1443", + "https://68.67.122.13:1443", + "https://68.67.122.17:1443", + "https://68.67.122.21:1443", + "https://68.67.122.26:1443", ]) } fn default_local_addresses() -> Vec
{ From 4258d991c95dbb78f2e973d56e7fb859aea881a8 Mon Sep 17 00:00:00 2001 From: thephez Date: Tue, 14 Apr 2026 10:56:21 -0400 Subject: [PATCH 2/4] refactor(sdk): centralize default DAPI addresses in SdkBuilder Move hardcoded testnet/mainnet/local default addresses from wasm-sdk and rs-sdk-ffi into rs-sdk's SdkBuilder::new_testnet(), new_mainnet(), and new_local() methods, replacing the previous unimplemented!() stubs. Both wasm-sdk and rs-sdk-ffi now delegate to these shared builders. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/rs-sdk-ffi/src/sdk.rs | 54 ++--------------------------- packages/rs-sdk/src/sdk.rs | 63 +++++++++++++++++++++++++++------- packages/wasm-sdk/src/sdk.rs | 50 ++------------------------- 3 files changed, 56 insertions(+), 111 deletions(-) diff --git a/packages/rs-sdk-ffi/src/sdk.rs b/packages/rs-sdk-ffi/src/sdk.rs index bfea1fe335c..a2f62f0b98c 100644 --- a/packages/rs-sdk-ffi/src/sdk.rs +++ b/packages/rs-sdk-ffi/src/sdk.rs @@ -381,60 +381,12 @@ pub unsafe extern "C" fn dash_sdk_create_trusted(config: *const DashSDKConfig) - // Use default addresses for the network match network { Network::Testnet => { - // Use testnet addresses from WASM SDK - let default_addresses = [ - "https://52.12.176.90:1443", - "https://35.82.197.197:1443", - "https://44.240.98.102:1443", - "https://52.34.144.50:1443", - "https://44.239.39.153:1443", - "https://35.164.23.245:1443", - "https://54.149.33.167:1443", - ] - .join(","); - - info!( - addresses = default_addresses.as_str(), - "dash_sdk_create_trusted: using default testnet addresses" - ); - let address_list = match AddressList::from_str(&default_addresses) { - Ok(list) => list, - Err(e) => { - error!(error = %e, "dash_sdk_create_trusted: failed to parse default addresses"); - return DashSDKResult::error(DashSDKError::new( - DashSDKErrorCode::InternalError, - format!("Failed to parse default addresses: {}", e), - )); - } - }; - SdkBuilder::new(address_list).with_network(network) + info!("dash_sdk_create_trusted: using default testnet addresses"); + SdkBuilder::new_testnet() } Network::Mainnet => { - // Use mainnet addresses from WASM SDK - let default_addresses = [ - "https://149.28.241.190:443", - "https://198.7.115.48:443", - "https://134.255.182.186:443", - "https://93.115.172.39:443", - "https://5.189.164.253:443", - "https://178.215.237.134:443", - "https://157.66.81.162:443", - "https://173.212.232.90:443", - ] - .join(","); - info!("dash_sdk_create_trusted: using default mainnet addresses"); - let address_list = match AddressList::from_str(&default_addresses) { - Ok(list) => list, - Err(e) => { - error!(error = %e, "dash_sdk_create_trusted: failed to parse default addresses"); - return DashSDKResult::error(DashSDKError::new( - DashSDKErrorCode::InternalError, - format!("Failed to parse default addresses: {}", e), - )); - } - }; - SdkBuilder::new(address_list).with_network(network) + SdkBuilder::new_mainnet() } _ => { error!( diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index 995126cd9c0..6bb785e2bab 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -31,6 +31,7 @@ use rs_dapi_client::{ transport::TransportRequest, DapiClient, DapiClientError, DapiRequestExecutor, ExecutionResult, }; use std::fmt::Debug; +use std::str::FromStr; #[cfg(feature = "mocks")] use std::num::NonZeroUsize; use std::path::Path; @@ -677,33 +678,69 @@ impl SdkBuilder { Self::default() } - /// Create a new SdkBuilder instance preconfigured for testnet. NOT IMPLEMENTED YET. + /// Create a new SdkBuilder instance preconfigured for testnet. /// /// This is a helper method that preconfigures [SdkBuilder] for testnet use. /// Use this method if you want to connect to Dash Platform testnet during development and testing /// of your solution. + /// + /// Testnet addresses sourced from . pub fn new_testnet() -> Self { - unimplemented!( - "Testnet address list not implemented yet. Use new() and provide address list." + let addresses = AddressList::from_str( + "https://68.67.122.1:1443,\ + https://68.67.122.4:1443,\ + https://68.67.122.7:1443,\ + https://68.67.122.10:1443,\ + https://68.67.122.13:1443,\ + https://68.67.122.17:1443,\ + https://68.67.122.21:1443,\ + https://68.67.122.26:1443", ) + .expect("hardcoded testnet addresses must be valid"); + + Self { + addresses: Some(addresses), + network: Network::Testnet, + ..Default::default() + } } - /// Create a new SdkBuilder instance preconfigured for mainnet (production network). NOT IMPLEMENTED YET. + /// Create a new SdkBuilder instance preconfigured for mainnet (production network). /// /// This is a helper method that preconfigures [SdkBuilder] for production use. /// Use this method if you want to connect to Dash Platform mainnet with production-ready product. /// - /// ## Panics - /// - /// This method panics if the mainnet configuration cannot be loaded. - /// - /// ## Unstable - /// - /// This method is unstable and can be changed in the future. + /// Mainnet addresses sourced from mnowatch.org. pub fn new_mainnet() -> Self { - unimplemented!( - "Mainnet address list not implemented yet. Use new() and provide address list." + let addresses = AddressList::from_str( + "https://149.28.241.190:443,\ + https://198.7.115.48:443,\ + https://134.255.182.186:443,\ + https://93.115.172.39:443,\ + https://5.189.164.253:443", ) + .expect("hardcoded mainnet addresses must be valid"); + + Self { + addresses: Some(addresses), + network: Network::Mainnet, + ..Default::default() + } + } + + /// Create a new SdkBuilder instance preconfigured for local network (dashmate gateway). + /// + /// This is a helper method that preconfigures [SdkBuilder] for local development use + /// with a dashmate-managed node. + pub fn new_local() -> Self { + let addresses = AddressList::from_str("https://127.0.0.1:2443") + .expect("hardcoded local address must be valid"); + + Self { + addresses: Some(addresses), + network: Network::Regtest, + ..Default::default() + } } /// Configure network type. diff --git a/packages/wasm-sdk/src/sdk.rs b/packages/wasm-sdk/src/sdk.rs index 318030e960b..322aebc429e 100644 --- a/packages/wasm-sdk/src/sdk.rs +++ b/packages/wasm-sdk/src/sdk.rs @@ -1,50 +1,12 @@ use crate::context_provider::{WasmContext, WasmTrustedContext}; use crate::error::WasmSdkError; use dash_sdk::dpp::version::PlatformVersion; -use dash_sdk::sdk::Uri; use dash_sdk::{Sdk, SdkBuilder}; use rs_dapi_client::{Address, RequestSettings}; use std::ops::{Deref, DerefMut}; use std::time::Duration; use wasm_bindgen::prelude::wasm_bindgen; -fn parse_addresses(addresses: &'static [&str]) -> Vec
{ - addresses - .iter() - .filter_map(|addr| { - Uri::from_maybe_shared(addr) - .ok() - .and_then(|uri| Address::try_from(uri).ok()) - }) - .collect() -} -// Mainnet addresses from mnowatch.org -fn default_mainnet_addresses() -> Vec
{ - parse_addresses(&[ - "https://149.28.241.190:443", - "https://198.7.115.48:443", - "https://134.255.182.186:443", - "https://93.115.172.39:443", - "https://5.189.164.253:443", - ]) -} -// Testnet addresses from https://quorums.testnet.networks.dash.org/masternodes -fn default_testnet_addresses() -> Vec
{ - parse_addresses(&[ - "https://68.67.122.1:1443", - "https://68.67.122.4:1443", - "https://68.67.122.7:1443", - "https://68.67.122.10:1443", - "https://68.67.122.13:1443", - "https://68.67.122.17:1443", - "https://68.67.122.21:1443", - "https://68.67.122.26:1443", - ]) -} -fn default_local_addresses() -> Vec
{ - parse_addresses(&["https://127.0.0.1:2443"]) -} - #[wasm_bindgen] pub struct WasmSdk { sdk: Sdk, @@ -249,9 +211,7 @@ impl WasmSdkBuilder { #[wasm_bindgen(js_name = "mainnet")] pub fn new_mainnet() -> Self { - let address_list = dash_sdk::sdk::AddressList::from_iter(default_mainnet_addresses()); - let sdk_builder = SdkBuilder::new(address_list) - .with_network(dash_sdk::dpp::dashcore::Network::Mainnet) + let sdk_builder = SdkBuilder::new_mainnet() .with_context_provider(WasmContext {}); Self { @@ -262,9 +222,7 @@ impl WasmSdkBuilder { #[wasm_bindgen(js_name = "testnet")] pub fn new_testnet() -> Self { - let address_list = dash_sdk::sdk::AddressList::from_iter(default_testnet_addresses()); - let sdk_builder = SdkBuilder::new(address_list) - .with_network(dash_sdk::dpp::dashcore::Network::Testnet) + let sdk_builder = SdkBuilder::new_testnet() .with_context_provider(WasmContext {}); Self { @@ -276,9 +234,7 @@ impl WasmSdkBuilder { /// Create a new SdkBuilder preconfigured for a local network using default dashmate gateway. #[wasm_bindgen(js_name = "local")] pub fn new_local() -> Self { - let address_list = dash_sdk::sdk::AddressList::from_iter(default_local_addresses()); - let sdk_builder = SdkBuilder::new(address_list) - .with_network(dash_sdk::dpp::dashcore::Network::Regtest) + let sdk_builder = SdkBuilder::new_local() .with_context_provider(WasmContext {}); Self { From 23e383aaa918bd47a05c6dfd1aac7a73baedc182 Mon Sep 17 00:00:00 2001 From: thephez Date: Tue, 14 Apr 2026 11:26:02 -0400 Subject: [PATCH 3/4] chore: cargo fmt --- packages/rs-sdk/src/sdk.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index fad70038ff2..6e761d5b16a 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -31,12 +31,12 @@ use rs_dapi_client::{ transport::TransportRequest, DapiClient, DapiClientError, DapiRequestExecutor, ExecutionResult, }; use std::fmt::Debug; -use std::str::FromStr; #[cfg(feature = "mocks")] use std::num::NonZeroUsize; use std::path::Path; #[cfg(feature = "mocks")] use std::path::PathBuf; +use std::str::FromStr; use std::sync::atomic::Ordering; use std::sync::{atomic, Arc}; #[cfg(feature = "mocks")] From 0771e1a3b8b5f5c3511a608c13d13f85468848a9 Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 16 Apr 2026 08:58:49 -0400 Subject: [PATCH 4/4] chore: cargo fmt Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/wasm-sdk/src/sdk.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/wasm-sdk/src/sdk.rs b/packages/wasm-sdk/src/sdk.rs index 322aebc429e..d515eb54782 100644 --- a/packages/wasm-sdk/src/sdk.rs +++ b/packages/wasm-sdk/src/sdk.rs @@ -211,8 +211,7 @@ impl WasmSdkBuilder { #[wasm_bindgen(js_name = "mainnet")] pub fn new_mainnet() -> Self { - let sdk_builder = SdkBuilder::new_mainnet() - .with_context_provider(WasmContext {}); + let sdk_builder = SdkBuilder::new_mainnet().with_context_provider(WasmContext {}); Self { inner: sdk_builder, @@ -222,8 +221,7 @@ impl WasmSdkBuilder { #[wasm_bindgen(js_name = "testnet")] pub fn new_testnet() -> Self { - let sdk_builder = SdkBuilder::new_testnet() - .with_context_provider(WasmContext {}); + let sdk_builder = SdkBuilder::new_testnet().with_context_provider(WasmContext {}); Self { inner: sdk_builder, @@ -234,8 +232,7 @@ impl WasmSdkBuilder { /// Create a new SdkBuilder preconfigured for a local network using default dashmate gateway. #[wasm_bindgen(js_name = "local")] pub fn new_local() -> Self { - let sdk_builder = SdkBuilder::new_local() - .with_context_provider(WasmContext {}); + let sdk_builder = SdkBuilder::new_local().with_context_provider(WasmContext {}); Self { inner: sdk_builder,