near_api/common/
utils.rs

1// https://github.com/near/near-token-rs/blob/3feafec624e7d1028ed00695f2acf87e1d823fa7/src/utils.rs#L1-L49
2
3use base64::{Engine, prelude::BASE64_STANDARD};
4use near_api_types::NearToken;
5use near_openapi_client::types::RpcError;
6
7pub fn to_base64(input: &[u8]) -> String {
8    BASE64_STANDARD.encode(input)
9}
10
11pub fn from_base64(encoded: &str) -> Result<Vec<u8>, base64::DecodeError> {
12    BASE64_STANDARD.decode(encoded)
13}
14
15/// Converts [crate::Data]<[u128]>] to [crate::NearToken].
16pub const fn near_data_to_near_token(data: near_api_types::Data<u128>) -> NearToken {
17    NearToken::from_yoctonear(data.data)
18}
19
20// TODO: this is a temporary solution to check if an error is critical
21// we had previously a full scale support for that
22// but auto generated code doesn't support errors yet, so we would need to leave it as is for now
23// We default to false as we can't know if an error is critical or not without the types
24// so to keep it safe it's better to retry
25
26pub fn is_critical_blocks_error(err: &RpcError) -> bool {
27    is_critical_json_rpc_error(err, |_| false)
28}
29
30pub fn is_critical_validator_error(err: &RpcError) -> bool {
31    is_critical_json_rpc_error(err, |_| false)
32}
33
34pub fn is_critical_query_error(rpc_error: &RpcError) -> bool {
35    is_critical_json_rpc_error(rpc_error, |_| false)
36}
37
38pub fn is_critical_transaction_error(err: &RpcError) -> bool {
39    is_critical_json_rpc_error(err, |_| false)
40}
41
42fn is_critical_json_rpc_error(
43    err: &RpcError,
44    is_critical_t: impl Fn(&serde_json::Value) -> bool,
45) -> bool {
46    match err {
47        RpcError::Variant0 { .. } => true,
48        RpcError::Variant1 { cause, .. } => is_critical_t(cause),
49        RpcError::Variant2 { .. } => false,
50    }
51}