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