@1sat/sweep-ui 0.0.14 → 0.0.15
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/index.js +20 -9
- package/dist/lib/scanner.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/lib/scanner.ts +28 -11
package/dist/index.js
CHANGED
|
@@ -398,15 +398,12 @@ async function groupBsv21Tokens(outputs) {
|
|
|
398
398
|
const tokenId = getEvent(events, "bsv21:");
|
|
399
399
|
if (!tokenId)
|
|
400
400
|
continue;
|
|
401
|
-
const amtStr = getEvent(events, "amt:");
|
|
402
|
-
const amount = amtStr ? BigInt(amtStr) : 0n;
|
|
403
401
|
let group = groups.get(tokenId);
|
|
404
402
|
if (!group) {
|
|
405
|
-
group =
|
|
403
|
+
group = [];
|
|
406
404
|
groups.set(tokenId, group);
|
|
407
405
|
}
|
|
408
|
-
group.
|
|
409
|
-
group.totalAmount += amount;
|
|
406
|
+
group.push(out);
|
|
410
407
|
}
|
|
411
408
|
if (groups.size === 0)
|
|
412
409
|
return [];
|
|
@@ -418,17 +415,31 @@ async function groupBsv21Tokens(outputs) {
|
|
|
418
415
|
} catch {}
|
|
419
416
|
const detailMap = new Map(details.map((d) => [d.tokenId, d]));
|
|
420
417
|
const balances = [];
|
|
421
|
-
for (const [tokenId,
|
|
418
|
+
for (const [tokenId, outs] of groups) {
|
|
422
419
|
const detail = detailMap.get(tokenId);
|
|
420
|
+
const isActive = detail?.status?.is_active ?? false;
|
|
423
421
|
const iconOutpoint = resolveIconOutpoint(tokenId, detail?.token?.icon);
|
|
422
|
+
let totalAmount = 0n;
|
|
423
|
+
let validatedOutputs = outs;
|
|
424
|
+
if (isActive) {
|
|
425
|
+
try {
|
|
426
|
+
const outpoints = outs.map((o) => o.outpoint);
|
|
427
|
+
const validated = await services.bsv21.validateOutputs(tokenId, outpoints, { unspent: true });
|
|
428
|
+
totalAmount = validated.reduce((sum, v) => {
|
|
429
|
+
const bsv21 = v.data?.bsv21;
|
|
430
|
+
return sum + (bsv21?.amt ? BigInt(bsv21.amt) : 0n);
|
|
431
|
+
}, 0n);
|
|
432
|
+
validatedOutputs = validated;
|
|
433
|
+
} catch {}
|
|
434
|
+
}
|
|
424
435
|
balances.push({
|
|
425
436
|
tokenId,
|
|
426
437
|
symbol: detail?.token?.sym,
|
|
427
438
|
icon: iconOutpoint ? services.ordfs.getContentUrl(iconOutpoint) : "",
|
|
428
439
|
decimals: Number(detail?.token?.dec ?? 0),
|
|
429
|
-
totalAmount
|
|
430
|
-
outputs:
|
|
431
|
-
isActive
|
|
440
|
+
totalAmount,
|
|
441
|
+
outputs: validatedOutputs,
|
|
442
|
+
isActive
|
|
432
443
|
});
|
|
433
444
|
}
|
|
434
445
|
return balances;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/lib/scanner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOjD,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,GAAG,EAAE,aAAa,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/lib/scanner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOjD,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,GAAG,EAAE,aAAa,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAyKD,wBAAsB,WAAW,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GACpC,OAAO,CAAC,aAAa,CAAC,CA0BxB;AAED,wBAAsB,aAAa,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GACpC,OAAO,CAAC,aAAa,CAAC,CAmBxB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@1sat/sweep-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"description": "Sweep UI components for migrating legacy BSV assets",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@1sat/actions": "0.0.74",
|
|
23
23
|
"@1sat/client": "0.0.20",
|
|
24
24
|
"@1sat/connect": "0.0.27",
|
|
25
|
-
"@1sat/sweep-ui": "0.0.
|
|
25
|
+
"@1sat/sweep-ui": "0.0.15",
|
|
26
26
|
"@1sat/types": "0.0.14",
|
|
27
27
|
"@1sat/utils": "0.0.12",
|
|
28
28
|
"bitcoin-backup": "^0.0.11",
|
package/src/lib/scanner.ts
CHANGED
|
@@ -73,23 +73,20 @@ function resolveIconOutpoint(tokenId: string, icon?: string): string | undefined
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
async function groupBsv21Tokens(outputs: IndexedOutput[]): Promise<TokenBalance[]> {
|
|
76
|
-
|
|
76
|
+
// Group outputs by token ID from general indexer events
|
|
77
|
+
const groups = new Map<string, IndexedOutput[]>();
|
|
77
78
|
|
|
78
79
|
for (const out of outputs) {
|
|
79
80
|
const events = out.events ?? [];
|
|
80
81
|
const tokenId = getEvent(events, "bsv21:");
|
|
81
82
|
if (!tokenId) continue;
|
|
82
83
|
|
|
83
|
-
const amtStr = getEvent(events, "amt:");
|
|
84
|
-
const amount = amtStr ? BigInt(amtStr) : 0n;
|
|
85
|
-
|
|
86
84
|
let group = groups.get(tokenId);
|
|
87
85
|
if (!group) {
|
|
88
|
-
group =
|
|
86
|
+
group = [];
|
|
89
87
|
groups.set(tokenId, group);
|
|
90
88
|
}
|
|
91
|
-
group.
|
|
92
|
-
group.totalAmount += amount;
|
|
89
|
+
group.push(out);
|
|
93
90
|
}
|
|
94
91
|
|
|
95
92
|
if (groups.size === 0) return [];
|
|
@@ -97,6 +94,7 @@ async function groupBsv21Tokens(outputs: IndexedOutput[]): Promise<TokenBalance[
|
|
|
97
94
|
const services = getServices();
|
|
98
95
|
const tokenIds = [...groups.keys()];
|
|
99
96
|
|
|
97
|
+
// Get token metadata and active status from overlay
|
|
100
98
|
let details: Array<{ tokenId: string; token?: { sym?: string; dec?: string; icon?: string }; status?: { is_active?: boolean } }> = [];
|
|
101
99
|
try {
|
|
102
100
|
details = await services.bsv21.lookupTokens(tokenIds);
|
|
@@ -107,18 +105,37 @@ async function groupBsv21Tokens(outputs: IndexedOutput[]): Promise<TokenBalance[
|
|
|
107
105
|
const detailMap = new Map(details.map((d) => [d.tokenId, d]));
|
|
108
106
|
|
|
109
107
|
const balances: TokenBalance[] = [];
|
|
110
|
-
for (const [tokenId,
|
|
108
|
+
for (const [tokenId, outs] of groups) {
|
|
111
109
|
const detail = detailMap.get(tokenId);
|
|
110
|
+
const isActive = detail?.status?.is_active ?? false;
|
|
112
111
|
const iconOutpoint = resolveIconOutpoint(tokenId, detail?.token?.icon);
|
|
113
112
|
|
|
113
|
+
let totalAmount = 0n;
|
|
114
|
+
let validatedOutputs = outs;
|
|
115
|
+
|
|
116
|
+
// For active tokens, validate outputs against the overlay to get real amounts
|
|
117
|
+
if (isActive) {
|
|
118
|
+
try {
|
|
119
|
+
const outpoints = outs.map((o) => o.outpoint);
|
|
120
|
+
const validated = await services.bsv21.validateOutputs(tokenId, outpoints, { unspent: true });
|
|
121
|
+
totalAmount = validated.reduce((sum, v) => {
|
|
122
|
+
const bsv21 = v.data?.bsv21 as { amt?: string } | undefined;
|
|
123
|
+
return sum + (bsv21?.amt ? BigInt(bsv21.amt) : 0n);
|
|
124
|
+
}, 0n);
|
|
125
|
+
validatedOutputs = validated;
|
|
126
|
+
} catch {
|
|
127
|
+
// Validation failed — show outputs without amounts
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
114
131
|
balances.push({
|
|
115
132
|
tokenId,
|
|
116
133
|
symbol: detail?.token?.sym,
|
|
117
134
|
icon: iconOutpoint ? services.ordfs.getContentUrl(iconOutpoint) : "",
|
|
118
135
|
decimals: Number(detail?.token?.dec ?? 0),
|
|
119
|
-
totalAmount
|
|
120
|
-
outputs:
|
|
121
|
-
isActive
|
|
136
|
+
totalAmount,
|
|
137
|
+
outputs: validatedOutputs,
|
|
138
|
+
isActive,
|
|
122
139
|
});
|
|
123
140
|
}
|
|
124
141
|
return balances;
|