Skip to content

Commit

Permalink
monero: scan all tx pub keys (not additional) for every tx
Browse files Browse the repository at this point in the history
wallet2's behavior is explained more fully here:
UkoeHB/monero#27
  • Loading branch information
j-berman committed Jan 9, 2024
1 parent 3aa8007 commit cf709a6
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 6 deletions.
12 changes: 8 additions & 4 deletions coins/monero/src/wallet/extra.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,20 +120,24 @@ 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))
}
_ => (),
}
}
// 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> {
Expand Down
6 changes: 4 additions & 2 deletions coins/monero/src/wallet/scan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,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![]);
};

Expand All @@ -355,7 +355,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) => {
Expand Down

0 comments on commit cf709a6

Please sign in to comment.