@1sat/sweep-ui 0.0.91 → 0.0.93

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SweepApp.d.ts","sourceRoot":"","sources":["../../src/components/SweepApp.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAgB3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAkB1C,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,EACxB,UAAU,EAAE,WAAW,EACvB,MAAM,EAAE,cAAc,EACtB,SAAS,GACT,EAAE,aAAa,+BAqkBf"}
1
+ {"version":3,"file":"SweepApp.d.ts","sourceRoot":"","sources":["../../src/components/SweepApp.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAgB3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmB1C,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,EACxB,UAAU,EAAE,WAAW,EACvB,MAAM,EAAE,cAAc,EACtB,SAAS,GACT,EAAE,aAAa,+BAimBf"}
@@ -29,6 +29,11 @@ export declare function Bsv21Section({ tokens, onSweep, walletConnected, }: {
29
29
  export declare function Bsv20Section({ tokens }: {
30
30
  tokens: IndexedOutput[];
31
31
  }): import("react").JSX.Element | null;
32
+ export declare function ListingsSection({ listings, walletConnected, onCancel, }: {
33
+ listings: EnrichedOrdinal[];
34
+ walletConnected?: boolean;
35
+ onCancel?: () => void;
36
+ }): import("react").JSX.Element | null;
32
37
  export declare function LockedSection({ locked }: {
33
38
  locked: IndexedOutput[];
34
39
  }): import("react").JSX.Element | null;
@@ -1 +1 @@
1
- {"version":3,"file":"asset-preview.d.ts","sourceRoot":"","sources":["../../src/components/asset-preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAuFnE,wBAAgB,cAAc,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,OAAO,EACP,MAAM,EACN,eAAe,GACf,EAAE;IACF,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACpD,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,eAAe,EAAE,OAAO,CAAA;CACxB,sCA0FA;AAED,wBAAgB,eAAe,CAAC,EAC/B,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,OAAO,EACP,UAAU,EACV,MAAM,EACN,MAAM,EACN,eAAe,GACf,EAAE;IACF,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC3C,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,eAAe,EAAE,OAAO,CAAA;CACxB,sCAgKA;AAgED,wBAAgB,YAAY,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,eAAe,GACf,EAAE;IACF,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,eAAe,EAAE,OAAO,CAAA;CACxB,sCAuCA;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,sCAkCnE;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,sCAgBpE;AAED,wBAAgB,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,aAAa,EAAE,CAAA;CAAE,sCAkB3D"}
1
+ {"version":3,"file":"asset-preview.d.ts","sourceRoot":"","sources":["../../src/components/asset-preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAuFnE,wBAAgB,cAAc,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,OAAO,EACP,MAAM,EACN,eAAe,GACf,EAAE;IACF,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACpD,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,eAAe,EAAE,OAAO,CAAA;CACxB,sCA0FA;AAED,wBAAgB,eAAe,CAAC,EAC/B,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,OAAO,EACP,UAAU,EACV,MAAM,EACN,MAAM,EACN,eAAe,GACf,EAAE;IACF,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC3C,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,eAAe,EAAE,OAAO,CAAA;CACxB,sCAgKA;AAgED,wBAAgB,YAAY,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,eAAe,GACf,EAAE;IACF,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,eAAe,EAAE,OAAO,CAAA;CACxB,sCAuCA;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,sCAkCnE;AAED,wBAAgB,eAAe,CAAC,EAC/B,QAAQ,EACR,eAAe,EACf,QAAQ,GACR,EAAE;IACF,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,sCA0BA;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,sCAgBpE;AAED,wBAAgB,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,aAAa,EAAE,CAAA;CAAE,sCAkB3D"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { SweepApp, type SweepAppProps } from './components/SweepApp';
2
2
  export { ConnectWallet } from './components/connect-wallet';
3
3
  export { WifInput } from './components/wif-input';
4
- export { FundingSection, OrdinalsSection, Bsv21Section, Bsv20Section, LockedSection, RunSection, } from './components/asset-preview';
4
+ export { FundingSection, OrdinalsSection, Bsv21Section, Bsv20Section, ListingsSection, LockedSection, RunSection, } from './components/asset-preview';
5
5
  export { OpnsSection } from './components/opns-section';
6
6
  export { TxHistory, type TxRecord } from './components/tx-history';
7
7
  export { SweepProgress } from './components/sweep-progress';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGpE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EACN,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,GACV,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAG3D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EACN,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,WAAW,GACX,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAG/E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EACN,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,GACX,MAAM,cAAc,CAAA;AACrB,OAAO,EACN,aAAa,EACb,WAAW,EACX,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,GACjB,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,KAAK,WAAW,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,gBAAgB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGzE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGpE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EACN,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,UAAU,GACV,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAG3D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EACN,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,WAAW,GACX,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAG/E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EACN,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,GACX,MAAM,cAAc,CAAA;AACrB,OAAO,EACN,aAAa,EACb,WAAW,EACX,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,GACjB,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,KAAK,WAAW,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EACN,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,gBAAgB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGzE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA"}
package/dist/index.js CHANGED
@@ -84,6 +84,7 @@ function toScannedAssets(result) {
84
84
  funding: result.funding,
85
85
  ordinals: result.ordinals.map(enrichOrdinal),
86
86
  opnsNames: result.opnsNames.map(enrichOrdinal),
87
+ listings: result.listings.map(enrichOrdinal),
87
88
  bsv21Tokens: enrichTokenBalances(result.bsv21Tokens),
88
89
  bsv20Tokens: result.bsv20Tokens,
89
90
  locked: result.locked,
@@ -302,14 +303,48 @@ function chunk(items, size) {
302
303
  return batches;
303
304
  }
304
305
  async function executeSweep(params) {
305
- const { wallet, keys, funding, ordinals, amount, onProgress } = params;
306
+ const {
307
+ wallet,
308
+ keys,
309
+ funding,
310
+ ordinals,
311
+ listings = [],
312
+ amount,
313
+ onProgress
314
+ } = params;
306
315
  const ctx = createContext(wallet, { services: getServices(), chain: "main" });
307
316
  const result = {
308
317
  ordinalTxids: [],
318
+ listingTxids: [],
309
319
  bsv21Txids: [],
310
320
  errors: [],
311
- sweptOutpoints: []
321
+ sweptOutpoints: [],
322
+ cancelledListings: []
312
323
  };
324
+ if (listings.length > 0) {
325
+ const batches = chunk(listings, SWEEP_BATCH_SIZE);
326
+ for (let b = 0;b < batches.length; b++) {
327
+ const batch = batches[b];
328
+ onProgress(`Cancelling ${batch.length} OrdLock listing${batch.length !== 1 ? "s" : ""} into wallet...`);
329
+ try {
330
+ const inputs = await prepareSweepInputs(ctx, batch);
331
+ const cancelResult = await sweepOrdinals.execute(ctx, {
332
+ inputs,
333
+ keys: buildKeys(batch, keys)
334
+ });
335
+ if (cancelResult.error) {
336
+ result.errors.push(`Listings batch ${b + 1}: ${cancelResult.error}`);
337
+ break;
338
+ }
339
+ if (cancelResult.txid)
340
+ result.listingTxids.push(cancelResult.txid);
341
+ result.cancelledListings.push(...batch.map((o) => o.outpoint));
342
+ } catch (e) {
343
+ result.errors.push(`Listings batch ${b + 1}: ${e instanceof Error ? e.message : String(e)}`);
344
+ break;
345
+ }
346
+ }
347
+ }
313
348
  if (funding.length > 0) {
314
349
  onProgress(`Sweeping ${funding.length} BSV UTXOs...`);
315
350
  try {
@@ -1089,6 +1124,47 @@ function Bsv20Section({ tokens }) {
1089
1124
  ]
1090
1125
  });
1091
1126
  }
1127
+ function ListingsSection({
1128
+ listings,
1129
+ walletConnected,
1130
+ onCancel
1131
+ }) {
1132
+ if (listings.length === 0)
1133
+ return null;
1134
+ return /* @__PURE__ */ jsxs("div", {
1135
+ className: "border border-primary/20 bg-primary/5 p-4 rounded-lg space-y-3",
1136
+ children: [
1137
+ /* @__PURE__ */ jsxs("div", {
1138
+ className: "flex items-center gap-2",
1139
+ children: [
1140
+ /* @__PURE__ */ jsx4("span", {
1141
+ className: "h-2 w-2 rounded-full bg-primary"
1142
+ }),
1143
+ /* @__PURE__ */ jsx4("span", {
1144
+ className: "text-sm font-semibold text-primary",
1145
+ children: "OrdLock Listings"
1146
+ })
1147
+ ]
1148
+ }),
1149
+ /* @__PURE__ */ jsxs("p", {
1150
+ className: "text-xs text-muted-foreground",
1151
+ children: [
1152
+ listings.length,
1153
+ " listed UTXO",
1154
+ listings.length !== 1 ? "s" : "",
1155
+ ". These are cancelled into your BRC-100 wallet on BSV sweep."
1156
+ ]
1157
+ }),
1158
+ onCancel && /* @__PURE__ */ jsx4(Button, {
1159
+ size: "sm",
1160
+ disabled: !walletConnected,
1161
+ onClick: onCancel,
1162
+ className: "w-full",
1163
+ children: "Cancel listings into wallet"
1164
+ })
1165
+ ]
1166
+ });
1167
+ }
1092
1168
  function LockedSection({ locked }) {
1093
1169
  if (locked.length === 0)
1094
1170
  return null;
@@ -2320,7 +2396,7 @@ function SweepApp({
2320
2396
  ];
2321
2397
  const result = await scanAddresses(addresses, (p) => setScanProgress(p.detail ?? p.phase));
2322
2398
  setAssets(result);
2323
- const total = result.funding.length + result.ordinals.length + result.opnsNames.length + result.bsv21Tokens.reduce((n, t) => n + t.outputs.length, 0) + result.bsv20Tokens.length + result.locked.length + result.run.length;
2399
+ const total = result.funding.length + result.ordinals.length + result.opnsNames.length + result.bsv21Tokens.reduce((n, t) => n + t.outputs.length, 0) + result.bsv20Tokens.length + result.listings.length + result.locked.length + result.run.length;
2324
2400
  if (total === 0)
2325
2401
  toast.info("No assets found at legacy addresses");
2326
2402
  if (result.ordinals.length > 0)
@@ -2385,12 +2461,15 @@ function SweepApp({
2385
2461
  keys: keyMap,
2386
2462
  funding: getSelectedFunding(),
2387
2463
  ordinals: [],
2464
+ listings: assets.listings,
2388
2465
  amount: sweepAmount ?? undefined,
2389
2466
  onProgress: setSweepProgress
2390
2467
  });
2391
2468
  if (result.errors.length > 0)
2392
2469
  throw new Error(result.errors[0]);
2393
- return result.bsvTxid ?? "";
2470
+ for (const txid of result.listingTxids)
2471
+ addTx("Cancel listings", txid);
2472
+ return result.bsvTxid ?? result.listingTxids[0] ?? "";
2394
2473
  });
2395
2474
  }, [
2396
2475
  resolveWallet,
@@ -2398,8 +2477,28 @@ function SweepApp({
2398
2477
  assets,
2399
2478
  sweepAmount,
2400
2479
  getSelectedFunding,
2401
- runOperation
2480
+ runOperation,
2481
+ keyMap,
2482
+ addTx
2402
2483
  ]);
2484
+ const handleCancelListings = useCallback2(async () => {
2485
+ const wallet = resolveWallet();
2486
+ if (!wallet || !legacyKeys || !assets || assets.listings.length === 0)
2487
+ return;
2488
+ await runOperation("Cancel listings", async () => {
2489
+ const result = await executeSweep({
2490
+ wallet,
2491
+ keys: keyMap,
2492
+ funding: [],
2493
+ ordinals: [],
2494
+ listings: assets.listings,
2495
+ onProgress: setSweepProgress
2496
+ });
2497
+ if (result.errors.length > 0)
2498
+ throw new Error(result.errors[0]);
2499
+ return result.listingTxids[0] ?? "";
2500
+ });
2501
+ }, [resolveWallet, legacyKeys, assets, keyMap, runOperation]);
2403
2502
  const handleSendBsv = useCallback2(async (destination) => {
2404
2503
  if (!legacyKeys || !assets)
2405
2504
  return;
@@ -2634,6 +2733,11 @@ function SweepApp({
2634
2733
  onSend: sweepOnly ? undefined : handleSendBsv,
2635
2734
  walletConnected
2636
2735
  }),
2736
+ /* @__PURE__ */ jsx11(ListingsSection, {
2737
+ listings: assets.listings,
2738
+ walletConnected,
2739
+ onCancel: handleCancelListings
2740
+ }),
2637
2741
  tabs.length > 0 && /* @__PURE__ */ jsxs6(Tabs, {
2638
2742
  value: activeTab,
2639
2743
  onValueChange: (v) => setActiveTab(v),
@@ -2841,6 +2945,7 @@ export {
2841
2945
  ConnectWallet,
2842
2946
  FundingSection,
2843
2947
  Input,
2948
+ ListingsSection,
2844
2949
  LockedSection,
2845
2950
  OpnsSection,
2846
2951
  OrdinalsSection,
@@ -10,6 +10,7 @@ export interface EnrichedOrdinal extends IndexedOutput {
10
10
  export interface ScannedAssets extends Omit<ScanResult, 'ordinals' | 'opnsNames'> {
11
11
  ordinals: EnrichedOrdinal[];
12
12
  opnsNames: EnrichedOrdinal[];
13
+ listings: EnrichedOrdinal[];
13
14
  bsv21Tokens: TokenBalance[];
14
15
  totalBsv: number;
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/lib/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EAEjB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAIhD,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,CAAA;AAEtD,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACrD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAChB,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAAC;IAClD,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,SAAS,EAAE,eAAe,EAAE,CAAA;IAC5B,WAAW,EAAE,YAAY,EAAE,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AA2CD,wBAAsB,WAAW,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GACpC,OAAO,CAAC,aAAa,CAAC,CAGxB;AAED,wBAAsB,aAAa,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GACpC,OAAO,CAAC,aAAa,CAAC,CAIxB"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/lib/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EAEjB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAIhD,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,CAAA;AAEtD,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACrD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAChB,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAAC;IAClD,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,SAAS,EAAE,eAAe,EAAE,CAAA;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,WAAW,EAAE,YAAY,EAAE,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AA2CD,wBAAsB,WAAW,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GACpC,OAAO,CAAC,aAAa,CAAC,CAGxB;AAED,wBAAsB,aAAa,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GACpC,OAAO,CAAC,aAAa,CAAC,CAIxB"}
@@ -6,10 +6,13 @@ export declare const SWEEP_BATCH_SIZE = 25;
6
6
  export interface SweepResult {
7
7
  bsvTxid?: string;
8
8
  ordinalTxids: string[];
9
+ listingTxids: string[];
9
10
  bsv21Txids: string[];
10
11
  errors: string[];
11
12
  /** Outpoints successfully swept (ordinals/OpNS). */
12
13
  sweptOutpoints: string[];
14
+ /** Listing outpoints cancelled into the BRC-100 wallet. */
15
+ cancelledListings: string[];
13
16
  }
14
17
  /**
15
18
  * Sweep BSV funding and ordinals into the connected wallet.
@@ -20,6 +23,8 @@ export declare function executeSweep(params: {
20
23
  keys: Map<string, PrivateKey>;
21
24
  funding: IndexedOutput[];
22
25
  ordinals: IndexedOutput[];
26
+ /** OPL-4696: listed OrdLock UTXOs — cancelled into BRC-100 via sweepOrdinals. */
27
+ listings?: IndexedOutput[];
23
28
  amount?: number;
24
29
  onProgress: (stage: string) => void;
25
30
  }): Promise<SweepResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"sweeper.d.ts","sourceRoot":"","sources":["../../src/lib/sweeper.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7C,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,MAAM,WAAW,WAAW;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,oDAAoD;IACpD,cAAc,EAAE,MAAM,EAAE,CAAA;CACxB;AA2BD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IAC1C,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC7B,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,GAAG,OAAO,CAAC,WAAW,CAAC,CAiEvB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC7C,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC7B,KAAK,EAAE,YAAY,CAAA;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B7C"}
1
+ {"version":3,"file":"sweeper.d.ts","sourceRoot":"","sources":["../../src/lib/sweeper.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7C,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,MAAM,WAAW,WAAW;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,oDAAoD;IACpD,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,2DAA2D;IAC3D,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC3B;AA2BD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IAC1C,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC7B,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,GAAG,OAAO,CAAC,WAAW,CAAC,CAuGvB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC7C,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC7B,KAAK,EAAE,YAAY,CAAA;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B7C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1sat/sweep-ui",
3
- "version": "0.0.91",
3
+ "version": "0.0.93",
4
4
  "description": "Sweep UI components for migrating legacy BSV assets",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -29,11 +29,11 @@
29
29
  ],
30
30
  "license": "MIT",
31
31
  "dependencies": {
32
- "@1sat/actions": "0.0.207",
33
- "@1sat/client": "0.0.51",
34
- "@1sat/connect": "0.0.91",
35
- "@1sat/types": "0.0.41",
36
- "@1sat/utils": "0.0.34",
32
+ "@1sat/actions": "0.0.214",
33
+ "@1sat/client": "0.0.52",
34
+ "@1sat/connect": "0.0.92",
35
+ "@1sat/types": "0.0.44",
36
+ "@1sat/utils": "0.0.35",
37
37
  "bitcoin-backup": "^0.0.11",
38
38
  "class-variance-authority": "^0.7.1",
39
39
  "clsx": "^2.1.1",
@@ -42,11 +42,11 @@
42
42
  "tailwind-merge": "^3.5.0"
43
43
  },
44
44
  "peerDependencies": {
45
- "@bsv/sdk": "^2.1.9",
45
+ "@bsv/sdk": "^2.5.0",
46
46
  "react": "^18.0.0 || ^19.0.0"
47
47
  },
48
48
  "devDependencies": {
49
- "@bsv/sdk": "^2.1.9",
49
+ "@bsv/sdk": "^2.5.0",
50
50
  "@types/react": "^19.0.0",
51
51
  "react": "^19.0.0",
52
52
  "typescript": "~5.7.0"
@@ -19,6 +19,7 @@ import {
19
19
  Bsv20Section,
20
20
  Bsv21Section,
21
21
  FundingSection,
22
+ ListingsSection,
22
23
  LockedSection,
23
24
  OrdinalsSection,
24
25
  RunSection,
@@ -192,6 +193,7 @@ export function SweepApp({
192
193
  result.opnsNames.length +
193
194
  result.bsv21Tokens.reduce((n, t) => n + t.outputs.length, 0) +
194
195
  result.bsv20Tokens.length +
196
+ result.listings.length +
195
197
  result.locked.length +
196
198
  result.run.length
197
199
  if (total === 0) toast.info('No assets found at legacy addresses')
@@ -255,11 +257,13 @@ export function SweepApp({
255
257
  keys: keyMap,
256
258
  funding: getSelectedFunding(),
257
259
  ordinals: [],
260
+ listings: assets.listings,
258
261
  amount: sweepAmount ?? undefined,
259
262
  onProgress: setSweepProgress,
260
263
  })
261
264
  if (result.errors.length > 0) throw new Error(result.errors[0])
262
- return result.bsvTxid ?? ''
265
+ for (const txid of result.listingTxids) addTx('Cancel listings', txid)
266
+ return result.bsvTxid ?? result.listingTxids[0] ?? ''
263
267
  })
264
268
  }, [
265
269
  resolveWallet,
@@ -268,8 +272,28 @@ export function SweepApp({
268
272
  sweepAmount,
269
273
  getSelectedFunding,
270
274
  runOperation,
275
+ keyMap,
276
+ addTx,
271
277
  ])
272
278
 
279
+ const handleCancelListings = useCallback(async () => {
280
+ const wallet = resolveWallet()
281
+ if (!wallet || !legacyKeys || !assets || assets.listings.length === 0)
282
+ return
283
+ await runOperation('Cancel listings', async () => {
284
+ const result = await executeSweep({
285
+ wallet,
286
+ keys: keyMap,
287
+ funding: [],
288
+ ordinals: [],
289
+ listings: assets.listings,
290
+ onProgress: setSweepProgress,
291
+ })
292
+ if (result.errors.length > 0) throw new Error(result.errors[0])
293
+ return result.listingTxids[0] ?? ''
294
+ })
295
+ }, [resolveWallet, legacyKeys, assets, keyMap, runOperation])
296
+
273
297
  const handleSendBsv = useCallback(
274
298
  async (destination: string) => {
275
299
  if (!legacyKeys || !assets) return
@@ -543,6 +567,11 @@ export function SweepApp({
543
567
  onSend={sweepOnly ? undefined : handleSendBsv}
544
568
  walletConnected={walletConnected}
545
569
  />
570
+ <ListingsSection
571
+ listings={assets.listings}
572
+ walletConnected={walletConnected}
573
+ onCancel={handleCancelListings}
574
+ />
546
575
 
547
576
  {tabs.length > 0 && (
548
577
  <Tabs
@@ -526,6 +526,42 @@ export function Bsv20Section({ tokens }: { tokens: IndexedOutput[] }) {
526
526
  )
527
527
  }
528
528
 
529
+ export function ListingsSection({
530
+ listings,
531
+ walletConnected,
532
+ onCancel,
533
+ }: {
534
+ listings: EnrichedOrdinal[]
535
+ walletConnected?: boolean
536
+ onCancel?: () => void
537
+ }) {
538
+ if (listings.length === 0) return null
539
+ return (
540
+ <div className="border border-primary/20 bg-primary/5 p-4 rounded-lg space-y-3">
541
+ <div className="flex items-center gap-2">
542
+ <span className="h-2 w-2 rounded-full bg-primary" />
543
+ <span className="text-sm font-semibold text-primary">
544
+ OrdLock Listings
545
+ </span>
546
+ </div>
547
+ <p className="text-xs text-muted-foreground">
548
+ {listings.length} listed UTXO{listings.length !== 1 ? 's' : ''}. These
549
+ are cancelled into your BRC-100 wallet on BSV sweep.
550
+ </p>
551
+ {onCancel && (
552
+ <Button
553
+ size="sm"
554
+ disabled={!walletConnected}
555
+ onClick={onCancel}
556
+ className="w-full"
557
+ >
558
+ Cancel listings into wallet
559
+ </Button>
560
+ )}
561
+ </div>
562
+ )
563
+ }
564
+
529
565
  export function LockedSection({ locked }: { locked: IndexedOutput[] }) {
530
566
  if (locked.length === 0) return null
531
567
  return (
package/src/index.ts CHANGED
@@ -9,6 +9,7 @@ export {
9
9
  OrdinalsSection,
10
10
  Bsv21Section,
11
11
  Bsv20Section,
12
+ ListingsSection,
12
13
  LockedSection,
13
14
  RunSection,
14
15
  } from './components/asset-preview'
@@ -21,6 +21,7 @@ export interface ScannedAssets
21
21
  extends Omit<ScanResult, 'ordinals' | 'opnsNames'> {
22
22
  ordinals: EnrichedOrdinal[]
23
23
  opnsNames: EnrichedOrdinal[]
24
+ listings: EnrichedOrdinal[]
24
25
  bsv21Tokens: TokenBalance[]
25
26
  totalBsv: number
26
27
  }
@@ -92,6 +93,7 @@ function toScannedAssets(result: ScanResult): ScannedAssets {
92
93
  funding: result.funding,
93
94
  ordinals: result.ordinals.map(enrichOrdinal),
94
95
  opnsNames: result.opnsNames.map(enrichOrdinal),
96
+ listings: result.listings.map(enrichOrdinal),
95
97
  bsv21Tokens: enrichTokenBalances(result.bsv21Tokens),
96
98
  bsv20Tokens: result.bsv20Tokens,
97
99
  locked: result.locked,
@@ -16,10 +16,13 @@ export const SWEEP_BATCH_SIZE = 25
16
16
  export interface SweepResult {
17
17
  bsvTxid?: string
18
18
  ordinalTxids: string[]
19
+ listingTxids: string[]
19
20
  bsv21Txids: string[]
20
21
  errors: string[]
21
22
  /** Outpoints successfully swept (ordinals/OpNS). */
22
23
  sweptOutpoints: string[]
24
+ /** Listing outpoints cancelled into the BRC-100 wallet. */
25
+ cancelledListings: string[]
23
26
  }
24
27
 
25
28
  function getOwner(output: IndexedOutput): string | undefined {
@@ -56,17 +59,57 @@ export async function executeSweep(params: {
56
59
  keys: Map<string, PrivateKey>
57
60
  funding: IndexedOutput[]
58
61
  ordinals: IndexedOutput[]
62
+ /** OPL-4696: listed OrdLock UTXOs — cancelled into BRC-100 via sweepOrdinals. */
63
+ listings?: IndexedOutput[]
59
64
  amount?: number
60
65
  onProgress: (stage: string) => void
61
66
  }): Promise<SweepResult> {
62
- const { wallet, keys, funding, ordinals, amount, onProgress } = params
67
+ const {
68
+ wallet,
69
+ keys,
70
+ funding,
71
+ ordinals,
72
+ listings = [],
73
+ amount,
74
+ onProgress,
75
+ } = params
63
76
  const ctx = createContext(wallet, { services: getServices(), chain: 'main' })
64
77
 
65
78
  const result: SweepResult = {
66
79
  ordinalTxids: [],
80
+ listingTxids: [],
67
81
  bsv21Txids: [],
68
82
  errors: [],
69
83
  sweptOutpoints: [],
84
+ cancelledListings: [],
85
+ }
86
+
87
+ if (listings.length > 0) {
88
+ const batches = chunk(listings, SWEEP_BATCH_SIZE)
89
+ for (let b = 0; b < batches.length; b++) {
90
+ const batch = batches[b]
91
+ onProgress(
92
+ `Cancelling ${batch.length} OrdLock listing${batch.length !== 1 ? 's' : ''} into wallet...`,
93
+ )
94
+ try {
95
+ const inputs = await prepareSweepInputs(ctx, batch)
96
+ const cancelResult = await sweepOrdinals.execute(ctx, {
97
+ inputs,
98
+ keys: buildKeys(batch, keys),
99
+ })
100
+ if (cancelResult.error) {
101
+ result.errors.push(`Listings batch ${b + 1}: ${cancelResult.error}`)
102
+ break
103
+ }
104
+ if (cancelResult.txid) result.listingTxids.push(cancelResult.txid)
105
+ result.cancelledListings.push(...batch.map((o) => o.outpoint))
106
+ } catch (e) {
107
+ result.errors.push(
108
+ `Listings batch ${b + 1}: ${e instanceof Error ? e.message : String(e)}`,
109
+ )
110
+ break
111
+ }
112
+ }
70
113
  }
71
114
 
72
115
  if (funding.length > 0) {