monero: scan all tx pub keys (not additional) for every tx

wallet2's behavior is explained more fully here:
https://github.com/UkoeHB/monero/issues/27
This commit is contained in:
j-berman 2024-01-09 07:27:44 -08:00 committed by Luke Parker
parent 0880453f82
commit 34b93b882c
2 changed files with 12 additions and 6 deletions

View file

@ -120,12 +120,12 @@ impl ExtraField {
#[derive(Clone, PartialEq, Eq, Debug, Zeroize)]
pub struct Extra(Vec<ExtraField>);
impl Extra {
pub fn keys(&self) -> Option<(EdwardsPoint, Option<Vec<EdwardsPoint>>)> {
let mut key = None;
pub fn keys(&self) -> Option<(Vec<EdwardsPoint>, Option<Vec<EdwardsPoint>>)> {
let mut keys = vec![];
let mut additional = None;
for field in &self.0 {
match field.clone() {
ExtraField::PublicKey(this_key) => key = key.or(Some(this_key)),
ExtraField::PublicKey(this_key) => keys.push(this_key),
ExtraField::PublicKeys(these_additional) => {
additional = additional.or(Some(these_additional))
}
@ -133,7 +133,11 @@ impl Extra {
}
}
// Don't return any keys if this was non-standard and didn't include the primary key
key.map(|key| (key, additional))
if keys.is_empty() {
None
} else {
Some((keys, additional))
}
}
pub fn payment_id(&self) -> Option<PaymentId> {

View file

@ -350,7 +350,7 @@ impl Scanner {
return Timelocked(tx.prefix.timelock, vec![]);
};
let Some((tx_key, additional)) = extra.keys() else {
let Some((tx_keys, additional)) = extra.keys() else {
return Timelocked(tx.prefix.timelock, vec![]);
};
@ -371,7 +371,9 @@ impl Scanner {
}
let output_key = output_key.unwrap();
for key in [Some(Some(&tx_key)), additional.as_ref().map(|additional| additional.get(o))] {
let additional = additional.as_ref().map(|additional| additional.get(o));
for key in tx_keys.iter().map(|key| Some(Some(key))).chain(core::iter::once(additional)) {
let key = match key {
Some(Some(key)) => key,
Some(None) => {