Skip to main content

nash_protocol/protocol/asset_nonces/
request.rs

1use 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                // TODO: schema bug, ask backend to fix
26                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
43/// Generate canonical string for on request to get asset nonces
44pub 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
53/// Convert ugly generated `get_assets_nonces::Signature` type into common signature
54impl 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}