use crate::{PayloadDecoder, Result};
use ex3_node_error::OtherError;
use ex3_timestamp::TimeInNs;
use num_bigint::BigUint;
use num_traits::Num;
use serde_bytes::ByteBuf;
use std::str::FromStr;
use crate::tx_type_dto::{AssetAccountBinding, AssetAccountUnbinding};
impl PayloadDecoder {
pub fn decode_to_asset_account_binding(
payload: &[u8],
) -> Result<ex3_node_types::transaction::AssetAccountBinding> {
let payload_str = String::from_utf8(payload.as_ref().to_vec()).expect("should success");
let hexes = payload_str.split('|').collect::<Vec<&str>>();
let err = OtherError::new("Invalid payload");
if hexes.len() != 7 {
return Err(err.clone().into());
}
let sign_schema = u8::from_str_radix(hexes[0], 16).map_err(|_| err.clone())?;
let initiator = BigUint::from_str_radix(hexes[1], 16).map_err(|_| err.clone())?;
let main_wallet_id = BigUint::from_str_radix(hexes[2], 16).map_err(|_| err.clone())?;
let asset_wallet_id = BigUint::from_str_radix(hexes[3], 16).map_err(|_| err.clone())?;
let timestamp = u64::from_str(hexes[4]).map_err(|_| err.clone())?;
let sign_schema_initiator = u8::from_str_radix(hexes[5], 16).map_err(|_| err.clone())?;
let sig_initiator = hex::decode(hexes[6]).map_err(|_| err.clone())?;
let tx = AssetAccountBinding {
sign_schema,
main: main_wallet_id,
asset: asset_wallet_id,
initiator,
sign_schema_initiator,
sig_initiator: ByteBuf::from(sig_initiator),
timestamp: TimeInNs(timestamp),
};
Ok(tx.into())
}
pub fn decode_to_asset_account_unbinding(
payload: &[u8],
) -> Result<ex3_node_types::transaction::AssetAccountUnbinding> {
let payload_str = String::from_utf8(payload.as_ref().to_vec()).expect("should success");
let hexes = payload_str.split('|').collect::<Vec<&str>>();
let err = OtherError::new("Invalid payload");
if hexes.len() != 3 {
return Err(err.clone().into());
}
let sign_schema = u8::from_str_radix(hexes[0], 16).map_err(|_| err.clone())?;
let main_wallet_id = BigUint::from_str_radix(hexes[1], 16).map_err(|_| err.clone())?;
let asset_wallet_id = BigUint::from_str_radix(hexes[2], 16).map_err(|_| err.clone())?;
let tx = AssetAccountUnbinding {
sign_schema,
main: main_wallet_id,
asset: asset_wallet_id,
};
Ok(tx.into())
}
}