use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use melstructs::{
Address, BlockHeight, CoinData, CoinID, CoinValue, Denom, NetID, Transaction, TxKind,
};
use thiserror::Error;
use std::error::Error as StdError;
#[derive(Error, Debug, Serialize, Deserialize)]
pub enum WalletAccessError {
#[error("wallet not found")]
NotFound,
#[error("wallet needs to be unlocked")]
Locked,
#[error("other problem accessing wallet: {0}")]
Other(String),
}
#[derive(Error, Debug, Serialize, Deserialize)]
pub enum CreateWalletError {
#[error("error parsing secret key: {0}")]
SecretKey(String),
#[error("wallet already exists")]
WalletExists,
#[error("other error creating wallet: {0}")]
Other(String),
}
#[derive(Error, Debug, Serialize, Deserialize)]
pub enum PrepareTxError {
#[error("not enough money ({0} more of {1} needed)")]
InsufficientFunds(CoinValue, Denom),
#[error("cannot access external input coin {0}")]
BadExternalInput(CoinID),
#[error("could not access network: {0}")]
Network(NetworkError),
}
#[derive(Error, Debug, Serialize, Deserialize)]
pub enum SendTxError {
#[error("could not access wallet: {0}")]
Wallet(WalletAccessError),
#[error("could not access network: {0}")]
Network(NetworkError),
}
#[derive(Error, Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum NeedWallet<T: StdError> {
#[error("wallet access error: {0}")]
Wallet(WalletAccessError),
#[error(transparent)]
Other(#[from] T),
}
#[derive(Error, Debug, Serialize, Deserialize)]
pub enum NetworkError {
#[error("transient network error: {0}")]
Transient(String),
#[error("fatal network error: {0}")]
Fatal(String),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct WalletSummary {
pub total_micromel: CoinValue,
pub detailed_balance: BTreeMap<String, CoinValue>,
pub staked_microsym: CoinValue,
pub network: NetID,
#[serde(with = "stdcode::asstr")]
pub address: Address,
pub locked: bool,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PrepareTxArgs {
#[serde(default = "txkind_normal")]
pub kind: TxKind,
#[serde(default)]
pub inputs: Vec<CoinID>,
pub outputs: Vec<CoinData>,
#[serde(default, with = "stdcode::hexvec")]
pub covenants: Vec<Vec<u8>>,
#[serde(default, with = "stdcode::hex")]
pub data: Vec<u8>,
#[serde(default)]
pub nobalance: Vec<Denom>,
#[serde(default)]
pub fee_ballast: usize,
}
fn txkind_normal() -> TxKind {
TxKind::Normal
}
#[derive(Serialize, Deserialize)]
pub struct SwapInfo {
pub result: u128,
pub price_impact: f64,
pub poolkey: String,
}
#[derive(Serialize, Deserialize)]
pub struct TxBalance(pub bool, pub TxKind, pub BTreeMap<String, i128>);
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct TransactionStatus {
pub raw: Transaction,
pub confirmed_height: Option<BlockHeight>,
pub outputs: Vec<AnnCoinID>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AnnCoinID {
pub coin_data: CoinData,
pub is_change: bool,
pub coin_id: String,
}