@1sat/sweep-ui 0.0.13 → 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 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 = { outputs: [], totalAmount: 0n };
403
+ group = [];
406
404
  groups.set(tokenId, group);
407
405
  }
408
- group.outputs.push(out);
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, group] of groups) {
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: group.totalAmount,
430
- outputs: group.outputs,
431
- isActive: detail?.status?.is_active ?? false
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;AAwJD,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"}
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.13",
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",
@@ -20,9 +20,9 @@
20
20
  "license": "MIT",
21
21
  "dependencies": {
22
22
  "@1sat/actions": "0.0.74",
23
- "@1sat/client": "0.0.19",
23
+ "@1sat/client": "0.0.20",
24
24
  "@1sat/connect": "0.0.27",
25
- "@1sat/sweep-ui": "0.0.13",
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",
@@ -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
- const groups = new Map<string, { outputs: IndexedOutput[]; totalAmount: bigint }>();
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 = { outputs: [], totalAmount: 0n };
86
+ group = [];
89
87
  groups.set(tokenId, group);
90
88
  }
91
- group.outputs.push(out);
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, group] of groups) {
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: group.totalAmount,
120
- outputs: group.outputs,
121
- isActive: detail?.status?.is_active ?? false,
136
+ totalAmount,
137
+ outputs: validatedOutputs,
138
+ isActive,
122
139
  });
123
140
  }
124
141
  return balances;