@1sat/sweep-ui 0.0.92 → 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.
- package/dist/components/SweepApp.d.ts.map +1 -1
- package/dist/components/asset-preview.d.ts +5 -0
- package/dist/components/asset-preview.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +110 -5
- package/dist/lib/scanner.d.ts +1 -0
- package/dist/lib/scanner.d.ts.map +1 -1
- package/dist/lib/sweeper.d.ts +5 -0
- package/dist/lib/sweeper.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/components/SweepApp.tsx +30 -1
- package/src/components/asset-preview.tsx +36 -0
- package/src/index.ts +1 -0
- package/src/lib/scanner.ts +2 -0
- package/src/lib/sweeper.ts +44 -1
|
@@ -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;
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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,
|
package/dist/lib/scanner.d.ts
CHANGED
|
@@ -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"}
|
package/dist/lib/sweeper.d.ts
CHANGED
|
@@ -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;
|
|
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.
|
|
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.
|
|
33
|
-
"@1sat/client": "0.0.
|
|
34
|
-
"@1sat/connect": "0.0.
|
|
35
|
-
"@1sat/types": "0.0.
|
|
36
|
-
"@1sat/utils": "0.0.
|
|
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.
|
|
45
|
+
"@bsv/sdk": "^2.5.0",
|
|
46
46
|
"react": "^18.0.0 || ^19.0.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@bsv/sdk": "^2.
|
|
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
|
-
|
|
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
package/src/lib/scanner.ts
CHANGED
|
@@ -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,
|
package/src/lib/sweeper.ts
CHANGED
|
@@ -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 {
|
|
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) {
|