Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions controller/tests/accounts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,15 @@ fn accounts_test_impl(test_dir: &'static str) -> Result<(), libwallet::Error> {
},
)?;

// Use the requested account's stored height
{
wallet_inst!(wallet1, w);
assert_eq!(w.parent_key_id(), ExtKeychain::derive_key_id(2, 1, 0, 0, 0));
let account2 = ExtKeychain::derive_key_id(2, 2, 0, 0, 0);
let account2_info = libwallet::retrieve_info(w, &account2, 1)?;
assert_eq!(account2_info.last_confirmed_height, 12);
}

// other account should be untouched
{
wallet_inst!(wallet1, w);
Expand Down
2 changes: 1 addition & 1 deletion libwallet/src/api_impl/foreign.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ where

ret_slate.tx = Some(Slate::empty_transaction());

let height = w.last_confirmed_height()?;
let height = w.last_confirmed_height_for_parent(&parent_key_id)?;
let keychain = w.keychain(keychain_mask)?;

let context = tx::add_output_to_slate(
Expand Down
2 changes: 1 addition & 1 deletion libwallet/src/api_impl/owner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ where

let parent_key_id = w.parent_key_id();
let wallet_info = updater::retrieve_info(w, &parent_key_id, minimum_confirmations)?;
let current_height = w.last_confirmed_height()?;
let current_height = w.last_confirmed_height_for_parent(&parent_key_id)?;
let max_outputs = 500;
let change_outputs = 1;
let (amount, fee, input_count) = match selection::select_coins_and_fee(
Expand Down
13 changes: 11 additions & 2 deletions libwallet/src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -482,13 +482,22 @@ where
Ok(Identifier::from_path(&return_path))
}

/// Last verified height of outputs directly descending from the given parent key.
/// Last verified height of outputs directly descending from the current parent key.
pub fn last_confirmed_height(&mut self) -> Result<u64, Error> {
let parent_key_id = self.parent_key_id.clone();
self.last_confirmed_height_for_parent(&parent_key_id)
}

/// Last verified height of outputs directly descending from the given parent key.
pub(crate) fn last_confirmed_height_for_parent(
&mut self,
parent_key_id: &Identifier,
) -> Result<u64, Error> {
let batch = self.db.batch()?;
let last_confirmed_height = batch
.get_ser(
Some(CONFIRMED_HEIGHT_PREFIX),
&self.parent_key_id.to_bytes(),
&parent_key_id.to_bytes(),
None,
)?
.unwrap_or_else(|| 0);
Expand Down
19 changes: 12 additions & 7 deletions libwallet/src/internal/updater.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ where
}

/// Apply advanced filtering to resultset from retrieve_txs below
pub fn apply_advanced_tx_list_filtering<C, K>(
fn apply_advanced_tx_list_filtering<C, K>(
wallet: &mut WalletBackend<C, K>,
parent_key_id: Option<&Identifier>,
query_args: &RetrieveTxQueryArgs,
Expand Down Expand Up @@ -402,6 +402,7 @@ where

/// Refreshes the outputs in a wallet with the latest information
/// from a node
/// Also removes stale unconfirmed coinbase outputs across all accounts
pub fn refresh_outputs<C, K>(
wallet: &mut WalletBackend<C, K>,
keychain_mask: Option<&SecretKey>,
Expand All @@ -417,8 +418,12 @@ where
Ok(())
}

/// build a local map of wallet outputs keyed by commit
/// and a list of outputs we want to query the node for
/// Build a local map of wallet outputs keyed by commit.
/// The map keys identify outputs to query from the node.
/// If `update_all` is `false`, select outputs involved in outstanding
/// transactions for the account and outputs without a transaction log entry.
/// Returns mapping of output commit to tuple of derived key for output,
/// PMMR index, tx entry log identifier and check if output is unspent
pub fn map_wallet_outputs<C, K>(
wallet: &mut WalletBackend<C, K>,
keychain_mask: Option<&SecretKey>,
Expand Down Expand Up @@ -505,7 +510,7 @@ where
}

/// Apply refreshed API output data to the wallet
pub fn apply_api_outputs<C, K>(
fn apply_api_outputs<C, K>(
wallet: &mut WalletBackend<C, K>,
keychain_mask: Option<&SecretKey>,
wallet_outputs: &HashMap<pedersen::Commitment, (Identifier, Option<u64>, Option<u32>, bool)>,
Expand All @@ -522,7 +527,7 @@ where
// api output (if it exists) and refresh it in-place in the wallet.
// Note: minimizing the time we spend holding the wallet lock.
{
let last_confirmed_height = wallet.last_confirmed_height()?;
let last_confirmed_height = wallet.last_confirmed_height_for_parent(parent_key_id)?;
// If the server height is less than our confirmed height, don't apply
// these changes as the chain is syncing, incorrect or forking
if height < last_confirmed_height {
Expand Down Expand Up @@ -799,7 +804,7 @@ where
C: NodeClient,
K: Keychain,
{
let current_height = wallet.last_confirmed_height()?;
let current_height = wallet.last_confirmed_height_for_parent(parent_key_id)?;
let outputs = wallet
.iter()?
.filter(|out| out.root_key_id == *parent_key_id);
Expand Down Expand Up @@ -876,7 +881,7 @@ where

//TODO: Split up the output creation and the wallet insertion
/// Build a coinbase output and the corresponding kernel
pub fn receive_coinbase<C, K>(
fn receive_coinbase<C, K>(
wallet: &mut WalletBackend<C, K>,
keychain_mask: Option<&SecretKey>,
block_fees: &BlockFees,
Expand Down
3 changes: 3 additions & 0 deletions libwallet/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ pub use api_impl::types::{
};
pub use backend::{WalletBackend, WalletBatch};
pub use internal::scan::scan;
pub use internal::updater::{
map_wallet_outputs, refresh_outputs, retrieve_info, retrieve_outputs, retrieve_txs,
Comment thread
ardocrat marked this conversation as resolved.
};
pub use slate_versions::ser as dalek_ser;
pub use types::{
AcctPathMapping, BlockIdentifier, CbData, Context, NodeClient, NodeVersionInfo, OutputData,
Expand Down