@arkade-os/sdk 0.4.65 → 0.4.66
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/adapters/expo.cjs +5 -5
- package/dist/adapters/expo.d.cts +3 -6
- package/dist/adapters/expo.d.ts +3 -6
- package/dist/adapters/expo.js +3 -3
- package/dist/adapters/indexedDB.cjs +5 -5
- package/dist/adapters/indexedDB.js +4 -4
- package/dist/{asyncStorageTaskQueue-Dq_UcvDx.d.ts → asyncStorageTaskQueue-B6SijMi3.d.ts} +1 -1
- package/dist/{asyncStorageTaskQueue-Chwe60Ce.d.cts → asyncStorageTaskQueue-BZcIN7sA.d.cts} +1 -1
- package/dist/{chunk-3G5V564P.js → chunk-2JZGPXU4.js} +32 -6
- package/dist/chunk-2JZGPXU4.js.map +1 -0
- package/dist/{chunk-XN55B6EP.cjs → chunk-3S3JZUEN.cjs} +46 -19
- package/dist/chunk-3S3JZUEN.cjs.map +1 -0
- package/dist/{chunk-RESN6QHP.js → chunk-55ZZ6RBL.js} +4 -4
- package/dist/{chunk-RESN6QHP.js.map → chunk-55ZZ6RBL.js.map} +1 -1
- package/dist/{chunk-GFZNEMGL.cjs → chunk-5E6IZNRG.cjs} +428 -427
- package/dist/chunk-5E6IZNRG.cjs.map +1 -0
- package/dist/{chunk-XMOIRDLF.js → chunk-CYOI4PEA.js} +14 -6
- package/dist/chunk-CYOI4PEA.js.map +1 -0
- package/dist/{chunk-5YTSQSLE.js → chunk-DSC3G6QZ.js} +32 -31
- package/dist/chunk-DSC3G6QZ.js.map +1 -0
- package/dist/{chunk-SJQM5AVB.cjs → chunk-IM6IKNSL.cjs} +17 -17
- package/dist/{chunk-SJQM5AVB.cjs.map → chunk-IM6IKNSL.cjs.map} +1 -1
- package/dist/{chunk-TFSVXMTM.js → chunk-J33ZEM3A.js} +26 -18
- package/dist/chunk-J33ZEM3A.js.map +1 -0
- package/dist/{chunk-7X744EFF.cjs → chunk-LL47QIHD.cjs} +10 -10
- package/dist/{chunk-7X744EFF.cjs.map → chunk-LL47QIHD.cjs.map} +1 -1
- package/dist/{chunk-BABJ77NG.cjs → chunk-PXPPZF5K.cjs} +59 -50
- package/dist/chunk-PXPPZF5K.cjs.map +1 -0
- package/dist/{chunk-TYTPVPKD.js → chunk-R5POS3RS.js} +4 -4
- package/dist/{chunk-TYTPVPKD.js.map → chunk-R5POS3RS.js.map} +1 -1
- package/dist/{chunk-G552MISJ.cjs → chunk-ZIRFXBKL.cjs} +26 -18
- package/dist/chunk-ZIRFXBKL.cjs.map +1 -0
- package/dist/contracts/handlers/index.cjs +9 -9
- package/dist/contracts/handlers/index.d.cts +3 -3
- package/dist/contracts/handlers/index.d.ts +3 -3
- package/dist/contracts/handlers/index.js +2 -2
- package/dist/{delegate-Dv_9OVHv.d.ts → delegate-T-vgxMYZ.d.ts} +1 -1
- package/dist/{delegate-BBQW61ym.d.cts → delegate-YXupcWWJ.d.cts} +1 -1
- package/dist/{index-fDDiA1-L.d.ts → index-D_FgwLH9.d.ts} +2 -2
- package/dist/{index-BtTtQFUX.d.cts → index-e7LYXk1d.d.cts} +2 -2
- package/dist/{index-CFOMyVMt.d.cts → index-uUE_uQPn.d.cts} +70 -33
- package/dist/{index-CFOMyVMt.d.ts → index-uUE_uQPn.d.ts} +70 -33
- package/dist/index.cjs +284 -276
- package/dist/index.d.cts +30 -9
- package/dist/index.d.ts +30 -9
- package/dist/index.js +4 -4
- package/dist/repositories/realm/index.cjs +19 -19
- package/dist/repositories/realm/index.d.cts +2 -2
- package/dist/repositories/realm/index.d.ts +2 -2
- package/dist/repositories/realm/index.js +5 -5
- package/dist/repositories/sqlite/index.cjs +18 -18
- package/dist/repositories/sqlite/index.d.cts +2 -2
- package/dist/repositories/sqlite/index.d.ts +2 -2
- package/dist/repositories/sqlite/index.js +5 -5
- package/dist/{taskRunner-CIKOS2OO.d.cts → taskRunner-BOVcIH1N.d.cts} +1 -1
- package/dist/{taskRunner-BDzWbpct.d.ts → taskRunner-DNyD1kXG.d.ts} +1 -1
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +6 -6
- package/dist/wallet/expo/index.cjs +14 -14
- package/dist/wallet/expo/index.d.cts +4 -4
- package/dist/wallet/expo/index.d.ts +4 -4
- package/dist/wallet/expo/index.js +5 -5
- package/dist/{wallet-C2NvHjWB.d.cts → wallet-CNibc3yJ.d.ts} +3 -3
- package/dist/{wallet-DJUnN939.d.ts → wallet-DJN1QgFt.d.cts} +3 -3
- package/dist/worker/expo/index.cjs +9 -9
- package/dist/worker/expo/index.d.cts +4 -4
- package/dist/worker/expo/index.d.ts +4 -4
- package/dist/worker/expo/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-3G5V564P.js.map +0 -1
- package/dist/chunk-5YTSQSLE.js.map +0 -1
- package/dist/chunk-BABJ77NG.cjs.map +0 -1
- package/dist/chunk-G552MISJ.cjs.map +0 -1
- package/dist/chunk-GFZNEMGL.cjs.map +0 -1
- package/dist/chunk-TFSVXMTM.js.map +0 -1
- package/dist/chunk-XMOIRDLF.js.map +0 -1
- package/dist/chunk-XN55B6EP.cjs.map +0 -1
package/dist/adapters/expo.cjs
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
3
|
+
var chunkIM6IKNSL_cjs = require('../chunk-IM6IKNSL.cjs');
|
|
4
|
+
require('../chunk-3S3JZUEN.cjs');
|
|
5
|
+
require('../chunk-ZIRFXBKL.cjs');
|
|
6
6
|
require('../chunk-5BLDMQED.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
Object.defineProperty(exports, "ExpoArkProvider", {
|
|
11
11
|
enumerable: true,
|
|
12
|
-
get: function () { return
|
|
12
|
+
get: function () { return chunkIM6IKNSL_cjs.ExpoArkProvider; }
|
|
13
13
|
});
|
|
14
14
|
Object.defineProperty(exports, "ExpoIndexerProvider", {
|
|
15
15
|
enumerable: true,
|
|
16
|
-
get: function () { return
|
|
16
|
+
get: function () { return chunkIM6IKNSL_cjs.ExpoIndexerProvider; }
|
|
17
17
|
});
|
|
18
18
|
//# sourceMappingURL=expo.cjs.map
|
|
19
19
|
//# sourceMappingURL=expo.cjs.map
|
package/dist/adapters/expo.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { l as RestArkProvider, i as SettlementEvent, T as
|
|
2
|
-
export { o as ArkProvider, p as IndexerProvider } from '../index-
|
|
1
|
+
import { l as RestArkProvider, i as SettlementEvent, T as TxNotificationEvent, m as RestIndexerProvider, n as SubscriptionResponse } from '../index-uUE_uQPn.cjs';
|
|
2
|
+
export { o as ArkProvider, p as IndexerProvider } from '../index-uUE_uQPn.cjs';
|
|
3
3
|
import '@scure/btc-signer/utils.js';
|
|
4
4
|
import '@scure/btc-signer/transaction.js';
|
|
5
5
|
import '@scure/btc-signer';
|
|
@@ -21,10 +21,7 @@ import '@scure/btc-signer/psbt.js';
|
|
|
21
21
|
declare class ExpoArkProvider extends RestArkProvider {
|
|
22
22
|
constructor(serverUrl?: string);
|
|
23
23
|
getEventStream(signal: AbortSignal, topics: string[]): AsyncIterableIterator<SettlementEvent>;
|
|
24
|
-
getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<
|
|
25
|
-
commitmentTx?: TxNotification;
|
|
26
|
-
arkTx?: TxNotification;
|
|
27
|
-
}>;
|
|
24
|
+
getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<TxNotificationEvent>;
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
/**
|
package/dist/adapters/expo.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { l as RestArkProvider, i as SettlementEvent, T as
|
|
2
|
-
export { o as ArkProvider, p as IndexerProvider } from '../index-
|
|
1
|
+
import { l as RestArkProvider, i as SettlementEvent, T as TxNotificationEvent, m as RestIndexerProvider, n as SubscriptionResponse } from '../index-uUE_uQPn.js';
|
|
2
|
+
export { o as ArkProvider, p as IndexerProvider } from '../index-uUE_uQPn.js';
|
|
3
3
|
import '@scure/btc-signer/utils.js';
|
|
4
4
|
import '@scure/btc-signer/transaction.js';
|
|
5
5
|
import '@scure/btc-signer';
|
|
@@ -21,10 +21,7 @@ import '@scure/btc-signer/psbt.js';
|
|
|
21
21
|
declare class ExpoArkProvider extends RestArkProvider {
|
|
22
22
|
constructor(serverUrl?: string);
|
|
23
23
|
getEventStream(signal: AbortSignal, topics: string[]): AsyncIterableIterator<SettlementEvent>;
|
|
24
|
-
getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<
|
|
25
|
-
commitmentTx?: TxNotification;
|
|
26
|
-
arkTx?: TxNotification;
|
|
27
|
-
}>;
|
|
24
|
+
getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<TxNotificationEvent>;
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
/**
|
package/dist/adapters/expo.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { ExpoArkProvider, ExpoIndexerProvider } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { ExpoArkProvider, ExpoIndexerProvider } from '../chunk-R5POS3RS.js';
|
|
2
|
+
import '../chunk-2JZGPXU4.js';
|
|
3
|
+
import '../chunk-J33ZEM3A.js';
|
|
4
4
|
import '../chunk-NSBPE2FW.js';
|
|
5
5
|
//# sourceMappingURL=expo.js.map
|
|
6
6
|
//# sourceMappingURL=expo.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
6
|
-
require('../chunk-
|
|
3
|
+
var chunk5E6IZNRG_cjs = require('../chunk-5E6IZNRG.cjs');
|
|
4
|
+
require('../chunk-3S3JZUEN.cjs');
|
|
5
|
+
require('../chunk-PXPPZF5K.cjs');
|
|
6
|
+
require('../chunk-ZIRFXBKL.cjs');
|
|
7
7
|
require('../chunk-5BLDMQED.cjs');
|
|
8
8
|
|
|
9
9
|
// src/storage/indexedDB.ts
|
|
@@ -11,7 +11,7 @@ var IndexedDBStorageAdapter = class {
|
|
|
11
11
|
dbName;
|
|
12
12
|
version;
|
|
13
13
|
db = null;
|
|
14
|
-
constructor(dbName, version =
|
|
14
|
+
constructor(dbName, version = chunk5E6IZNRG_cjs.DB_VERSION) {
|
|
15
15
|
this.dbName = dbName;
|
|
16
16
|
this.version = version;
|
|
17
17
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { DB_VERSION } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
1
|
+
import { DB_VERSION } from '../chunk-DSC3G6QZ.js';
|
|
2
|
+
import '../chunk-2JZGPXU4.js';
|
|
3
|
+
import '../chunk-CYOI4PEA.js';
|
|
4
|
+
import '../chunk-J33ZEM3A.js';
|
|
5
5
|
import '../chunk-NSBPE2FW.js';
|
|
6
6
|
|
|
7
7
|
// src/storage/indexedDB.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_ARKADE_SERVER_URL, eventSourceIterator, resolveEventSource, convertVtxo, isFetchTimeoutError, isEventSourceError, isEventSourceUnavailableError, rateGate, baseFetch, toProviderUnavailable, ProviderUnavailableError, throwIfHttpUnavailable } from './chunk-
|
|
1
|
+
import { DEFAULT_ARKADE_SERVER_URL, eventSourceIterator, resolveEventSource, convertVtxo, isFetchTimeoutError, isEventSourceError, isEventSourceUnavailableError, rateGate, baseFetch, toProviderUnavailable, ProviderUnavailableError, throwIfHttpUnavailable } from './chunk-J33ZEM3A.js';
|
|
2
2
|
import { __export } from './chunk-NSBPE2FW.js';
|
|
3
3
|
import { hex } from '@scure/base';
|
|
4
4
|
import { schnorr } from '@noble/curves/secp256k1.js';
|
|
@@ -1446,6 +1446,7 @@ function retryDelayMs(attempt) {
|
|
|
1446
1446
|
return INDEXER_RETRY_BASE_MS * 2 ** (attempt - 1);
|
|
1447
1447
|
}
|
|
1448
1448
|
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
1449
|
+
var DEFAULT_VTXO_PAGE_SIZE = 500;
|
|
1449
1450
|
var IndexerTxType = /* @__PURE__ */ ((IndexerTxType2) => {
|
|
1450
1451
|
IndexerTxType2[IndexerTxType2["INDEXER_TX_TYPE_UNSPECIFIED"] = 0] = "INDEXER_TX_TYPE_UNSPECIFIED";
|
|
1451
1452
|
IndexerTxType2[IndexerTxType2["INDEXER_TX_TYPE_RECEIVED"] = 1] = "INDEXER_TX_TYPE_RECEIVED";
|
|
@@ -1718,14 +1719,39 @@ var RestIndexerProvider = class {
|
|
|
1718
1719
|
if (opts?.after !== void 0 && opts?.before !== void 0 && opts.after !== 0 && opts.before !== 0 && opts.before <= opts.after) {
|
|
1719
1720
|
throw new Error("before must be greater than after");
|
|
1720
1721
|
}
|
|
1722
|
+
if (opts?.pageIndex === void 0 && opts?.pageSize === void 0) {
|
|
1723
|
+
const all = [];
|
|
1724
|
+
let pageIndex = 0;
|
|
1725
|
+
for (; ; ) {
|
|
1726
|
+
const { vtxos, page } = await this.fetchVtxosPage({
|
|
1727
|
+
...opts,
|
|
1728
|
+
pageIndex,
|
|
1729
|
+
pageSize: DEFAULT_VTXO_PAGE_SIZE
|
|
1730
|
+
});
|
|
1731
|
+
all.push(...vtxos);
|
|
1732
|
+
if (!page || page.current >= page.total || vtxos.length < DEFAULT_VTXO_PAGE_SIZE) {
|
|
1733
|
+
break;
|
|
1734
|
+
}
|
|
1735
|
+
pageIndex = page.next;
|
|
1736
|
+
}
|
|
1737
|
+
return { vtxos: all };
|
|
1738
|
+
}
|
|
1739
|
+
return this.fetchVtxosPage(opts);
|
|
1740
|
+
}
|
|
1741
|
+
/**
|
|
1742
|
+
* Fetch a single page of vtxos. Callers paging to exhaustion get no
|
|
1743
|
+
* deliberate inter-page backoff here: `indexerFetch` already enforces
|
|
1744
|
+
* politeness through the rate gate, so don't add a redundant sleep.
|
|
1745
|
+
*/
|
|
1746
|
+
async fetchVtxosPage(opts) {
|
|
1721
1747
|
let url = `${this.serverUrl}/v1/indexer/vtxos`;
|
|
1722
1748
|
const params = new URLSearchParams();
|
|
1723
|
-
if (
|
|
1749
|
+
if (opts?.scripts?.length) {
|
|
1724
1750
|
opts.scripts.forEach((script) => {
|
|
1725
1751
|
params.append("scripts", script);
|
|
1726
1752
|
});
|
|
1727
1753
|
}
|
|
1728
|
-
if (
|
|
1754
|
+
if (opts?.outpoints?.length) {
|
|
1729
1755
|
opts.outpoints.forEach((outpoint) => {
|
|
1730
1756
|
params.append("outpoints", `${outpoint.txid}:${outpoint.vout}`);
|
|
1731
1757
|
});
|
|
@@ -1927,6 +1953,6 @@ var Response;
|
|
|
1927
1953
|
Response2.isGetAssetResponse = isGetAssetResponse;
|
|
1928
1954
|
})(Response || (Response = {}));
|
|
1929
1955
|
|
|
1930
|
-
export { AssetGroup, AssetId, AssetInput, AssetOutput, AssetRef, BufferReader, BufferWriter, ChainTxType, IndexerTxType, Metadata, Packet, RestIndexerProvider, asset_exports };
|
|
1931
|
-
//# sourceMappingURL=chunk-
|
|
1932
|
-
//# sourceMappingURL=chunk-
|
|
1956
|
+
export { AssetGroup, AssetId, AssetInput, AssetOutput, AssetRef, BufferReader, BufferWriter, ChainTxType, DEFAULT_VTXO_PAGE_SIZE, IndexerTxType, Metadata, Packet, RestIndexerProvider, asset_exports };
|
|
1957
|
+
//# sourceMappingURL=chunk-2JZGPXU4.js.map
|
|
1958
|
+
//# sourceMappingURL=chunk-2JZGPXU4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/extension/asset/index.ts","../src/extension/asset/types.ts","../src/extension/utils.ts","../src/extension/asset/utils.ts","../src/extension/asset/assetId.ts","../src/extension/asset/assetRef.ts","../src/extension/asset/assetInput.ts","../src/extension/asset/assetOutput.ts","../src/extension/asset/metadata.ts","../src/extension/asset/assetGroup.ts","../src/extension/asset/packet.ts","../src/extension/asset/assetIdVectors.json","../src/extension/asset/assetIdVectors.ts","../src/providers/indexer.ts"],"names":["AssetInputType","AssetRefType","hex","IndexerTxType","ChainTxType","Response"],"mappings":"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","file":"chunk-2JZGPXU4.js","sourcesContent":["export { AssetInputType, AssetRefType } from \"./types\";\n\nexport { AssetId } from \"./assetId\";\nexport { AssetRef } from \"./assetRef\";\nexport { AssetInput, AssetInputs } from \"./assetInput\";\nexport { AssetOutput, AssetOutputs } from \"./assetOutput\";\nexport { Metadata, MetadataList } from \"./metadata\";\nexport { AssetGroup } from \"./assetGroup\";\nexport { Packet } from \"./packet\";\n\nexport { ASSET_ID_VECTORS } from \"./assetIdVectors\";\nexport type { AssetIdVectors } from \"./assetIdVectors\";\n","export const TX_HASH_SIZE = 32;\nexport const ASSET_ID_SIZE = 34;\nexport const ASSET_VERSION = 0x01;\n\nexport enum AssetInputType {\n Unspecified = 0,\n Local = 1,\n Intent = 2,\n}\n\nexport enum AssetRefType {\n Unspecified = 0,\n ByID = 1,\n ByGroup = 2,\n}\n\n// Presence byte masks for AssetGroup\nexport const MASK_ASSET_ID = 0x01;\nexport const MASK_CONTROL_ASSET = 0x02;\nexport const MASK_METADATA = 0x04;\n","export class BufferWriter {\n private buffer: number[] = [];\n\n write(data: Uint8Array): void {\n for (const byte of data) {\n this.buffer.push(byte);\n }\n }\n\n writeByte(byte: number): void {\n this.buffer.push(byte & 0xff);\n }\n\n writeUint16LE(value: number): void {\n const buf = new Uint8Array(2);\n new DataView(buf.buffer).setUint16(0, value, true); // true = little endian\n this.write(buf);\n }\n\n writeVarUint(value: bigint | number): void {\n if (typeof value === \"number\") {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(\"writeVarUint: value must be a non-negative integer\");\n }\n } else if (value < 0n) {\n throw new RangeError(\"writeVarUint: value must be a non-negative integer\");\n }\n const val = typeof value === \"number\" ? BigInt(value) : value;\n const bytes: number[] = [];\n let remaining = val;\n\n do {\n let byte = Number(remaining & 0x7fn);\n remaining >>= 7n;\n if (remaining > 0n) {\n byte |= 0x80;\n }\n bytes.push(byte);\n } while (remaining > 0n);\n\n this.write(new Uint8Array(bytes));\n }\n\n writeVarSlice(data: Uint8Array): void {\n this.writeVarUint(data.length);\n this.write(data);\n }\n\n writeCompactSize(value: number): void {\n if (value < 0xfd) {\n this.writeByte(value);\n } else if (value <= 0xffff) {\n this.writeByte(0xfd);\n this.writeUint16LE(value);\n } else if (value <= 0xffffffff) {\n this.writeByte(0xfe);\n const b = new Uint8Array(4);\n new DataView(b.buffer).setUint32(0, value, true);\n this.write(b);\n } else {\n throw new Error(\"CompactSize value too large\");\n }\n }\n\n writeCompactSlice(data: Uint8Array): void {\n this.writeCompactSize(data.length);\n this.write(data);\n }\n\n toBytes(): Uint8Array {\n return new Uint8Array(this.buffer);\n }\n}\n\nexport class BufferReader {\n private view: DataView;\n private offset: number = 0;\n\n constructor(data: Uint8Array) {\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n }\n\n remaining(): number {\n return this.view.byteLength - this.offset;\n }\n\n readByte(): number {\n if (this.offset >= this.view.byteLength) {\n throw new Error(\"unexpected end of buffer\");\n }\n return this.view.getUint8(this.offset++);\n }\n\n readSlice(size: number): Uint8Array {\n if (this.offset + size > this.view.byteLength) {\n throw new Error(\"unexpected end of buffer\");\n }\n const result = new Uint8Array(this.view.buffer, this.view.byteOffset + this.offset, size);\n this.offset += size;\n return result;\n }\n\n readUint16LE(): number {\n if (this.offset + 2 > this.view.byteLength) {\n throw new Error(\"unexpected end of buffer\");\n }\n const value = this.view.getUint16(this.offset, true);\n this.offset += 2;\n return value;\n }\n\n readVarUint(): bigint {\n let result = 0n;\n let shift = 0n;\n let byte: number;\n\n do {\n if (this.offset >= this.view.byteLength) {\n throw new Error(\"unexpected end of buffer\");\n }\n byte = this.view.getUint8(this.offset++);\n result |= BigInt(byte & 0x7f) << shift;\n shift += 7n;\n } while (byte & 0x80);\n\n return result;\n }\n\n readVarSlice(): Uint8Array {\n const length = Number(this.readVarUint());\n return this.readSlice(length);\n }\n\n readCompactSize(): number {\n const first = this.readByte();\n if (first < 0xfd) return first;\n if (first === 0xfd) return this.readUint16LE();\n if (first === 0xfe) {\n const b = this.readSlice(4);\n return new DataView(b.buffer, b.byteOffset, b.byteLength).getUint32(0, true);\n }\n throw new Error(\"CompactSize 8-byte values not supported\");\n }\n\n readCompactSlice(): Uint8Array {\n const length = this.readCompactSize();\n return this.readSlice(length);\n }\n}\n","export function isZeroBytes(bytes: Uint8Array): boolean {\n return bytes.every((byte) => byte === 0);\n}\n","import { hex } from \"@scure/base\";\nimport { TX_HASH_SIZE, ASSET_ID_SIZE } from \"./types\";\nimport { BufferReader, BufferWriter } from \"../utils\";\nimport { isZeroBytes } from \"./utils\";\n\n/**\n * AssetId identifies a specific asset.\n *\n * @remarks\n * Asset ids are derived from the genesis transaction id plus the asset group index.\n *\n * @see AssetRef\n *\n * @example\n * ```typescript\n * const assetId = AssetId.create('00'.repeat(32), 0)\n * const encoded = assetId.toString()\n * const decoded = AssetId.fromString(encoded)\n * ```\n */\nexport class AssetId {\n private constructor(\n readonly txid: Uint8Array,\n readonly groupIndex: number,\n ) {}\n\n /**\n * Create an asset id from a genesis transaction id and group index.\n *\n * @param txid - Hex-encoded genesis transaction id\n * @param groupIndex - Asset group index within the genesis transaction\n * @returns A validated asset id\n * @throws Error if the txid is missing, malformed, or not 32 bytes long\n * @see fromString\n */\n static create(txid: string, groupIndex: number): AssetId {\n if (!txid) {\n throw new Error(\"missing txid\");\n }\n\n let buf: Uint8Array;\n try {\n buf = hex.decode(txid);\n } catch {\n throw new Error(\"invalid txid format, must be hex\");\n }\n\n if (buf.length !== TX_HASH_SIZE) {\n throw new Error(\n `invalid txid length: got ${buf.length} bytes, want ${TX_HASH_SIZE} bytes`,\n );\n }\n\n const assetId = new AssetId(buf, groupIndex);\n assetId.validate();\n return assetId;\n }\n\n /**\n * Decode an asset id from its hex string representation.\n *\n * @param s - Hex-encoded asset id\n * @returns Decoded asset id\n * @throws Error if the string is not valid hex or does not encode a valid asset id\n * @see toString\n */\n static fromString(s: string): AssetId {\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid asset id format, must be hex\");\n }\n return AssetId.fromBytes(buf);\n }\n\n /**\n * Decode an asset id from its serialized bytes.\n *\n * @param buf - Serialized asset id bytes\n * @returns Decoded asset id\n * @throws Error if the buffer length is invalid\n */\n static fromBytes(buf: Uint8Array): AssetId {\n if (!buf || buf.length === 0) {\n throw new Error(\"missing asset id\");\n }\n if (buf.length !== ASSET_ID_SIZE) {\n throw new Error(\n `invalid asset id length: got ${buf.length} bytes, want ${ASSET_ID_SIZE} bytes`,\n );\n }\n const reader = new BufferReader(buf);\n return AssetId.fromReader(reader);\n }\n\n /**\n * Serialize the asset id to raw bytes.\n *\n * @returns Serialized asset id bytes\n * @see fromBytes\n */\n serialize(): Uint8Array {\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /**\n * Encode the asset id to a hex string.\n *\n * @returns Hex-encoded asset id\n * @see fromString\n */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n /**\n * Validate the asset id fields.\n *\n * @throws Error if the txid is empty or the group index is out of range\n */\n validate(): void {\n if (isZeroBytes(this.txid)) {\n throw new Error(\"empty txid\");\n }\n if (!Number.isInteger(this.groupIndex) || this.groupIndex < 0 || this.groupIndex > 0xffff) {\n throw new Error(`invalid group index: ${this.groupIndex}, must be in range [0, 65535]`);\n }\n }\n\n /**\n * Decode an asset id from a binary reader.\n *\n * @param reader - Reader positioned at an asset id\n * @returns Decoded asset id\n * @throws Error if the reader does not contain enough bytes\n */\n static fromReader(reader: BufferReader): AssetId {\n if (reader.remaining() < ASSET_ID_SIZE) {\n throw new Error(\n `invalid asset id length: got ${reader.remaining()}, want ${ASSET_ID_SIZE}`,\n );\n }\n\n const txid = reader.readSlice(TX_HASH_SIZE);\n const index = reader.readUint16LE();\n\n const assetId = new AssetId(txid, index);\n assetId.validate();\n return assetId;\n }\n\n /**\n * Serialize the asset id into an existing binary writer.\n *\n * @param writer - Writer to append the asset id to\n * @see serialize\n */\n serializeTo(writer: BufferWriter): void {\n writer.write(this.txid);\n writer.writeUint16LE(this.groupIndex);\n }\n}\n","import { hex } from \"@scure/base\";\nimport { AssetRefType } from \"./types\";\nimport { AssetId } from \"./assetId\";\nimport { BufferReader, BufferWriter } from \"../utils\";\n\ntype AssetRefByID = {\n type: AssetRefType.ByID;\n assetId: AssetId;\n};\ntype AssetRefByGroup = {\n type: AssetRefType.ByGroup;\n groupIndex: number;\n};\n\n/**\n * Reference to either an explicit asset id or another asset group in the same packet.\n *\n * @see AssetId\n *\n * @example\n * ```typescript\n * const refById = AssetRef.fromId(assetId)\n * const refByGroup = AssetRef.fromGroupIndex(0)\n * ```\n */\nexport class AssetRef {\n private constructor(readonly ref: AssetRefByID | AssetRefByGroup) {}\n\n /** Reference type discriminator. */\n get type(): AssetRefType {\n return this.ref.type;\n }\n\n /**\n * Create an asset reference that points to a specific asset id.\n *\n * @param assetId - Asset id referenced by this pointer\n * @returns Asset reference by id\n * @see fromGroupIndex\n */\n static fromId(assetId: AssetId): AssetRef {\n return new AssetRef({ type: AssetRefType.ByID, assetId });\n }\n\n /**\n * Create an asset reference that points to another asset group by index.\n *\n * @param groupIndex - Zero-based asset group index in the packet\n * @returns Asset reference by group index\n * @see fromId\n */\n static fromGroupIndex(groupIndex: number): AssetRef {\n return new AssetRef({ type: AssetRefType.ByGroup, groupIndex });\n }\n\n /**\n * Decode an asset reference from its hex string form.\n *\n * @param s - Hex-encoded asset reference\n * @returns Decoded asset reference\n * @throws Error if the string is not valid hex or does not encode a valid asset reference\n * @see toString\n */\n static fromString(s: string): AssetRef {\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid asset ref format, must be hex\");\n }\n return AssetRef.fromBytes(buf);\n }\n\n /**\n * Decode an asset reference from its serialized bytes.\n *\n * @param buf - Serialized asset reference bytes\n * @returns Decoded asset reference\n * @throws Error if the buffer is empty or malformed\n */\n static fromBytes(buf: Uint8Array): AssetRef {\n if (!buf || buf.length === 0) {\n throw new Error(\"missing asset ref\");\n }\n const reader = new BufferReader(buf);\n return AssetRef.fromReader(reader);\n }\n\n /**\n * Serialize the asset reference to raw bytes.\n *\n * @returns Serialized asset reference bytes\n * @see fromBytes\n */\n serialize(): Uint8Array {\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /**\n * Encode the asset reference to a hex string.\n *\n * @returns Hex-encoded asset reference\n * @see fromString\n */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n /**\n * Decode an asset reference from a binary reader.\n *\n * @param reader - Reader positioned at an asset reference\n * @returns Decoded asset reference\n * @throws Error if the type is unknown or the reader does not contain enough bytes\n */\n static fromReader(reader: BufferReader): AssetRef {\n const type = reader.readByte() as AssetRefType;\n\n let ref: AssetRef;\n switch (type) {\n case AssetRefType.ByID: {\n const assetId = AssetId.fromReader(reader);\n ref = new AssetRef({ type: AssetRefType.ByID, assetId });\n break;\n }\n case AssetRefType.ByGroup: {\n if (reader.remaining() < 2) {\n throw new Error(\"invalid asset ref length\");\n }\n const groupIndex = reader.readUint16LE();\n ref = new AssetRef({ type: AssetRefType.ByGroup, groupIndex });\n break;\n }\n case AssetRefType.Unspecified:\n throw new Error(\"asset ref type unspecified\");\n default:\n throw new Error(`asset ref type unknown ${type}`);\n }\n\n return ref;\n }\n\n /**\n * Serialize the asset reference into an existing binary writer.\n *\n * @param writer - Writer to append the asset reference to\n * @see serialize\n */\n serializeTo(writer: BufferWriter): void {\n writer.writeByte(this.ref.type);\n\n switch (this.ref.type) {\n case AssetRefType.ByID:\n this.ref.assetId.serializeTo(writer);\n break;\n case AssetRefType.ByGroup:\n writer.writeUint16LE(this.ref.groupIndex);\n break;\n }\n }\n}\n","import { hex } from \"@scure/base\";\nimport { AssetInputType, TX_HASH_SIZE } from \"./types\";\nimport { BufferReader, BufferWriter } from \"../utils\";\nimport { isZeroBytes } from \"./utils\";\n\ntype AssetInputLocal = {\n type: AssetInputType.Local;\n vin: number;\n amount: bigint;\n};\n\ntype AssetInputIntent = Pick<AssetInputLocal, \"vin\" | \"amount\"> & {\n type: AssetInputType.Intent;\n txid: Uint8Array;\n};\n\n/**\n * AssetInput represents an input of an asset group.\n * a local input references a real transaction input and specify the amount in satoshis.\n * an intent input references an external intent transaction. It is created by the server to handle batch leaf transaction.\n */\nexport class AssetInput {\n private constructor(readonly input: AssetInputLocal | AssetInputIntent) {}\n\n /** Gets the transaction input index for an asset input, e.g. 0 */\n get vin(): number {\n return this.input.vin;\n }\n\n /** Gets the amount for an input (in most cases, 330 sats) */\n get amount(): bigint {\n return this.input.amount;\n }\n\n /** Create a local asset input that points at a transaction input index. */\n static create(vin: number, amount: bigint | number): AssetInput {\n const input = new AssetInput({\n type: AssetInputType.Local,\n vin,\n amount: typeof amount === \"number\" ? BigInt(amount) : amount,\n });\n input.validate();\n return input;\n }\n\n /** Create an intent-backed asset input referencing an external intent transaction. */\n static createIntent(txid: string, vin: number, amount: bigint | number): AssetInput {\n if (!txid || txid.length === 0) {\n throw new Error(\"missing input intent txid\");\n }\n\n let buf: Uint8Array;\n try {\n buf = hex.decode(txid);\n } catch {\n throw new Error(\"invalid input intent txid format, must be hex\");\n }\n\n if (buf.length !== TX_HASH_SIZE) {\n throw new Error(\"invalid input intent txid length\");\n }\n\n const input = new AssetInput({\n type: AssetInputType.Intent,\n txid: buf,\n vin,\n amount: typeof amount === \"number\" ? BigInt(amount) : amount,\n });\n input.validate();\n return input;\n }\n\n /** Decode an asset input from its hex string form. */\n static fromString(s: string): AssetInput {\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid format, must be hex\");\n }\n return AssetInput.fromBytes(buf);\n }\n\n /** Decode an asset input from its serialized bytes. */\n static fromBytes(buf: Uint8Array): AssetInput {\n const reader = new BufferReader(buf);\n return AssetInput.fromReader(reader);\n }\n\n /** Serialize the asset input to raw bytes. */\n serialize(): Uint8Array {\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /** Encode the asset input to a hex string. */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n /** Validate the asset input fields. */\n validate(): void {\n switch (this.input.type) {\n case AssetInputType.Local:\n break;\n case AssetInputType.Intent:\n if (isZeroBytes(this.input.txid)) {\n throw new Error(\"missing input intent txid\");\n }\n break;\n }\n }\n\n /** Decode an asset input from a buffer reader. */\n static fromReader(reader: BufferReader): AssetInput {\n const type = reader.readByte() as AssetInputType;\n\n let input: AssetInput;\n switch (type) {\n case AssetInputType.Local: {\n const vin = reader.readUint16LE();\n const amount = reader.readVarUint();\n input = new AssetInput({\n type: AssetInputType.Local,\n vin,\n amount,\n });\n break;\n }\n case AssetInputType.Intent: {\n if (reader.remaining() < TX_HASH_SIZE) {\n throw new Error(\"invalid input intent txid length\");\n }\n const txid = reader.readSlice(TX_HASH_SIZE);\n const vin = reader.readUint16LE();\n const amount = reader.readVarUint();\n input = new AssetInput({\n type: AssetInputType.Intent,\n txid: new Uint8Array(txid),\n vin,\n amount,\n });\n break;\n }\n case AssetInputType.Unspecified:\n throw new Error(\"asset input type unspecified\");\n default:\n throw new Error(`asset input type ${type} unknown`);\n }\n\n input.validate();\n return input;\n }\n\n /** Serialize the asset input into an existing buffer writer. */\n serializeTo(writer: BufferWriter): void {\n writer.writeByte(this.input.type);\n if (this.input.type === AssetInputType.Intent) {\n writer.write(this.input.txid);\n }\n writer.writeUint16LE(this.input.vin);\n writer.writeVarUint(this.input.amount);\n }\n}\n\n/**\n * AssetInputs represents a list of asset inputs.\n */\nexport class AssetInputs {\n private constructor(readonly inputs: AssetInput[]) {}\n\n /** Create a validated list of asset inputs. */\n static create(inputs: AssetInput[]): AssetInputs {\n const list = new AssetInputs(inputs);\n list.validate();\n return list;\n }\n\n /** Decode an asset input list from its hex string form. */\n static fromString(s: string): AssetInputs {\n if (!s || s.length === 0) {\n throw new Error(\"missing asset inputs\");\n }\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid asset inputs format, must be hex\");\n }\n const reader = new BufferReader(buf);\n return AssetInputs.fromReader(reader);\n }\n\n /** Serialize the asset input list to raw bytes. */\n serialize(): Uint8Array {\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /** Encode the asset input list to a hex string. */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n /** Validate the asset input list. */\n validate(): void {\n const seen = new Set<number>();\n let listType = AssetInputType.Unspecified;\n\n for (const assetInput of this.inputs) {\n assetInput.validate();\n\n if (listType === AssetInputType.Unspecified) {\n listType = assetInput.input.type;\n } else if (listType !== assetInput.input.type) {\n throw new Error(\"all inputs must be of the same type\");\n }\n\n // verify the same input vin is not duplicated\n if (assetInput.input.type === AssetInputType.Local) {\n if (seen.has(assetInput.input.vin)) {\n throw new Error(`duplicated input vin ${assetInput.input.vin}`);\n }\n seen.add(assetInput.input.vin);\n continue;\n }\n }\n }\n\n /** Decode an asset input list from a buffer reader. */\n static fromReader(reader: BufferReader): AssetInputs {\n const count = Number(reader.readVarUint());\n const inputs: AssetInput[] = [];\n for (let i = 0; i < count; i++) {\n inputs.push(AssetInput.fromReader(reader));\n }\n return AssetInputs.create(inputs);\n }\n\n /** Serialize the asset input list into an existing buffer writer. */\n serializeTo(writer: BufferWriter): void {\n writer.writeVarUint(this.inputs.length);\n for (const input of this.inputs) {\n input.serializeTo(writer);\n }\n }\n}\n","import { hex } from \"@scure/base\";\nimport { BufferReader, BufferWriter } from \"../utils\";\n\n/**\n * AssetOutput references a real transaction output and specify the amount in satoshis.\n * it must be present in an AssetGroup.\n *\n * @param vout - the output index in the transaction\n * @param amount - asset amount in satoshis\n */\nexport class AssetOutput {\n // 0x01 means local output, there is only 1 local output type currently\n // however we serialize it for future upgrades\n static readonly TYPE_LOCAL = 0x01;\n\n private constructor(\n readonly vout: number,\n readonly amount: bigint,\n ) {}\n\n /** Create a local asset output referencing a transaction output index. */\n static create(vout: number, amount: bigint | number): AssetOutput {\n const output = new AssetOutput(vout, typeof amount === \"number\" ? BigInt(amount) : amount);\n output.validate();\n return output;\n }\n\n /** Decode an asset output from its hex string form. */\n static fromString(s: string): AssetOutput {\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid asset output format, must be hex\");\n }\n return AssetOutput.fromBytes(buf);\n }\n\n /** Decode an asset output from its serialized bytes. */\n static fromBytes(buf: Uint8Array): AssetOutput {\n if (!buf || buf.length === 0) {\n throw new Error(\"missing asset output\");\n }\n const reader = new BufferReader(buf);\n const output = AssetOutput.fromReader(reader);\n output.validate();\n return output;\n }\n\n /** Serialize the asset output to raw bytes. */\n serialize(): Uint8Array {\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /** Encode the asset output to a hex string. */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n /** Validate the asset output fields. */\n validate(): void {\n if (!Number.isInteger(this.vout) || this.vout < 0 || this.vout > 0xffff) {\n throw new Error(\"asset output vout must be an integer in range [0, 65535]\");\n }\n if (this.amount <= 0n) {\n throw new Error(\"asset output amount must be greater than 0\");\n }\n }\n\n /** Decode an asset output from a buffer reader. */\n static fromReader(reader: BufferReader): AssetOutput {\n if (reader.remaining() < 2) {\n throw new Error(\"invalid asset output vout length\");\n }\n const type = reader.readByte();\n if (type !== AssetOutput.TYPE_LOCAL) {\n if (type === 0x00) {\n throw new Error(\"output type unspecified\");\n }\n throw new Error(\"unknown asset output type\");\n }\n\n let vout: number;\n try {\n vout = reader.readUint16LE();\n } catch {\n throw new Error(\"invalid asset output vout length\");\n }\n\n const amount = reader.readVarUint();\n return new AssetOutput(vout, amount);\n }\n\n /** Serialize the asset output into an existing buffer writer. */\n serializeTo(writer: BufferWriter): void {\n writer.writeByte(0x01);\n writer.writeUint16LE(this.vout);\n writer.writeVarUint(this.amount);\n }\n}\n\n/**\n * AssetOutputs is a list of AssetOutput references.\n * it must be present in an AssetGroup.\n *\n * @param outputs - the list of asset outputs\n */\nexport class AssetOutputs {\n private constructor(readonly outputs: AssetOutput[]) {}\n\n /** Create a validated list of asset outputs. */\n static create(outputs: AssetOutput[]): AssetOutputs {\n const list = new AssetOutputs(outputs);\n list.validate();\n return list;\n }\n\n /** Decode an asset output list from its hex string form. */\n static fromString(s: string): AssetOutputs {\n if (!s || s.length === 0) {\n throw new Error(\"missing asset outputs\");\n }\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid asset outputs format, must be hex\");\n }\n const reader = new BufferReader(buf);\n return AssetOutputs.fromReader(reader);\n }\n\n /** Serialize the asset output list to raw bytes. */\n serialize(): Uint8Array {\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /** Encode the asset output list to a hex string. */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n /** Validate the asset output list. */\n validate(): void {\n const seen = new Set<number>();\n for (const output of this.outputs) {\n output.validate();\n if (seen.has(output.vout)) {\n throw new Error(`duplicated output vout ${output.vout}`);\n }\n seen.add(output.vout);\n }\n }\n\n /** Decode an asset output list from a buffer reader. */\n static fromReader(reader: BufferReader): AssetOutputs {\n const count = Number(reader.readVarUint());\n if (count === 0) {\n return new AssetOutputs([]);\n }\n\n const outputs: AssetOutput[] = [];\n for (let i = 0; i < count; i++) {\n outputs.push(AssetOutput.fromReader(reader));\n }\n const result = new AssetOutputs(outputs);\n result.validate();\n return result;\n }\n\n /** Serialize the asset output list into an existing buffer writer. */\n serializeTo(writer: BufferWriter): void {\n this.validate();\n writer.writeVarUint(this.outputs.length);\n for (const output of this.outputs) {\n output.serializeTo(writer);\n }\n }\n}\n","import { schnorr } from \"@noble/curves/secp256k1.js\";\nimport { hex } from \"@scure/base\";\nimport { Bytes, compareBytes } from \"@scure/btc-signer/utils.js\";\nimport { BufferReader, BufferWriter } from \"../utils\";\n\n/**\n * Metadata represents a key-value pair.\n * @param key - the key\n * @param value - the value\n */\nexport class Metadata {\n private constructor(\n readonly key: Uint8Array,\n readonly value: Uint8Array,\n ) {}\n\n /** Create a metadata entry from raw key and value bytes. */\n static create(key: Bytes, value: Bytes): Metadata {\n const md = new Metadata(key, value);\n md.validate();\n return md;\n }\n\n /** Decode metadata from its hex string form. */\n static fromString(s: string): Metadata {\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid metadata format, must be hex\");\n }\n return Metadata.fromBytes(buf);\n }\n\n /** Decode metadata from its serialized bytes. */\n static fromBytes(buf: Uint8Array): Metadata {\n if (!buf || buf.length === 0) {\n throw new Error(\"missing metadata\");\n }\n const reader = new BufferReader(buf);\n return Metadata.fromReader(reader);\n }\n\n /** Serialize metadata to raw bytes. */\n serialize(): Uint8Array {\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /** Encode metadata to a hex string. */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n get keyString(): string {\n return new TextDecoder().decode(this.key);\n }\n\n get valueString(): string {\n return new TextDecoder().decode(this.value);\n }\n\n /** Validate the metadata key and value. */\n validate(): void {\n if (this.key.length === 0) {\n throw new Error(\"missing metadata key\");\n }\n if (this.value.length === 0) {\n throw new Error(\"missing metadata value\");\n }\n }\n\n /** Decode metadata from a buffer reader. */\n static fromReader(reader: BufferReader): Metadata {\n let key: Uint8Array;\n let value: Uint8Array;\n\n try {\n key = reader.readVarSlice();\n } catch {\n throw new Error(\"invalid metadata length\");\n }\n\n try {\n value = reader.readVarSlice();\n } catch {\n throw new Error(\"invalid metadata length\");\n }\n\n const md = new Metadata(key, value);\n md.validate();\n return md;\n }\n\n /** Serialize metadata into an existing buffer writer. */\n serializeTo(writer: BufferWriter): void {\n writer.writeVarSlice(this.key);\n writer.writeVarSlice(this.value);\n }\n}\n\nexport class MetadataList {\n static readonly ARK_LEAF_TAG = \"ArkadeAssetLeaf\";\n static readonly ARK_BRANCH_TAG = \"ArkadeAssetBranch\";\n static readonly ARK_LEAF_VERSION = 0x00;\n\n constructor(readonly items: Metadata[]) {}\n\n /** Create a metadata list from its hex string form. */\n static fromString(s: string): MetadataList {\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid metadata list format\");\n }\n return MetadataList.fromBytes(buf);\n }\n\n /** Decode a metadata list from its serialized bytes. */\n static fromBytes(buf: Uint8Array): MetadataList {\n if (!buf || buf.length === 0) {\n throw new Error(\"missing metadata list\");\n }\n const reader = new BufferReader(buf);\n return MetadataList.fromReader(reader);\n }\n\n /** Decode a metadata list from a buffer reader. */\n static fromReader(reader: BufferReader): MetadataList {\n const count = Number(reader.readVarUint());\n const items = Array.from({ length: count }, () => Metadata.fromReader(reader));\n return new MetadataList(items);\n }\n\n /** Serialize the metadata list into an existing buffer writer. */\n serializeTo(writer: BufferWriter): void {\n writer.writeVarUint(this.items.length);\n for (const item of this) {\n item.serializeTo(writer);\n }\n }\n\n /** Serialize the metadata list to raw bytes. */\n serialize(): Uint8Array {\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /** Iterate through metadata entries in insertion order. */\n [Symbol.iterator](): Iterator<Metadata> {\n return this.items[Symbol.iterator]();\n }\n\n get length(): number {\n return this.items.length;\n }\n\n /** Compute the tagged Merkle root for the metadata list. */\n hash(): Uint8Array {\n if (this.items.length === 0) throw new Error(\"missing metadata list\");\n const levels = buildMetadataMerkleTree(this.items);\n return levels[levels.length - 1][0]; // the last level is the root\n }\n}\n\nfunction computeMetadataLeafHash(md: Metadata): Uint8Array {\n const writer = new BufferWriter();\n writer.writeByte(MetadataList.ARK_LEAF_VERSION);\n writer.writeVarSlice(md.key);\n writer.writeVarSlice(md.value);\n return schnorr.utils.taggedHash(MetadataList.ARK_LEAF_TAG, writer.toBytes());\n}\n\nfunction computeMetadataBranchHash(a: Uint8Array, b: Uint8Array): Uint8Array {\n const [smaller, larger] = compareBytes(a, b) === -1 ? [a, b] : [b, a];\n return schnorr.utils.taggedHash(MetadataList.ARK_BRANCH_TAG, smaller, larger);\n}\n\nfunction buildMetadataMerkleTree(leaves: Metadata[]): Uint8Array[][] {\n if (leaves.length === 0) return [];\n const leafHashes = leaves.map(computeMetadataLeafHash);\n const levels: Uint8Array[][] = [leafHashes];\n\n let current = leafHashes;\n while (current.length > 1) {\n const next: Uint8Array[] = [];\n for (let i = 0; i < current.length; i += 2) {\n if (i + 1 < current.length) {\n next.push(computeMetadataBranchHash(current[i], current[i + 1]));\n } else {\n next.push(current[i]);\n }\n }\n levels.push(next);\n current = next;\n }\n\n return levels;\n}\n","import { hex } from \"@scure/base\";\nimport { AssetInputType, MASK_ASSET_ID, MASK_CONTROL_ASSET, MASK_METADATA } from \"./types\";\nimport { AssetId } from \"./assetId\";\nimport { AssetRef } from \"./assetRef\";\nimport { AssetInput, AssetInputs } from \"./assetInput\";\nimport { AssetOutput, AssetOutputs } from \"./assetOutput\";\nimport { Metadata, MetadataList } from \"./metadata\";\nimport { BufferReader, BufferWriter } from \"../utils\";\n\n/**\n * An asset group contains inputs, outputs, and all data related to a given asset id.\n *\n * @see Packet\n * @see AssetId\n * @see AssetRef\n *\n * @example\n * ```typescript\n * const group = AssetGroup.create(\n * null, // asset ID: null for new issuance\n * null, // control asset ID: null when reissuance not needed\n * [], // asset inputs: empty for new issuance\n * [AssetOutput.create(0, 1000)], // asset outputs: 1000 units at vout index 0\n * [] // metadata: can be empty\n * )\n * ```\n */\nexport class AssetGroup {\n private readonly metadataList: MetadataList;\n\n /** @see create */\n constructor(\n readonly assetId: AssetId | null,\n readonly controlAsset: AssetRef | null,\n readonly inputs: AssetInput[],\n readonly outputs: AssetOutput[],\n metadata: Metadata[],\n ) {\n this.metadataList = new MetadataList(metadata);\n }\n\n /**\n * Create and validate an asset group.\n *\n * @param assetId - Asset id for this group, or `null` for fresh issuance\n * @param controlAsset - Optional control asset reference for (re) issuance\n * @param inputs - Asset inputs in the group\n * @param outputs - Asset outputs in the group\n * @param metadata - Metadata entries associated with the group\n * @returns A validated asset group\n * @throws Error if the group fails validation\n * @see validate\n */\n static create(\n assetId: AssetId | null,\n controlAsset: AssetRef | null,\n inputs: AssetInput[],\n outputs: AssetOutput[],\n metadata: Metadata[],\n ): AssetGroup {\n const ag = new AssetGroup(assetId, controlAsset, inputs, outputs, metadata);\n ag.validate();\n return ag;\n }\n\n /**\n * Decode an asset group from its hex string form.\n *\n * @param s - Hex-encoded asset group\n * @returns Decoded asset group\n * @throws Error if the string is not valid hex or does not encode a valid asset group\n * @see toString\n */\n static fromString(s: string): AssetGroup {\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid format, must be hex\");\n }\n return AssetGroup.fromBytes(buf);\n }\n\n /**\n * Decode an asset group from its serialized bytes.\n *\n * @param buf - Serialized asset group bytes\n * @returns Decoded asset group\n * @throws Error if the buffer is empty or malformed\n */\n static fromBytes(buf: Uint8Array): AssetGroup {\n if (!buf || buf.length === 0) {\n throw new Error(\"missing asset group\");\n }\n const reader = new BufferReader(buf);\n return AssetGroup.fromReader(reader);\n }\n\n /**\n * Return true when the group represents an issuance.\n *\n * @returns `true` when the group has no asset id\n */\n isIssuance(): boolean {\n return this.assetId === null;\n }\n\n /**\n * Return true when the group represents a reissuance.\n *\n * @returns `true` when the group has an asset id and outputs exceed local inputs\n * @remarks\n * Only local inputs contribute to the comparison; intent-backed inputs contribute `0` here.\n */\n isReissuance(): boolean {\n const sumReducer = (s: bigint, { amount }: { amount: bigint }) => s + amount;\n const sumOutputs = this.outputs.reduce(sumReducer, 0n);\n const sumInputs = this.inputs\n .map((i) => ({\n amount: i.input.type === AssetInputType.Local ? i.input.amount : 0n,\n }))\n .reduce(sumReducer, 0n);\n return !this.isIssuance() && sumInputs < sumOutputs;\n }\n\n /**\n * Serialize the asset group to raw bytes.\n *\n * @returns Serialized asset group bytes\n * @see fromBytes\n */\n serialize(): Uint8Array {\n this.validate();\n const writer = new BufferWriter();\n this.serializeTo(writer);\n return writer.toBytes();\n }\n\n /**\n * Validate the asset group and its child structures.\n *\n * @throws Error if the group is empty or violates issuance invariants\n */\n validate(): void {\n if (this.inputs.length === 0 && this.outputs.length === 0) {\n throw new Error(\"empty asset group\");\n }\n if (this.isIssuance()) {\n if (this.inputs.length !== 0) {\n throw new Error(\"issuance must have no inputs\");\n }\n } else {\n if (this.controlAsset !== null) {\n throw new Error(\"only issuance can have a control asset\");\n }\n }\n }\n\n /**\n * Convert the group into its batch-leaf representation for the given intent txid.\n *\n * @param intentTxid - Intent transaction id used to build the leaf input reference\n * @returns Batch-leaf asset group\n * @see AssetInput.createIntent\n */\n toBatchLeafAssetGroup(intentTxid: Uint8Array): AssetGroup {\n const leafInput = AssetInput.createIntent(hex.encode(intentTxid), 0, 0);\n return new AssetGroup(\n this.assetId,\n this.controlAsset,\n [leafInput],\n this.outputs,\n this.metadataList.items,\n );\n }\n\n /**\n * Encode the asset group to a hex string.\n *\n * @returns Hex-encoded asset group\n * @see fromString\n */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n /**\n * Decode an asset group from a binary reader.\n *\n * @param reader - Reader positioned at an asset group\n * @returns Decoded asset group\n * @throws Error if the encoded group is malformed\n */\n static fromReader(reader: BufferReader): AssetGroup {\n const presence = reader.readByte();\n\n let assetId: AssetId | null = null;\n let controlAsset: AssetRef | null = null;\n let metadata: Metadata[] = [];\n\n if (presence & MASK_ASSET_ID) {\n assetId = AssetId.fromReader(reader);\n }\n\n if (presence & MASK_CONTROL_ASSET) {\n controlAsset = AssetRef.fromReader(reader);\n }\n\n if (presence & MASK_METADATA) {\n metadata = MetadataList.fromReader(reader).items;\n }\n\n const inputs = AssetInputs.fromReader(reader);\n const outputs = AssetOutputs.fromReader(reader);\n\n const ag = new AssetGroup(assetId, controlAsset, inputs.inputs, outputs.outputs, metadata);\n ag.validate();\n return ag;\n }\n\n /**\n * Serialize the asset group into an existing binary writer.\n *\n * @param writer - Writer to append the asset group to\n */\n serializeTo(writer: BufferWriter): void {\n let presence = 0;\n if (this.assetId !== null) {\n presence |= MASK_ASSET_ID;\n }\n if (this.controlAsset !== null) {\n presence |= MASK_CONTROL_ASSET;\n }\n if (this.metadataList.length > 0) {\n presence |= MASK_METADATA;\n }\n writer.writeByte(presence);\n\n if (presence & MASK_ASSET_ID) {\n this.assetId!.serializeTo(writer);\n }\n\n if (presence & MASK_CONTROL_ASSET) {\n this.controlAsset!.serializeTo(writer);\n }\n\n if (presence & MASK_METADATA) {\n this.metadataList.serializeTo(writer);\n }\n\n writer.writeVarUint(this.inputs.length);\n for (const input of this.inputs) {\n input.serializeTo(writer);\n }\n\n writer.writeVarUint(this.outputs.length);\n for (const output of this.outputs) {\n output.serializeTo(writer);\n }\n }\n}\n","import { hex } from \"@scure/base\";\nimport type { ExtensionPacket } from \"../packet\";\nimport { AssetRefType } from \"./types\";\nimport { AssetGroup } from \"./assetGroup\";\nimport { BufferReader, BufferWriter } from \"../utils\";\n\n/**\n * Packet represents a collection of asset groups.\n * It encodes/decodes as raw bytes only — OP_RETURN framing is handled by the Extension module.\n */\nexport class Packet implements ExtensionPacket {\n /** PACKET_TYPE is the 1-byte TLV type tag used in the Extension envelope. */\n static readonly PACKET_TYPE = 0;\n\n private constructor(readonly groups: AssetGroup[]) {}\n\n /** Create a validated asset packet from a list of asset groups. */\n static create(groups: AssetGroup[]): Packet {\n const p = new Packet(groups);\n p.validate();\n return p;\n }\n\n /**\n * fromBytes parses a Packet from raw bytes.\n */\n static fromBytes(buf: Uint8Array): Packet {\n return Packet.fromReader(new BufferReader(buf));\n }\n\n /**\n * fromString parses a Packet from a raw hex string (not an OP_RETURN script).\n */\n static fromString(s: string): Packet {\n if (!s) {\n throw new Error(\"missing packet data\");\n }\n let buf: Uint8Array;\n try {\n buf = hex.decode(s);\n } catch {\n throw new Error(\"invalid packet format, must be hex\");\n }\n return Packet.fromBytes(buf);\n }\n\n /**\n * type returns the TLV packet type tag. Implements ExtensionPacket interface.\n */\n type(): number {\n return Packet.PACKET_TYPE;\n }\n\n /** Convert the packet into the batch-leaf form for a specific intent transaction id. */\n leafTxPacket(intentTxid: Uint8Array): Packet {\n const leafGroups = this.groups.map((group) => group.toBatchLeafAssetGroup(intentTxid));\n return new Packet(leafGroups);\n }\n\n /**\n * serialize encodes the packet as raw bytes (varint group count + group data).\n * Does NOT include OP_RETURN, Arkade magic bytes (`ARK`), or TLV type/length; those are\n * added by the Extension module.\n */\n serialize(): Uint8Array {\n if (this.groups.length === 0) {\n return new Uint8Array(0);\n }\n const writer = new BufferWriter();\n writer.writeVarUint(this.groups.length);\n for (const group of this.groups) {\n group.serializeTo(writer);\n }\n return writer.toBytes();\n }\n\n /**\n * toString returns the hex-encoded raw packet bytes.\n */\n toString(): string {\n return hex.encode(this.serialize());\n }\n\n /** Validate packet structure and cross-group references. */\n validate(): void {\n if (this.groups.length === 0) {\n throw new Error(\"missing assets\");\n }\n\n const seenAssetIds = new Set<string>();\n for (const group of this.groups) {\n if (group.assetId !== null) {\n const key = group.assetId.toString();\n if (seenAssetIds.has(key)) {\n throw new Error(`duplicate asset group for asset ${key}`);\n }\n seenAssetIds.add(key);\n }\n\n if (\n group.controlAsset !== null &&\n group.controlAsset.ref.type === AssetRefType.ByGroup &&\n group.controlAsset.ref.groupIndex >= this.groups.length\n ) {\n throw new Error(\n `invalid control asset group index, ${group.controlAsset.ref.groupIndex} out of range [0, ${this.groups.length - 1}]`,\n );\n }\n }\n }\n\n private static fromReader(reader: BufferReader): Packet {\n const count = Number(reader.readVarUint());\n const groups: AssetGroup[] = [];\n\n for (let i = 0; i < count; i++) {\n groups.push(AssetGroup.fromReader(reader));\n }\n\n if (reader.remaining() > 0) {\n throw new Error(\n `invalid packet length, left ${reader.remaining()} unknown bytes to read`,\n );\n }\n\n const packet = new Packet(groups);\n packet.validate();\n return packet;\n }\n}\n","{\n \"version\": 1,\n \"note\": \"Source of truth for the Arkade Asset ID encodings. See ts-sdk plans/asset-id-shared-vectors.md.\",\n \"txid_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20\",\n \"script_txid_hex\": \"201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201\",\n \"valid\": [\n {\n \"label\": \"group 0 (issuance mints this one)\",\n \"group_index\": 0,\n \"asset_id_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f200000\",\n \"script_group_index_item_hex\": \"\"\n },\n {\n \"label\": \"group 1 \\u2014 high byte zero, so endianness bugs hide here\",\n \"group_index\": 1,\n \"asset_id_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f200100\",\n \"script_group_index_item_hex\": \"01\"\n },\n {\n \"label\": \"endianness discriminator (gidx 258 = 0x0102)\",\n \"group_index\": 258,\n \"asset_id_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f200201\",\n \"script_group_index_item_hex\": \"0201\"\n },\n {\n \"label\": \"upper bound \\u2014 script number needs a third byte, the u16 blob does not\",\n \"group_index\": 65535,\n \"asset_id_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20ffff\",\n \"script_group_index_item_hex\": \"ffff00\"\n }\n ],\n \"invalid_identity\": [\n {\n \"label\": \"uppercase\",\n \"value\": \"0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F200201\",\n \"why\": \"identity is lowercase-only\",\n \"normalizes_to\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f200201\"\n },\n {\n \"label\": \"too short\",\n \"value\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2002\",\n \"why\": \"33 bytes; the identity is 34\"\n },\n {\n \"label\": \"non-hex\",\n \"value\": \"z102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f200201\",\n \"why\": \"ASCII hex only\"\n }\n ],\n \"invalid_decode\": [\n {\n \"label\": \"empty\",\n \"value\": \"\",\n \"expected_error\": \"missing asset id\"\n },\n {\n \"label\": \"too short\",\n \"value\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2002\",\n \"expected_error\": \"invalid asset id length\"\n },\n {\n \"label\": \"too long\",\n \"value\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f200201ff\",\n \"expected_error\": \"invalid asset id length\"\n },\n {\n \"label\": \"non-hex\",\n \"value\": \"z102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f200201\",\n \"expected_error\": \"invalid asset id format\"\n },\n {\n \"label\": \"zero txid\",\n \"value\": \"00000000000000000000000000000000000000000000000000000000000000000201\",\n \"expected_error\": \"empty txid\"\n }\n ],\n \"invalid_construction\": [\n {\n \"label\": \"missing txid\",\n \"txid_hex\": \"\",\n \"group_index\": 0,\n \"expected_error\": \"missing txid\"\n },\n {\n \"label\": \"non-hex txid\",\n \"txid_hex\": \"z102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20\",\n \"group_index\": 0,\n \"expected_error\": \"invalid txid format\"\n },\n {\n \"label\": \"txid too long\",\n \"txid_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021\",\n \"group_index\": 0,\n \"expected_error\": \"invalid txid length\"\n },\n {\n \"label\": \"txid too short\",\n \"txid_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e\",\n \"group_index\": 0,\n \"expected_error\": \"invalid txid length\"\n },\n {\n \"label\": \"zero txid\",\n \"txid_hex\": \"0000000000000000000000000000000000000000000000000000000000000000\",\n \"group_index\": 0,\n \"expected_error\": \"empty txid\"\n },\n {\n \"label\": \"gidx out of range\",\n \"txid_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20\",\n \"group_index\": 65536,\n \"expected_error\": \"invalid group index\",\n \"outside_uint16\": true\n },\n {\n \"label\": \"gidx negative\",\n \"txid_hex\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20\",\n \"group_index\": -1,\n \"expected_error\": \"invalid group index\",\n \"outside_uint16\": true\n }\n ]\n}\n","import raw from \"./assetIdVectors.json\";\n\n/**\n * Cross-repo test vectors for the Arkade Asset ID encodings.\n *\n * @remarks\n * Shipped from `src/` rather than `test/` so consumers outside this package can\n * pin the same bytes: `lightning-swap-service` imports this value, while NArk\n * and go-sdk vendor the backing `assetIdVectors.json` from a pinned revision of\n * this repository.\n *\n * The encoding is implemented in seven places across three repos and every\n * disagreement between them fails silently — a flipped txid makes a covenant\n * unsatisfiable, a flipped group index resolves to a different asset, a case\n * mismatch is a routing miss. None of those name their cause, which is what\n * these vectors are for.\n *\n * @see plans/asset-id-shared-vectors.md\n */\nexport interface AssetIdVectors {\n readonly version: number;\n readonly note: string;\n /** Genesis txid in display order — the 32 bytes an id's leading 64 hex chars carry. */\n readonly txid_hex: string;\n /** `txid_hex` reversed: serialization order, what the introspection opcodes match. */\n readonly script_txid_hex: string;\n readonly valid: ReadonlyArray<{\n readonly label: string;\n readonly group_index: number;\n /** `txid_hex` with the group index appended little-endian. */\n readonly asset_id_hex: string;\n /**\n * The group index as a stack item, after script-number encoding and\n * before push framing. Not the raw u16: `65535` is `ffff00` here and\n * `ffff` on the wire, and `0` is the empty item.\n */\n readonly script_group_index_item_hex: string;\n }>;\n /** Refused by the identity rule (`^[0-9a-f]{68}$`), though not necessarily by the decoder. */\n readonly invalid_identity: ReadonlyArray<{\n readonly label: string;\n readonly value: string;\n readonly why: string;\n /** Present when the value still decodes: what `toString()` must return. */\n readonly normalizes_to?: string;\n }>;\n /** Refused by {@link AssetId.fromString} / `fromBytes`. */\n readonly invalid_decode: ReadonlyArray<{\n readonly label: string;\n readonly value: string;\n /** Substring of the thrown message — normative for TS, advisory for other SDKs. */\n readonly expected_error: string;\n }>;\n /** Refused by {@link AssetId.create} / `validate`. */\n readonly invalid_construction: ReadonlyArray<{\n readonly label: string;\n readonly txid_hex: string;\n readonly group_index: number;\n readonly expected_error: string;\n /** Set when the group index cannot be expressed by an SDK whose constructor takes a native u16. */\n readonly outside_uint16?: boolean;\n }>;\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (value !== null && typeof value === \"object\" && !Object.isFrozen(value)) {\n Object.freeze(value);\n for (const key of Object.getOwnPropertyNames(value)) {\n deepFreeze((value as Record<string, unknown>)[key]);\n }\n }\n return value;\n}\n\n/**\n * The asset-id test vectors, deeply frozen.\n *\n * @remarks\n * Frozen all the way down, not just at the top: every value that matters lives\n * inside the nested arrays, and the module is a singleton — one consumer\n * mutating an entry would corrupt it for every other consumer in the process.\n *\n * @example\n * ```typescript\n * import { asset } from '@arkade-os/sdk'\n * const { txid_hex, valid } = asset.ASSET_ID_VECTORS\n * expect(AssetId.create(txid_hex, valid[0].group_index).toString()).toBe(valid[0].asset_id_hex)\n * ```\n */\nexport const ASSET_ID_VECTORS: AssetIdVectors = deepFreeze(raw as AssetIdVectors);\n","import { hex } from \"@scure/base\";\nimport { AssetDetails, AssetMetadata, Outpoint, VirtualCoin } from \"../wallet\";\nimport { convertVtxo } from \"../wallet/vtxo\";\nimport { isFetchTimeoutError } from \"./ark\";\nimport { eventSourceIterator, isEventSourceError } from \"./utils\";\nimport {\n isEventSourceUnavailableError,\n resolveEventSource,\n type EventSourceCapable,\n type EventSourceFactory,\n} from \"./eventSource\";\nimport { MetadataList } from \"../extension/asset\";\nimport { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\nimport { baseFetch } from \"../utils/fetch\";\nimport { ProviderUnavailableError, throwIfHttpUnavailable, toProviderUnavailable } from \"./errors\";\nimport { rateGate } from \"./rateGate\";\n\n/**\n * Attempts (initial + retries) before an availability failure surfaces. Small\n * on purpose: the shared cooldown in {@link rateGate} does the rate-limit work,\n * and a long ladder only delays an honest error.\n */\nconst INDEXER_MAX_ATTEMPTS = 3;\n\n/** First retry delay; doubled per attempt. */\nconst INDEXER_RETRY_BASE_MS = 250;\n\n/**\n * `baseFetch` for indexer requests with availability classification: a transport\n * failure (server unreachable) or a 429/5xx response becomes a typed\n * {@link ProviderUnavailableError} of kind `\"indexer\"`, so offline-first read\n * paths can catch it and fall back to repository state. Other non-2xx responses\n * are returned unchanged for each method to reject with its descriptive\n * (terminal) error.\n *\n * Every REST indexer call funnels through here, so this is where politeness\n * lives: each attempt goes through the origin-scoped {@link rateGate}, and a\n * bounded retry ladder — GET/HEAD only — gives `ProviderUnavailableError`'s\n * `retryable` some teeth.\n * `Retry-After` is read here, while the `Response` is in hand, and fed to the\n * gate — never attached to the typed error, since per-instance `Error`\n * own-properties do not survive the service-worker `postMessage` boundary.\n * Only the retries-exhausted failure reaches the caller, in its previous shape.\n */\nasync function indexerFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n // Retry only what is safe to send twice. A subscribe POST whose response is\n // lost would otherwise be re-sent without a subscriptionId, creating a\n // second subscription and leaking the first. Non-GETs still wait behind the\n // cooldown and still report a 429 — only the replay is withheld.\n const method = (init?.method ?? \"GET\").toUpperCase();\n const maxAttempts = method === \"GET\" || method === \"HEAD\" ? INDEXER_MAX_ATTEMPTS : 1;\n\n for (let attempt = 1; ; attempt++) {\n const lastAttempt = attempt >= maxAttempts;\n let res: Response;\n try {\n res = await rateGate.runHttp(input, () => baseFetch(input, init));\n } catch (err) {\n const mapped = toProviderUnavailable(err, \"indexer\");\n // Only a transport failure is retryable; anything else is terminal.\n if (lastAttempt || !(mapped instanceof ProviderUnavailableError)) throw mapped;\n await sleep(retryDelayMs(attempt));\n continue;\n }\n\n if (res.ok) return res;\n\n // Pass the body so a 5xx carrying a structured arkd error (grpc-gateway\n // maps gRPC INTERNAL -> HTTP 500) stays terminal instead of being\n // misclassified as a retryable availability failure. If the body can't be\n // read, fall back to status-only classification.\n let body: string | undefined;\n try {\n body = await res.clone().text();\n } catch {\n body = undefined;\n }\n\n try {\n throwIfHttpUnavailable(res, \"indexer\", body);\n } catch (err) {\n if (lastAttempt) throw err;\n // Exponential backoff only — the gate re-applies the shared cooldown\n // with per-waiter jitter on the next `run()`. Sleeping the cooldown\n // here too would wake the herd in lockstep.\n await sleep(retryDelayMs(attempt));\n continue;\n }\n\n // Terminal non-2xx: hand it back for the caller's descriptive error.\n return res;\n }\n}\n\nfunction retryDelayMs(attempt: number): number {\n return INDEXER_RETRY_BASE_MS * 2 ** (attempt - 1);\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport type PaginationOptions = {\n pageIndex?: number;\n pageSize?: number;\n};\n\n/**\n * Page size {@link RestIndexerProvider.getVtxos} uses when the caller named no\n * pagination of its own and it pages the query out itself.\n */\nexport const DEFAULT_VTXO_PAGE_SIZE = 500;\n\nexport enum IndexerTxType {\n INDEXER_TX_TYPE_UNSPECIFIED = 0,\n INDEXER_TX_TYPE_RECEIVED = 1,\n INDEXER_TX_TYPE_SENT = 2,\n}\n\nexport enum ChainTxType {\n UNSPECIFIED = \"INDEXER_CHAINED_TX_TYPE_UNSPECIFIED\",\n COMMITMENT = \"INDEXER_CHAINED_TX_TYPE_COMMITMENT\",\n ARK = \"INDEXER_CHAINED_TX_TYPE_ARK\",\n TREE = \"INDEXER_CHAINED_TX_TYPE_TREE\",\n CHECKPOINT = \"INDEXER_CHAINED_TX_TYPE_CHECKPOINT\",\n}\n\nexport interface PageResponse {\n /** Current page index **/\n current: number;\n\n /** Next page index **/\n next: number;\n\n /** Total pages given the page-size used in the query **/\n total: number;\n}\n\nexport interface BatchInfo {\n totalOutputAmount: string;\n totalOutputVtxos: number;\n expiresAt: string;\n swept: boolean;\n}\n\nexport interface ChainTx {\n txid: string;\n expiresAt: string;\n type: ChainTxType;\n\n /** IDs of the transactions in the chain used as input of the current transaction. */\n spends: string[];\n}\n\nexport interface CommitmentTx {\n startedAt: string;\n endedAt: string;\n batches: { [key: string]: BatchInfo };\n totalInputAmount: string;\n totalInputVtxos: number;\n totalOutputAmount: string;\n totalOutputVtxos: number;\n}\n\nexport interface Tx {\n txid: string;\n children: Record<number, string>;\n}\n\nexport interface TxHistoryRecord {\n commitmentTxid?: string;\n virtualTxid?: string;\n type: IndexerTxType;\n amount: string;\n createdAt: string;\n isSettled: boolean;\n settledBy: string;\n}\n\nexport interface VtxoAsset {\n assetId: string;\n amount: string;\n}\n\nexport interface Vtxo {\n outpoint: Outpoint;\n createdAt: string;\n expiresAt: string | null;\n amount: string;\n script: string;\n isPreconfirmed: boolean;\n isSwept: boolean;\n isUnrolled: boolean;\n isSpent: boolean;\n spentBy: string | null;\n commitmentTxids: string[];\n settledBy?: string;\n arkTxid?: string;\n assets?: VtxoAsset[];\n}\n\nexport interface VtxoChain {\n chain: ChainTx[];\n page?: PageResponse;\n}\n\nexport interface SubscriptionResponse {\n txid?: string;\n scripts: string[];\n newVtxos: VirtualCoin[];\n spentVtxos: VirtualCoin[];\n sweptVtxos: VirtualCoin[];\n tx?: string;\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n}\n\nexport interface SubscriptionHeartbeat {\n type: \"heartbeat\";\n}\n\nexport interface SubscriptionEvent extends SubscriptionResponse {\n type: \"event\";\n}\n\n/**\n * Filters accepted by `IndexerProvider.getVtxos`.\n *\n * @remarks\n * Exactly one of `scripts` or `outpoints` must be supplied.\n *\n * @see IndexerProvider.getVtxos\n */\nexport type GetVtxosOptions = PaginationOptions & {\n /** Only return spendable virtual outputs. */\n spendableOnly?: boolean;\n /** Only return spent virtual outputs. */\n spentOnly?: boolean;\n /** Only return recoverable virtual outputs. */\n recoverableOnly?: boolean;\n /** Only return pending/preconfirmed virtual outputs. */\n pendingOnly?: boolean;\n /** Only return renewable virtual outputs (the union of the spendable and recoverable sets). */\n renewableOnly?: boolean;\n /** Only return virtual outputs created after this timestamp. */\n after?: number;\n /** Only return virtual outputs created before this timestamp. */\n before?: number;\n} & (\n | {\n /** Scripts to search for matching virtual outputs. */\n scripts: string[];\n outpoints?: never;\n }\n | {\n /** Explicit outpoints to fetch. */\n outpoints: Outpoint[];\n scripts?: never;\n }\n );\n\nexport interface IndexerProvider {\n /**\n * Fetch the virtual output tree for a batch outpoint.\n *\n * @param batchOutpoint - Batch outpoint whose tree should be fetched\n * @param opts - Optional pagination settings\n * @returns virtual output tree nodes and optional pagination state\n */\n getVtxoTree(\n batchOutpoint: Outpoint,\n opts?: PaginationOptions,\n ): Promise<{ vtxoTree: Tx[]; page?: PageResponse }>;\n\n /**\n * Fetch the leaf outpoints for a batch virtual output tree.\n *\n * @param batchOutpoint - Batch outpoint whose leaf outpoints should be fetched\n * @param opts - Optional pagination settings\n * @returns Leaf outpoints and optional pagination state\n */\n getVtxoTreeLeaves(\n batchOutpoint: Outpoint,\n opts?: PaginationOptions,\n ): Promise<{ leaves: Outpoint[]; page?: PageResponse }>;\n\n /**\n * Fetch sweep transactions that spent a batch.\n *\n * @param batchOutpoint - Batch outpoint to inspect\n * @returns Sweep transaction ids\n */\n getBatchSweepTransactions(batchOutpoint: Outpoint): Promise<{ sweptBy: string[] }>;\n\n /**\n * Fetch a commitment transaction by txid.\n *\n * @param txid - Commitment transaction id\n * @returns Commitment transaction details\n */\n getCommitmentTx(txid: string): Promise<CommitmentTx>;\n\n /**\n * Fetch connector transactions for a commitment transaction.\n *\n * @param txid - Commitment transaction id\n * @param opts - Optional pagination settings\n * @returns Connector transactions and optional pagination state\n */\n getCommitmentTxConnectors(\n txid: string,\n opts?: PaginationOptions,\n ): Promise<{ connectors: Tx[]; page?: PageResponse }>;\n\n /**\n * Fetch forfeit transaction ids for a commitment transaction.\n *\n * @param txid - Commitment transaction id\n * @param opts - Optional pagination settings\n * @returns Forfeit transaction ids and optional pagination state\n */\n getCommitmentTxForfeitTxs(\n txid: string,\n opts?: PaginationOptions,\n ): Promise<{ txids: string[]; page?: PageResponse }>;\n\n /**\n * Open a streamed subscription for a previously created subscription id.\n *\n * @param subscriptionId - Subscription identifier returned by `subscribeForScripts`\n * @param abortSignal - Signal used to terminate the stream\n * @returns Async iterator of subscription responses\n */\n getSubscription(\n subscriptionId: string,\n abortSignal: AbortSignal,\n ): AsyncIterableIterator<SubscriptionResponse>;\n\n /**\n * Fetch raw virtual transactions by txid.\n *\n * @param txids - Virtual transaction ids to fetch\n * @param opts - Optional pagination settings\n * @returns Raw virtual transactions and optional pagination state\n */\n getVirtualTxs(\n txids: string[],\n opts?: PaginationOptions,\n ): Promise<{ txs: string[]; page?: PageResponse }>;\n\n /**\n * Fetch the ancestry chain for a virtual output.\n *\n * @param vtxoOutpoint - Virtual output outpoint to inspect\n * @param opts - Optional pagination settings\n * @returns Chain data and optional pagination state\n */\n getVtxoChain(vtxoOutpoint: Outpoint, opts?: PaginationOptions): Promise<VtxoChain>;\n\n /**\n * Fetch virtual outputs by script set or outpoints.\n *\n * @param opts - Virtual output filters and pagination settings\n * @returns Virtual outputs and optional pagination state\n */\n getVtxos(opts?: GetVtxosOptions): Promise<{ vtxos: VirtualCoin[]; page?: PageResponse }>;\n\n /**\n * Fetch metadata for a specific asset id.\n *\n * @param assetId - Asset identifier\n * @returns Asset details\n */\n getAssetDetails(assetId: string): Promise<AssetDetails>;\n\n /**\n * Create or extend a subscription for a set of scripts.\n *\n * @param scripts - Scripts to monitor\n * @param subscriptionId - Existing subscription id to extend\n * @returns Subscription id\n */\n subscribeForScripts(scripts: string[], subscriptionId?: string): Promise<string>;\n\n /**\n * Remove some or all scripts from an existing subscription.\n *\n * @param subscriptionId - Subscription identifier to update\n * @param scripts - Scripts to remove, or omit to remove all\n */\n unsubscribeForScripts(subscriptionId: string, scripts?: string[]): Promise<void>;\n}\n\n/**\n * REST-based indexer provider implementation.\n * @see https://buf.build/arkade-os/arkd/docs/main:ark.v1#ark.v1.IndexerService\n * @example\n * ```typescript\n * const provider = new RestIndexerProvider('https://arkade.computer');\n * const commitmentTx = await provider.getCommitmentTx(\"6686af8f3be3517880821f62e6c3d749b9d6713736a1d8e229a55daa659446b2\");\n * ```\n */\nexport class RestIndexerProvider implements IndexerProvider {\n /** Overrides {@link configureEventSource} for this provider's subscription. */\n protected readonly eventSource?: EventSourceFactory;\n\n constructor(\n public serverUrl: string = DEFAULT_ARKADE_SERVER_URL,\n options: EventSourceCapable = {},\n ) {\n this.eventSource = options.eventSource;\n }\n\n async getVtxoTree(\n batchOutpoint: Outpoint,\n opts?: PaginationOptions,\n ): Promise<{ vtxoTree: Tx[]; page?: PageResponse }> {\n let url = `${this.serverUrl}/v1/indexer/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/tree`;\n const params = new URLSearchParams();\n if (opts) {\n if (opts.pageIndex !== undefined)\n params.append(\"page.index\", opts.pageIndex.toString());\n if (opts.pageSize !== undefined) params.append(\"page.size\", opts.pageSize.toString());\n }\n if (params.toString()) {\n url += \"?\" + params.toString();\n }\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch vtxo tree: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isVtxoTreeResponse(data)) {\n throw new Error(\"Invalid vtxo tree data received\");\n }\n\n data.vtxoTree.forEach((tx) => {\n tx.children = Object.fromEntries(\n Object.entries(tx.children).map(([key, value]) => [Number(key), value]),\n );\n });\n return data;\n }\n\n async getVtxoTreeLeaves(\n batchOutpoint: Outpoint,\n opts?: PaginationOptions,\n ): Promise<{ leaves: Outpoint[]; page?: PageResponse }> {\n let url = `${this.serverUrl}/v1/indexer/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/tree/leaves`;\n const params = new URLSearchParams();\n if (opts) {\n if (opts.pageIndex !== undefined)\n params.append(\"page.index\", opts.pageIndex.toString());\n if (opts.pageSize !== undefined) params.append(\"page.size\", opts.pageSize.toString());\n }\n if (params.toString()) {\n url += \"?\" + params.toString();\n }\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch vtxo tree leaves: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isVtxoTreeLeavesResponse(data)) {\n throw new Error(\"Invalid vtxos tree leaves data received\");\n }\n return data;\n }\n\n async getBatchSweepTransactions(batchOutpoint: Outpoint): Promise<{ sweptBy: string[] }> {\n const url = `${this.serverUrl}/v1/indexer/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/sweepTxs`;\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch batch sweep transactions: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isBatchSweepTransactionsResponse(data)) {\n throw new Error(\"Invalid batch sweep transactions data received\");\n }\n return data;\n }\n\n async getCommitmentTx(txid: string): Promise<CommitmentTx> {\n const url = `${this.serverUrl}/v1/indexer/commitmentTx/${txid}`;\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch commitment tx: ${res.statusText}`);\n }\n const data = await res.json();\n\n if (!Response.isCommitmentTx(data)) {\n throw new Error(\"Invalid commitment tx data received\");\n }\n return data;\n }\n\n async getCommitmentTxConnectors(\n txid: string,\n opts?: PaginationOptions,\n ): Promise<{ connectors: Tx[]; page?: PageResponse }> {\n let url = `${this.serverUrl}/v1/indexer/commitmentTx/${txid}/connectors`;\n const params = new URLSearchParams();\n if (opts) {\n if (opts.pageIndex !== undefined)\n params.append(\"page.index\", opts.pageIndex.toString());\n if (opts.pageSize !== undefined) params.append(\"page.size\", opts.pageSize.toString());\n }\n if (params.toString()) {\n url += \"?\" + params.toString();\n }\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch commitment tx connectors: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isConnectorsResponse(data)) {\n throw new Error(\"Invalid commitment tx connectors data received\");\n }\n\n data.connectors.forEach((tx) => {\n tx.children = Object.fromEntries(\n Object.entries(tx.children).map(([key, value]) => [Number(key), value]),\n );\n });\n return data;\n }\n\n async getCommitmentTxForfeitTxs(\n txid: string,\n opts?: PaginationOptions,\n ): Promise<{ txids: string[]; page?: PageResponse }> {\n let url = `${this.serverUrl}/v1/indexer/commitmentTx/${txid}/forfeitTxs`;\n const params = new URLSearchParams();\n if (opts) {\n if (opts.pageIndex !== undefined)\n params.append(\"page.index\", opts.pageIndex.toString());\n if (opts.pageSize !== undefined) params.append(\"page.size\", opts.pageSize.toString());\n }\n if (params.toString()) {\n url += \"?\" + params.toString();\n }\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch commitment tx forfeitTxs: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isForfeitTxsResponse(data)) {\n throw new Error(\"Invalid commitment tx forfeitTxs data received\");\n }\n return data;\n }\n\n getSubscription(\n subscriptionId: string,\n abortSignal: AbortSignal,\n ): AsyncIterableIterator<SubscriptionResponse> {\n const url = `${this.serverUrl}/v1/indexer/script/subscription/${subscriptionId}`;\n // Captured, not resolved, here: resolution has to happen per connection\n // attempt inside the generator, so a caller that abandons the iterator\n // never triggers it and a late `configureEventSource` is still seen.\n const override = this.eventSource;\n let iterator: ReturnType<typeof eventSourceIterator> | null = null;\n const closeIterator = () => iterator?.close();\n\n const gen = (async function* () {\n const abortHandler = closeIterator;\n abortSignal?.addEventListener(\"abort\", abortHandler);\n\n try {\n while (!abortSignal?.aborted) {\n try {\n const currentIterator = eventSourceIterator(\n resolveEventSource(override)(url),\n );\n iterator = currentIterator;\n\n for await (const event of currentIterator) {\n if (abortSignal?.aborted) break;\n\n try {\n const data = JSON.parse(event.data);\n if (data.event) {\n yield {\n txid: data.event.txid,\n scripts: data.event.scripts || [],\n newVtxos: (data.event.newVtxos || []).map(convertVtxo),\n spentVtxos: (data.event.spentVtxos || []).map(convertVtxo),\n sweptVtxos: (data.event.sweptVtxos || []).map(convertVtxo),\n tx: data.event.tx,\n checkpointTxs: data.event.checkpointTxs,\n };\n }\n } catch (err) {\n console.error(\"Failed to parse subscription event:\", err);\n throw err;\n }\n }\n } catch (error) {\n if (\n abortSignal?.aborted ||\n (error instanceof Error && error.name === \"AbortError\")\n ) {\n break;\n }\n\n // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n if (isFetchTimeoutError(error)) {\n console.debug(\"Timeout error ignored\");\n continue;\n }\n\n if (isEventSourceError(error)) {\n throw error;\n }\n\n // A missing EventSource is an environment fact, not a\n // stream failure: the caller reports it once (see\n // ContractWatcher), where this loop would log it on\n // every reconnect attempt.\n if (isEventSourceUnavailableError(error)) throw error;\n\n console.error(\"Subscription error:\", error);\n throw error;\n } finally {\n closeIterator();\n iterator = null;\n }\n }\n } finally {\n abortSignal?.removeEventListener(\"abort\", abortHandler);\n closeIterator();\n }\n })();\n\n const origReturn = gen.return.bind(gen);\n gen.return = (value) => {\n closeIterator();\n return origReturn(value);\n };\n\n return gen;\n }\n\n async getVirtualTxs(\n txids: string[],\n opts?: PaginationOptions,\n ): Promise<{ txs: string[]; page?: PageResponse }> {\n let url = `${this.serverUrl}/v1/indexer/virtualTx/${txids.join(\",\")}`;\n const params = new URLSearchParams();\n if (opts) {\n if (opts.pageIndex !== undefined)\n params.append(\"page.index\", opts.pageIndex.toString());\n if (opts.pageSize !== undefined) params.append(\"page.size\", opts.pageSize.toString());\n }\n if (params.toString()) {\n url += \"?\" + params.toString();\n }\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch virtual txs: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isVirtualTxsResponse(data)) {\n throw new Error(\"Invalid virtual txs data received\");\n }\n return data;\n }\n\n async getVtxoChain(vtxoOutpoint: Outpoint, opts?: PaginationOptions): Promise<VtxoChain> {\n let url = `${this.serverUrl}/v1/indexer/vtxo/${vtxoOutpoint.txid}/${vtxoOutpoint.vout}/chain`;\n const params = new URLSearchParams();\n if (opts) {\n if (opts.pageIndex !== undefined)\n params.append(\"page.index\", opts.pageIndex.toString());\n if (opts.pageSize !== undefined) params.append(\"page.size\", opts.pageSize.toString());\n }\n if (params.toString()) {\n url += \"?\" + params.toString();\n }\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch vtxo chain: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isVtxoChainResponse(data)) {\n throw new Error(\"Invalid vtxo chain data received\");\n }\n return data;\n }\n\n async getVtxos(opts?: GetVtxosOptions): Promise<{ vtxos: VirtualCoin[]; page?: PageResponse }> {\n const hasScripts = (opts?.scripts?.length ?? 0) > 0;\n const hasOutpoints = (opts?.outpoints?.length ?? 0) > 0;\n\n // scripts and outpoints are mutually exclusive\n if (hasScripts && hasOutpoints) {\n throw new Error(\"scripts and outpoints are mutually exclusive options\");\n }\n\n if (!hasScripts && !hasOutpoints) {\n throw new Error(\"Either scripts or outpoints must be provided\");\n }\n\n // The server treats these state filters as mutually exclusive.\n const filterCount = [\n opts?.spendableOnly,\n opts?.spentOnly,\n opts?.recoverableOnly,\n opts?.pendingOnly,\n opts?.renewableOnly,\n ].filter(Boolean).length;\n if (filterCount > 1) {\n throw new Error(\n \"spendableOnly, spentOnly, recoverableOnly, pendingOnly, and renewableOnly are mutually exclusive options\",\n );\n }\n\n if (\n opts?.after !== undefined &&\n opts?.before !== undefined &&\n opts.after !== 0 &&\n opts.before !== 0 &&\n opts.before <= opts.after\n ) {\n throw new Error(\"before must be greater than after\");\n }\n\n // A caller that named no page is asking for the whole answer, but the\n // server answers with one page of its own choosing, so returning it\n // verbatim hands back a silent prefix. Page it out here instead: the\n // result is complete, and `page` is dropped because nothing is left to\n // ask for.\n if (opts?.pageIndex === undefined && opts?.pageSize === undefined) {\n const all: VirtualCoin[] = [];\n // Follow the server's cursor rather than a local counter: the\n // server clamps page.index=0 to page 1 and echoes the 1-based\n // page in `current`, so only `next` says where to go and\n // `current >= total` says when to stop (both reference clients\n // drive the loop exactly this way).\n let pageIndex = 0;\n for (;;) {\n const { vtxos, page } = await this.fetchVtxosPage({\n ...(opts as GetVtxosOptions),\n pageIndex,\n pageSize: DEFAULT_VTXO_PAGE_SIZE,\n });\n all.push(...vtxos);\n // A provider that omits `page` entirely never paged in the\n // first place; a short page can only be the last one.\n if (!page || page.current >= page.total || vtxos.length < DEFAULT_VTXO_PAGE_SIZE) {\n break;\n }\n pageIndex = page.next;\n }\n return { vtxos: all };\n }\n\n return this.fetchVtxosPage(opts);\n }\n\n /**\n * Fetch a single page of vtxos. Callers paging to exhaustion get no\n * deliberate inter-page backoff here: `indexerFetch` already enforces\n * politeness through the rate gate, so don't add a redundant sleep.\n */\n private async fetchVtxosPage(\n opts?: GetVtxosOptions,\n ): Promise<{ vtxos: VirtualCoin[]; page?: PageResponse }> {\n let url = `${this.serverUrl}/v1/indexer/vtxos`;\n const params = new URLSearchParams();\n\n // Handle scripts with multi collection format\n if (opts?.scripts?.length) {\n opts.scripts.forEach((script) => {\n params.append(\"scripts\", script);\n });\n }\n\n // Handle outpoints with multi collection format\n if (opts?.outpoints?.length) {\n opts.outpoints.forEach((outpoint) => {\n params.append(\"outpoints\", `${outpoint.txid}:${outpoint.vout}`);\n });\n }\n\n if (opts) {\n if (opts.spendableOnly !== undefined)\n params.append(\"spendableOnly\", opts.spendableOnly.toString());\n if (opts.spentOnly !== undefined) params.append(\"spentOnly\", opts.spentOnly.toString());\n if (opts.recoverableOnly !== undefined)\n params.append(\"recoverableOnly\", opts.recoverableOnly.toString());\n if (opts.pendingOnly !== undefined)\n params.append(\"pendingOnly\", opts.pendingOnly.toString());\n if (opts.renewableOnly !== undefined)\n params.append(\"renewableOnly\", opts.renewableOnly.toString());\n if (opts.after !== undefined) params.append(\"after\", opts.after.toString());\n if (opts.before !== undefined) params.append(\"before\", opts.before.toString());\n if (opts.pageIndex !== undefined)\n params.append(\"page.index\", opts.pageIndex.toString());\n if (opts.pageSize !== undefined) params.append(\"page.size\", opts.pageSize.toString());\n }\n if (params.toString()) {\n url += \"?\" + params.toString();\n }\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch vtxos: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isVtxosResponse(data)) {\n throw new Error(\"Invalid vtxos data received\");\n }\n return {\n vtxos: data.vtxos.map(convertVtxo),\n page: data.page,\n };\n }\n\n async getAssetDetails(assetId: string): Promise<AssetDetails> {\n const url = `${this.serverUrl}/v1/indexer/asset/${encodeURIComponent(assetId)}`;\n const res = await indexerFetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch asset details: ${res.statusText}`);\n }\n const data = await res.json();\n if (!Response.isGetAssetResponse(data)) {\n throw new Error(\"Invalid get asset response\");\n }\n const metadata = data.metadata?.length ? parseAssetMetadata(data.metadata) : undefined;\n return {\n assetId: data.assetId ?? assetId,\n supply: BigInt(data.supply ?? 0),\n metadata,\n controlAssetId: data.controlAsset || undefined,\n };\n }\n\n async subscribeForScripts(scripts: string[], subscriptionId?: string): Promise<string> {\n const url = `${this.serverUrl}/v1/indexer/script/subscribe`;\n const res = await indexerFetch(url, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify({ scripts, subscriptionId }),\n });\n if (!res.ok) {\n const errorText = await res.text();\n throw new Error(`Failed to subscribe to scripts: ${errorText}`);\n }\n const data = await res.json();\n if (!data.subscriptionId) throw new Error(`Subscription ID not found`);\n return data.subscriptionId;\n }\n\n async unsubscribeForScripts(subscriptionId: string, scripts?: string[]): Promise<void> {\n const url = `${this.serverUrl}/v1/indexer/script/unsubscribe`;\n const res = await indexerFetch(url, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify({ subscriptionId, scripts }),\n });\n if (!res.ok) {\n const errorText = await res.text();\n console.warn(`Failed to unsubscribe to scripts: ${errorText}`);\n }\n }\n}\n\ninterface GetAssetResponse {\n assetId: string;\n supply: string;\n controlAsset?: string;\n metadata?: string;\n}\n\nfunction parseAssetMetadata(metadata: string): AssetMetadata {\n const metadataList = MetadataList.fromString(metadata);\n const out: Record<string, unknown> = {};\n const decoder = new TextDecoder();\n for (const { key, value } of metadataList.items) {\n const keyString = decoder.decode(key);\n switch (keyString) {\n case \"decimals\":\n const n = Number(decoder.decode(value));\n out[keyString] = Number.isFinite(n) ? n : hex.encode(value);\n break;\n case \"name\":\n case \"ticker\":\n case \"icon\":\n out[keyString] = decoder.decode(value);\n break;\n default:\n out[keyString] = hex.encode(value);\n break;\n }\n }\n return out;\n}\n\n// Unexported namespace for type guards only\nnamespace Response {\n function isBatchInfo(data: any): data is BatchInfo {\n return (\n typeof data === \"object\" &&\n typeof data.totalOutputAmount === \"string\" &&\n typeof data.totalOutputVtxos === \"number\" &&\n typeof data.expiresAt === \"string\" &&\n typeof data.swept === \"boolean\"\n );\n }\n\n function isChain(data: any): data is ChainTx {\n return (\n typeof data === \"object\" &&\n typeof data.txid === \"string\" &&\n typeof data.expiresAt === \"string\" &&\n Object.values(ChainTxType).includes(data.type) &&\n Array.isArray(data.spends) &&\n data.spends.every((spend: any) => typeof spend === \"string\")\n );\n }\n\n export function isCommitmentTx(data: any): data is CommitmentTx {\n return (\n typeof data === \"object\" &&\n typeof data.startedAt === \"string\" &&\n typeof data.endedAt === \"string\" &&\n typeof data.totalInputAmount === \"string\" &&\n typeof data.totalInputVtxos === \"number\" &&\n typeof data.totalOutputAmount === \"string\" &&\n typeof data.totalOutputVtxos === \"number\" &&\n typeof data.batches === \"object\" &&\n Object.values(data.batches).every(isBatchInfo)\n );\n }\n\n export function isOutpoint(data: any): data is Outpoint {\n return (\n typeof data === \"object\" &&\n typeof data.txid === \"string\" &&\n typeof data.vout === \"number\"\n );\n }\n\n export function isOutpointArray(data: any): data is Outpoint[] {\n return Array.isArray(data) && data.every(isOutpoint);\n }\n\n function isTx(data: any): data is Tx {\n return (\n typeof data === \"object\" &&\n typeof data.txid === \"string\" &&\n typeof data.children === \"object\" &&\n Object.values(data.children).every(isTxid) &&\n Object.keys(data.children).every((k) => Number.isInteger(Number(k)))\n );\n }\n\n export function isTxsArray(data: any): data is Tx[] {\n return Array.isArray(data) && data.every(isTx);\n }\n\n function isTxHistoryRecord(data: any): data is TxHistoryRecord {\n return (\n typeof data === \"object\" &&\n typeof data.amount === \"string\" &&\n typeof data.createdAt === \"string\" &&\n typeof data.isSettled === \"boolean\" &&\n typeof data.settledBy === \"string\" &&\n Object.values(IndexerTxType).includes(data.type) &&\n ((!data.commitmentTxid && typeof data.virtualTxid === \"string\") ||\n (typeof data.commitmentTxid === \"string\" && !data.virtualTxid))\n );\n }\n\n export function isTxHistoryRecordArray(data: any): data is TxHistoryRecord[] {\n return Array.isArray(data) && data.every(isTxHistoryRecord);\n }\n\n function isTxid(data: any): data is string {\n return typeof data === \"string\" && data.length === 64;\n }\n\n export function isTxidArray(data: any): data is string[] {\n return Array.isArray(data) && data.every(isTxid);\n }\n\n function isVtxoAsset(data: any): data is VtxoAsset {\n return (\n typeof data === \"object\" &&\n data !== null &&\n typeof data.assetId === \"string\" &&\n typeof data.amount === \"string\"\n );\n }\n\n function isVtxo(data: any): data is Vtxo {\n return (\n typeof data === \"object\" &&\n isOutpoint(data.outpoint) &&\n typeof data.createdAt === \"string\" &&\n (data.expiresAt === null || typeof data.expiresAt === \"string\") &&\n typeof data.amount === \"string\" &&\n typeof data.script === \"string\" &&\n typeof data.isPreconfirmed === \"boolean\" &&\n typeof data.isSwept === \"boolean\" &&\n typeof data.isUnrolled === \"boolean\" &&\n typeof data.isSpent === \"boolean\" &&\n (!data.spentBy || typeof data.spentBy === \"string\") &&\n (!data.settledBy || typeof data.settledBy === \"string\") &&\n (!data.arkTxid || typeof data.arkTxid === \"string\") &&\n Array.isArray(data.commitmentTxids) &&\n data.commitmentTxids.every(isTxid) &&\n (data.assets === undefined ||\n (Array.isArray(data.assets) && data.assets.every(isVtxoAsset)))\n );\n }\n\n function isPageResponse(data: any): data is PageResponse {\n return (\n typeof data === \"object\" &&\n typeof data.current === \"number\" &&\n typeof data.next === \"number\" &&\n typeof data.total === \"number\"\n );\n }\n\n export function isVtxoTreeResponse(data: any): data is { vtxoTree: Tx[]; page?: PageResponse } {\n return (\n typeof data === \"object\" &&\n Array.isArray(data.vtxoTree) &&\n data.vtxoTree.every(isTx) &&\n (!data.page || isPageResponse(data.page))\n );\n }\n\n export function isVtxoTreeLeavesResponse(\n data: any,\n ): data is { leaves: Outpoint[]; page?: PageResponse } {\n return (\n typeof data === \"object\" &&\n Array.isArray(data.leaves) &&\n data.leaves.every(isOutpoint) &&\n (!data.page || isPageResponse(data.page))\n );\n }\n\n export function isConnectorsResponse(\n data: any,\n ): data is { connectors: Tx[]; page?: PageResponse } {\n return (\n typeof data === \"object\" &&\n Array.isArray(data.connectors) &&\n data.connectors.every(isTx) &&\n (!data.page || isPageResponse(data.page))\n );\n }\n\n export function isForfeitTxsResponse(\n data: any,\n ): data is { txids: string[]; page?: PageResponse } {\n return (\n typeof data === \"object\" &&\n Array.isArray(data.txids) &&\n data.txids.every(isTxid) &&\n (!data.page || isPageResponse(data.page))\n );\n }\n\n export function isSweptCommitmentTxResponse(data: any): data is { sweptBy: string[] } {\n return (\n typeof data === \"object\" && Array.isArray(data.sweptBy) && data.sweptBy.every(isTxid)\n );\n }\n\n export function isBatchSweepTransactionsResponse(data: any): data is { sweptBy: string[] } {\n return (\n typeof data === \"object\" && Array.isArray(data.sweptBy) && data.sweptBy.every(isTxid)\n );\n }\n\n export function isVirtualTxsResponse(\n data: any,\n ): data is { txs: string[]; page?: PageResponse } {\n return (\n typeof data === \"object\" &&\n Array.isArray(data.txs) &&\n data.txs.every((tx: any) => typeof tx === \"string\") &&\n (!data.page || isPageResponse(data.page))\n );\n }\n\n export function isVtxoChainResponse(data: any): data is VtxoChain {\n return (\n typeof data === \"object\" &&\n Array.isArray(data.chain) &&\n data.chain.every(isChain) &&\n (!data.page || isPageResponse(data.page))\n );\n }\n\n export function isVtxosResponse(data: any): data is { vtxos: Vtxo[]; page?: PageResponse } {\n return (\n typeof data === \"object\" &&\n Array.isArray(data.vtxos) &&\n data.vtxos.every(isVtxo) &&\n (!data.page || isPageResponse(data.page))\n );\n }\n\n export function isGetAssetResponse(data: any): data is GetAssetResponse {\n return (\n typeof data === \"object\" &&\n data !== null &&\n typeof data.assetId === \"string\" &&\n typeof data.supply === \"string\" &&\n (data.controlAsset === undefined || typeof data.controlAsset === \"string\") &&\n (data.metadata === undefined || typeof data.metadata === \"string\")\n );\n }\n}\n"]}
|