From e01333662e79cb34d716627685e4013120c0f214 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 27 May 2026 10:20:49 +0200 Subject: [PATCH] feat(rs-sdk-ffi): expose optional platform_version in DashSDKConfig Adds a `platform_version: u32` field to `DashSDKConfig` so callers of `dash_sdk_create*` can pin the SDK to a specific `PlatformVersion`. `0` keeps the SDK default (auto-detect / latest); any non-zero value is forwarded to `SdkBuilder::with_version` and rejected via `InvalidParameter` if the version is unknown. The Swift wrapper forwards a new optional `platformVersion: UInt32 = 0` parameter on `SDK.init(network:)` into the config. Co-Authored-By: Claude Opus 4.6 --- packages/rs-sdk-ffi/src/sdk.rs | 29 +++++++++++++++++++ packages/rs-sdk-ffi/src/token/claim.rs | 1 + .../rs-sdk-ffi/src/token/emergency_action.rs | 1 + packages/rs-sdk-ffi/src/token/freeze.rs | 1 + packages/rs-sdk-ffi/src/types.rs | 4 +++ .../rs-sdk-ffi/tests/context_provider_test.rs | 1 + .../swift-sdk/Sources/SwiftDashSDK/SDK.swift | 3 +- 7 files changed, 39 insertions(+), 1 deletion(-) diff --git a/packages/rs-sdk-ffi/src/sdk.rs b/packages/rs-sdk-ffi/src/sdk.rs index aa53fa8fcc9..efd6d3aecfe 100644 --- a/packages/rs-sdk-ffi/src/sdk.rs +++ b/packages/rs-sdk-ffi/src/sdk.rs @@ -25,6 +25,19 @@ pub struct DashSDKConfigExtended { pub core_sdk_handle: *mut CoreSDKHandle, } +fn apply_version(builder: SdkBuilder, platform_version: u32) -> Result { + if platform_version == 0 { + return Ok(builder); + } + match dash_sdk::dpp::version::PlatformVersion::get(platform_version) { + Ok(v) => Ok(builder.with_version(v)), + Err(e) => Err(DashSDKError::new( + DashSDKErrorCode::InvalidParameter, + format!("Invalid platform_version {}: {}", platform_version, e), + )), + } +} + /// Internal SDK wrapper pub(crate) struct SDKWrapper { pub sdk: Sdk, @@ -149,6 +162,11 @@ pub unsafe extern "C" fn dash_sdk_create(config: *const DashSDKConfig) -> DashSD } }; + let builder = match apply_version(builder, config.platform_version) { + Ok(b) => b, + Err(e) => return DashSDKResult::error(e), + }; + // Build SDK let sdk_result = builder.build().map_err(FFIError::from); @@ -257,6 +275,11 @@ pub unsafe extern "C" fn dash_sdk_create_extended( } } + let builder = match apply_version(builder, base_config.platform_version) { + Ok(b) => b, + Err(e) => return DashSDKResult::error(e), + }; + // Build SDK let sdk_result = builder.build().map_err(FFIError::from); @@ -420,6 +443,11 @@ pub unsafe extern "C" fn dash_sdk_create_trusted(config: *const DashSDKConfig) - info!("dash_sdk_create_trusted: adding trusted context provider to builder"); let builder = builder.with_context_provider(Arc::clone(&trusted_provider)); + let builder = match apply_version(builder, config.platform_version) { + Ok(b) => b, + Err(e) => return DashSDKResult::error(e), + }; + // Build SDK let sdk_result = builder.build().map_err(FFIError::from); @@ -572,6 +600,7 @@ pub unsafe extern "C" fn dash_sdk_create_with_callbacks( skip_asset_lock_proof_verification: config_ref.skip_asset_lock_proof_verification, request_retry_count: config_ref.request_retry_count, request_timeout_ms: config_ref.request_timeout_ms, + platform_version: config_ref.platform_version, }, context_provider: context_provider_handle, core_sdk_handle: std::ptr::null_mut(), diff --git a/packages/rs-sdk-ffi/src/token/claim.rs b/packages/rs-sdk-ffi/src/token/claim.rs index a6c6ab80eb2..dd2f96a77c7 100644 --- a/packages/rs-sdk-ffi/src/token/claim.rs +++ b/packages/rs-sdk-ffi/src/token/claim.rs @@ -203,6 +203,7 @@ mod tests { skip_asset_lock_proof_verification: false, request_retry_count: 3, request_timeout_ms: 5000, + platform_version: 0, }; let result = unsafe { crate::sdk::dash_sdk_create(&config) }; diff --git a/packages/rs-sdk-ffi/src/token/emergency_action.rs b/packages/rs-sdk-ffi/src/token/emergency_action.rs index 391bc090f45..a93ba9fd874 100644 --- a/packages/rs-sdk-ffi/src/token/emergency_action.rs +++ b/packages/rs-sdk-ffi/src/token/emergency_action.rs @@ -210,6 +210,7 @@ mod tests { skip_asset_lock_proof_verification: false, request_retry_count: 3, request_timeout_ms: 5000, + platform_version: 0, }; let result = unsafe { crate::sdk::dash_sdk_create(&config) }; diff --git a/packages/rs-sdk-ffi/src/token/freeze.rs b/packages/rs-sdk-ffi/src/token/freeze.rs index b7a1fcd5cd3..3e260081b62 100644 --- a/packages/rs-sdk-ffi/src/token/freeze.rs +++ b/packages/rs-sdk-ffi/src/token/freeze.rs @@ -212,6 +212,7 @@ mod tests { skip_asset_lock_proof_verification: false, request_retry_count: 3, request_timeout_ms: 5000, + platform_version: 0, }; let result = unsafe { crate::sdk::dash_sdk_create(&config) }; diff --git a/packages/rs-sdk-ffi/src/types.rs b/packages/rs-sdk-ffi/src/types.rs index ce5e7eb20a3..2f2ad8efc94 100644 --- a/packages/rs-sdk-ffi/src/types.rs +++ b/packages/rs-sdk-ffi/src/types.rs @@ -77,6 +77,10 @@ pub struct DashSDKConfig { pub request_retry_count: u32, /// Timeout for requests in milliseconds pub request_timeout_ms: u64, + /// Pin to a specific Dash Platform protocol version. + /// `0` keeps the SDK default (auto-detect / latest); any non-zero value + /// is forwarded to `SdkBuilder::with_version` and rejected if unknown. + pub platform_version: u32, } /// Result data type indicator for iOS diff --git a/packages/rs-sdk-ffi/tests/context_provider_test.rs b/packages/rs-sdk-ffi/tests/context_provider_test.rs index 6cbdc2050c1..cda74eed121 100644 --- a/packages/rs-sdk-ffi/tests/context_provider_test.rs +++ b/packages/rs-sdk-ffi/tests/context_provider_test.rs @@ -85,6 +85,7 @@ mod tests { skip_asset_lock_proof_verification: false, request_retry_count: 3, request_timeout_ms: 30000, + platform_version: 0, }; // Create extended config diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/SDK.swift b/packages/swift-sdk/Sources/SwiftDashSDK/SDK.swift index 39147c56ed1..1e39669550d 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/SDK.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/SDK.swift @@ -94,13 +94,14 @@ public final class SDK: @unchecked Sendable { /// This uses a trusted context provider that fetches quorum keys and /// data contracts from trusted HTTP endpoints instead of requiring proof verification. /// This is suitable for mobile applications where proof verification would be resource-intensive. - public init(network: Network) throws { + public init(network: Network, platformVersion: UInt32 = 0) throws { var config = DashSDKConfig() config.network = network.ffiValue config.dapi_addresses = nil config.skip_asset_lock_proof_verification = false config.request_retry_count = 1 config.request_timeout_ms = 8000 // 8 seconds + config.platform_version = platformVersion // 0 = SDK default (auto-detect) // Create SDK with trusted setup — Rust side auto-detects local/regtest // and uses the quorum sidecar at localhost:22444 instead of remote endpoints.