use std::result;
use ex3_canister_types::chain::Chain;
use ex3_canister_types::wallet_identifier::WalletIdentifier;
use serde_bytes::ByteBuf;
use ex3_node_error::{Error, OtherError};
use ex3_node_types::deposit::Deposit;
use ex3_node_types::transaction::{ResetMainSecretRequest, WalletRegisterRequest};
use ex3_node_types::PublicKey;
pub type Result<T> = result::Result<T, Error>;
pub struct PayloadDecoder;
impl PayloadDecoder {
pub fn decode_to_wallet_identifier(payload: &ByteBuf) -> Result<WalletIdentifier> {
let payload_str = String::from_utf8(payload.as_ref().to_vec()).expect("should success");
let hexes = payload_str.split('|').collect::<Vec<&str>>();
if hexes.len() != 3 {
return Err(OtherError::new("Invalid payload").into());
}
let chain_bytes = hex::decode(hexes[0]);
let network_bytes = hex::decode(hexes[1]);
let pub_key_bytes = hex::decode(hexes[2]);
if chain_bytes.is_err() || network_bytes.is_err() || pub_key_bytes.is_err() {
return Err(OtherError::new("Invalid payload").into());
}
let chain_bytes = chain_bytes.unwrap();
let network = network_bytes.unwrap();
let pub_key = pub_key_bytes.unwrap();
if chain_bytes.len() != 4 || network.len() != 1 {
return Err(OtherError::new("Invalid payload").into());
}
let chain_bytes: [u8; 4] = chain_bytes.try_into().unwrap();
let chain: Chain = u32::from_be_bytes(chain_bytes).into();
let pub_key: ByteBuf = ByteBuf::from(pub_key);
let wallet_identifier = WalletIdentifier {
chain,
network: network[0],
pub_key,
};
Ok(wallet_identifier)
}
pub fn decode_to_deposit(payload: &ByteBuf) -> Result<Deposit> {
match Deposit::cbor_decode(payload.as_ref()) {
Ok(deposit) => Ok(deposit),
Err(e) => Err(e.into()),
}
}
pub fn decode_to_wallet_register_request(payload: &ByteBuf) -> Result<WalletRegisterRequest> {
let payload_str = String::from_utf8(payload.as_ref().to_vec()).expect("should success");
let hexes = payload_str.split('|').collect::<Vec<&str>>();
if hexes.len() != 3 {
return Err(OtherError::new("Invalid payload").into());
}
let chain_bytes = hex::decode(hexes[0]);
let network_bytes = hex::decode(hexes[1]);
let pub_key_bytes = hex::decode(hexes[2]);
if chain_bytes.is_err() || network_bytes.is_err() || pub_key_bytes.is_err() {
return Err(OtherError::new("Invalid payload").into());
}
let chain_bytes = chain_bytes.unwrap();
let network = network_bytes.unwrap();
let pub_key = pub_key_bytes.unwrap();
if chain_bytes.len() != 4 || network.len() != 1 {
return Err(OtherError::new("Invalid payload").into());
}
let chain_bytes: [u8; 4] = chain_bytes.try_into().unwrap();
let chain: Chain = u32::from_be_bytes(chain_bytes).into();
let pub_key: ByteBuf = ByteBuf::from(pub_key);
let wallet_register_request = WalletRegisterRequest {
chain,
network: network[0],
pub_key,
};
Ok(wallet_register_request)
}
pub fn decode_to_reset_main_secret_request(
payload: &ByteBuf,
) -> Result<ResetMainSecretRequest> {
let payload_str = String::from_utf8(payload.as_ref().to_vec()).expect("should success");
let hexes = payload_str.split('|').collect::<Vec<&str>>();
if hexes.len() != 2 {
return Err(OtherError::new("Invalid payload").into());
}
let encrypted_pri_key = hex::decode(hexes[0]).unwrap();
let l2_pub_key = hex::decode(hexes[1]).unwrap();
if encrypted_pri_key.len() != 32 || l2_pub_key.len() != 32 {
return Err(OtherError::new("Invalid payload").into());
}
let encrypted_pri_key: ByteBuf = ByteBuf::from(encrypted_pri_key);
let l2_pub_key: PublicKey = ByteBuf::from(l2_pub_key);
let reset_main_secret_request = ResetMainSecretRequest {
encrypted_pri_key,
l2_pub_key,
};
Ok(reset_main_secret_request)
}
}