-
Notifications
You must be signed in to change notification settings - Fork 278
/
Copy pathqueryable.rs
52 lines (43 loc) · 1.76 KB
/
queryable.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// To the extent possible under law, the author(s) have dedicated all
// copyright and related and neighboring rights to this software to
// the public domain worldwide. This software is distributed without
// any warranty.
//
// You should have received a copy of the CC0 Public Domain Dedication
// along with this software.
// If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
//
use crate::bitcoin;
use crate::client::Result;
use crate::client::RpcApi;
/// A type that can be queried from Bitcoin Core.
pub trait Queryable<C: RpcApi>: Sized {
/// Type of the ID used to query the item.
type Id;
/// Query the item using `rpc` and convert to `Self`.
fn query(rpc: &C, id: &Self::Id) -> Result<Self>;
}
impl<C: RpcApi> Queryable<C> for bitcoin::block::Block {
type Id = bitcoin::BlockHash;
fn query(rpc: &C, id: &Self::Id) -> Result<Self> {
let rpc_name = "getblock";
let hex: String = rpc.call(rpc_name, &[serde_json::to_value(id)?, 0.into()])?;
let bytes: Vec<u8> = bitcoin::hashes::hex::FromHex::from_hex(&hex)?;
Ok(bitcoin::consensus::encode::deserialize(&bytes)?)
}
}
impl<C: RpcApi> Queryable<C> for bitcoin::transaction::Transaction {
type Id = bitcoin::Txid;
fn query(rpc: &C, id: &Self::Id) -> Result<Self> {
let rpc_name = "getrawtransaction";
let hex: String = rpc.call(rpc_name, &[serde_json::to_value(id)?])?;
let bytes: Vec<u8> = bitcoin::hashes::hex::FromHex::from_hex(&hex)?;
Ok(bitcoin::consensus::encode::deserialize(&bytes)?)
}
}
impl<C: RpcApi> Queryable<C> for Option<crate::json::GetTxOutResult> {
type Id = bitcoin::OutPoint;
fn query(rpc: &C, id: &Self::Id) -> Result<Self> {
rpc.get_tx_out(&id.txid, id.vout, Some(true))
}
}