Merge bitcoindevkit/bdk#812: Implement ordering for TransactionDetails
d3d07564f28b68723630fcb03becdc9d5b8d72ae Implement ordering for TransactionDetails (benthecarman) Pull request description: <!-- You can erase any parts of this template not applicable to your Pull Request. --> ### Description Pulled from https://github.com/BitcoinDevShop/mutiny-web-poc/pull/189 Wallets should be able to sort the transactions easily, this makes it so you can just all `sort` on a list of tx details instead of needing to implement the sort_by yourself ### Checklists #### All Submissions: * [x] I've signed all my commits * [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk/blob/master/CONTRIBUTING.md) * [x] I ran `cargo fmt` and `cargo clippy` before committing ACKs for top commit: danielabrozzoni: utACK d3d07564f28b68723630fcb03becdc9d5b8d72ae Tree-SHA512: d2b53dc959897b71d71794f3c919f86f8b7886e6ea5f6ac511cfaca0c19b2f78784a23491b3010380cf41da7ef69fd9ca1be75437c53eca1c60bd6651d1fec41
This commit is contained in:
commit
634a0575cb
117
src/types.rs
117
src/types.rs
@ -247,6 +247,20 @@ pub struct TransactionDetails {
|
|||||||
pub confirmation_time: Option<BlockTime>,
|
pub confirmation_time: Option<BlockTime>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for TransactionDetails {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for TransactionDetails {
|
||||||
|
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||||
|
self.confirmation_time
|
||||||
|
.cmp(&other.confirmation_time)
|
||||||
|
.then_with(|| self.txid.cmp(&other.txid))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Block height and timestamp of a block
|
/// Block height and timestamp of a block
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default)]
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default)]
|
||||||
pub struct BlockTime {
|
pub struct BlockTime {
|
||||||
@ -256,6 +270,20 @@ pub struct BlockTime {
|
|||||||
pub timestamp: u64,
|
pub timestamp: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for BlockTime {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for BlockTime {
|
||||||
|
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||||
|
self.height
|
||||||
|
.cmp(&other.height)
|
||||||
|
.then_with(|| self.timestamp.cmp(&other.timestamp))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// **DEPRECATED**: Confirmation time of a transaction
|
/// **DEPRECATED**: Confirmation time of a transaction
|
||||||
///
|
///
|
||||||
/// The structure has been renamed to `BlockTime`
|
/// The structure has been renamed to `BlockTime`
|
||||||
@ -334,6 +362,95 @@ impl std::iter::Sum for Balance {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use bitcoin::hashes::Hash;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sort_block_time() {
|
||||||
|
let block_time_a = BlockTime {
|
||||||
|
height: 100,
|
||||||
|
timestamp: 100,
|
||||||
|
};
|
||||||
|
|
||||||
|
let block_time_b = BlockTime {
|
||||||
|
height: 100,
|
||||||
|
timestamp: 110,
|
||||||
|
};
|
||||||
|
|
||||||
|
let block_time_c = BlockTime {
|
||||||
|
height: 0,
|
||||||
|
timestamp: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut vec = vec![
|
||||||
|
block_time_a.clone(),
|
||||||
|
block_time_b.clone(),
|
||||||
|
block_time_c.clone(),
|
||||||
|
];
|
||||||
|
vec.sort();
|
||||||
|
let expected = vec![block_time_c, block_time_a, block_time_b];
|
||||||
|
|
||||||
|
assert_eq!(vec, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sort_tx_details() {
|
||||||
|
let block_time_a = BlockTime {
|
||||||
|
height: 100,
|
||||||
|
timestamp: 100,
|
||||||
|
};
|
||||||
|
|
||||||
|
let block_time_b = BlockTime {
|
||||||
|
height: 0,
|
||||||
|
timestamp: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let tx_details_a = TransactionDetails {
|
||||||
|
transaction: None,
|
||||||
|
txid: Txid::from_inner([0; 32]),
|
||||||
|
received: 0,
|
||||||
|
sent: 0,
|
||||||
|
fee: None,
|
||||||
|
confirmation_time: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let tx_details_b = TransactionDetails {
|
||||||
|
transaction: None,
|
||||||
|
txid: Txid::from_inner([0; 32]),
|
||||||
|
received: 0,
|
||||||
|
sent: 0,
|
||||||
|
fee: None,
|
||||||
|
confirmation_time: Some(block_time_a),
|
||||||
|
};
|
||||||
|
|
||||||
|
let tx_details_c = TransactionDetails {
|
||||||
|
transaction: None,
|
||||||
|
txid: Txid::from_inner([0; 32]),
|
||||||
|
received: 0,
|
||||||
|
sent: 0,
|
||||||
|
fee: None,
|
||||||
|
confirmation_time: Some(block_time_b.clone()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let tx_details_d = TransactionDetails {
|
||||||
|
transaction: None,
|
||||||
|
txid: Txid::from_inner([1; 32]),
|
||||||
|
received: 0,
|
||||||
|
sent: 0,
|
||||||
|
fee: None,
|
||||||
|
confirmation_time: Some(block_time_b),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut vec = vec![
|
||||||
|
tx_details_a.clone(),
|
||||||
|
tx_details_b.clone(),
|
||||||
|
tx_details_c.clone(),
|
||||||
|
tx_details_d.clone(),
|
||||||
|
];
|
||||||
|
vec.sort();
|
||||||
|
let expected = vec![tx_details_a, tx_details_c, tx_details_d, tx_details_b];
|
||||||
|
|
||||||
|
assert_eq!(vec, expected)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn can_store_feerate_in_const() {
|
fn can_store_feerate_in_const() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user