{"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":["__export","AssetInputType","AssetRefType","hex","schnorr","compareBytes","rateGate","baseFetch","toProviderUnavailable","ProviderUnavailableError","throwIfHttpUnavailable","IndexerTxType","ChainTxType","DEFAULT_ARKADE_SERVER_URL","eventSourceIterator","resolveEventSource","convertVtxo","isFetchTimeoutError","isEventSourceError","isEventSourceUnavailableError","Response"],"mappings":"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","file":"chunk-SJPPBR2V.cjs","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    /** @see fetchVtxosJson */\n    private readonly inFlightVtxoReads = new Map<\n        string,\n        Promise<{ vtxos: Vtxo[]; page?: PageResponse }>\n    >();\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 data = await this.fetchVtxosJson(url);\n        // Mapped per caller, not shared: `convertVtxo` builds a fresh coin, so\n        // two callers served from one request still get independent results.\n        return {\n            vtxos: data.vtxos.map(convertVtxo),\n            page: data.page,\n        };\n    }\n\n    /**\n     * The wire read behind {@link fetchVtxosPage}, with an identical read\n     * already in flight served from that one request instead of repeated.\n     *\n     * Two callers can want the same page at the same instant without either\n     * being redundant, so there is no single call site to remove: a send that\n     * leaves change makes the indexer emit `vtxo_spent` and `vtxo_received` for\n     * the wallet's own contract milliseconds apart, and `handleContractEvent`\n     * delta-syncs that contract on both arms.\n     */\n    private async fetchVtxosJson(url: string): Promise<{ vtxos: Vtxo[]; page?: PageResponse }> {\n        const joined = this.inFlightVtxoReads.get(url);\n        if (joined) return joined;\n\n        const shared = (async () => {\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 data;\n        })();\n\n        this.inFlightVtxoReads.set(url, shared);\n        try {\n            return await shared;\n        } finally {\n            if (this.inFlightVtxoReads.get(url) === shared) this.inFlightVtxoReads.delete(url);\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"]}