diff --git a/packages/js-evo-sdk/src/sdk.ts b/packages/js-evo-sdk/src/sdk.ts index 9cf8aba176..82d77670c9 100644 --- a/packages/js-evo-sdk/src/sdk.ts +++ b/packages/js-evo-sdk/src/sdk.ts @@ -200,7 +200,7 @@ export class EvoSDK { ); } - this.wasmSdk = builder.build(); + this.wasmSdk = await builder.build(); } static fromWasm(wasmSdk: wasm.WasmSdk): EvoSDK { diff --git a/packages/rs-sdk-ffi/src/sdk.rs b/packages/rs-sdk-ffi/src/sdk.rs index 0f3f89b666..c0c1920928 100644 --- a/packages/rs-sdk-ffi/src/sdk.rs +++ b/packages/rs-sdk-ffi/src/sdk.rs @@ -26,6 +26,23 @@ pub struct DashSDKConfigExtended { pub core_sdk_handle: *mut CoreSDKHandle, } +/// Best-effort protocol-version refresh on SDK init. +/// +/// Logs a warning and proceeds if the network is unreachable; never fails SDK creation. +fn best_effort_refresh(sdk: &Sdk, runtime: &BigStackRuntime) { + // Mock SDKs have no live network; refreshing only logs noise. + if sdk.is_mock() { + return; + } + match runtime.block_on(sdk.refresh_protocol_version()) { + Ok(v) => debug!(protocol_version = v, "protocol version refreshed on init"), + Err(e) => warn!( + error = %e, + "protocol version refresh failed on init; proceeding with floor version" + ), + } +} + fn apply_version(builder: SdkBuilder, platform_version: u32) -> Result { if platform_version == 0 { return Ok(builder); @@ -168,6 +185,7 @@ pub unsafe extern "C" fn dash_sdk_create(config: *const DashSDKConfig) -> DashSD match sdk_result { Ok(sdk) => { + best_effort_refresh(&sdk, &runtime); // Clone Arc into the wrapper let wrapper = Box::new(SDKWrapper { sdk, @@ -281,6 +299,7 @@ pub unsafe extern "C" fn dash_sdk_create_extended( match sdk_result { Ok(sdk) => { + best_effort_refresh(&sdk, &runtime); let wrapper = Box::new(SDKWrapper { sdk, runtime, @@ -487,6 +506,8 @@ pub unsafe extern "C" fn dash_sdk_create_trusted(config: *const DashSDKConfig) - match sdk_result { Ok(sdk) => { + best_effort_refresh(&sdk, &runtime); + // Prefetch quorums for trusted setup info!("dash_sdk_create_trusted: SDK built, prefetching quorums..."); diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index c24c0379e9..335553a309 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -570,6 +570,22 @@ impl Sdk { self.protocol_version.load(Ordering::Relaxed) } + /// Returns `true` if this SDK is backed by a mock instead of a live network. + /// + /// Real (network-backed) SDKs return `false`. Used by callers (e.g. the FFI + /// init wiring) to skip the best-effort protocol-version refresh, which would + /// otherwise issue a guaranteed-failing proven query against a mock. + pub fn is_mock(&self) -> bool { + #[cfg(feature = "mocks")] + { + matches!(self.inner, SdkInstance::Mock { .. }) + } + #[cfg(not(feature = "mocks"))] + { + false + } + } + // TODO: Move to settings /// Indicate if the sdk should request and verify proofs. pub fn prove(&self) -> bool { diff --git a/packages/wasm-sdk/src/sdk.rs b/packages/wasm-sdk/src/sdk.rs index 83c87428f8..e6f5fca7bc 100644 --- a/packages/wasm-sdk/src/sdk.rs +++ b/packages/wasm-sdk/src/sdk.rs @@ -333,8 +333,14 @@ impl WasmSdkBuilder { } } - pub fn build(self) -> Result { + pub async fn build(self) -> Result { let sdk = self.inner.build().map_err(WasmSdkError::from)?; + if let Err(e) = sdk.refresh_protocol_version().await { + tracing::warn!( + error = %e, + "protocol version refresh failed on init; proceeding with floor version" + ); + } Ok(WasmSdk { sdk, trusted_context: self.trusted_context,