nash_protocol/protocol/asset_nonces/
request.rs1use super::super::{general_canonical_string, RequestPayloadSignature};
2use super::types::AssetNoncesRequest;
3use crate::errors::{ProtocolError, Result};
4use crate::graphql;
5use crate::types::Asset;
6use crate::utils::current_time_as_i64;
7
8use super::super::signer::Signer;
9
10use graphql::get_assets_nonces;
11use graphql_client::GraphQLQuery;
12
13impl AssetNoncesRequest {
14 pub fn make_query(
15 &self,
16 signer: &Signer,
17 assets: Option<Vec<Asset>>,
18 ) -> Result<graphql_client::QueryBody<get_assets_nonces::Variables>> {
19 let asset_list = assets
20 .ok_or(ProtocolError(
21 "Client must be initialized with list of assets first",
22 ))?
23 .iter()
24 .map(|asset| {
25 Some(asset.name().to_string())
27 })
28 .collect();
29 let mut asset_nonce_args = get_assets_nonces::Variables {
30 payload: get_assets_nonces::GetAssetsNoncesParams {
31 timestamp: current_time_as_i64(),
32 assets: Some(asset_list),
33 },
34 signature: RequestPayloadSignature::empty().into(),
35 };
36 let sig_payload = asset_nonces_canonical_string(&asset_nonce_args)?;
37 let sig = signer.sign_canonical_string(&sig_payload);
38 asset_nonce_args.signature = sig.into();
39 Ok(graphql::GetAssetsNonces::build_query(asset_nonce_args))
40 }
41}
42
43pub fn asset_nonces_canonical_string(variables: &get_assets_nonces::Variables) -> Result<String> {
45 let serialized_all = serde_json::to_string(variables).map_err(|_|ProtocolError("Failed to serialize variables"))?;
46 Ok(general_canonical_string(
47 "get_assets_nonces".to_string(),
48 serde_json::from_str(&serialized_all).map_err(|_|ProtocolError("Failed to deserialize variables"))?,
49 vec![],
50 ))
51}
52
53impl From<RequestPayloadSignature> for get_assets_nonces::Signature {
55 fn from(sig: RequestPayloadSignature) -> Self {
56 get_assets_nonces::Signature {
57 signed_digest: sig.signed_digest,
58 public_key: sig.public_key,
59 }
60 }
61}