use crate::ports::Port;
#[derive(Debug, Clone, PartialEq)]
pub enum TxStatus {
Pending,
Confirmed,
Rejected,
Unknown,
}
#[derive(Debug, Clone, PartialEq)]
pub enum PSBTRole {
Creator,
Updater,
Signer,
Finalizer,
Extractor,
}
#[derive(Debug, Clone)]
pub struct PSBT {
pub tx_bytes: Vec<u8>,
pub global_map: Vec<(String, Vec<u8>)>,
pub input_maps: Vec<Vec<(String, Vec<u8>)>>,
pub output_maps: Vec<Vec<(String, Vec<u8>)>>,
}
pub struct WalletPort {
connected: bool,
has_psbt_support: bool,
transactions: Vec<(String, TxStatus)>,
}
impl WalletPort {
pub fn new() -> Self {
WalletPort {
connected: false,
has_psbt_support: true, transactions: Vec::new(),
}
}
pub fn connect(&mut self) -> Result<(), String> {
self.connected = true;
Ok(())
}
pub fn disconnect(&mut self) {
self.connected = false;
}
pub fn has_psbt_support(&self) -> bool {
self.has_psbt_support
}
pub fn create_psbt(&self, _inputs: Vec<Vec<u8>>, _outputs: Vec<(String, u64)>) -> Result<PSBT, String> {
if !self.connected {
return Err("Not connected".to_string());
}
Ok(PSBT {
tx_bytes: vec![0; 100], global_map: vec![("version".to_string(), vec![2, 0, 0, 0])],
input_maps: vec![vec![("non_witness_utxo".to_string(), vec![0; 100])]],
output_maps: vec![vec![("script".to_string(), vec![0; 34])]],
})
}
pub fn sign_psbt(&self, psbt: PSBT) -> Result<PSBT, String> {
if !self.connected {
return Err("Not connected".to_string());
}
Ok(psbt)
}
pub fn finalize_psbt(&self, psbt: PSBT) -> Result<Vec<u8>, String> {
if !self.connected {
return Err("Not connected".to_string());
}
Ok(vec![0; 200]) }
pub fn get_transaction_status(&self, tx_id: &str) -> TxStatus {
for (id, status) in &self.transactions {
if id == tx_id {
return status.clone();
}
}
TxStatus::Unknown
}
}
impl Port for WalletPort {
fn name(&self) -> &'static str {
"wallet"
}
fn version(&self) -> &'static str {
"1.0.0"
}
fn is_connected(&self) -> bool {
self.connected
}
}