use getset::Getters;
use serde::{Deserialize, Serialize};
use crate::{
client::api::PreparedTransactionDataDto,
types::{
api::core::response::OutputWithMetadataResponse,
block::{
address::Bech32Address,
payload::transaction::{dto::TransactionPayloadDto, TransactionId},
},
},
wallet::account::types::{InclusionState, OutputDataDto},
};
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Event {
pub account_index: u32,
pub event: WalletEvent,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum WalletEvent {
ConsolidationRequired,
#[cfg(feature = "ledger_nano")]
#[cfg_attr(docsrs, doc(cfg(feature = "ledger_nano")))]
LedgerAddressGeneration(AddressData),
NewOutput(Box<NewOutputEvent>),
SpentOutput(Box<SpentOutputEvent>),
TransactionInclusion(TransactionInclusionEvent),
TransactionProgress(TransactionProgressEvent),
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum WalletEventType {
ConsolidationRequired,
#[cfg(feature = "ledger_nano")]
#[cfg_attr(docsrs, doc(cfg(feature = "ledger_nano")))]
LedgerAddressGeneration,
NewOutput,
SpentOutput,
TransactionInclusion,
TransactionProgress,
}
impl TryFrom<&str> for WalletEventType {
type Error = String;
fn try_from(value: &str) -> Result<Self, Self::Error> {
let event_type = match value {
"ConsolidationRequired" => Self::ConsolidationRequired,
#[cfg(feature = "ledger_nano")]
"LedgerAddressGeneration" => Self::LedgerAddressGeneration,
"NewOutput" => Self::NewOutput,
"SpentOutput" => Self::SpentOutput,
"TransactionInclusion" => Self::TransactionInclusion,
"TransactionProgress" => Self::TransactionProgress,
_ => return Err(format!("invalid event type {value}")),
};
Ok(event_type)
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct NewOutputEvent {
pub output: OutputDataDto,
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction: Option<TransactionPayloadDto>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction_inputs: Option<Vec<OutputWithMetadataResponse>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct SpentOutputEvent {
pub output: OutputDataDto,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionInclusionEvent {
pub transaction_id: TransactionId,
pub inclusion_state: InclusionState,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum TransactionProgressEvent {
SelectingInputs,
GeneratingRemainderDepositAddress(AddressData),
PreparedTransaction(Box<PreparedTransactionDataDto>),
PreparedTransactionEssenceHash(String),
SigningTransaction,
PerformingPow,
Broadcasting,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct AddressConsolidationNeeded {
pub address: Bech32Address,
}
#[derive(Debug, Clone, Serialize, Deserialize, Getters, PartialEq, Eq, Hash)]
#[getset(get = "pub")]
pub struct AddressData {
#[getset(get = "pub")]
pub address: String,
}