Skip to content

Commit 0b4e0c4

Browse files
committed
ignore deleted tokens in tokens query
1 parent 83ab09e commit 0b4e0c4

File tree

1 file changed

+38
-27
lines changed

1 file changed

+38
-27
lines changed

packages/wallet/src/queries/tokens.ts

+38-27
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,27 @@ import { NostrEvent } from "nostr-tools";
44

55
import { getTokenDetails, isTokenDetailsLocked, WALLET_TOKEN_KIND } from "../helpers/tokens.js";
66

7+
/** removes deleted events from sorted array */
8+
function filterDeleted(tokens: NostrEvent[]) {
9+
const deleted = new Set<string>();
10+
return Array.from(tokens)
11+
.reverse()
12+
.filter((token) => {
13+
// skip this event if it a newer event says its deleted
14+
if (deleted.has(token.id)) return false;
15+
// skip if token is locked
16+
if (isTokenDetailsLocked(token)) return false;
17+
else {
18+
// add ids to deleted array
19+
const details = getTokenDetails(token);
20+
for (const id of details.del) deleted.add(id);
21+
}
22+
23+
return true;
24+
})
25+
.reverse();
26+
}
27+
728
/** A query that subscribes to all token events for a wallet, passing locked will filter by token locked status */
829
export function WalletTokensQuery(pubkey: string, locked?: boolean | undefined): Query<NostrEvent[]> {
930
return {
@@ -16,10 +37,13 @@ export function WalletTokensQuery(pubkey: string, locked?: boolean | undefined):
1637
const timeline = events.timeline({ kinds: [WALLET_TOKEN_KIND], authors: [pubkey] });
1738

1839
return combineLatest([updates, timeline]).pipe(
40+
// filter out locked tokens
1941
map(([_, tokens]) => {
2042
if (locked === undefined) return tokens;
2143
else return tokens.filter((t) => isTokenDetailsLocked(t) === locked);
2244
}),
45+
// remove deleted events
46+
map(filterDeleted),
2347
);
2448
},
2549
};
@@ -37,33 +61,20 @@ export function WalletBalanceQuery(pubkey: string): Query<Record<string, number>
3761
const timeline = events.timeline({ kinds: [WALLET_TOKEN_KIND], authors: [pubkey] });
3862

3963
return combineLatest([updates, timeline]).pipe(
40-
map(([_, tokens]) => {
41-
const deleted = new Set<string>();
42-
43-
return (
44-
tokens
45-
// count the tokens from newest to oldest (so del gets applied correctly)
46-
.reverse()
47-
.reduce(
48-
(totals, token) => {
49-
// skip this event if it a newer event says its deleted
50-
if (deleted.has(token.id)) return totals;
51-
// skip if token is locked
52-
if (isTokenDetailsLocked(token)) return totals;
53-
54-
const details = getTokenDetails(token);
55-
if (!details) return totals;
56-
57-
// add deleted ids
58-
for (const id of details.del) deleted.add(id);
59-
60-
const total = details.proofs.reduce((t, p) => t + p.amount, 0);
61-
return { ...totals, [details.mint]: (totals[details.mint] ?? 0) + total };
62-
},
63-
{} as Record<string, number>,
64-
)
65-
);
66-
}),
64+
map(([_, tokens]) => tokens),
65+
// filter out deleted tokens
66+
map(filterDeleted),
67+
// map tokens to totals
68+
map((tokens) =>
69+
tokens.reduce(
70+
(totals, token) => {
71+
const details = getTokenDetails(token);
72+
const total = details.proofs.reduce((t, p) => t + p.amount, 0);
73+
return { ...totals, [details.mint]: (totals[details.mint] ?? 0) + total };
74+
},
75+
{} as Record<string, number>,
76+
),
77+
),
6778
);
6879
},
6980
};

0 commit comments

Comments
 (0)