use crate::types::{
CreateWalletError, NeedWallet, NetworkError, PrepareTxArgs, PrepareTxError, SwapInfo,
TransactionStatus, TxBalance, WalletAccessError, WalletSummary,
};
use async_trait::async_trait;
use melstructs::{BlockHeight, CoinData, CoinID, Denom, Transaction, TxHash};
use melstructs::{Header, PoolKey, PoolState};
use nanorpc::nanorpc_derive;
use std::fmt::Debug;
use tmelcrypt::HashVal;
#[nanorpc_derive]
#[async_trait]
pub trait MelwalletdProtocol: Send + Sync {
async fn list_wallets(&self) -> Vec<String>;
async fn wallet_summary(&self, wallet_name: String)
-> Result<WalletSummary, WalletAccessError>;
async fn latest_header(&self) -> Result<Header, NetworkError>;
async fn melswap_info(&self, pool_key: PoolKey) -> Result<Option<PoolState>, NetworkError>;
async fn simulate_swap(
&self,
to: Denom,
from: Denom,
value: u128,
) -> Result<Option<SwapInfo>, NetworkError>;
async fn create_wallet(
&self,
wallet_name: String,
password: String,
secret: Option<String>,
) -> Result<(), CreateWalletError>;
async fn dump_coins(
&self,
wallet_name: String,
) -> Result<Vec<(CoinID, CoinData)>, WalletAccessError>;
async fn dump_transactions(
&self,
wallet_name: String,
) -> Result<Vec<(TxHash, Option<BlockHeight>)>, WalletAccessError>;
async fn lock_wallet(&self, wallet_name: String) -> Result<(), WalletAccessError>;
async fn unlock_wallet(
&self,
wallet_name: String,
password: String,
) -> Result<(), WalletAccessError>;
async fn export_sk(
&self,
wallet_name: String,
password: String,
) -> Result<String, WalletAccessError>;
async fn prepare_tx(
&self,
wallet_name: String,
request: PrepareTxArgs,
) -> Result<Transaction, NeedWallet<PrepareTxError>>;
async fn send_tx(
&self,
wallet_name: String,
tx: Transaction,
) -> Result<TxHash, NeedWallet<NetworkError>>;
async fn tx_balance(
&self,
wallet_name: String,
txhash: HashVal,
) -> Result<Option<TxBalance>, WalletAccessError>;
async fn tx_status(
&self,
wallet_name: String,
txhash: HashVal,
) -> Result<Option<TransactionStatus>, WalletAccessError>;
async fn send_faucet(&self, wallet_name: String) -> Result<TxHash, NeedWallet<NetworkError>>;
}