applesauce-wallet 0.0.0-next-20250310162525 → 0.0.0-next-20250310180212
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helpers/history.d.ts +4 -0
- package/dist/helpers/history.js +4 -1
- package/dist/queries/tokens.js +37 -24
- package/package.json +2 -2
|
@@ -8,6 +8,10 @@ export type HistoryDetails = {
|
|
|
8
8
|
amount: number;
|
|
9
9
|
/** An array of token event ids created */
|
|
10
10
|
created: string[];
|
|
11
|
+
/** The mint that was spent from */
|
|
12
|
+
mint?: string;
|
|
13
|
+
/** The fee paid */
|
|
14
|
+
fee?: number;
|
|
11
15
|
};
|
|
12
16
|
export declare const HistoryDetailsSymbol: unique symbol;
|
|
13
17
|
/** returns an array of redeemed event ids in a history event */
|
package/dist/helpers/history.js
CHANGED
|
@@ -24,8 +24,11 @@ export function getHistoryDetails(history) {
|
|
|
24
24
|
const amount = parseInt(amountStr);
|
|
25
25
|
if (!Number.isFinite(amount))
|
|
26
26
|
throw new Error("Failed to parse amount");
|
|
27
|
+
const mint = tags.find((t) => t[0] === "mint")?.[1];
|
|
28
|
+
const feeStr = tags.find((t) => t[0] === "fee")?.[1];
|
|
29
|
+
const fee = feeStr ? parseInt(feeStr) : undefined;
|
|
27
30
|
const created = tags.filter((t) => isETag(t) && t[3] === "created").map((t) => t[1]);
|
|
28
|
-
return { direction, amount, created };
|
|
31
|
+
return { direction, amount, created, mint, fee };
|
|
29
32
|
});
|
|
30
33
|
}
|
|
31
34
|
/** Decrypts a wallet history event */
|
package/dist/queries/tokens.js
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
import { combineLatest, filter, map, startWith } from "rxjs";
|
|
2
2
|
import { getTokenDetails, isTokenDetailsLocked, WALLET_TOKEN_KIND } from "../helpers/tokens.js";
|
|
3
|
+
/** removes deleted events from sorted array */
|
|
4
|
+
function filterDeleted(tokens) {
|
|
5
|
+
const deleted = new Set();
|
|
6
|
+
return Array.from(tokens)
|
|
7
|
+
.reverse()
|
|
8
|
+
.filter((token) => {
|
|
9
|
+
// skip this event if it a newer event says its deleted
|
|
10
|
+
if (deleted.has(token.id))
|
|
11
|
+
return false;
|
|
12
|
+
// skip if token is locked
|
|
13
|
+
if (isTokenDetailsLocked(token))
|
|
14
|
+
return false;
|
|
15
|
+
else {
|
|
16
|
+
// add ids to deleted array
|
|
17
|
+
const details = getTokenDetails(token);
|
|
18
|
+
for (const id of details.del)
|
|
19
|
+
deleted.add(id);
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
})
|
|
23
|
+
.reverse();
|
|
24
|
+
}
|
|
3
25
|
/** A query that subscribes to all token events for a wallet, passing locked will filter by token locked status */
|
|
4
26
|
export function WalletTokensQuery(pubkey, locked) {
|
|
5
27
|
return {
|
|
@@ -7,12 +29,16 @@ export function WalletTokensQuery(pubkey, locked) {
|
|
|
7
29
|
run: (events) => {
|
|
8
30
|
const updates = events.updates.pipe(filter((e) => e.kind === WALLET_TOKEN_KIND && e.pubkey === pubkey), startWith(undefined));
|
|
9
31
|
const timeline = events.timeline({ kinds: [WALLET_TOKEN_KIND], authors: [pubkey] });
|
|
10
|
-
return combineLatest([updates, timeline]).pipe(
|
|
32
|
+
return combineLatest([updates, timeline]).pipe(
|
|
33
|
+
// filter out locked tokens
|
|
34
|
+
map(([_, tokens]) => {
|
|
11
35
|
if (locked === undefined)
|
|
12
36
|
return tokens;
|
|
13
37
|
else
|
|
14
38
|
return tokens.filter((t) => isTokenDetailsLocked(t) === locked);
|
|
15
|
-
})
|
|
39
|
+
}),
|
|
40
|
+
// remove deleted events
|
|
41
|
+
map(filterDeleted));
|
|
16
42
|
},
|
|
17
43
|
};
|
|
18
44
|
}
|
|
@@ -23,28 +49,15 @@ export function WalletBalanceQuery(pubkey) {
|
|
|
23
49
|
run: (events) => {
|
|
24
50
|
const updates = events.updates.pipe(filter((e) => e.kind === WALLET_TOKEN_KIND && e.pubkey === pubkey), startWith(undefined));
|
|
25
51
|
const timeline = events.timeline({ kinds: [WALLET_TOKEN_KIND], authors: [pubkey] });
|
|
26
|
-
return combineLatest([updates, timeline]).pipe(map(([_, tokens]) =>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// skip if token is locked
|
|
36
|
-
if (isTokenDetailsLocked(token))
|
|
37
|
-
return totals;
|
|
38
|
-
const details = getTokenDetails(token);
|
|
39
|
-
if (!details)
|
|
40
|
-
return totals;
|
|
41
|
-
// add deleted ids
|
|
42
|
-
for (const id of details.del)
|
|
43
|
-
deleted.add(id);
|
|
44
|
-
const total = details.proofs.reduce((t, p) => t + p.amount, 0);
|
|
45
|
-
return { ...totals, [details.mint]: (totals[details.mint] ?? 0) + total };
|
|
46
|
-
}, {}));
|
|
47
|
-
}));
|
|
52
|
+
return combineLatest([updates, timeline]).pipe(map(([_, tokens]) => tokens),
|
|
53
|
+
// filter out deleted tokens
|
|
54
|
+
map(filterDeleted),
|
|
55
|
+
// map tokens to totals
|
|
56
|
+
map((tokens) => tokens.reduce((totals, token) => {
|
|
57
|
+
const details = getTokenDetails(token);
|
|
58
|
+
const total = details.proofs.reduce((t, p) => t + p.amount, 0);
|
|
59
|
+
return { ...totals, [details.mint]: (totals[details.mint] ?? 0) + total };
|
|
60
|
+
}, {})));
|
|
48
61
|
},
|
|
49
62
|
};
|
|
50
63
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "applesauce-wallet",
|
|
3
|
-
"version": "0.0.0-next-
|
|
3
|
+
"version": "0.0.0-next-20250310180212",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"applesauce-core": "0.0.0-next-
|
|
45
|
+
"applesauce-core": "0.0.0-next-20250310180212",
|
|
46
46
|
"nostr-tools": "^2.10.4",
|
|
47
47
|
"rxjs": "^7.8.1"
|
|
48
48
|
},
|