use anyhow::Result;
use bitcoin::{Block, BlockHash, Transaction, Txid};
use serde_json::Value;
use crate::bitcoin::adapters::BitcoinPort;
use crate::bitcoin::protocol::BitcoinProtocol;
use crate::bitcoin::protocol::BPCLevel;
pub struct BitcoinProtocolAdapter {
compliance_level: BPCLevel,
url: String,
connected: bool,
}
impl BitcoinProtocolAdapter {
pub fn new(url: &str, compliance_level: BPCLevel) -> Self {
Self {
compliance_level,
url: url.to_string(),
connected: false,
}
}
pub fn compliance_level(&self) -> BPCLevel {
self.compliance_level
}
pub fn is_connected(&self) -> bool {
self.connected
}
pub fn verify_transaction(&self, tx: &Transaction) -> Result<bool> {
let protocol = BitcoinProtocol::new(self.compliance_level);
match protocol.verify_with_policy(tx) {
Ok(_) => Ok(true),
Err(_) => Ok(false),
}
}
}
impl BitcoinPort for BitcoinProtocolAdapter {
fn connect(&self) -> Result<()> {
Ok(())
}
fn disconnect(&self) -> Result<()> {
Ok(())
}
fn send_transaction(&self, tx: &Transaction) -> Result<Txid> {
self.verify_transaction(tx)?;
Ok(tx.txid())
}
fn get_transaction(&self, txid: &Txid) -> Result<Option<Transaction>> {
Ok(None)
}
fn get_block(&self, hash: &BlockHash) -> Result<Option<Block>> {
Ok(None)
}
fn get_blockchain_info(&self) -> Result<Value> {
Ok(serde_json::json!({
"chain": "main",
"blocks": 800000,
"headers": 800000,
"bestblockhash": "000000000000000000000000000000000000000000000000000000000000000",
"difficulty": 53911173001054.59,
"mediantime": 1714524195,
"verificationprogress": 0.9999915857973493,
"initialblockdownload": false,
"chainwork": "0000000000000000000000000000000000000000000000000000000000000000",
"size_on_disk": 650432985219,
"pruned": false,
}))
}
}