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>, | ||||
| } | ||||
| 
 | ||||
| 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
 | ||||
| #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default)] | ||||
| pub struct BlockTime { | ||||
| @ -256,6 +270,20 @@ pub struct BlockTime { | ||||
|     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
 | ||||
| ///
 | ||||
| /// The structure has been renamed to `BlockTime`
 | ||||
| @ -334,6 +362,95 @@ impl std::iter::Sum for Balance { | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     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] | ||||
|     fn can_store_feerate_in_const() { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user