Skip to content

Commit 60c7aa6

Browse files
committed
feat(sdk): pre-fetch trusted address list
1 parent bc2dd30 commit 60c7aa6

File tree

3 files changed

+94
-494
lines changed

3 files changed

+94
-494
lines changed

packages/wasm-sdk/src/context_provider.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,29 @@ impl WasmTrustedContext {
134134
})
135135
}
136136

137+
pub async fn fetch_masternode_addresses(
138+
&self,
139+
) -> Result<rs_dapi_client::AddressList, ContextProviderError> {
140+
let urls = self
141+
.inner
142+
.fetch_masternode_addresses()
143+
.await
144+
.map_err(|e| ContextProviderError::Generic(format!("Failed to fetch masternodes: {}", e)))?;
145+
146+
let mut addresses = Vec::new();
147+
for url in urls {
148+
let uri = dash_sdk::sdk::Uri::from_maybe_shared(url.to_string()).map_err(|e| {
149+
ContextProviderError::Generic(format!("Invalid masternode URI '{}': {}", url, e))
150+
})?;
151+
let address = rs_dapi_client::Address::try_from(uri).map_err(|e| {
152+
ContextProviderError::Generic(format!("Invalid masternode address '{}': {}", url, e))
153+
})?;
154+
addresses.push(address);
155+
}
156+
157+
Ok(rs_dapi_client::AddressList::from_iter(addresses))
158+
}
159+
137160
/// Add a data contract to the known contracts cache
138161
pub fn add_known_contract(&self, contract: DataContract) {
139162
self.inner.add_known_contract(contract);

packages/wasm-sdk/src/dpns.rs

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::error::WasmSdkError;
22
use crate::queries::utils::{deserialize_required_query, identifier_from_js};
3-
use crate::queries::{ProofInfoWasm, ProofMetadataResponseWasm, ResponseMetadataWasm};
3+
use crate::queries::ProofMetadataResponseWasm;
44
use crate::sdk::WasmSdk;
55
use dash_sdk::dpp::document::{Document, DocumentV0Getters};
66
use dash_sdk::dpp::identity::accessors::IdentityGettersV0;
@@ -119,27 +119,6 @@ fn parse_dpns_usernames_query(
119119
})
120120
}
121121

122-
#[wasm_bindgen(js_name = "DpnsUsernamesProofResponse")]
123-
#[derive(Clone)]
124-
pub struct DpnsUsernamesProofResponseWasm {
125-
#[wasm_bindgen(getter_with_clone)]
126-
pub usernames: Array,
127-
#[wasm_bindgen(getter_with_clone)]
128-
pub metadata: ResponseMetadataWasm,
129-
#[wasm_bindgen(getter_with_clone)]
130-
pub proof: ProofInfoWasm,
131-
}
132-
133-
#[wasm_bindgen(js_name = "DpnsUsernameProofResponse")]
134-
#[derive(Clone)]
135-
pub struct DpnsUsernameProofResponseWasm {
136-
#[wasm_bindgen(getter_with_clone)]
137-
pub username: JsValue,
138-
#[wasm_bindgen(getter_with_clone)]
139-
pub metadata: ResponseMetadataWasm,
140-
#[wasm_bindgen(getter_with_clone)]
141-
pub proof: ProofInfoWasm,
142-
}
143122
impl WasmSdk {
144123
async fn prepare_dpns_usernames_query(
145124
&self,
@@ -189,19 +168,19 @@ impl WasmSdk {
189168
&self,
190169
identity_id: Identifier,
191170
limit: Option<u32>,
192-
) -> Result<DpnsUsernamesProofResponseWasm, WasmSdkError> {
171+
) -> Result<ProofMetadataResponseWasm, WasmSdkError> {
193172
let query = self
194173
.prepare_dpns_usernames_query(identity_id, limit)
195174
.await?;
196175
let (documents_result, metadata, proof) =
197176
Document::fetch_many_with_metadata_and_proof(self.as_ref(), query, None).await?;
198177
let usernames_array = usernames_from_documents(documents_result);
199178

200-
Ok(DpnsUsernamesProofResponseWasm {
201-
usernames: usernames_array,
202-
metadata: metadata.into(),
203-
proof: proof.into(),
204-
})
179+
Ok(ProofMetadataResponseWasm::from_parts(
180+
usernames_array.into(),
181+
metadata.into(),
182+
proof.into(),
183+
))
205184
}
206185
}
207186

@@ -480,43 +459,44 @@ impl WasmSdk {
480459
.map(Some)
481460
.ok_or_else(|| WasmSdkError::generic("DPNS username is not a string"))
482461
}
483-
#[wasm_bindgen(js_name = "getDpnsUsernamesWithProofInfo")]
462+
#[wasm_bindgen(
463+
js_name = "getDpnsUsernamesWithProofInfo",
464+
unchecked_return_type = "ProofMetadataResponseTyped<Array<string>>"
465+
)]
484466
pub async fn get_dpns_usernames_with_proof_info(
485467
&self,
486468
query: DpnsUsernamesQueryJs,
487-
) -> Result<DpnsUsernamesProofResponseWasm, WasmSdkError> {
469+
) -> Result<ProofMetadataResponseWasm, WasmSdkError> {
488470
let params = parse_dpns_usernames_query(query)?;
489471
self.fetch_dpns_usernames_with_proof(params.identity_id, params.limit)
490472
.await
491473
}
492474

493-
#[wasm_bindgen(js_name = "getDpnsUsernameWithProofInfo")]
475+
#[wasm_bindgen(
476+
js_name = "getDpnsUsernameWithProofInfo",
477+
unchecked_return_type = "ProofMetadataResponseTyped<string | null>"
478+
)]
494479
pub async fn get_dpns_username_with_proof_info(
495480
&self,
496481
#[wasm_bindgen(js_name = "identityId")]
497482
#[wasm_bindgen(unchecked_param_type = "IdentifierLike")]
498483
identity_id: JsValue,
499-
) -> Result<DpnsUsernameProofResponseWasm, WasmSdkError> {
484+
) -> Result<ProofMetadataResponseWasm, WasmSdkError> {
500485
let identity_id_parsed = identifier_from_js(&identity_id, "identity ID")?;
501486

502-
let DpnsUsernamesProofResponseWasm {
503-
usernames,
504-
metadata,
505-
proof,
506-
} = self
487+
let mut response = self
507488
.fetch_dpns_usernames_with_proof(identity_id_parsed, Some(1))
508489
.await?;
509490

491+
let usernames = js_sys::Array::from(&response.data());
510492
let username = if usernames.length() > 0 {
511493
usernames.get(0)
512494
} else {
513495
JsValue::NULL
514496
};
515497

516-
Ok(DpnsUsernameProofResponseWasm {
517-
username,
518-
metadata,
519-
proof,
520-
})
498+
response.set_data(username);
499+
500+
Ok(response)
521501
}
522502
}

0 commit comments

Comments
 (0)