@@ -4,6 +4,27 @@ import { NostrEvent } from "nostr-tools";
4
4
5
5
import { getTokenDetails , isTokenDetailsLocked , WALLET_TOKEN_KIND } from "../helpers/tokens.js" ;
6
6
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
+
7
28
/** A query that subscribes to all token events for a wallet, passing locked will filter by token locked status */
8
29
export function WalletTokensQuery ( pubkey : string , locked ?: boolean | undefined ) : Query < NostrEvent [ ] > {
9
30
return {
@@ -16,10 +37,13 @@ export function WalletTokensQuery(pubkey: string, locked?: boolean | undefined):
16
37
const timeline = events . timeline ( { kinds : [ WALLET_TOKEN_KIND ] , authors : [ pubkey ] } ) ;
17
38
18
39
return combineLatest ( [ updates , timeline ] ) . pipe (
40
+ // filter out locked tokens
19
41
map ( ( [ _ , tokens ] ) => {
20
42
if ( locked === undefined ) return tokens ;
21
43
else return tokens . filter ( ( t ) => isTokenDetailsLocked ( t ) === locked ) ;
22
44
} ) ,
45
+ // remove deleted events
46
+ map ( filterDeleted ) ,
23
47
) ;
24
48
} ,
25
49
} ;
@@ -37,33 +61,20 @@ export function WalletBalanceQuery(pubkey: string): Query<Record<string, number>
37
61
const timeline = events . timeline ( { kinds : [ WALLET_TOKEN_KIND ] , authors : [ pubkey ] } ) ;
38
62
39
63
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
+ ) ,
67
78
) ;
68
79
} ,
69
80
} ;
0 commit comments