This allows us to skip adding an extra input to `Wallet::insert_tx`.
Also remove redundant logic.
fn get_test_utxos() -> Vec<WeightedUtxo> {
vec![
- utxo(100_000, 0, ConfirmationTime::Unconfirmed),
- utxo(FEE_AMOUNT - 40, 1, ConfirmationTime::Unconfirmed),
- utxo(200_000, 2, ConfirmationTime::Unconfirmed),
+ utxo(100_000, 0, ConfirmationTime::Unconfirmed { last_seen: 0 }),
+ utxo(
+ FEE_AMOUNT - 40,
+ 1,
+ ConfirmationTime::Unconfirmed { last_seen: 0 },
+ ),
+ utxo(200_000, 2, ConfirmationTime::Unconfirmed { last_seen: 0 }),
]
}
time: rng.next_u64(),
}
} else {
- ConfirmationTime::Unconfirmed
+ ConfirmationTime::Unconfirmed { last_seen: 0 }
},
}),
});
keychain: KeychainKind::External,
is_spent: false,
derivation_index: 42,
- confirmation_time: ConfirmationTime::Unconfirmed,
+ confirmation_time: ConfirmationTime::Unconfirmed { last_seen: 0 },
}),
};
vec![utxo; utxos_number]
let required = vec![utxos[0].clone()];
let mut optional = utxos[1..].to_vec();
- optional.push(utxo(500_000, 3, ConfirmationTime::Unconfirmed));
+ optional.push(utxo(
+ 500_000,
+ 3,
+ ConfirmationTime::Unconfirmed { last_seen: 0 },
+ ));
// Defensive assertions, for sanity and in case someone changes the test utxos vector.
let amount: u64 = required.iter().map(|u| u.utxo.txout().value).sum();
height: 5000,
time: 0,
},
- None,
)
.unwrap();
wallet
{
let changeset = self.chain.insert_block(block_id)?;
let changed = !changeset.is_empty();
- if changed {
- self.persist.stage(changeset.into());
- }
+ self.persist.stage(changeset.into());
Ok(changed)
}
&mut self,
tx: Transaction,
position: ConfirmationTime,
- seen_at: Option<u64>,
) -> Result<bool, InsertTxError>
where
D: PersistBackend<ChangeSet>,
{
let tip = self.chain.tip();
- if let ConfirmationTime::Confirmed { height, .. } = position {
- let tip_height = tip.map(|b| b.height);
- if Some(height) > tip_height {
- return Err(InsertTxError::ConfirmationHeightCannotBeGreaterThanTip {
- tip_height,
- tx_height: height,
- });
- }
- }
-
- let anchor = match position {
+ let (anchor, last_seen) = match position {
ConfirmationTime::Confirmed { height, time } => {
let tip_height = tip.map(|b| b.height);
if Some(height) > tip_height {
tx_height: height,
});
}
- Some(ConfirmationTimeAnchor {
- anchor_block: tip.expect("already checked if tip_height > height"),
- confirmation_height: height,
- confirmation_time: time,
- })
+ (
+ Some(ConfirmationTimeAnchor {
+ anchor_block: tip.expect("already checked if tip_height > height"),
+ confirmation_height: height,
+ confirmation_time: time,
+ }),
+ None,
+ )
}
- ConfirmationTime::Unconfirmed => None,
+ ConfirmationTime::Unconfirmed { last_seen } => (None, Some(last_seen)),
};
- let changeset: ChangeSet = self.indexed_graph.insert_tx(&tx, anchor, seen_at).into();
+ let changeset: ChangeSet = self.indexed_graph.insert_tx(&tx, anchor, last_seen).into();
let changed = !changeset.is_empty();
- if changed {
- self.persist.stage(changeset);
- }
+ self.persist.stage(changeset);
Ok(changed)
}
let transaction_details = TransactionDetails {
transaction: None,
txid,
- confirmation_time: ConfirmationTime::Unconfirmed,
+ confirmation_time: ConfirmationTime::Unconfirmed { last_seen: 0 },
received,
sent,
fee: Some(fee_amount),
spendable &=
(current_height.saturating_sub(height)) >= COINBASE_MATURITY;
}
- ConfirmationTime::Unconfirmed => spendable = false,
+ ConfirmationTime::Unconfirmed { .. } => spendable = false,
}
}
}
changeset.append(self.indexed_graph.apply_update(update.graph).into());
let changed = !changeset.is_empty();
- if changed {
- self.persist.stage(changeset);
- }
+ self.persist.stage(changeset);
Ok(changed)
}
self.persist.staged()
}
- /// Get a reference to the inner [`TxGraph`](bdk_chain::tx_graph::TxGraph).
- pub fn as_graph(&self) -> &TxGraph<ConfirmationTimeAnchor> {
+ /// Get a reference to the inner [`TxGraph`].
+ pub fn tx_graph(&self) -> &TxGraph<ConfirmationTimeAnchor> {
self.indexed_graph.graph()
}
- pub fn as_index(&self) -> &KeychainTxOutIndex<KeychainKind> {
+ /// Get a reference to the inner [`KeychainTxOutIndex`].
+ pub fn spk_index(&self) -> &KeychainTxOutIndex<KeychainKind> {
&self.indexed_graph.index
}
- pub fn as_chain(&self) -> &LocalChain {
+ /// Get a reference to the inner [`LocalChain`].
+ pub fn local_chain(&self) -> &LocalChain {
&self.chain
}
}
let _ = wallet.insert_tx(tx.clone(), ConfirmationTime::Confirmed {
height: 500,
time: 50_000
- }, None);
+ });
wallet
}}
txout: Default::default(),
keychain: KeychainKind::External,
is_spent: false,
- confirmation_time: ConfirmationTime::Unconfirmed,
+ confirmation_time: ConfirmationTime::Unconfirmed { last_seen: 0 },
derivation_index: 0,
},
LocalUtxo {
height: 1_000,
time: 100,
},
- None,
)
.unwrap();
height,
time: 42_000,
},
- TxHeight::Unconfirmed => ConfirmationTime::Unconfirmed,
+ TxHeight::Unconfirmed => ConfirmationTime::Unconfirmed { last_seen: 0 },
},
- None,
)
.unwrap();
lock_time: PackedLockTime(0),
};
wallet
- .insert_tx(small_output_tx.clone(), ConfirmationTime::Unconfirmed, None)
+ .insert_tx(
+ small_output_tx.clone(),
+ ConfirmationTime::Unconfirmed { last_seen: 0 },
+ )
.unwrap();
let addr = Address::from_str("2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX").unwrap();
};
wallet
- .insert_tx(small_output_tx.clone(), ConfirmationTime::Unconfirmed, None)
+ .insert_tx(
+ small_output_tx.clone(),
+ ConfirmationTime::Unconfirmed { last_seen: 0 },
+ )
.unwrap();
let addr = Address::from_str("2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX").unwrap();
}],
};
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let external_policy = wallet.policies(KeychainKind::External).unwrap().unwrap();
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
wallet.build_fee_bump(txid).unwrap().finish().unwrap();
}
height: 42,
time: 42_000,
},
- None,
)
.unwrap();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
height: wallet.latest_checkpoint().unwrap().height,
time: 42_000,
},
- None,
)
.unwrap();
let addr = Address::from_str("2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX").unwrap();
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
assert_eq!(original_details.sent, 25_000);
.observed_as
.cloned()
.into(),
- None,
)
.unwrap();
let outpoint = OutPoint {
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
assert_eq!(original_details.sent, 25_000);
.observed_as
.cloned()
.into();
- wallet.insert_tx(init_tx, pos, None).unwrap();
+ wallet.insert_tx(init_tx, pos).unwrap();
let addr = Address::from_str("2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX").unwrap();
let mut builder = wallet.build_tx().coin_selection(LargestFirstCoinSelection);
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
let tx = psbt.extract_tx();
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
// now bump the fees without using `allow_shrinking`. the wallet should add an
assert_eq!(tx.output.len(), 2);
let txid = tx.txid();
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
}
wallet
- .insert_tx(tx.clone(), ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx.clone(), ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
// the new fee_rate is low enough that just reducing the change would be fine, but we force
// the addition of an extra input with `add_utxo()`
txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
}
wallet
- .insert_tx(tx.clone(), ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx.clone(), ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
// the new fee_rate is low enough that just reducing the change would be fine, but we force
txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
}
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
builder.fee_rate(FeeRate::from_sat_per_vb(25.0));
txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
}
wallet
- .insert_tx(tx, ConfirmationTime::Unconfirmed, None)
+ .insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let mut builder = wallet.build_fee_bump(txid).unwrap();
height: confirmation_height,
time: 30_000,
},
- None,
)
.unwrap();
)]
pub enum ConfirmationTime {
Confirmed { height: u32, time: u64 },
- Unconfirmed,
+ Unconfirmed { last_seen: u64 },
}
impl sparse_chain::ChainPosition for ConfirmationTime {
fn height(&self) -> TxHeight {
match self {
ConfirmationTime::Confirmed { height, .. } => TxHeight::Confirmed(*height),
- ConfirmationTime::Unconfirmed => TxHeight::Unconfirmed,
+ ConfirmationTime::Unconfirmed { .. } => TxHeight::Unconfirmed,
}
}
height,
time: u64::MAX,
},
- TxHeight::Unconfirmed => Self::Unconfirmed,
+ TxHeight::Unconfirmed => Self::Unconfirmed { last_seen: 0 },
}
}
height,
time: u64::MIN,
},
- TxHeight::Unconfirmed => Self::Unconfirmed,
+ TxHeight::Unconfirmed => Self::Unconfirmed { last_seen: 0 },
}
}
}
height: a.confirmation_height,
time: a.confirmation_time,
},
- ObservedAs::Unconfirmed(_) => Self::Unconfirmed,
+ ObservedAs::Unconfirmed(_) => Self::Unconfirmed { last_seen: 0 },
}
}
}
let _ = tracker.txout_index.reveal_to_target(&(), 5);
let changeset = tracker
- .insert_tx_preview(tx.clone(), ConfirmationTime::Unconfirmed)
+ .insert_tx_preview(tx.clone(), ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
tracker.apply_changeset(changeset);
assert_eq!(
.chain_graph()
.transactions_in_chain()
.collect::<Vec<_>>(),
- vec![(&ConfirmationTime::Unconfirmed, &tx,)]
+ vec![(&ConfirmationTime::Unconfirmed { last_seen: 0 }, &tx,)]
);
assert_eq!(
height,
time: height_to_time[&height],
},
- TxHeight::Unconfirmed => ConfirmationTime::Unconfirmed,
+ TxHeight::Unconfirmed => ConfirmationTime::Unconfirmed { last_seen: 0 },
};
let _ = new_update.insert_tx(txid, conf_time).expect("must insert");
}
(Some(time), Some(height)) if height <= height_at_start => {
ConfirmationTime::Confirmed { height, time }
}
- _ => ConfirmationTime::Unconfirmed,
+ _ => ConfirmationTime::Unconfirmed { last_seen: 0 },
}
}