use std::fmt::Display;
use candid::CandidType;
use ex3_timestamp::TimeInNs;
use serde::{Deserialize, Serialize};
use crate::{
AssetAmount, AssetId, BlockHeight, CandidAssetAmount, CandidAssetId, CandidBlockHeight,
CandidWalletRegisterId, WalletRegisterId,
};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, PartialOrd, Ord)]
pub struct DepositIdentifier {
pub asset_id: AssetId,
pub block_height: BlockHeight,
pub tx_id: Option<String>,
}
impl Display for DepositIdentifier {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}:{}:{}",
self.asset_id,
self.block_height,
self.tx_id.clone().unwrap_or("".to_string())
)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, CandidType, Ord, PartialOrd)]
pub struct CandidDepositIdentifier {
pub asset_id: CandidAssetId,
pub block_height: CandidBlockHeight,
pub tx_id: Option<String>,
}
impl From<DepositIdentifier> for CandidDepositIdentifier {
fn from(deposit_identifier: DepositIdentifier) -> Self {
Self {
asset_id: deposit_identifier.asset_id.into(),
block_height: deposit_identifier.block_height.into(),
tx_id: deposit_identifier.tx_id,
}
}
}
impl From<CandidDepositIdentifier> for DepositIdentifier {
fn from(deposit_identifier: CandidDepositIdentifier) -> Self {
Self {
asset_id: deposit_identifier.asset_id.0,
block_height: deposit_identifier.block_height.0,
tx_id: deposit_identifier.tx_id,
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
pub struct OriginalDeposit {
pub identifier: DepositIdentifier,
pub amount: AssetAmount,
}
#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct Deposit {
pub identifier: DepositIdentifier,
pub from_wallet: WalletRegisterId,
pub amount: AssetAmount,
}
#[derive(Deserialize, CandidType, Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct CandidDeposit {
pub identifier: CandidDepositIdentifier,
pub from_wallet: CandidWalletRegisterId,
pub amount: CandidAssetAmount,
}
#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct ConfirmedDeposit {
pub deposit: Deposit,
pub confirmed_at: TimeInNs
}
#[derive(Deserialize, CandidType, Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct CandidConfirmedDeposit {
pub deposit: CandidDeposit,
pub confirmed_at: TimeInNs
}
impl From<Deposit> for CandidDeposit {
fn from(deposit: Deposit) -> Self {
Self {
identifier: deposit.identifier.into(),
from_wallet: deposit.from_wallet.into(),
amount: deposit.amount.into(),
}
}
}
impl From<CandidDeposit> for Deposit {
fn from(deposit: CandidDeposit) -> Self {
Self {
identifier: deposit.identifier.into(),
from_wallet: deposit.from_wallet.0,
amount: deposit.amount.0,
}
}
}
impl From<ConfirmedDeposit> for CandidConfirmedDeposit {
fn from(deposit: ConfirmedDeposit) -> Self {
Self {
deposit: deposit.deposit.into(),
confirmed_at: deposit.confirmed_at
}
}
}
impl From<CandidConfirmedDeposit> for ConfirmedDeposit {
fn from(deposit: CandidConfirmedDeposit) -> Self {
Self {
deposit: deposit.deposit.into(),
confirmed_at: deposit.confirmed_at
}
}
}
#[cfg(test)]
mod tests {
use ex3_serde::bincode;
use super::*;
#[test]
fn test_serde() {
let deposit_identifier = DepositIdentifier {
asset_id: 1u64.into(),
block_height: 2u64.into(),
tx_id: Some("tx_id".to_string()),
};
let deposit = OriginalDeposit {
identifier: deposit_identifier.clone(),
amount: 3u64.into(),
};
let encoded = bincode::serialize(&deposit).unwrap();
let decoded: OriginalDeposit = bincode::deserialize(&encoded).unwrap();
assert_eq!(deposit, decoded);
let encoded = ex3_serde::cbor::serialize(&deposit).unwrap();
let decoded: OriginalDeposit = ex3_serde::cbor::deserialize(&encoded).unwrap();
assert_eq!(deposit, decoded);
}
}