Rename ConfirmationTime
to BlockTime
This commit is contained in:
parent
3e5bb077ac
commit
2c77329333
@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- BIP39 implementation dependency, in `keys::bip39` changed from tiny-bip39 to rust-bip39.
|
||||
- Add new method on the `TxBuilder` to embed data in the transaction via `OP_RETURN`. To allow that a fix to check the dust only on spendable output has been introduced.
|
||||
- Update the `Database` trait to store the last sync timestamp and block height
|
||||
- Rename `ConfirmationTime` to `BlockTime`
|
||||
|
||||
## [v0.13.0] - [v0.12.0]
|
||||
|
||||
|
@ -71,7 +71,7 @@ use super::{Blockchain, Capability, ConfigurableBlockchain, Progress};
|
||||
use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils};
|
||||
use crate::error::Error;
|
||||
use crate::types::{KeychainKind, LocalUtxo, TransactionDetails};
|
||||
use crate::{ConfirmationTime, FeeRate};
|
||||
use crate::{BlockTime, FeeRate};
|
||||
|
||||
use peer::*;
|
||||
use store::*;
|
||||
@ -206,7 +206,7 @@ impl CompactFiltersBlockchain {
|
||||
transaction: Some(tx.clone()),
|
||||
received: incoming,
|
||||
sent: outgoing,
|
||||
confirmation_time: ConfirmationTime::new(height, timestamp),
|
||||
confirmation_time: BlockTime::new(height, timestamp),
|
||||
verified: height.is_some(),
|
||||
fee: Some(inputs_sum.saturating_sub(outputs_sum)),
|
||||
};
|
||||
|
@ -37,7 +37,7 @@ use crate::blockchain::{Blockchain, Capability, ConfigurableBlockchain, Progress
|
||||
use crate::database::{BatchDatabase, DatabaseUtils};
|
||||
use crate::descriptor::{get_checksum, IntoWalletDescriptor};
|
||||
use crate::wallet::utils::SecpCtx;
|
||||
use crate::{ConfirmationTime, Error, FeeRate, KeychainKind, LocalUtxo, TransactionDetails};
|
||||
use crate::{BlockTime, Error, FeeRate, KeychainKind, LocalUtxo, TransactionDetails};
|
||||
use bitcoincore_rpc::json::{
|
||||
GetAddressInfoResultLabel, ImportMultiOptions, ImportMultiRequest,
|
||||
ImportMultiRequestScriptPubkey, ImportMultiRescanSince,
|
||||
@ -230,7 +230,7 @@ impl Blockchain for RpcBlockchain {
|
||||
list_txs_ids.insert(txid);
|
||||
if let Some(mut known_tx) = known_txs.get_mut(&txid) {
|
||||
let confirmation_time =
|
||||
ConfirmationTime::new(tx_result.info.blockheight, tx_result.info.blocktime);
|
||||
BlockTime::new(tx_result.info.blockheight, tx_result.info.blocktime);
|
||||
if confirmation_time != known_tx.confirmation_time {
|
||||
// reorg may change tx height
|
||||
debug!(
|
||||
@ -266,7 +266,7 @@ impl Blockchain for RpcBlockchain {
|
||||
let td = TransactionDetails {
|
||||
transaction: Some(tx),
|
||||
txid: tx_result.info.txid,
|
||||
confirmation_time: ConfirmationTime::new(
|
||||
confirmation_time: BlockTime::new(
|
||||
tx_result.info.blockheight,
|
||||
tx_result.info.blocktime,
|
||||
),
|
||||
|
@ -21,7 +21,7 @@ use bitcoin::{BlockHeader, OutPoint, Script, Transaction, Txid};
|
||||
use super::*;
|
||||
use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils};
|
||||
use crate::error::Error;
|
||||
use crate::types::{ConfirmationTime, KeychainKind, LocalUtxo, TransactionDetails};
|
||||
use crate::types::{BlockTime, KeychainKind, LocalUtxo, TransactionDetails};
|
||||
use crate::wallet::time::Instant;
|
||||
use crate::wallet::utils::ChunksIterator;
|
||||
|
||||
@ -151,7 +151,7 @@ pub trait ElectrumLikeSync {
|
||||
// check if tx height matches, otherwise updates it. timestamp is not in the if clause
|
||||
// because we are not asking headers for confirmed tx we know about
|
||||
if tx_details.confirmation_time.as_ref().map(|c| c.height) != height {
|
||||
let confirmation_time = ConfirmationTime::new(height, timestamp);
|
||||
let confirmation_time = BlockTime::new(height, timestamp);
|
||||
let mut new_tx_details = tx_details.clone();
|
||||
new_tx_details.confirmation_time = confirmation_time;
|
||||
batch.set_tx(&new_tx_details)?;
|
||||
@ -359,7 +359,7 @@ fn save_transaction_details_and_utxos<D: BatchDatabase>(
|
||||
transaction: Some(tx),
|
||||
received: incoming,
|
||||
sent: outgoing,
|
||||
confirmation_time: ConfirmationTime::new(height, timestamp),
|
||||
confirmation_time: BlockTime::new(height, timestamp),
|
||||
fee: Some(inputs_sum.saturating_sub(outputs_sum)), /* if the tx is a coinbase, fees would be negative */
|
||||
verified: height.is_some(),
|
||||
};
|
||||
|
@ -144,7 +144,7 @@ impl BatchOperations for AnyDatabase {
|
||||
fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
|
||||
impl_inner_method!(AnyDatabase, self, set_last_index, keychain, value)
|
||||
}
|
||||
fn set_last_sync_time(&mut self, last_sync_time: ConfirmationTime) -> Result<(), Error> {
|
||||
fn set_last_sync_time(&mut self, last_sync_time: BlockTime) -> Result<(), Error> {
|
||||
impl_inner_method!(AnyDatabase, self, set_last_sync_time, last_sync_time)
|
||||
}
|
||||
|
||||
@ -183,7 +183,7 @@ impl BatchOperations for AnyDatabase {
|
||||
fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
|
||||
impl_inner_method!(AnyDatabase, self, del_last_index, keychain)
|
||||
}
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<BlockTime>, Error> {
|
||||
impl_inner_method!(AnyDatabase, self, del_last_sync_time)
|
||||
}
|
||||
}
|
||||
@ -247,7 +247,7 @@ impl Database for AnyDatabase {
|
||||
fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
|
||||
impl_inner_method!(AnyDatabase, self, get_last_index, keychain)
|
||||
}
|
||||
fn get_last_sync_time(&self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn get_last_sync_time(&self) -> Result<Option<BlockTime>, Error> {
|
||||
impl_inner_method!(AnyDatabase, self, get_last_sync_time)
|
||||
}
|
||||
|
||||
@ -281,7 +281,7 @@ impl BatchOperations for AnyBatch {
|
||||
fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
|
||||
impl_inner_method!(AnyBatch, self, set_last_index, keychain, value)
|
||||
}
|
||||
fn set_last_sync_time(&mut self, last_sync_time: ConfirmationTime) -> Result<(), Error> {
|
||||
fn set_last_sync_time(&mut self, last_sync_time: BlockTime) -> Result<(), Error> {
|
||||
impl_inner_method!(AnyBatch, self, set_last_sync_time, last_sync_time)
|
||||
}
|
||||
|
||||
@ -314,7 +314,7 @@ impl BatchOperations for AnyBatch {
|
||||
fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
|
||||
impl_inner_method!(AnyBatch, self, del_last_index, keychain)
|
||||
}
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<BlockTime>, Error> {
|
||||
impl_inner_method!(AnyBatch, self, del_last_sync_time)
|
||||
}
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ macro_rules! impl_batch_operations {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn set_last_sync_time(&mut self, ct: ConfirmationTime) -> Result<(), Error> {
|
||||
fn set_last_sync_time(&mut self, ct: BlockTime) -> Result<(), Error> {
|
||||
let key = MapKey::LastSyncTime.as_map_key();
|
||||
self.insert(key, serde_json::to_vec(&ct)?)$($after_insert)*;
|
||||
|
||||
@ -176,7 +176,7 @@ macro_rules! impl_batch_operations {
|
||||
}
|
||||
}
|
||||
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<BlockTime>, Error> {
|
||||
let key = MapKey::LastSyncTime.as_map_key();
|
||||
let res = self.remove(key);
|
||||
let res = $process_delete!(res);
|
||||
@ -357,7 +357,7 @@ impl Database for Tree {
|
||||
.transpose()
|
||||
}
|
||||
|
||||
fn get_last_sync_time(&self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn get_last_sync_time(&self) -> Result<Option<BlockTime>, Error> {
|
||||
let key = MapKey::LastSyncTime.as_map_key();
|
||||
Ok(self
|
||||
.get(key)?
|
||||
|
@ -183,7 +183,7 @@ impl BatchOperations for MemoryDatabase {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
fn set_last_sync_time(&mut self, ct: ConfirmationTime) -> Result<(), Error> {
|
||||
fn set_last_sync_time(&mut self, ct: BlockTime) -> Result<(), Error> {
|
||||
let key = MapKey::LastSyncTime.as_map_key();
|
||||
self.map.insert(key, Box::new(ct));
|
||||
|
||||
@ -279,7 +279,7 @@ impl BatchOperations for MemoryDatabase {
|
||||
Some(b) => Ok(Some(*b.downcast_ref().unwrap())),
|
||||
}
|
||||
}
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<BlockTime>, Error> {
|
||||
let key = MapKey::LastSyncTime.as_map_key();
|
||||
let res = self.map.remove(&key);
|
||||
self.deleted_keys.push(key);
|
||||
@ -423,7 +423,7 @@ impl Database for MemoryDatabase {
|
||||
Ok(self.map.get(&key).map(|b| *b.downcast_ref().unwrap()))
|
||||
}
|
||||
|
||||
fn get_last_sync_time(&self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn get_last_sync_time(&self) -> Result<Option<BlockTime>, Error> {
|
||||
let key = MapKey::LastSyncTime.as_map_key();
|
||||
Ok(self
|
||||
.map
|
||||
@ -505,7 +505,7 @@ macro_rules! populate_test_db {
|
||||
let txid = tx.txid();
|
||||
let confirmation_time = tx_meta
|
||||
.min_confirmations
|
||||
.map(|conf| $crate::ConfirmationTime {
|
||||
.map(|conf| $crate::BlockTime {
|
||||
height: current_height.unwrap().checked_sub(conf as u32).unwrap(),
|
||||
timestamp: 0,
|
||||
});
|
||||
|
@ -65,7 +65,7 @@ pub trait BatchOperations {
|
||||
/// Store the last derivation index for a given keychain.
|
||||
fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error>;
|
||||
/// Store the sync time in terms of block height and timestamp
|
||||
fn set_last_sync_time(&mut self, last_sync_time: ConfirmationTime) -> Result<(), Error>;
|
||||
fn set_last_sync_time(&mut self, last_sync_time: BlockTime) -> Result<(), Error>;
|
||||
|
||||
/// Delete a script_pubkey given the keychain and its child number.
|
||||
fn del_script_pubkey_from_path(
|
||||
@ -94,7 +94,7 @@ pub trait BatchOperations {
|
||||
/// Reset the last sync time to `None`
|
||||
///
|
||||
/// Returns the removed value
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<ConfirmationTime>, Error>;
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<BlockTime>, Error>;
|
||||
}
|
||||
|
||||
/// Trait for reading data from a database
|
||||
@ -141,7 +141,7 @@ pub trait Database: BatchOperations {
|
||||
/// Return the last defivation index for a keychain.
|
||||
fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error>;
|
||||
/// Return the last sync time, if present
|
||||
fn get_last_sync_time(&self) -> Result<Option<ConfirmationTime>, Error>;
|
||||
fn get_last_sync_time(&self) -> Result<Option<BlockTime>, Error>;
|
||||
|
||||
/// Increment the last derivation index for a keychain and return it
|
||||
///
|
||||
@ -333,7 +333,7 @@ pub mod test {
|
||||
received: 1337,
|
||||
sent: 420420,
|
||||
fee: Some(140),
|
||||
confirmation_time: Some(ConfirmationTime {
|
||||
confirmation_time: Some(BlockTime {
|
||||
timestamp: 123456,
|
||||
height: 1000,
|
||||
}),
|
||||
@ -388,7 +388,7 @@ pub mod test {
|
||||
pub fn test_last_sync_time<D: Database>(mut tree: D) {
|
||||
assert!(tree.get_last_sync_time().unwrap().is_none());
|
||||
|
||||
tree.set_last_sync_time(ConfirmationTime {
|
||||
tree.set_last_sync_time(BlockTime {
|
||||
height: 100,
|
||||
timestamp: 1000,
|
||||
})
|
||||
|
@ -206,7 +206,7 @@ impl SqliteDatabase {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn update_last_sync_time(&self, ct: ConfirmationTime) -> Result<i64, Error> {
|
||||
fn update_last_sync_time(&self, ct: BlockTime) -> Result<i64, Error> {
|
||||
let mut statement = self.connection.prepare_cached(
|
||||
"INSERT INTO last_sync_time (id, height, timestamp) VALUES (0, :height, :timestamp) ON CONFLICT(id) DO UPDATE SET height=:height, timestamp=:timestamp WHERE id = 0",
|
||||
)?;
|
||||
@ -389,7 +389,7 @@ impl SqliteDatabase {
|
||||
};
|
||||
|
||||
let confirmation_time = match (height, timestamp) {
|
||||
(Some(height), Some(timestamp)) => Some(ConfirmationTime { height, timestamp }),
|
||||
(Some(height), Some(timestamp)) => Some(BlockTime { height, timestamp }),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
@ -423,7 +423,7 @@ impl SqliteDatabase {
|
||||
let verified: bool = row.get(6)?;
|
||||
|
||||
let confirmation_time = match (height, timestamp) {
|
||||
(Some(height), Some(timestamp)) => Some(ConfirmationTime { height, timestamp }),
|
||||
(Some(height), Some(timestamp)) => Some(BlockTime { height, timestamp }),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
@ -466,7 +466,7 @@ impl SqliteDatabase {
|
||||
};
|
||||
|
||||
let confirmation_time = match (height, timestamp) {
|
||||
(Some(height), Some(timestamp)) => Some(ConfirmationTime { height, timestamp }),
|
||||
(Some(height), Some(timestamp)) => Some(BlockTime { height, timestamp }),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
@ -501,12 +501,12 @@ impl SqliteDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
fn select_last_sync_time(&self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn select_last_sync_time(&self) -> Result<Option<BlockTime>, Error> {
|
||||
let mut statement = self
|
||||
.connection
|
||||
.prepare_cached("SELECT height, timestamp FROM last_sync_time WHERE id = 0")?;
|
||||
let mut rows = statement.query_map([], |row| {
|
||||
Ok(ConfirmationTime {
|
||||
Ok(BlockTime {
|
||||
height: row.get(0)?,
|
||||
timestamp: row.get(1)?,
|
||||
})
|
||||
@ -658,7 +658,7 @@ impl BatchOperations for SqliteDatabase {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn set_last_sync_time(&mut self, ct: ConfirmationTime) -> Result<(), Error> {
|
||||
fn set_last_sync_time(&mut self, ct: BlockTime) -> Result<(), Error> {
|
||||
self.update_last_sync_time(ct)?;
|
||||
Ok(())
|
||||
}
|
||||
@ -749,7 +749,7 @@ impl BatchOperations for SqliteDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn del_last_sync_time(&mut self) -> Result<Option<BlockTime>, Error> {
|
||||
match self.select_last_sync_time()? {
|
||||
Some(value) => {
|
||||
self.delete_last_sync_time()?;
|
||||
@ -870,7 +870,7 @@ impl Database for SqliteDatabase {
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
fn get_last_sync_time(&self) -> Result<Option<ConfirmationTime>, Error> {
|
||||
fn get_last_sync_time(&self) -> Result<Option<BlockTime>, Error> {
|
||||
self.select_last_sync_time()
|
||||
}
|
||||
|
||||
|
18
src/types.rs
18
src/types.rs
@ -210,7 +210,7 @@ pub struct TransactionDetails {
|
||||
pub fee: Option<u64>,
|
||||
/// If the transaction is confirmed, contains height and timestamp of the block containing the
|
||||
/// transaction, unconfirmed transaction contains `None`.
|
||||
pub confirmation_time: Option<ConfirmationTime>,
|
||||
pub confirmation_time: Option<BlockTime>,
|
||||
/// Whether the tx has been verified against the consensus rules
|
||||
///
|
||||
/// Confirmed txs are considered "verified" by default, while unconfirmed txs are checked to
|
||||
@ -222,20 +222,26 @@ pub struct TransactionDetails {
|
||||
pub verified: bool,
|
||||
}
|
||||
|
||||
/// Block height and timestamp of the block containing the confirmed transaction
|
||||
/// Block height and timestamp of a block
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default)]
|
||||
pub struct ConfirmationTime {
|
||||
pub struct BlockTime {
|
||||
/// confirmation block height
|
||||
pub height: u32,
|
||||
/// confirmation block timestamp
|
||||
pub timestamp: u64,
|
||||
}
|
||||
|
||||
impl ConfirmationTime {
|
||||
/// Returns `Some` `ConfirmationTime` if both `height` and `timestamp` are `Some`
|
||||
/// **DEPRECATED**: Confirmation time of a transaction
|
||||
///
|
||||
/// The structure has been renamed to `BlockTime`
|
||||
#[deprecated(note = "This structure has been renamed to `BlockTime`")]
|
||||
pub type ConfirmationTime = BlockTime;
|
||||
|
||||
impl BlockTime {
|
||||
/// Returns `Some` `BlockTime` if both `height` and `timestamp` are `Some`
|
||||
pub fn new(height: Option<u32>, timestamp: Option<u64>) -> Option<Self> {
|
||||
match (height, timestamp) {
|
||||
(Some(height), Some(timestamp)) => Some(ConfirmationTime { height, timestamp }),
|
||||
(Some(height), Some(timestamp)) => Some(BlockTime { height, timestamp }),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
@ -212,7 +212,7 @@ mod test {
|
||||
use crate::database::{memory::MemoryDatabase, BatchOperations};
|
||||
use crate::types::TransactionDetails;
|
||||
use crate::wallet::Wallet;
|
||||
use crate::ConfirmationTime;
|
||||
use crate::BlockTime;
|
||||
|
||||
fn get_test_db() -> MemoryDatabase {
|
||||
let mut db = MemoryDatabase::new();
|
||||
@ -226,7 +226,7 @@ mod test {
|
||||
received: 100_000,
|
||||
sent: 0,
|
||||
fee: Some(500),
|
||||
confirmation_time: Some(ConfirmationTime {
|
||||
confirmation_time: Some(BlockTime {
|
||||
timestamp: 12345678,
|
||||
height: 5000,
|
||||
}),
|
||||
|
@ -1554,7 +1554,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
let last_sync_time = ConfirmationTime {
|
||||
let last_sync_time = BlockTime {
|
||||
height: maybe_await!(self.client.get_height())?,
|
||||
timestamp: time::get_timestamp(),
|
||||
};
|
||||
@ -2792,7 +2792,7 @@ pub(crate) mod test {
|
||||
let txid = tx.txid();
|
||||
// skip saving the utxos, we know they can't be used anyways
|
||||
details.transaction = Some(tx);
|
||||
details.confirmation_time = Some(ConfirmationTime {
|
||||
details.confirmation_time = Some(BlockTime {
|
||||
timestamp: 12345678,
|
||||
height: 42,
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user