{"version":3,"file":"index.cjs","sources":["../src/types.ts","../src/constants.ts","../src/signData.ts","../src/utils/strings.ts","../src/templates/ordP2pkh.ts","../src/utils/subtypeData.ts","../src/utils/utxo.ts","../src/createOrdinals.ts","../src/templates/MAP.ts","../src/templates/BitCom.ts","../src/sendOrdinals.ts","../src/sendUtxos.ts","../src/transferOrdinals.ts","../src/templates/B.ts","../src/templates/ordLock.ts","../src/createListings.ts","../src/cancelListings.ts","../src/purchaseOrdListing.ts","../src/utils/icon.ts","../src/deployBsv21.ts","../src/utils/fetch.ts","../src/utils/broadcast.ts","../src/utils/httpClient.ts","../src/burnOrdinals.ts","../src/utils/paymail.ts","../src/validate.ts"],"sourcesContent":["import type { PrivateKey, Script, Transaction } from \"@bsv/sdk\";\nimport type { AuthToken } from \"sigma-protocol\";\n\n// biome-ignore lint/complexity/noBannedTypes: Reserved for future use\ntype Signer = {};\n\nexport interface LocalSigner extends Signer {\n  idKey: PrivateKey;\n}\n\nexport interface RemoteSigner extends Signer {\n  keyHost: string;\n  authToken?: AuthToken;\n}\n\nexport type Destination = {\n  address: string;\n  inscription?: Inscription;\n};\n\n/**\n * @typedef {Object} Listing\n * @property {string} payAddress - Address to send the payment upon purchase\n * @property {string} price - Listing price in satoshis\n * @property {String} ordAddress - Where to return a listed ordinal upon cancel.\n * @property {Utxo} listingUtxo - Utxo of the listing\n */\nexport type NewListing = {\n  payAddress: string;\n  price: number;\n  ordAddress: string;\n  listingUtxo: Utxo;\n}\n\n/**\n * @typedef {Object} ExistingListing\n * @property {string} payout - Payment output script base64 encoded\n * @property {Utxo} listingUtxo - Utxo of the listing\n */\nexport type ExistingListing = {\n  payout: string;\n  listingUtxo: Utxo;\n}\n\n/**\n * @typedef {Object} NewTokenListing\n * @property {string} payAddress - Address to send the payment upon purchase\n * @property {string} price - Listing price in satoshis\n * @property {String} ordAddress - Where to return a listed ordinal upon cancel.\n * @property {number} tokens - Number of tokens in whole token display format. Ex. 0.5 for 0.5 tokens. Library handles conversion to 'tsat' format.\n */\nexport type NewTokenListing = {\n  payAddress: string;\n  price: number;\n  tokens: number;\n  ordAddress: string;\n}\n\n/**\n * @typedef {Object} Distribution\n * @property {string} address - Destination address. Must be a Ordinals address (BSV address for recieving 1Sat ordinals tokens).\n * @property {number} tokens - Number of tokens in whole token display format. Ex. 0.5 for 0.5 tokens. Library handles conversion to 'tsat' format. \n * @property {boolean} [omitMetaData] - Optional. Set to true to omit metadata from this distribution's output.\n */\nexport type Distribution = {\n  address: string | Script;\n  tokens: number;\n  omitMetaData?: boolean;\n};\n\n/**\n * @typedef {Object} Utxo\n * @property {number} satoshis - Amount in satoshis\n * @property {string} txid - Transaction id\n * @property {number} vout - Output index\n * @property {string} script - Base64 encoded locking script\n * @property {PrivateKey} [pk] - Optional. Private key for unlocking this utxo\n */\nexport type Utxo = {\n  satoshis: number;\n  txid: string;\n  vout: number;\n  script: string;\n  pk?: PrivateKey;\n};\n\n/**\n * @typedef {Object} NftUtxo\n * @property {string} collectionId - Optional. Collection id of the NFT\n * @property {string} contentType - Media type of the NFT\n * @property {string} creatorBapId - Optional. Creator BAP id of the NFT\n * @property {string} origin - Origin address of the NFT\n * @property {number} satoshis - Always 1\n * @property {PrivateKey} [pk] - Optional. Private key for unlocking this utxo\n */\nexport interface NftUtxo extends Utxo {\n  collectionId?: string;\n  contentType: string;\n  creatorBapId?: string;\n  origin: string;\n  satoshis: 1;\n  pk?: PrivateKey;\n}\n\n/**\n * @typedef {Object} TokenUtxo\n * @property {string} amt - Number of tokens as a string in 'tsat' format. Ex. 100000000 for 1 token with 8 decimal places.\n * @property {string} id - Token id -  either tick or id depending on protocol\n * @property {string} satoshis - Always 1\n * @property {string} [payout] - Optional. Payment output script base64 encoded\n * @property {number} [price] - Optional. Listing price in satoshis\n * @property {boolean} [isListing] - Optional. True if the token is a listing\n * @property {PrivateKey} [pk] - Optional. Private key for unlocking this utxo\n */\nexport interface TokenUtxo extends Utxo {\n  amt: string;\n  id: string;\n  satoshis: 1;\n  payout?: string;\n  price?: number;\n  isListing?: boolean;\n  pk?: PrivateKey;\n}\n\nexport enum TokenSelectionStrategy {\n  SmallestFirst = \"smallest\",\n  LargestFirst = \"largest\",\n  RetainOrder = \"retain\",\n  Random = \"random\",\n}\n\nexport interface TokenSelectionOptions {\n  inputStrategy?: TokenSelectionStrategy;\n  outputStrategy?: TokenSelectionStrategy;\n}\n\nexport interface TokenSelectionResult {\n  selectedUtxos: TokenUtxo[];\n  totalSelected: number;\n  isEnough: boolean;\n}\n\nexport type Inscription = {\n  dataB64: string;\n  contentType: string;\n};\n\nexport type ImageContentType =\n  | \"image/png\"\n  | \"image/jpeg\"\n  | \"image/gif\"\n  | \"image/svg+xml\"\n  | \"image/webp\";\n\n/**\n * @typedef {Object} IconInscription\n * @property {string} dataB64 - Base64 encoded image data. Must be a square image.\n * @property {ImageContentType} contentType - Media type of the image\n */\nexport type IconInscription = {\n  dataB64: string;\n  contentType: ImageContentType;\n};\n\nexport type Payment = {\n  to: string;\n  amount: number;\n};\n\nexport type TokenInscription = {\n  p: \"bsv-20\";\n  amt: string;\n  op: \"transfer\" | \"mint\" | \"deploy+mint\" | \"burn\";\n  dec?: string;\n};\n\nexport interface MintTokenInscription extends TokenInscription {\n  op: \"mint\";\n}\n\nexport interface DeployMintTokenInscription extends TokenInscription {\n  op: \"deploy+mint\";\n  sym: string;\n  icon: string;\n}\n\nexport interface TransferTokenInscription extends TokenInscription {\n  p: \"bsv-20\";\n  amt: string;\n  op: \"transfer\" | \"burn\";\n}\n\nexport interface TransferBSV20Inscription extends TransferTokenInscription {\n  tick: string;\n}\n\nexport interface TransferBSV21Inscription extends TransferTokenInscription {\n  id: string;\n}\n\nexport enum TokenType {\n  BSV20 = \"bsv20\",\n  BSV21 = \"bsv21\",\n}\n\nexport type BaseResult = {\n  tx: Transaction;\n  spentOutpoints: string[];\n};\n\nexport interface ChangeResult extends BaseResult {\n  payChange?: Utxo;\n};\n\n/**\n * MAP (Magic Attribute Protocol) metadata object with stringified values for writing to the blockchain\n * @typedef {Object} MAP\n * @property {string} app - Application identifier\n * @property {string} type - Metadata type\n * @property {string} [prop] - Optional. Additional metadata properties\n */\nexport type MAP = {\n  app: string;\n  type: string;\n  [prop: string]: string;\n};\n\nexport type PreMAP = {\n  app: string;\n  type: string;\n  [prop: string]: unknown;\n  royalties?: Royalty[];\n  subTypeData?: CollectionSubTypeData | CollectionItemSubTypeData;\n};\n\nexport type CreateOrdinalsConfig = {\n  utxos: Utxo[];\n  destinations: Destination[];\n  paymentPk?: PrivateKey;\n  changeAddress?: string;\n  satsPerKb?: number;\n  metaData?: PreMAP;\n  signer?: LocalSigner | RemoteSigner;\n  additionalPayments?: Payment[];\n};\n\nexport enum RoytaltyType {\n  Paymail = \"paymail\",\n  Address = \"address\",\n  Script = \"script\",\n}\n\n/**\n * Royalty object\n * @typedef {Object} Royalty\n * @property {RoytaltyType} type - Royalty type, string, one of \"paymail\", \"address\", \"script\"\n * @property {string} destination - Royalty destination\n * @property {string} percentage - Royalty percentage as a string float 0-1 (0.01 = 1%)\n */\nexport type Royalty = {\n  type: RoytaltyType;\n  destination: string;\n  percentage: string; // string float 0-1\n};\n\nexport interface CreateOrdinalsMetadata extends PreMAP {\n  type: \"ord\",\n  name: string,\n  previewUrl?: string,\n}\n\nexport interface CreateOrdinalsCollectionMetadata extends CreateOrdinalsMetadata {\n  subType: \"collection\",\n  subTypeData: CollectionSubTypeData, // JSON stringified CollectionSubTypeData\n  royalties?: Royalty[],\n};\n\nexport interface CreateOrdinalsCollectionItemMetadata extends CreateOrdinalsMetadata {\n  subType: \"collectionItem\",\n  subTypeData: CollectionItemSubTypeData, // JSON stringified CollectionItemSubTypeData\n};\n\n/**\n * Configuration object for creating an ordinals collection\n * @typedef {Object} CreateOrdinalsCollectionConfig\n * @property metaData - MAP (Magic Attribute Protocol) metadata for the collection\n * @property metaData.type - \"ord\"\n * @property metaData.subType - \"collection\"\n * @property metaData.name - Collection name\n * @property metaData.subTypeData - JSON stringified CollectionSubTypeData\n * @property [metaData.royalties] - Optional. Royalties address\n * @property [metaData.previewUrl] - Optional. Preview URL\n */\nexport interface CreateOrdinalsCollectionConfig extends CreateOrdinalsConfig {\n  metaData: CreateOrdinalsCollectionMetadata\n}\n\nexport type CollectionTraits = {\n  [trait: string]: CollectionTrait;\n};\n\nexport type CollectionTrait = {\n  values: string[];\n  occurancePercentages: string[];\n};\n\nexport type Rarity = {\n  [key: string]: string;\n}\n\nexport type RarityLabels = Rarity[]\nexport interface CollectionSubTypeData {\n  description: string;\n  quantity: number;\n  rarityLabels: RarityLabels;\n  traits: CollectionTraits;\n}\n\nexport interface CreateOrdinalsCollectionItemMetadata extends PreMAP {\n  type: \"ord\",\n  name: string,\n  subType: \"collectionItem\",\n  subTypeData: CollectionItemSubTypeData, // JSON stringified CollectionItemSubTypeData\n  previewUrl?: string,\n}\n\n/**\n * Configuration object for creating an ordinals collection item\n * @typedef {Object} CreateOrdinalsCollectionItemConfig\n * @property metaData - MAP (Magic Attribute Protocol) metadata for the collection item\n * @property metaData.type - \"ord\"\n * @property metaData.subType - \"collectionItem\"\n * @property metaData.name - Collection item name\n * @property metaData.subTypeData - JSON stringified CollectionItemSubTypeData\n * @property [metaData.royalties] - Optional. Royalties address\n * @property [metaData.previewUrl] - Optional. Preview URL\n */\nexport interface CreateOrdinalsCollectionItemConfig extends CreateOrdinalsConfig {\n  metaData: CreateOrdinalsCollectionItemMetadata\n}\n\n/**\n * Subtype data for an ordinals collection item\n * @typedef {Object} CollectionItemSubTypeData\n * @property {string} collectionId - Collection id\n * @property {number} mintNumner - Mint number\n * @property {number} rank - Rank\n * @property {string} rarityLabel - Rarity label\n * @property {string} traits - traits object\n * @property {string} attachments - array of attachment objects\n */\nexport interface CollectionItemSubTypeData {\n  collectionId: string;\n  mintNumber?: number;\n  rank?: number;\n  rarityLabel?: RarityLabels;\n  traits?: CollectionItemTrait[];\n  attachments?: CollectionItemAttachment[];\n}\n\nexport type CollectionItemTrait = {\n  name: string;\n  value: string;\n  rarityLabel?: string;\n  occurancePercentrage?: string;\n};\n\nexport type CollectionItemAttachment = {\n  name: string;\n  description?: string;\n  \"content-type\": string;\n  url: string;\n}\n\nexport interface BurnMAP extends MAP {\n  type: \"ord\";\n  op: \"burn\";\n}\n\nexport type BurnOrdinalsConfig = {\n  ordPk?: PrivateKey;\n  ordinals: Utxo[];\n  metaData?: BurnMAP;\n}\n\nexport type SendOrdinalsConfig = {\n  paymentUtxos: Utxo[];\n  ordinals: Utxo[];\n  paymentPk?: PrivateKey;\n  ordPk?: PrivateKey;\n  destinations: Destination[];\n  changeAddress?: string;\n  satsPerKb?: number;\n  metaData?: PreMAP;\n  signer?: LocalSigner | RemoteSigner;\n  additionalPayments?: Payment[];\n  enforceUniformSend?: boolean;\n}\n\nexport type DeployBsv21TokenConfig = {\n  symbol: string;\n  decimals?: number;\n  icon: string | IconInscription;\n  utxos: Utxo[];\n  initialDistribution: Distribution;\n  paymentPk?: PrivateKey;\n  destinationAddress: string;\n  changeAddress?: string;\n  satsPerKb?: number;\n  additionalPayments?: Payment[];\n  signer?: LocalSigner | RemoteSigner;\n};\n\nexport type SendUtxosConfig = {\n  utxos: Utxo[];\n  paymentPk?: PrivateKey;\n  payments: Payment[];\n  satsPerKb?: number;\n  changeAddress?: string;\n  metaData?: MAP;\n  signer?: LocalSigner | RemoteSigner;\n};\n\nexport interface TokenChangeResult extends ChangeResult {\n  tokenChange?: TokenUtxo[];\n}\n\n/**\n * Configuration object for token outputs\n * @typedef {Object} TokenSplitConfig\n * @property {number} outputs - Number of outputs to split the token into. Default is 1.\n * @property {number} threshold - Optional. Minimum amount of tokens per output.\n * @property {boolean} omitMetaData - Set to true to omit metadata from the token change outputs\n **/\nexport type TokenSplitConfig = {\n  outputs: number;\n  threshold?: number;\n  omitMetaData?: boolean;\n}\n\nexport enum TokenInputMode {\n  All = \"all\",\n  Needed = \"needed\",\n}\n\n/**\n * Configuration object for transferring token ordinals\n * @typedef {Object} TransferOrdTokensConfig\n * @property {TokenType} protocol - Token protocol\n * @property {string} tokenID - Token id\n * @property {number} decimals - Number of decimal places for this token.\n * @property {Utxo[]} utxos - Array of payment Utxos\n * @property {TokenUtxo[]} inputTokens - Array of TokenUtxos to be transferred\n * @property {Distribution[]} distributions - Array of Distribution objects\n * @property {PrivateKey} paymentPk - Private key of the payment address\n * @property {PrivateKey} ordPk - Private key of the ord address\n * @property {string} [changeAddress] - Optional. Address to send the change\n * @property {string} [tokenChangeAddress] - Optional. Address to send the token change\n * @property {number} [satsPerKb] - Optional. Satoshis per kilobyte\n * @property {PreMAP} [metaData] - Optional. MAP metadata object\n * @property {LocalSigner | RemoteSigner} [signer] - Optional. Signer object\n * @property {Payment[]} [additionalPayments] - Optional. Array of additional payments\n * @property {boolean} [burn] - Optional. Set to true to burn the input tokens\n * @property {TokenSplitConfig} [splitConfig] - Optional. Configuration object for splitting token change\n * @property {TokenInputMode} [tokenInputMode] - Optional. Token input mode. Default is \"needed\"\n */\nexport type TransferOrdTokensConfig = {\n  protocol: TokenType;\n  tokenID: string;\n  decimals: number;\n  utxos: Utxo[];\n  inputTokens: TokenUtxo[];\n  distributions: Distribution[];\n  paymentPk?: PrivateKey;\n  ordPk?: PrivateKey;\n  inputMode?: TokenInputMode;\n  changeAddress?: string;\n  tokenChangeAddress?: string;\n  satsPerKb?: number;\n  metaData?: PreMAP;\n  signer?: LocalSigner | RemoteSigner;\n  additionalPayments?: Payment[];\n  burn?: boolean;\n  splitConfig?: TokenSplitConfig;\n  tokenInputMode?: TokenInputMode;\n}\n\nexport type CreateOrdListingsConfig = {\n  utxos: Utxo[];\n  listings: NewListing[];\n  paymentPk?: PrivateKey;\n  ordPk: PrivateKey,\n  changeAddress?: string;\n  satsPerKb?: number;\n  additionalPayments?: Payment[];\n  signer?: LocalSigner | RemoteSigner;\n}\n\nexport type PurchaseOrdListingConfig = {\n  utxos: Utxo[];\n  paymentPk?: PrivateKey;\n  listing: ExistingListing;\n  ordAddress: string;\n  changeAddress?: string;\n  satsPerKb?: number;\n  additionalPayments?: Payment[],\n  royalties?: Royalty[],\n  metaData?: MAP,\n}\n\nexport type PurchaseOrdTokenListingConfig = {\n  protocol: TokenType;\n  tokenID: string;\n  utxos: Utxo[];\n  paymentPk?: PrivateKey;\n  listingUtxo: TokenUtxo;\n  ordAddress: string;\n  changeAddress?: string;\n  satsPerKb?: number;\n  additionalPayments?: Payment[],\n  metaData?: MAP,\n}\n\nexport type CancelOrdListingsConfig = {\n  utxos: Utxo[],\n  paymentPk?: PrivateKey;\n  ordPk?: PrivateKey;\n  listingUtxos: Utxo[];\n  additionalPayments?: Payment[];\n  changeAddress?: string;\n  satsPerKb?: number;\n}\n\nexport interface CancelOrdTokenListingsConfig extends CancelOrdListingsConfig {\n  utxos: Utxo[],\n  paymentPk?: PrivateKey;\n  ordPk?: PrivateKey;\n  listingUtxos: TokenUtxo[];\n  additionalPayments: Payment[];\n  changeAddress?: string;\n  satsPerKb?: number;\n  protocol: TokenType,\n  tokenID: string;\n  ordAddress?: string;\n}\n\n/**\n * Configuration object for creating a token listing\n * @typedef {Object} CreateOrdTokenListingsConfig\n * @property {Utxo[]} utxos - Array of payment Utxos\n * @property {TokenUtxo[]} inputTokens - Array of TokenUtxos to be listed\n * @property {NewTokenListing[]} listings - Array of NewTokenListings\n * @property {PrivateKey} paymentPk - Private key of the payment address\n * @property {PrivateKey} ordPk - Private key of the ord address\n * @property {string} tokenChangeAddress - Address to send the token change\n * @property {number} [satsPerKb] - Optional. Satoshis per kilobyte\n * @property {Payment[]} [additionalPayments] - Optional. Array of additional payments\n * @property {TokenType} protocol - Token protocol\n * @property {string} tokenID - Token id\n * @property {number} decimals - Number of decimal places for this token.\n */\nexport interface CreateOrdTokenListingsConfig {\n  utxos: Utxo[];\n  listings: NewTokenListing[];\n  paymentPk?: PrivateKey;\n  ordPk?: PrivateKey,\n  changeAddress?: string;\n  satsPerKb?: number;\n  additionalPayments?: Payment[];\n  protocol: TokenType;\n  tokenID: string;\n  decimals: number;\n  inputTokens: TokenUtxo[];\n  tokenChangeAddress: string;\n  signer?: LocalSigner | RemoteSigner;\n}\n\nexport const MAX_TOKEN_SUPPLY = 2n ** 64n - 1n;","export const MAP_PREFIX = \"1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5\";\nexport const DEFAULT_SAT_PER_KB = 10;\nexport const API_HOST = \"https://ordinals.gorillapool.io/api\";","import type { Transaction } from \"@bsv/sdk\";\nimport { Sigma } from \"sigma-protocol\";\nimport type { LocalSigner, RemoteSigner } from \"./types\";\n\n/**\n * Signs data in the transaction with Sigma protocol\n * @param {Transaction} tx - Transaction to sign\n * @param {LocalSigner | RemoteSigner} signer - Local or remote signer (used for data signature)\n * @returns {Transaction} Transaction with signed data\n */\nexport const signData = async (\n\ttx: Transaction,\n\tsigner: LocalSigner | RemoteSigner,\n): Promise<Transaction> => {\n\t// Sign tx if idKey or remote signer like starfish/tokenpass\n\tconst idKey = (signer as LocalSigner)?.idKey;\n\tconst keyHost = (signer as RemoteSigner)?.keyHost;\n\n\tif (idKey) {\n\t\tconst sigma = new Sigma(tx);\n\t\tconst { signedTx } = sigma.sign(idKey);\n\t\treturn signedTx;\n\t}\n\tif (keyHost) {\n\t\tconst authToken = (signer as RemoteSigner)?.authToken;\n\t\tconst sigma = new Sigma(tx);\n\t\ttry {\n\t\t\tconst { signedTx } = await sigma.remoteSign(keyHost, authToken);\n\t\t\treturn signedTx;\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t\tthrow new Error(`Remote signing to ${keyHost} failed`);\n\t\t}\n\t}\n\tthrow new Error(\"Signer must be a LocalSigner or RemoteSigner\");\n};\n","/**\n * Converts a string to its hexadecimal representation\n *\n * @param {string} utf8Str - The string to convert\n * @returns {string} The hexadecimal representation of the input string\n */\nconst toHex = (utf8Str: string): string => {\n  return Buffer.from(utf8Str).toString(\"hex\");\n};\n\nexport { toHex };\n","import {\n\tLockingScript,\n\tP2PKH,\n\ttype Script,\n} from \"@bsv/sdk\";\nimport type { Inscription, MAP } from \"../types\";\nimport { toHex } from \"../utils/strings\";\nimport { MAP_PREFIX } from \"../constants\";\n\n/**\n * OrdP2PKH (1Sat Ordinal + Pay To Public Key Hash) class implementing ScriptTemplate.\n *\n * This class provides methods to create an Ordinal with Pay To Public Key Hash locking and unlocking scripts. \n * It extends the standard P2PKH script template and provides a custom lock method.\n */\nexport default class OrdP2PKH extends P2PKH {\n\t/**\n\t * Creates a 1Sat Ordinal + P2PKH locking script for a given address string\n\t *\n\t * @param {string} address - An destination address for the Ordinal.\n\t * @param {Object} [inscription] - Base64 encoded file data and Content type of the file.\n\t * @param {MAP} [metaData] - (optional) MAP Metadata to be included in OP_RETURN.\n\t * @returns {LockingScript} - A P2PKH locking script.\n\t */\n\t// unlock method inherits from p2pkh\n\tlock(\n\t\taddress: string,\n\t\tinscription?: Inscription,\n\t\tmetaData?: MAP | undefined,\n\t): Script {\n\t\t// Create ordinal output and inscription in a single output\n\t\tconst lockingScript = new P2PKH().lock(address);\n\t\treturn applyInscription(lockingScript, inscription, metaData);\n\t}\n}\n\nexport const applyInscription = (lockingScript: LockingScript, inscription?: Inscription, metaData?: MAP, withSeparator=false) => {\n\tlet ordAsm = \"\";\n\t// This can be omitted for reinscriptions that just update metadata\n\tif (inscription?.dataB64 !== undefined && inscription?.contentType !== undefined) {\n\t\tconst ordHex = toHex(\"ord\");\n\t\tconst fsBuffer = Buffer.from(inscription.dataB64, \"base64\");\n\t\tconst fileHex = fsBuffer.toString(\"hex\").trim();\n\t\tif (!fileHex) {\n\t\t\tthrow new Error(\"Invalid file data\");\n\t\t}\n\t\tconst fileMediaType = toHex(inscription.contentType);\n\t\tif (!fileMediaType) {\n\t\t\tthrow new Error(\"Invalid media type\");\n\t\t}\n\t\tordAsm = `OP_0 OP_IF ${ordHex} OP_1 ${fileMediaType} OP_0 ${fileHex} OP_ENDIF`;\n\t}\n\n\tlet inscriptionAsm = `${ordAsm ? `${ordAsm} ${withSeparator ? 'OP_CODESEPARATOR ' : ''}` : \"\"}${lockingScript.toASM()}`;\n\n\t// MAP.app and MAP.type keys are required\n\tif (metaData && (!metaData.app || !metaData.type)) {\n\t\tthrow new Error(\"MAP.app and MAP.type are required fields\");\n\t}\n\n\tif (metaData?.app && metaData?.type) {\n\t\tconst mapPrefixHex = toHex(MAP_PREFIX);\n\t\tconst mapCmdValue = toHex(\"SET\");\n\t\tinscriptionAsm = `${inscriptionAsm ? `${inscriptionAsm} ` : \"\"}OP_RETURN ${mapPrefixHex} ${mapCmdValue}`;\n\n\t\tfor (const [key, value] of Object.entries(metaData)) {\n\t\t\tif (key !== \"cmd\") {\n\t\t\t\tinscriptionAsm = `${inscriptionAsm} ${toHex(key)} ${toHex(\n\t\t\t\t\tvalue as string,\n\t\t\t\t)}`;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn LockingScript.fromASM(inscriptionAsm);\n}\n","import type { MAP, PreMAP } from \"../types\";\n\nconst stringifyMetaData = (metaData?: PreMAP): MAP | undefined => {\n  if (!metaData) return undefined;\n\tconst result: MAP = {\n\t\tapp: metaData.app,\n\t\ttype: metaData.type,\n\t};\n\n\tfor (const [key, value] of Object.entries(metaData)) {\n\t\tif (value !== undefined) {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tresult[key] = value;\n\t\t\t} else if (Array.isArray(value) || typeof value === \"object\") {\n\t\t\t\tresult[key] = JSON.stringify(value);\n\t\t\t} else {\n\t\t\t\tresult[key] = String(value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n};\n\nexport default stringifyMetaData;\n","import {\n\ttype Transaction,\n\ttype UnlockingScript,\n\tfromUtxo,\n\ttype TransactionInput,\n\tUtils,\n\tP2PKH,\n  Script,\n} from \"@bsv/sdk\";\nimport { type NftUtxo, type TokenSelectionOptions, type TokenSelectionResult, TokenSelectionStrategy, TokenType, type TokenUtxo, type Utxo } from \"../types\";\nimport { API_HOST } from \"../constants\";\nimport { toToken } from \"satoshi-token\";\n\nconst { fromBase58Check } = Utils;\n\n/**\n * Converts a Utxo object with a base64 encoded script to a Utxo object with a hex encoded script\n * @param {Utxo} utxo - Utxo object with base64 encoded script\n * @param {Object} unlockScriptTemplate - Object with sign and estimateLength functions\n * @returns {TransactionInput} Utxo object with hex encoded script\n */\nexport const inputFromB64Utxo = (\n\tutxo: Utxo,\n\tunlockScriptTemplate: {\n\t\tsign: (tx: Transaction, inputIndex: number) => Promise<UnlockingScript>;\n\t\testimateLength: (tx: Transaction, inputIndex: number) => Promise<number>;\n\t},\n): TransactionInput => {\n\tconst input = fromUtxo(\n\t\t{\n\t\t\t...utxo,\n\t\t\tscript: Buffer.from(utxo.script, \"base64\").toString(\"hex\"),\n\t\t},\n\t\tunlockScriptTemplate,\n\t);\n\treturn input;\n};\n\n/**\n * Fetches pay utxos from the API\n * @param {string} address - Address to fetch utxos for\n * @returns {Promise<Utxo[]>} Array of pay utxos\n */\nexport const fetchPayUtxos = async (address: string, scriptEncoding: \"hex\" | \"base64\" | \"asm\" = \"base64\"): Promise<Utxo[]> => {\n\tconst payUrl = `${API_HOST}/txos/address/${address}/unspent?bsv20=false`;\n\tconst payRes = await fetch(payUrl);\n\tif (!payRes.ok) {\n\t\tthrow new Error(\"Error fetching pay utxos\");\n\t}\n\tlet payUtxos = await payRes.json();\n\t// exclude all 1 satoshi utxos\n\tpayUtxos = payUtxos.filter((u: Utxo) => u.satoshis !== 1 && !isLock(u));\n\n\t// Get pubkey hash from address\n\tconst pubKeyHash = fromBase58Check(address);\n\tconst p2pkhScript = new P2PKH().lock(pubKeyHash.data);\n\tpayUtxos = payUtxos.map((utxo: Partial<Utxo>) => ({\n\t\ttxid: utxo.txid,\n\t\tvout: utxo.vout,\n\t\tsatoshis: utxo.satoshis,\n\t\tscript: scriptEncoding === \"hex\" || scriptEncoding === \"base64\" ? Buffer.from(p2pkhScript.toBinary()).toString(scriptEncoding) : p2pkhScript.toASM(),\n\t}));\n\treturn payUtxos as Utxo[];\n};\n\n/**\n * Fetches NFT utxos from the API\n * @param {string} address - Address to fetch utxos for\n * @param {string} [collectionId] - Optional. Collection id (collection insciprtion origin)\n * @param {number} [limit=10] - Optional. Number of utxos to fetch. Default is 10\n * @param {number} [offset=0] - Optional. Offset for fetching utxos. Default is 0\n * @param {string} [scriptEncoding=\"base64\"] - Optional. Encoding for the script. Default is base64. Options are hex, base64, or asm.\n * @returns {Promise<Utxo[]>} Array of NFT utxos\n */\nexport const fetchNftUtxos = async (\n\taddress: string,\n\tcollectionId?: string,\n\tlimit = 10,\n\toffset = 0,\n  scriptEncoding: \"hex\" | \"base64\" | \"asm\" = \"base64\",\n): Promise<NftUtxo[]> => {\n\tlet url = `${API_HOST}/txos/address/${address}/unspent?limit=${limit}&offset=${offset}&`;\n\n\tif (collectionId) {\n\t\tconst query = {\n\t\t\tmap: {\n\t\t\t\tsubTypeData: { collectionId },\n\t\t\t},\n\t\t};\n\t\tconst b64Query = Buffer.from(JSON.stringify(query)).toString(\"base64\");\n\t\turl += `q=${b64Query}`;\n\t}\n\n\tconst res = await fetch(url);\n\tif (!res.ok) {\n\t\tthrow new Error(`Error fetching NFT utxos for ${address}`);\n\t}\n\n\t// Returns a BSV20Txo but we only need a few fields\n\tlet nftUtxos = await res.json();\n\n\t// Only include 1 satoshi outputs, non listings\n\tnftUtxos = nftUtxos.filter(\n\t\t(u: {\n\t\t\tsatoshis: number;\n\t\t\tdata: { list: { price: number; payout: string } | undefined } | null;\n\t\t}) => u.satoshis === 1 && !u.data?.list,\n\t);\n\n\tconst outpoints = nftUtxos.map(\n\t\t(utxo: { txid: string; vout: number }) => `${utxo.txid}_${utxo.vout}`,\n\t);\n\t// Fetch the scripts up to the limit\n\tconst nftRes = await fetch(`${API_HOST}/txos/outpoints?script=true`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify([...outpoints]),\n\t});\n\n\tif (!nftRes.ok) {\n\t\tthrow new Error(`Error fetching NFT scripts for ${address}`);\n\t}\n\n\tconst nfts = (await nftRes.json() || [])\n\n\tnftUtxos = nfts.map(\n\t\t(utxo: {\n\t\t\torigin: { outpoint: string };\n\t\t\tscript: string;\n\t\t\tvout: number;\n\t\t\ttxid: string;\n\t\t}) => {\n      let script = utxo.script;\n      if (scriptEncoding === \"hex\") {\n        script = Buffer.from(script, \"base64\").toString(\"hex\");\n      } else if (scriptEncoding === \"asm\") {\n        script = Script.fromHex(Buffer.from(script, \"base64\").toString(\"hex\")).toASM();\n      }\n\t\t\tconst nftUtxo = {\n\t\t\t\torigin: utxo.origin.outpoint,\n\t\t\t\tscript,\n\t\t\t\tvout: utxo.vout,\n\t\t\t\ttxid: utxo.txid,\n\t\t\t\tsatoshis: 1,\n\t\t\t} as NftUtxo;\n\t\t\tif (collectionId) {\n\t\t\t\tnftUtxo.collectionId = collectionId;\n\t\t\t}\n\t\t\treturn nftUtxo;\n\t\t},\n\t);\n\n\treturn nftUtxos as NftUtxo[];\n};\n\n/**\n * Fetches token utxos from the API\n * @param {TokenType} protocol - Token protocol. Either BSV20 or BSV21\n * @param {string} tokenId - Token id. Ticker for BSV20 and id (mint+deploy inscription origin) for BSV21\n * @param {string} address - Address to fetch utxos for\n * @param {number} [limit=10] - Number of utxos to fetch. Default is 10\n * @param {number} [offset=0] - Offset for fetching utxos. Default is 0\n * @returns {Promise<TokenUtxo[]>} Array of token utxos\n */\nexport const fetchTokenUtxos = async (\n\tprotocol: TokenType,\n\ttokenId: string,\n\taddress: string,\n  limit = 10,\n  offset = 0,\n): Promise<TokenUtxo[]> => {\n\tconst url = `${API_HOST}/bsv20/${address}/${protocol === TokenType.BSV20 ? \"tick\" : \"id\"}/${tokenId}?bsv20=true&listing=false&limit=${limit}&offset=${offset}`;\n\tconst res = await fetch(url);\n\tif (!res.ok) {\n\t\tthrow new Error(`Error fetching ${protocol} utxos`);\n\t}\n\n\t// returns a BSV20Txo but we only need a few fields\n\tlet tokenUtxos = await res.json();\n\n\ttokenUtxos = tokenUtxos.map((utxo: Partial<TokenUtxo>) => ({\n\t\tamt: utxo.amt,\n\t\tscript: utxo.script,\n\t\tvout: utxo.vout,\n\t\ttxid: utxo.txid,\n\t\tid: tokenId,\n\t\tsatoshis: 1,\n\t}));\n\n\treturn tokenUtxos as TokenUtxo[];\n};\n\nconst isLock = (utxo: Utxo) => {\n  return !!(utxo as unknown as { data?: {lock: { address: string, until: number } }}).data?.lock;\n}\n\n/**\n * Selects token UTXOs based on the required amount and specified strategies.\n * @param {TokenUtxo[]} tokenUtxos - Array of token UTXOs.\n * @param {number} requiredTokens - Required amount in tokens (displayed amount).\n * @param {number} decimals - Number of decimal places for the token.\n * @param {TokenSelectionOptions} [options={}] - Options for token selection.\n * @returns {TokenSelectionResult} Selected token UTXOs and total selected amount.\n */\nexport const selectTokenUtxos = (\n  tokenUtxos: TokenUtxo[],\n  requiredTokens: number,\n  decimals: number,\n  options: TokenSelectionOptions = {}\n): TokenSelectionResult => {\n  const {\n    inputStrategy = TokenSelectionStrategy.RetainOrder,\n    outputStrategy = TokenSelectionStrategy.RetainOrder,\n  } = options;\n  \n  // Sort the UTXOs based on the input strategy\n  const sortedUtxos = [...tokenUtxos].sort((a, b) => {\n    if (inputStrategy === TokenSelectionStrategy.RetainOrder) return 0;\n    const amtA = BigInt(a.amt);\n    const amtB = BigInt(b.amt);\n\n    switch (inputStrategy) {\n      case TokenSelectionStrategy.SmallestFirst:\n        return Number(amtA - amtB);\n      case TokenSelectionStrategy.LargestFirst:\n        return Number(amtB - amtA);\n      case TokenSelectionStrategy.Random:\n        return Math.random() - 0.5;\n      default:\n        return 0;\n    }\n  });\n\n  let totalSelected = 0;\n  const selectedUtxos: TokenUtxo[] = [];\n\n  for (const utxo of sortedUtxos) {\n    selectedUtxos.push(utxo);\n    totalSelected += toToken(utxo.amt, decimals);\n    if (totalSelected >= requiredTokens && requiredTokens > 0) {\n      break;\n    }\n  }\n\n  // Sort the selected UTXOs based on the output strategy\n  if (outputStrategy !== TokenSelectionStrategy.RetainOrder) {\n    selectedUtxos.sort((a, b) => {\n      const amtA = BigInt(a.amt);\n      const amtB = BigInt(b.amt);\n\n      switch (outputStrategy) {\n        case TokenSelectionStrategy.SmallestFirst:\n          return Number(amtA - amtB);\n        case TokenSelectionStrategy.LargestFirst:\n          return Number(amtB - amtA);\n        case TokenSelectionStrategy.Random:\n          return Math.random() - 0.5;\n        default:\n          return 0;\n      }\n    });\n  }\n\n  return {\n    selectedUtxos,\n    totalSelected,\n    isEnough: totalSelected >= requiredTokens\n  };\n};","import { P2PKH, SatoshisPerKilobyte, Script, Transaction, Utils } from \"@bsv/sdk\";\nimport { DEFAULT_SAT_PER_KB } from \"./constants\";\nimport { signData } from \"./signData\";\nimport OrdP2PKH from \"./templates/ordP2pkh\";\nimport type {\n\tChangeResult,\n\tCreateOrdinalsCollectionConfig,\n\tCreateOrdinalsCollectionItemConfig,\n\tCreateOrdinalsConfig,\n\tUtxo,\n} from \"./types\";\nimport stringifyMetaData from \"./utils/subtypeData\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\n\n/**\n * Creates a transaction with inscription outputs\n * @param {CreateOrdinalsConfig | CreateOrdinalsCollectionConfig | CreateOrdinalsCollectionItemConfig} config - Configuration object for creating ordinals\n * @param {Utxo[]} config.utxos - Utxos to spend (with base64 encoded scripts)\n * @param {Destination[]} config.destinations - Array of destinations with addresses and inscriptions\n * @param {PrivateKey} config.paymentPk - Private key to sign utxos\n * @param {string} config.changeAddress - Optional. Address to send change to. If not provided, defaults to paymentPk address\n * @param {number} config.satsPerKb - Optional. Satoshis per kilobyte for fee calculation. Default is DEFAULT_SAT_PER_KB\n * @param {PreMAP} config.metaData - Optional. MAP (Magic Attribute Protocol) metadata to include in inscriptions\n * @param {LocalSigner | RemoteSigner} config.signer - Optional. Local or remote signer (used for data signature)\n * @param {Payment[]} config.additionalPayments - Optional. Additional payments to include in the transaction\n * @returns {Promise<ChangeResult>} Transaction with inscription outputs\n */\nexport const createOrdinals = async (\n\tconfig:\n\t\t| CreateOrdinalsConfig\n\t\t| CreateOrdinalsCollectionConfig\n\t\t| CreateOrdinalsCollectionItemConfig,\n): Promise<ChangeResult> => {\n\tconst {\n\t\tutxos,\n\t\tdestinations,\n\t\tpaymentPk,\n\t\tsatsPerKb = DEFAULT_SAT_PER_KB,\n\t\tmetaData,\n\t\tsigner,\n\t\tadditionalPayments = [],\n\t} = config;\n\t\n\t// Warn if creating many inscriptions at once\n\tif (destinations.length > 100) {\n\t\tconsole.warn(\n\t\t\t\"Creating many inscriptions at once can be slow. Consider using multiple transactions instead.\",\n\t\t);\n\t}\n\n\tconst modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n\tlet tx = new Transaction();\n\n\t// Outputs\n\t// Add inscription outputs\n\tfor (const destination of destinations) {\n\t\tif (!destination.inscription) {\n\t\t\tthrow new Error(\"Inscription is required for all destinations\");\n\t\t}\n\n\t\t// remove any undefined fields from metadata\n\t\tif (metaData) {\n\t\t\tfor(const key of Object.keys(metaData)) {\n\t\t\t\tif (metaData[key] === undefined) {\n\t\t\t\t\tdelete metaData[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttx.addOutput({\n\t\t\tsatoshis: 1,\n\t\t\tlockingScript: new OrdP2PKH().lock(\n\t\t\t\tdestination.address,\n\t\t\t\tdestination.inscription,\n\t\t\t\tstringifyMetaData(metaData),\n\t\t\t),\n\t\t});\n\t}\n\n\t// Add additional payments if any\n\tfor (const p of additionalPayments) {\n\t\ttx.addOutput({\n\t\t\tsatoshis: p.amount,\n\t\t\tlockingScript: new P2PKH().lock(p.to),\n\t\t});\n\t}\n\n\tlet payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n\tif(!changeAddress) {\n\t\tthrow new Error(\"Either changeAddress or paymentPk is required\");\n\t}\n\tconst changeScript = new P2PKH().lock(changeAddress);\n\tconst changeOut = {\n\t\tlockingScript: changeScript,\n\t\tchange: true,\n\t};\n\ttx.addOutput(changeOut);\n\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + BigInt(out.satoshis || 0),\n\t\t0n,\n\t);\n\n\tlet fee = 0;\n\n\tif(signer) {\n\t\tconst utxo = utxos.pop() as Utxo\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif(!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the transaction\");\n\t\t}\n\t\ttx.addInput(inputFromB64Utxo(utxo, new P2PKH().unlock(\n\t\t\tpayKeyToUse,\n\t\t\t\"all\",\n\t\t\ttrue,\n\t\t\tutxo.satoshis,\n\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t)));\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\ttx = await signData(tx, signer);\n\t\t// Calculate fee after signing since it adds OP_RETURN outputs\n\t\tfee = await modelOrFee.computeFee(tx);\n\t}\n\tfor (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif(!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the transaction\");\n\t\t}\n\t\tif (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n\t\t\tbreak;\n\t\t}\n\t\tconst input = inputFromB64Utxo(utxo, new P2PKH().unlock(\n\t\t\tpayKeyToUse, \n\t\t\t\"all\",\n\t\t\ttrue, \n\t\t\tutxo.satoshis,\n\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t));\n\n\t\ttx.addInput(input);\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\t}\n\n\t// make sure we have enough\n\tif (totalSatsIn < totalSatsOut + BigInt(fee)) {\n\t\tthrow new Error(\n\t\t\t`Not enough funds to create ordinals. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n\t\t);\n\t}\n\n\t// Calculate fee\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid: tx.id(\"hex\") as string,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (payChange) {\n\t\tconst changeOutput = tx.outputs[tx.outputs.length - 1];\n\t\tpayChange.satoshis = changeOutput.satoshis as number;\n\t\tpayChange.txid = tx.id(\"hex\") as string;\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints: tx.inputs.map(\n\t\t\t(i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n\t\t),\n\t\tpayChange,\n\t};\n};\n","import { Script, LockingScript, Utils } from \"@bsv/sdk\";\nimport BitCom, { BitComProtocol } from \"./BitCom.js\";\n\n/**\n * MAP Protocol Prefix - the BitCom protocol address for MAP\n */\nexport const MAP_PREFIX = \"1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5\";\n\n/**\n * MAP protocol commands\n */\nexport enum MAPCommand {\n  SET = \"SET\",\n  DEL = \"DEL\",\n  ADD = \"ADD\",\n  SELECT = \"SELECT\",\n}\n\n/**\n * MAP protocol data structure\n */\nexport interface MAPData {\n  cmd: MAPCommand | string;\n  data: Record<string, string>;\n  adds?: string[];\n}\n\n/**\n * MAP (Metadata and Payload) Protocol Template\n *\n * The MAP protocol provides a way to store key-value metadata on the blockchain.\n * It supports different commands for setting, deleting, adding, and selecting data.\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport default class MAP {\n  /**\n   * Creates a MAP protocol locking script with SET command\n   *\n   * @param data - Key-value pairs to set\n   * @returns LockingScript - The MAP protocol locking script\n   */\n  static set(data: Record<string, string>): LockingScript {\n    return this.lock(MAPCommand.SET, data);\n  }\n\n  /**\n   * Creates a MAP protocol locking script with ADD command\n   *\n   * @param key - The key to add values to\n   * @param values - Array of values to add\n   * @returns LockingScript - The MAP protocol locking script\n   */\n  static add(key: string, values: string[]): LockingScript {\n    const data: Record<string, string> = {};\n    data[key] = values.join(\" \"); // Join values with space\n    return this.lock(MAPCommand.ADD, data);\n  }\n\n  /**\n   * Creates a MAP protocol locking script with DEL command\n   *\n   * @param keys - Array of keys to delete\n   * @returns LockingScript - The MAP protocol locking script\n   */\n  static del(keys: string[]): LockingScript {\n    const data: Record<string, string> = {};\n    keys.forEach((key) => {\n      data[key] = \"\";\n    });\n    return this.lock(MAPCommand.DEL, data);\n  }\n\n  /**\n   * Creates a MAP protocol locking script\n   *\n   * @param command - The MAP command\n   * @param data - The key-value data\n   * @returns LockingScript - The MAP protocol locking script\n   */\n  static lock(\n    command: MAPCommand | string,\n    data: Record<string, string>\n  ): LockingScript {\n    const protocols: BitComProtocol[] = [\n      {\n        protocol: MAP_PREFIX,\n        script: [],\n        pos: 0,\n      },\n    ];\n\n    // Build the MAP protocol script: CMD KEY1 VALUE1 KEY2 VALUE2 ...\n    const script = new Script();\n\n    // Add COMMAND\n    script.writeBin(Utils.toArray(command.toString()));\n\n    // Add key-value pairs\n    for (const [key, value] of Object.entries(data)) {\n      // Add KEY\n      script.writeBin(Utils.toArray(this.cleanString(key)));\n\n      // Add VALUE\n      script.writeBin(Utils.toArray(this.cleanString(value)));\n    }\n\n    protocols[0].script = script.toBinary();\n\n    // Create BitCom structure and return locking script\n    const bitcom = new BitCom(protocols);\n    return bitcom.lock();\n  }\n\n  /**\n   * Decodes MAP protocol data from script\n   *\n   * @param script - The script containing MAP protocol data\n   * @returns MAPData - The decoded MAP protocol data, or null if invalid\n   */\n  static decode(script: Script | LockingScript | number[]): MAPData | null {\n    let scriptToProcess: Script | null = null;\n\n    if (Array.isArray(script)) {\n      scriptToProcess = Script.fromBinary(script);\n    } else {\n      scriptToProcess = BitCom.toScript(script);\n    }\n\n    if (scriptToProcess == null) {\n      return null;\n    }\n\n    // First decode as BitCom to find MAP protocol\n    const bitcomData = BitCom.decode(scriptToProcess);\n    if (bitcomData == null) {\n      return null;\n    }\n\n    // Find MAP protocol in the protocols\n    const mapProtocol = bitcomData.protocols.find(\n      (p: BitComProtocol) => p.protocol === MAP_PREFIX\n    );\n    if (mapProtocol == null) {\n      return null;\n    }\n\n    // Parse the MAP protocol script using SDK native parsing\n    const parsedScript = Script.fromBinary(mapProtocol.script);\n    const chunks = parsedScript.chunks;\n\n    if (chunks.length < 1) {\n      // At least command\n      return null;\n    }\n\n    // Read COMMAND (first chunk)\n    const cmdChunk = chunks[0];\n    if (cmdChunk.data == null) {\n      return null;\n    }\n    const cmd = Utils.toUTF8(cmdChunk.data);\n\n    const mapData: MAPData = {\n      cmd,\n      data: {},\n    };\n\n    // Handle SET command - read key-value pairs\n    if (cmd === MAPCommand.SET) {\n      for (let i = 1; i < chunks.length; i += 2) {\n        // Read key\n        const keyChunk = chunks[i];\n        if (keyChunk?.data == null) break;\n\n        // Read value (next chunk)\n        const valueChunk = chunks[i + 1];\n        if (valueChunk?.data == null) break;\n\n        const key = this.cleanString(Utils.toUTF8(keyChunk.data));\n        const value = this.cleanString(Utils.toUTF8(valueChunk.data));\n\n        mapData.data[key] = value;\n      }\n    } else if (cmd === MAPCommand.ADD) {\n      // For ADD command, read key and then all remaining values\n      if (chunks.length >= 2) {\n        const keyChunk = chunks[1];\n        if (keyChunk?.data != null) {\n          const key = this.cleanString(Utils.toUTF8(keyChunk.data));\n\n          const values: string[] = [];\n          for (let i = 2; i < chunks.length; i++) {\n            const valueChunk = chunks[i];\n            if (valueChunk?.data != null) {\n              values.push(this.cleanString(Utils.toUTF8(valueChunk.data)));\n            }\n          }\n\n          mapData.data[key] = values.join(\" \");\n          mapData.adds = values;\n        }\n      }\n    } else if (cmd === MAPCommand.DEL) {\n      // For DEL command, read all keys to delete\n      for (let i = 1; i < chunks.length; i++) {\n        const keyChunk = chunks[i];\n        if (keyChunk?.data != null) {\n          const key = this.cleanString(Utils.toUTF8(keyChunk.data));\n          mapData.data[key] = \"\";\n        }\n      }\n    }\n\n    return mapData;\n  }\n\n  /**\n   * Cleans a string by replacing null bytes with spaces and handling escape sequences\n   *\n   * @param str - The string to clean\n   * @returns string - The cleaned string\n   */\n  private static cleanString(str: string): string {\n    return str\n      .replace(/\\0/g, \" \") // Replace null bytes with spaces\n      .replace(/\\\\u0000/g, \" \"); // Replace escaped null bytes with spaces\n  }\n\n  /**\n   * Helper method to create a simple key-value MAP\n   *\n   * @param key - The key\n   * @param value - The value\n   * @returns LockingScript - The MAP protocol locking script\n   */\n  static keyValue(key: string, value: string): LockingScript {\n    return this.set({ [key]: value });\n  }\n\n  /**\n   * Helper method to create an app identification MAP\n   *\n   * @param appName - The application name\n   * @param type - The action/content type\n   * @param additionalData - Optional additional key-value pairs\n   * @returns LockingScript - The MAP protocol locking script\n   */\n  static app(\n    appName: string,\n    type: string,\n    additionalData: Record<string, string> = {}\n  ): LockingScript {\n    const data = {\n      app: appName,\n      type,\n      ...additionalData,\n    };\n    return this.set(data);\n  }\n}\n","import { Script, LockingScript, OP, Utils } from \"@bsv/sdk\";\n\nexport interface BitComProtocol {\n  protocol: string;\n  script: number[];\n  pos: number;\n}\n\nexport interface BitComDecoded {\n  protocols: BitComProtocol[];\n  scriptPrefix: number[];\n}\n\n/**\n * BitCom template for handling multi-protocol Bitcoin transactions\n *\n * BitCom allows multiple protocols to be embedded in a single transaction output\n * using the pipe ('|') delimiter to separate different protocol sections.\n */\nexport default class BitCom {\n  protocols: BitComProtocol[];\n  scriptPrefix: number[];\n\n  constructor(protocols: BitComProtocol[] = [], scriptPrefix: number[] = []) {\n    this.protocols = protocols;\n    this.scriptPrefix = scriptPrefix;\n  }\n\n  /**\n   * Decodes a script to extract BitCom protocol data\n   *\n   * @param script - The script to decode\n   * @returns BitComDecoded - The decoded BitCom structure, or null if no OP_RETURN found\n   */\n  static decode(script: Script | LockingScript): BitComDecoded | null {\n    // Handle null script safely - return empty structure\n    if (script == null) {\n      return {\n        protocols: [],\n        scriptPrefix: [],\n      };\n    }\n\n    let scriptBytes: number[];\n    if (script instanceof LockingScript) {\n      scriptBytes = script.toBinary();\n    } else {\n      scriptBytes = script.toBinary();\n    }\n\n    const pos = this.findReturn(scriptBytes, 0);\n    if (pos === -1) {\n      return null;\n    }\n\n    // Get prefix if present\n    let prefix: number[] = [];\n    if (pos > 0) {\n      prefix = scriptBytes.slice(0, pos);\n    }\n\n    const bitcom: BitComDecoded = {\n      scriptPrefix: prefix,\n      protocols: [],\n    };\n\n    // Start after OP_RETURN\n    const currentPos = pos + 1;\n\n    // Parse protocols using SDK's built-in parsing\n    const remainingScript = Script.fromBinary(scriptBytes.slice(currentPos));\n    const chunks = remainingScript.chunks;\n\n    let chunkIndex = 0;\n    let currentProtocolPos = currentPos;\n\n    while (chunkIndex < chunks.length) {\n      const protocol: BitComProtocol = {\n        protocol: \"\",\n        script: [],\n        pos: currentProtocolPos,\n      };\n\n      // Read protocol identifier from current chunk\n      const protocolChunk = chunks[chunkIndex];\n      if (protocolChunk.data == null) {\n        break;\n      }\n\n      protocol.protocol = Utils.toUTF8(protocolChunk.data);\n      chunkIndex++;\n\n      // Collect script chunks until we find a pipe delimiter or reach end\n      const protocolChunks = [];\n      while (chunkIndex < chunks.length) {\n        const chunk = chunks[chunkIndex];\n\n        // Check if this chunk is a pipe delimiter\n        if (\n          chunk.data != null &&\n          chunk.data.length === 1 &&\n          chunk.data[0] === 0x7c\n        ) {\n          // Found pipe delimiter - end current protocol\n          chunkIndex++; // Skip the pipe\n          break;\n        }\n\n        // Add chunk to current protocol (preserve chunk structure)\n        protocolChunks.push(chunk);\n        chunkIndex++;\n      }\n\n      // Convert chunks back to binary for protocol.script\n      const protocolScript = new Script(protocolChunks);\n      protocol.script = protocolScript.toBinary();\n\n      bitcom.protocols.push(protocol);\n\n      // Update position for next protocol\n      currentProtocolPos +=\n        protocolChunk.op +\n        1 +\n        protocol.script.length +\n        (chunkIndex < chunks.length ? 2 : 0); // +2 for pipe delimiter\n    }\n\n    return bitcom;\n  }\n\n  /**\n   * Creates a locking script from the BitCom structure\n   *\n   * @returns LockingScript - The BitCom locking script\n   */\n  lock(): LockingScript {\n    const script = new Script();\n\n    // Add prefix if present\n    if (this.scriptPrefix.length > 0) {\n      script.writeBin(this.scriptPrefix);\n    }\n\n    if (this.protocols.length > 0) {\n      // Add OP_RETURN\n      script.writeOpCode(OP.OP_RETURN);\n\n      for (let i = 0; i < this.protocols.length; i++) {\n        const protocol = this.protocols[i];\n\n        // Add protocol identifier as push data\n        const protocolBytes = Utils.toArray(protocol.protocol, \"utf8\");\n        script.writeBin(protocolBytes);\n\n        // Add protocol script data directly\n        if (protocol.script.length > 0) {\n          // Parse the protocol script to get its chunks and append them\n          const protocolScript = Script.fromBinary(protocol.script);\n          for (const chunk of protocolScript.chunks) {\n            if (chunk.data != null) {\n              script.writeBin(chunk.data);\n            } else {\n              script.writeOpCode(chunk.op);\n            }\n          }\n        }\n\n        // Add pipe delimiter if not the last protocol\n        if (i < this.protocols.length - 1) {\n          const pipeBytes = Utils.toArray(\"|\", \"utf8\");\n          script.writeBin(pipeBytes);\n        }\n      }\n    }\n\n    return new LockingScript(script.chunks);\n  }\n\n  /**\n   * Finds the position of OP_RETURN in the script\n   *\n   * @param scriptBytes - The script bytes to search\n   * @param from - Starting position\n   * @returns number - Position of OP_RETURN, or -1 if not found\n   */\n  static findReturn(scriptBytes: number[], from: number): number {\n    for (let i = from; i < scriptBytes.length; i++) {\n      if (scriptBytes[i] === OP.OP_RETURN) {\n        return i;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Converts various input types to a Script object\n   *\n   * @param data - The data to convert (Script, LockingScript, or byte array)\n   * @returns Script - The converted script, or null if conversion fails\n   */\n  static toScript(data: Script | LockingScript | number[]): Script | null {\n    if (data instanceof Script) {\n      return data;\n    }\n\n    if (data instanceof LockingScript) {\n      return new Script(data.chunks);\n    }\n\n    if (Array.isArray(data)) {\n      if (data.length === 0) {\n        return new Script();\n      }\n      return Script.fromBinary(data);\n    }\n\n    return null;\n  }\n}\n","import {\n\tTransaction,\n\tSatoshisPerKilobyte,\n\tP2PKH,\n\tScript,\n\tUtils,\n} from \"@bsv/sdk\";\nimport { DEFAULT_SAT_PER_KB } from \"./constants\";\nimport OrdP2PKH from \"./templates/ordP2pkh\";\nimport type { SendOrdinalsConfig, Utxo, ChangeResult } from \"./types\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\nimport { signData } from \"./signData\";\nimport stringifyMetaData from \"./utils/subtypeData\";\nimport MAP, { MAPCommand } from \"./templates/MAP\";\n\n/**\n * Sends ordinals to the given destinations\n * @param {SendOrdinalsConfig} config - Configuration object for sending ordinals\n * @param {Utxo[]} config.paymentUtxos - Utxos to spend (with base64 encoded scripts)\n * @param {Utxo[]} config.ordinals - Utxos to spend (with base64 encoded scripts)\n * @param {PrivateKey} config.paymentPk - Private key to sign paymentUtxos\n * @param {PrivateKey} config.ordPk - Private key to sign ordinals\n * @param {Destination[]} config.destinations - Array of destinations with addresses and inscriptions\n * @param {string} [config.changeAddress] - Optional. Address to send change to, if any. If not provided, defaults to paymentPk address\n * @param {number} [config.satsPerKb] - Optional. Satoshis per kilobyte for fee calculation. Default is DEFAULT_SAT_PER_KB\n * @param {PreMAP} [config.metaData] - Optional. MAP (Magic Attribute Protocol) metadata to include in inscriptions\n * @param {LocalSigner | RemoteSigner} [config.signer] - Optional. Signer object to sign the transaction\n * @param {Payment[]} [config.additionalPayments] - Optional. Additional payments to include in the transaction\n * @param {boolean} [config.enforceUniformSend] - Optional. Default: true. Enforce that the number of destinations matches the number of ordinals being sent. Sending ordinals requires a 1:1 mapping of destinations to ordinals. This is only used for sub-protocols like BSV21 that manage tokens without sending the inscriptions directly.\n * @returns {Promise<ChangeResult>} Transaction, spent outpoints, and change utxo\n */\nexport const sendOrdinals = async (\n\tconfig: SendOrdinalsConfig,\n): Promise<ChangeResult> => {\n\tif (!config.satsPerKb) {\n\t\tconfig.satsPerKb = DEFAULT_SAT_PER_KB;\n\t}\n\tif (!config.additionalPayments) {\n\t\tconfig.additionalPayments = [];\n\t}\n\tif (config.enforceUniformSend === undefined) {\n\t\tconfig.enforceUniformSend = true;\n\t}\n\n\tconst {ordPk, paymentPk} = config;\n\n\tconst modelOrFee = new SatoshisPerKilobyte(config.satsPerKb);\n\tlet tx = new Transaction();\n\tconst spentOutpoints: string[] = [];\n\n\t// Inputs\n\t// Add ordinal inputs\n\tfor (const ordUtxo of config.ordinals) {\n    const ordKeyToUse = ordUtxo.pk || ordPk;\n\t\tif (!ordKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the ordinal\");\n\t\t}\n\t\tif (ordUtxo.satoshis !== 1) {\n\t\t\tthrow new Error(\"1Sat Ordinal utxos must have exactly 1 satoshi\");\n\t\t}\n\n\t\tconst input = inputFromB64Utxo(\n\t\t\tordUtxo,\n\t\t\tnew OrdP2PKH().unlock(\n\t\t\t\tordKeyToUse, \n\t\t\t\t\"all\",\n\t\t\t\ttrue, \n\t\t\t\tordUtxo.satoshis,\n\t\t\t\tScript.fromBinary(Utils.toArray(ordUtxo.script, 'base64'))\n\t\t\t),\n\t\t);\n\t\tspentOutpoints.push(`${ordUtxo.txid}_${ordUtxo.vout}`);\n\t\ttx.addInput(input);\n\t}\n\n\t// Outputs\n\t// check that ordinals coming in matches ordinals going out if supplied\n\tif (\n\t\tconfig.enforceUniformSend &&\n\t\tconfig.destinations.length !== config.ordinals.length\n\t) {\n\t\tthrow new Error(\n\t\t\t\"Number of destinations must match number of ordinals being sent\",\n\t\t);\n\t}\n\n\t// Add ordinal outputs\n\tfor (const destination of config.destinations) {\n\t\tlet s: Script;\n\t\tif (\n\t\t\tdestination.inscription?.dataB64 &&\n\t\t\tdestination.inscription?.contentType\n\t\t) {\n\t\t\ts = new OrdP2PKH().lock(\n\t\t\t\tdestination.address,\n\t\t\t\tdestination.inscription,\n\t\t\t\tstringifyMetaData(config.metaData),\n\t\t\t);\n\t\t} else {\n\t\t\ts = new P2PKH().lock(destination.address);\n\n\t\t\tif (config.metaData) {\n\t\t\t\tconst data = {} as Record<string, string>;\n\t\t\t\tfor (const key in config.metaData) {\n\t\t\t\t\tdata[key] = (config.metaData[key] as any).toString();\n\t\t\t\t}\n\t\t\t\ts = new Script([\n\t\t\t\t\t...s.chunks,\n\t\t\t\t\t...MAP.lock(MAPCommand.SET, data).chunks,\n\t\t\t\t])\n\t\t\t}\n\t\t}\n\n\t\ttx.addOutput({\n\t\t\tsatoshis: 1,\n\t\t\tlockingScript: s,\n\t\t});\n\t}\n\n  \n\t// Add additional payments if any\n\tfor (const p of config.additionalPayments) {\n\t\ttx.addOutput({\n\t\t\tsatoshis: p.amount,\n\t\t\tlockingScript: new P2PKH().lock(p.to),\n\t\t});\n\t}\n\n  // add change to the outputs\n\tlet payChange: Utxo | undefined;\n\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n\tif(!changeAddress) {\n\t\tthrow new Error(\"Either changeAddress or paymentPk is required\");\n\t}\n\tconst changeScript = new P2PKH().lock(changeAddress);\n\tconst changeOut = {\n\t\tlockingScript: changeScript,\n\t\tchange: true,\n\t};\n\ttx.addOutput(changeOut);\n\n\t// Inputs\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + BigInt(out.satoshis || 0),\n\t\t0n,\n\t);\n\tlet fee = 0;\n\tfor (const utxo of config.paymentUtxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif (!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the payment\");\n\t\t}\n\t\tconst input = inputFromB64Utxo(utxo, new P2PKH().unlock(\n\t\t\tpayKeyToUse, \n\t\t\t\"all\",\n\t\t\ttrue, \n\t\t\tutxo.satoshis,\n\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t));\n\t\tspentOutpoints.push(`${utxo.txid}_${utxo.vout}`);\n\n\t\ttx.addInput(input);\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\n\t\tif (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (totalSatsIn < totalSatsOut) {\n\t\tthrow new Error(\"Not enough ordinals to send\");\n\t}\n\n\tif (config.signer) {\n\t\ttx = await signData(tx, config.signer);\n\t}\n\n\t// Calculate fee\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid: tx.id(\"hex\") as string,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (payChange) {\n\t\tconst changeOutput = tx.outputs[tx.outputs.length - 1];\n\t\tpayChange.satoshis = changeOutput.satoshis as number;\n\t\tpayChange.txid = tx.id(\"hex\") as string;\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints,\n\t\tpayChange,\n\t};\n};\n","import {\n\tP2PKH,\n\ttype PrivateKey,\n\tSatoshisPerKilobyte,\n\tScript,\n\tTransaction,\n\ttype TransactionOutput,\n\tUtils,\n} from \"@bsv/sdk\";\nimport { DEFAULT_SAT_PER_KB } from \"./constants\";\nimport { signData } from \"./signData\";\nimport OrdP2PKH from \"./templates/ordP2pkh\";\nimport type { ChangeResult, SendUtxosConfig, Utxo } from \"./types\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\n\n/**\n * Sends utxos to the given destination\n * @param {SendUtxosConfig} config - Configuration object for sending utxos\n * @param {Utxo[]} config.utxos - Utxos to spend (with base64 encoded scripts)\n * @param {PrivateKey} config.paymentPk - Private key to sign utxos\n * @param {Payment[]} config.payments - Array of payments with addresses and amounts\n * @param {number} [config.satsPerKb] - (Optional) Satoshis per kilobyte for fee calculation. Default is DEFAULT_SAT_PER_KB\n * @param {string} [config.changeAddress] - (Optional) Address to send change to. If not provided, defaults to paymentPk address\n * @param {string} [config.metaData] - (Optional) Metadata to include in OP_RETURN of the payment output\n * @returns {Promise<ChangeResult>} - Returns a ChangeResult: payChange, tx, and spentOutputs\n */\nexport const sendUtxos = async (\n\tconfig: SendUtxosConfig,\n): Promise<ChangeResult> => {\n\tconst {\n\t\tutxos,\n\t\tpaymentPk,\n\t\tpayments,\n\t\tsatsPerKb = DEFAULT_SAT_PER_KB,\n\t\tmetaData,\n\t\tsigner,\n\t} = config;\n\n\tconst modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n\n\tlet tx = new Transaction();\n\n\t// Outputs\n\tfor (const payment of payments) {\n\t\tconst sendTxOut: TransactionOutput = {\n\t\t\tsatoshis: payment.amount,\n\t\t\tlockingScript: new OrdP2PKH().lock(payment.to, undefined, metaData),\n\t\t};\n\t\ttx.addOutput(sendTxOut);\n\t}\n\n\t// Inputs\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + (out.satoshis || 0),\n\t\t0,\n\t);\n\n\tlet fee = 0;\n\n\tif(signer) {\n\t\tconst utxo = utxos.pop() as Utxo\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif(!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the transaction\");\n\t\t}\n\t\ttx.addInput(inputFromB64Utxo(utxo, new P2PKH().unlock(\n\t\t\tpayKeyToUse,\n\t\t\t\"all\",\n\t\t\ttrue,\n\t\t\tutxo.satoshis,\n\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t)));\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\ttx = await signData(tx, signer);\n\t\t// Calculate fee after signing since it adds OP_RETURN outputs\n\t\tfee = await modelOrFee.computeFee(tx);\n\t}\n\tfor (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif (!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the utxos\");\n\t\t}\n\t\tconst input = inputFromB64Utxo(utxo, new P2PKH().unlock(\n\t\t\tpayKeyToUse,\n\t\t\t\"all\",\n\t\t\ttrue,\n\t\t\tutxo.satoshis,\n\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t));\n\t\ttx.addInput(input);\n\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\n\t\tif (totalSatsIn >= totalSatsOut + fee) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// make sure we have enough\n\tif (totalSatsIn < totalSatsOut + fee) {\n\t\tthrow new Error(\n\t\t\t`Not enough funds to send. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n\t\t);\n\t}\n\n  // Change\n\tlet payChange: Utxo | undefined;\n  // if we need to send change, add it to the outputs\n\tif (totalSatsIn > totalSatsOut + fee) {\n    const changeAddress = config.changeAddress || paymentPk?.toAddress();\n    if(!changeAddress) {\n      throw new Error(\"Either changeAddress or paymentPk is required\");\n    }\n    const changeScript = new P2PKH().lock(changeAddress);\n\t\tconst changeOut: TransactionOutput = {\n\t\t\tlockingScript: changeScript,\n\t\t\tchange: true,\n\t\t};\n\t\tpayChange = {\n\t\t\ttxid: \"\", // txid is not known yet\n\t\t\tvout: tx.outputs.length,\n\t\t\tsatoshis: 0, // change output amount is not known yet\n\t\t\tscript: Buffer.from(changeScript.toHex(), \"hex\").toString(\"base64\"),\n\t\t};\n\t\ttx.addOutput(changeOut);\n\t} else if (totalSatsIn < totalSatsOut + fee) {\n\t\tconsole.log(\"No change needed\");\n\t}\n\n\t// Calculate fee\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid: tx.id(\"hex\") as string,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (payChange) {\n\t\tconst changeOutput = tx.outputs[tx.outputs.length - 1];\n\t\tpayChange.satoshis = changeOutput.satoshis as number;\n\t\tpayChange.txid = tx.id(\"hex\") as string;\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints: tx.inputs.map(\n\t\t\t(i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n\t\t),\n\t\tpayChange,\n\t};\n};\n","import {\n\tP2PKH,\n\tSatoshisPerKilobyte,\n\tScript,\n\tTransaction,\n\tUtils,\n} from \"@bsv/sdk\";\nimport { DEFAULT_SAT_PER_KB } from \"./constants\";\nimport OrdP2PKH, { applyInscription } from \"./templates/ordP2pkh\";\nimport {\n\tTokenType,\n\ttype TokenUtxo,\n\ttype TransferBSV20Inscription,\n\ttype TransferBSV21Inscription,\n\ttype TransferOrdTokensConfig,\n\ttype TokenChangeResult,\n\ttype TransferTokenInscription,\n\ttype Utxo,\n\tTokenInputMode,\n\ttype TokenSplitConfig,\n\ttype PreMAP,\n} from \"./types\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\nimport { signData } from \"./signData\";\nimport stringifyMetaData from \"./utils/subtypeData\";\nimport { ReturnTypes, toToken, toTokenSat } from \"satoshi-token\";\n\n/**\n * Transfer tokens to a destination\n * @param {TransferOrdTokensConfig} config - Configuration object for transferring tokens\n * @param {TokenType} config.protocol - Token protocol. Must be TokenType.BSV20 or TokenType.BSV21\n * @param {string} config.tokenID - Token ID. Either the tick or id value depending on the protocol\n * @param {Utxo[]} config.utxos - Payment Utxos available to spend. Will only consume what is needed.\n * @param {TokenUtxo[]} config.inputTokens - Token utxos to spend\n * @param {Distribution[]} config.distributions - Array of destinations with addresses and amounts\n * @param {PrivateKey} config.paymentPk - Private key to sign paymentUtxos\n * @param {PrivateKey} config.ordPk - Private key to sign ordinals\n * @param {decimals} config.decimals - Number of decimal places for the token\n * @param {string} [config.changeAddress] - Optional. Address to send payment change to, if any. If not provided, defaults to paymentPk address\n * @param {string} [config.tokenChangeAddress] - Optional. Address to send token change to, if any. If not provided, defaults to ordPk address\n * @param {number} [config.satsPerKb] - Optional. Satoshis per kilobyte for fee calculation. Default is DEFAULT_SAT_PER_KB\n * @param {PreMAP} [config.metaData] - Optional. MAP (Magic Attribute Protocol) metadata to include in inscriptions\n * @param {LocalSigner | RemoteSigner} [config.signer] - Optional. Signer object to sign the transaction\n * @param {Payment[]} [config.additionalPayments] - Optional. Additional payments to include in the transaction\n * @param {TokenInputMode} [config.tokenInputMode] - Optional. \"all\" or \"needed\". Default is \"needed\"\n * @param {TokenSplitConfig} [config.tokenSplitConfig] - Optional. Configuration object for splitting token change\n * @param {burn} [config.burn] - Optional. Set to true to burn the tokens.\n * @returns {Promise<TokenChangeResult>} Transaction with token transfer outputs\n */\nexport const transferOrdTokens = async (\n\tconfig: TransferOrdTokensConfig,\n): Promise<TokenChangeResult> => {\n\tconst {\n\t\tprotocol,\n\t\ttokenID,\n\t\tutxos,\n\t\tinputTokens,\n\t\tdistributions,\n\t\tpaymentPk,\n\t\tordPk,\n\t\tsatsPerKb = DEFAULT_SAT_PER_KB,\n\t\tmetaData,\n\t\tsigner,\n\t\tdecimals,\n\t\tadditionalPayments = [],\n\t\tburn = false,\n\t\ttokenInputMode = TokenInputMode.Needed,\n\t\tsplitConfig = {\n\t\t\toutputs: 1,\n\t\t\tomitMetaData: false,\n\t\t},\n\t} = config;\n\n\t// Ensure these inputs are for the expected token\n\tif (!inputTokens.every((token) => token.id === tokenID)) {\n\t\tthrow new Error(\"Input tokens do not match the provided tokenID\");\n\t}\n\n\t// calculate change amount\n\tlet changeTsats = 0n;\n\tlet totalTsatIn = 0n;\n\tlet totalTsatOut = 0n;\n\tconst totalAmtNeeded = distributions.reduce(\n\t\t(acc, dist) => acc + toTokenSat(dist.tokens, decimals, ReturnTypes.BigInt),\n\t\t0n,\n\t);\n\n\tconst modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n\tlet tx = new Transaction();\n\n\t// Handle token inputs based on tokenInputMode\n\tlet tokensToUse: TokenUtxo[];\n\tif (tokenInputMode === TokenInputMode.All) {\n\t\ttokensToUse = inputTokens;\n\t\ttotalTsatIn = inputTokens.reduce(\n\t\t\t(acc, token) => acc + BigInt(token.amt),\n\t\t\t0n,\n\t\t);\n\t} else {\n\t\ttokensToUse = [];\n\t\tfor (const token of inputTokens) {\n\t\t\ttokensToUse.push(token);\n\t\t\ttotalTsatIn += BigInt(token.amt);\n\t\t\tif (totalTsatIn >= totalAmtNeeded) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (totalTsatIn < totalAmtNeeded) {\n\t\t\tthrow new Error(\"Not enough tokens to satisfy the transfer amount\");\n\t\t}\n\t}\n\n\tfor (const token of tokensToUse) {\n    const ordKeyToUse = token.pk || ordPk;\n\t\tif(!ordKeyToUse) {\n\t\t\tthrow new Error(\"Private key required for token input\");\n\t\t}\n\t\tconst inputScriptBinary = Utils.toArray(token.script, \"base64\");\n\t\tconst inputScript = Script.fromBinary(inputScriptBinary);\n\t\ttx.addInput(\n\t\t\tinputFromB64Utxo(\n\t\t\t\ttoken,\n\t\t\t\tnew OrdP2PKH().unlock(ordKeyToUse, \"all\", true, token.satoshis, inputScript),\n\t\t\t),\n\t\t);\n\t}\n\n\t// remove any undefined fields from metadata\n\tif (metaData) {\n\t\tfor (const key of Object.keys(metaData)) {\n\t\t\tif (metaData[key] === undefined) {\n\t\t\t\tdelete metaData[key];\n\t\t\t}\n\t\t}\n\t}\n\n\t// build destination inscriptions\n\tfor (const dest of distributions) {\n\t\tconst bigAmt = toTokenSat(dest.tokens, decimals, ReturnTypes.BigInt);\n    \n\t\tconst transferInscription: TransferTokenInscription = {\n\t\t\tp: \"bsv-20\",\n\t\t\top: burn ? \"burn\" : \"transfer\",\n\t\t\tamt: bigAmt.toString(),\n\t\t};\n\t\tlet inscriptionObj: TransferBSV20Inscription | TransferBSV21Inscription;\n\t\tif (protocol === TokenType.BSV20) {\n\t\t\tinscriptionObj = {\n\t\t\t\t...transferInscription,\n\t\t\t\ttick: tokenID,\n\t\t\t} as TransferBSV20Inscription;\n\t\t} else if (protocol === TokenType.BSV21) {\n\t\t\tinscriptionObj = {\n\t\t\t\t...transferInscription,\n\t\t\t\tid: tokenID,\n\t\t\t} as TransferBSV21Inscription;\n\t\t} else {\n\t\t\tthrow new Error(\"Invalid protocol\");\n\t\t}\n\n\t\tconst inscription = {\n\t\t\tdataB64: Buffer.from(JSON.stringify(inscriptionObj)).toString(\"base64\"),\n\t\t\tcontentType: \"application/bsv-20\",\n\t\t}\n\t\tconst lockingScript = typeof dest.address === 'string' ?\n\t\t\tnew OrdP2PKH().lock(\n\t\t\t\tdest.address,\n\t\t\t\tinscription,\n\t\t\t\t// when present, include metadata on each distribution if omit is not specified\n\t\t\t\tdest.omitMetaData ? undefined : stringifyMetaData(metaData),\n\t\t\t) :\n\t\t\tapplyInscription(dest.address, inscription);\n\n\t\ttx.addOutput({\n\t\t\tsatoshis: 1,\n\t\t\tlockingScript,\n\t\t});\n\t\ttotalTsatOut += bigAmt;\n\t}\n\n\tchangeTsats = totalTsatIn - totalTsatOut;\n\t\n\t// check that you have enough tokens to send and return change\n\tif (changeTsats < 0n) {\n\t\tthrow new Error(\"Not enough tokens to send\");\n\t}\n\n\tlet tokenChange: TokenUtxo[] = [];\n\tif (changeTsats > 0n) {\n    const tokenChangeAddress = config.tokenChangeAddress || ordPk?.toAddress();\n\t\tif(!tokenChangeAddress) {\n\t\t\tthrow new Error(\"ordPk or changeAddress required for token change\");\n\t\t}\n\t\ttokenChange = splitChangeOutputs(\n\t\t\ttx,\n\t\t\tchangeTsats,\n\t\t\tprotocol,\n\t\t\ttokenID,\n\t\t\ttokenChangeAddress,\n\t\t\tmetaData,\n\t\t\tsplitConfig,\n      \t\tdecimals,\n\t\t);\n\t}\n\n\t// Add additional payments if any\n\tfor (const p of additionalPayments) {\n\t\ttx.addOutput({\n\t\t\tsatoshis: p.amount,\n\t\t\tlockingScript: new P2PKH().lock(p.to),\n\t\t});\n\t}\n\n\t// add change to the outputs\n\tlet payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n\tif (!changeAddress) {\n\t\tthrow new Error(\"paymentPk or changeAddress required for payment change\");\n\t}\n\tconst changeScript = new P2PKH().lock(changeAddress);\n\tconst changeOut = {\n\t\tlockingScript: changeScript,\n\t\tchange: true,\n\t};\n\ttx.addOutput(changeOut);\n\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + BigInt(out.satoshis || 0),\n\t\t0n,\n\t);\n\tlet fee = 0;\n\tfor (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif(!payKeyToUse) {\n\t\t\tthrow new Error(\"paymentPk required for payment utxo\");\n\t\t}\n\t\tconst input = inputFromB64Utxo(\n\t\t\tutxo,\n\t\t\tnew P2PKH().unlock(\n\t\t\t\tpayKeyToUse,\n\t\t\t\t\"all\",\n\t\t\t\ttrue,\n\t\t\t\tutxo.satoshis,\n\t\t\t\tScript.fromBinary(Utils.toArray(utxo.script, \"base64\")),\n\t\t\t),\n\t\t);\n\n\t\ttx.addInput(input);\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\n\t\tif (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// make sure we have enough\n\tif (totalSatsIn < totalSatsOut + BigInt(fee)) {\n\t\tthrow new Error(\n\t\t\t`Not enough funds to transfer tokens. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n\t\t);\n\t}\n\n\tif (signer) {\n\t\ttx = await signData(tx, signer);\n\t}\n\n\t// estimate the cost of the transaction and assign change value\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\t// assign txid to tokenChange outputs\n\tconst txid = tx.id(\"hex\") as string;\n\tfor (const change of tokenChange) {\n\t\tchange.txid = txid;\n\t}\n\n\t// check for change\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (payChange) {\n\t\tconst changeOutput = tx.outputs[tx.outputs.length - 1];\n\t\tpayChange.satoshis = changeOutput.satoshis as number;\n\t\tpayChange.txid = tx.id(\"hex\") as string;\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints: tx.inputs.map(\n\t\t\t(i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n\t\t),\n\t\tpayChange,\n\t\ttokenChange,\n\t};\n};\n\nconst splitChangeOutputs = (\n  tx: Transaction,\n  changeTsats: bigint,\n  protocol: TokenType,\n  tokenID: string,\n  tokenChangeAddress: string,\n  metaData: PreMAP | undefined,\n  splitConfig: TokenSplitConfig,\n  decimals: number,\n): TokenUtxo[] => {\n  const tokenChanges: TokenUtxo[] = [];\n\n  const threshold = splitConfig.threshold !== undefined ? toTokenSat(splitConfig.threshold, decimals, ReturnTypes.BigInt) : undefined;\n  const maxOutputs = splitConfig.outputs;\n  const changeAmt = changeTsats;\n  let splitOutputs: bigint;\n  if (threshold !== undefined && threshold > 0n) {\n      splitOutputs = changeAmt / threshold;\n      splitOutputs = BigInt(Math.min(Number(splitOutputs), maxOutputs));\n  } else {\n      // If no threshold is specified, use maxOutputs directly\n      splitOutputs = BigInt(maxOutputs);\n  }\n  splitOutputs = BigInt(Math.max(Number(splitOutputs), 1));\n\n  const baseChangeAmount = changeAmt / splitOutputs;\n  let remainder = changeAmt % splitOutputs;\n\n  for (let i = 0n; i < splitOutputs; i++) {\n      let splitAmount = baseChangeAmount;\n      if (remainder > 0n) {\n          splitAmount += 1n;\n          remainder -= 1n;\n      }\n\n      const transferInscription: TransferTokenInscription = {\n          p: \"bsv-20\",\n          op: \"transfer\",\n          amt: splitAmount.toString(),\n      };\n      let inscription: TransferBSV20Inscription | TransferBSV21Inscription;\n      if (protocol === TokenType.BSV20) {\n          inscription = {\n              ...transferInscription,\n              tick: tokenID,\n          } as TransferBSV20Inscription;\n      } else if (protocol === TokenType.BSV21) {\n          inscription = {\n              ...transferInscription,\n              id: tokenID,\n          } as TransferBSV21Inscription;\n      } else {\n          throw new Error(\"Invalid protocol\");\n      }\n\n      const lockingScript = new OrdP2PKH().lock(\n          tokenChangeAddress,\n          {\n              dataB64: Buffer.from(JSON.stringify(inscription)).toString(\"base64\"),\n              contentType: \"application/bsv-20\",\n          },\n          splitConfig.omitMetaData ? undefined : stringifyMetaData(metaData),\n      );\n\n      const vout = tx.outputs.length;\n      tx.addOutput({ lockingScript, satoshis: 1 });\n      tokenChanges.push({\n          id: tokenID,\n          satoshis: 1,\n          script: Buffer.from(lockingScript.toBinary()).toString(\"base64\"),\n          txid: \"\",\n          vout,\n          amt: splitAmount.toString(),\n      });\n  }\n\n  return tokenChanges;\n};","import { Script, LockingScript, Utils } from \"@bsv/sdk\";\nimport BitCom, { BitComProtocol } from \"./BitCom.js\";\n\n/**\n * B Protocol Prefix - the BitCom protocol address for B\n */\nexport const B_PREFIX = \"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut\";\n\n/**\n * Media types for B protocol\n */\nexport enum MediaType {\n  TextPlain = \"text/plain\",\n  TextMarkdown = \"text/markdown\",\n  TextHTML = \"text/html\",\n  ImagePNG = \"image/png\",\n  ImageJPEG = \"image/jpeg\",\n  ApplicationJSON = \"application/json\",\n  ApplicationPDF = \"application/pdf\",\n}\n\n/**\n * Encoding types for B protocol\n */\nexport enum Encoding {\n  UTF8 = \"utf-8\",\n  Binary = \"binary\",\n  Base64 = \"base64\",\n  Hex = \"hex\",\n}\n\n/**\n * B protocol data structure\n * B PROTOCOL FORMAT: PREFIX DATA MEDIA_TYPE ENCODING FILENAME\n */\nexport interface BData {\n  mediaType: MediaType | string;\n  encoding: Encoding | string;\n  data: number[];\n  filename?: string;\n}\n\n/**\n * B (Binary) Protocol Template\n *\n * The B protocol is used for storing arbitrary binary data on the blockchain.\n * It follows the format: PREFIX DATA MEDIA_TYPE ENCODING [FILENAME]\n * where FILENAME is optional.\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport default class B {\n  /**\n   * Creates a B protocol locking script\n   *\n   * @param data - The binary data to store\n   * @param mediaType - The MIME type of the data\n   * @param encoding - The encoding format\n   * @param filename - Optional filename\n   * @returns LockingScript - The B protocol locking script\n   */\n  static lock(\n    data: number[] | string | Uint8Array,\n    mediaType: MediaType | string = MediaType.TextPlain,\n    encoding: Encoding | string = Encoding.UTF8,\n    filename?: string\n  ): LockingScript {\n    // Convert data to number array\n    let dataBytes: number[];\n    if (typeof data === \"string\") {\n      if (encoding === Encoding.Hex) {\n        dataBytes = Utils.toArray(data, \"hex\");\n      } else if (encoding === Encoding.Base64) {\n        dataBytes = Utils.toArray(data, \"base64\");\n      } else {\n        dataBytes = Utils.toArray(data, \"utf8\");\n      }\n    } else if (data instanceof Uint8Array) {\n      dataBytes = Array.from(data);\n    } else {\n      dataBytes = data;\n    }\n\n    const protocols: BitComProtocol[] = [\n      {\n        protocol: B_PREFIX,\n        script: [],\n        pos: 0,\n      },\n    ];\n\n    // Build the B protocol script: DATA MEDIA_TYPE ENCODING [FILENAME]\n    // ✅ CORRECT - Use SDK's built-in writeBin method\n    const script = new Script();\n\n    // Add DATA as push data\n    script.writeBin(dataBytes);\n\n    // Add MEDIA_TYPE as push data\n    script.writeBin(Utils.toArray(mediaType));\n\n    // Add ENCODING as push data\n    script.writeBin(Utils.toArray(encoding));\n\n    // Add optional FILENAME as push data\n    if (filename != null && filename !== \"\") {\n      script.writeBin(Utils.toArray(filename));\n    }\n\n    protocols[0].script = script.toBinary();\n\n    // Create BitCom structure and return locking script\n    const bitcom = new BitCom(protocols);\n    return bitcom.lock();\n  }\n\n  /**\n   * Decodes B protocol data from script\n   *\n   * @param script - The script containing B protocol data\n   * @returns BData - The decoded B protocol data, or null if invalid\n   */\n  static decode(script: Script | LockingScript | number[]): BData | null {\n    let scriptToProcess: Script | null = null;\n\n    if (Array.isArray(script)) {\n      scriptToProcess = Script.fromBinary(script);\n    } else {\n      scriptToProcess = BitCom.toScript(script);\n    }\n\n    if (scriptToProcess == null) {\n      return null;\n    }\n\n    // First decode as BitCom to find B protocol\n    const bitcomData = BitCom.decode(scriptToProcess);\n    if (bitcomData == null) {\n      return null;\n    }\n\n    // Find B protocol in the protocols\n    const bProtocol = bitcomData.protocols.find(\n      (p: BitComProtocol) => p.protocol === B_PREFIX\n    );\n    if (bProtocol == null) {\n      return null;\n    }\n\n    // Parse the B protocol script: DATA MEDIA_TYPE ENCODING [FILENAME]\n    // ✅ CORRECT - Use SDK native parsing\n    const parsedScript = Script.fromBinary(bProtocol.script);\n    const chunks = parsedScript.chunks;\n\n    if (chunks.length < 3) {\n      // Need at least DATA, MEDIA_TYPE, ENCODING\n      return null;\n    }\n\n    // Access parsed chunks directly\n    const dataChunk = chunks[0];\n    if (dataChunk.data == null) {\n      return null;\n    }\n    const data = dataChunk.data;\n\n    // Return null for empty data as expected by tests\n    if (data.length === 0) return null;\n\n    // Read MEDIA_TYPE (second chunk)\n    const mediaTypeChunk = chunks[1];\n    if (mediaTypeChunk.data == null) {\n      return null;\n    }\n    const mediaType = Utils.toUTF8(mediaTypeChunk.data);\n\n    // Read ENCODING (third chunk)\n    const encodingChunk = chunks[2];\n    if (encodingChunk.data == null) {\n      return null;\n    }\n    const encoding = Utils.toUTF8(encodingChunk.data);\n\n    // Try to read optional FILENAME (fourth chunk)\n    let filename: string | undefined;\n    if (chunks.length >= 4) {\n      const filenameChunk = chunks[3];\n      if (filenameChunk.data != null) {\n        filename = Utils.toUTF8(filenameChunk.data);\n      }\n    }\n\n    return {\n      data,\n      mediaType,\n      encoding,\n      filename,\n    };\n  }\n\n  /**\n   * Helper method to create text content\n   *\n   * @param text - The text content\n   * @param mediaType - Optional media type (defaults to text/plain)\n   * @param filename - Optional filename\n   * @returns LockingScript - The B protocol locking script\n   */\n  static text(\n    text: string,\n    mediaType: MediaType | string = MediaType.TextPlain,\n    filename?: string\n  ): LockingScript {\n    return this.lock(text, mediaType, Encoding.UTF8, filename);\n  }\n\n  /**\n   * Helper method to create binary content\n   *\n   * @param data - The binary data\n   * @param mediaType - The media type\n   * @param filename - Optional filename\n   * @returns LockingScript - The B protocol locking script\n   */\n  static binary(\n    data: number[] | Uint8Array,\n    mediaType: MediaType | string,\n    filename?: string\n  ): LockingScript {\n    return this.lock(data, mediaType, Encoding.Binary, filename);\n  }\n\n  /**\n   * Helper method to create base64 encoded content\n   *\n   * @param base64Data - The base64 encoded data\n   * @param mediaType - The media type\n   * @param filename - Optional filename\n   * @returns LockingScript - The B protocol locking script\n   */\n  static base64(\n    base64Data: string,\n    mediaType: MediaType | string,\n    filename?: string\n  ): LockingScript {\n    return this.lock(base64Data, mediaType, Encoding.Base64, filename);\n  }\n\n  /**\n   * Helper method to create hex encoded content\n   *\n   * @param hexData - The hex encoded data\n   * @param mediaType - The media type\n   * @param filename - Optional filename\n   * @returns LockingScript - The B protocol locking script\n   */\n  static hex(\n    hexData: string,\n    mediaType: MediaType | string,\n    filename?: string\n  ): LockingScript {\n    return this.lock(hexData, mediaType, Encoding.Hex, filename);\n  }\n}\n","import {\n\tBigNumber,\n\ttype LockingScript,\n\tOP,\n\tP2PKH,\n\ttype PrivateKey,\n\tScript,\n\ttype Transaction,\n\tTransactionSignature,\n\tUnlockingScript,\n\tUtils,\n} from \"@bsv/sdk\";\nimport { toHex } from \"../utils/strings\";\nimport type { Inscription } from \"../types\";\n\nexport const oLockPrefix =\n\t\"2097dfd76851bf465e8f715593b217714858bbe9570ff3bd5e33840a34e20ff0262102ba79df5f8ae7604a9830f03c7933028186aede0675a16f025dc4f8be8eec0382201008ce7480da41702918d1ec8e6849ba32b4d65b1e40dc669c31a1e6306b266c0000\";\nexport const oLockSuffix =\n\t\"615179547a75537a537a537a0079537a75527a527a7575615579008763567901c161517957795779210ac407f0e4bd44bfc207355a778b046225a7068fc59ee7eda43ad905aadbffc800206c266b30e6a1319c66dc401e5bd6b432ba49688eecd118297041da8074ce081059795679615679aa0079610079517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e01007e81517a75615779567956795679567961537956795479577995939521414136d08c5ed2bf3ba048afe6dcaebafeffffffffffffffffffffffffffffff00517951796151795179970079009f63007952799367007968517a75517a75517a7561527a75517a517951795296a0630079527994527a75517a6853798277527982775379012080517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f517f7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e7c7e01205279947f7754537993527993013051797e527e54797e58797e527e53797e52797e57797e0079517a75517a75517a75517a75517a75517a75517a75517a75517a75517a75517a75517a75517a756100795779ac517a75517a75517a75517a75517a75517a75517a75517a75517a7561517a75517a756169587951797e58797eaa577961007982775179517958947f7551790128947f77517a75517a75618777777777777777777767557951876351795779a9876957795779ac777777777777777767006868\";\n\n/**\n * OrdLock class implementing ScriptTemplate.\n *\n * This class provides methods for interacting with OrdinalLock contract \n */\nexport default class OrdLock {\n\t/**\n\t * Creates a 1Sat Ordinal Lock script\n\t *\n\t * @param {string} ordAddress - An address which can cancel listing.\n\t * @param {string} payAddress - Address which is paid on purchase\n\t * @param {number} price - Listing price in satoshis\n\t * @returns {LockingScript} - A P2PKH locking script.\n\t */\n\tlock(\n\t\tordAddress: string,\n\t\tpayAddress: string,\n\t\tprice: number,\n\t\tinscription?: Inscription,\n\t): Script {\n\t\tconst cancelPkh = Utils.fromBase58Check(ordAddress).data as number[];\n\t\tconst payPkh = Utils.fromBase58Check(payAddress).data as number[];\n\n\t\tlet script = new Script()\n\t\tif (inscription?.dataB64 !== undefined && inscription?.contentType !== undefined) {\n\t\t\tconst ordHex = toHex(\"ord\");\n\t\t\tconst fsBuffer = Buffer.from(inscription.dataB64, \"base64\");\n\t\t\tconst fileHex = fsBuffer.toString(\"hex\").trim();\n\t\t\tif (!fileHex) {\n\t\t\t\tthrow new Error(\"Invalid file data\");\n\t\t\t}\n\t\t\tconst fileMediaType = toHex(inscription.contentType);\n\t\t\tif (!fileMediaType) {\n\t\t\t\tthrow new Error(\"Invalid media type\");\n\t\t\t}\n\t\t\tscript = Script.fromASM(`OP_0 OP_IF ${ordHex} OP_1 ${fileMediaType} OP_0 ${fileHex} OP_ENDIF`);\n\t\t}\n\n\t\treturn script.writeScript(Script.fromHex(oLockPrefix))\n\t\t\t.writeBin(cancelPkh)\n\t\t\t.writeBin(OrdLock.buildOutput(price, new P2PKH().lock(payPkh).toBinary()))\n\t\t\t.writeScript(Script.fromHex(oLockSuffix))\n\t}\n\n\tcancelListing(\n\t\tprivateKey: PrivateKey,\n\t\tsignOutputs: 'all' | 'none' | 'single' = 'all',\n\t\tanyoneCanPay = false,\n\t\tsourceSatoshis?: number,\n\t\tlockingScript?: Script\n\t): {\n\t\tsign: (tx: Transaction, inputIndex: number) => Promise<UnlockingScript>\n\t\testimateLength: () => Promise<number>\n\t} {\n\t\tconst p2pkh = new P2PKH().unlock(privateKey, signOutputs, anyoneCanPay, sourceSatoshis, lockingScript)\n\t\treturn {\n\t\t\tsign: async (tx: Transaction, inputIndex: number) => {\n\t\t\t\treturn (await p2pkh.sign(tx, inputIndex)).writeOpCode(OP.OP_1)\n\t\t\t},\n\t\t\testimateLength: async () => {\n\t\t\t\treturn 107\n\t\t\t}\n\t\t}\n\t}\n\n\tpurchaseListing(\n\t\tsourceSatoshis?: number,\n\t\tlockingScript?: Script\n\t): {\n\t\tsign: (tx: Transaction, inputIndex: number) => Promise<UnlockingScript>\n\t\testimateLength: (tx: Transaction, inputIndex: number) => Promise<number>\n\t} {\n\t\tconst purchase = {\n\t\t\tsign: async (tx: Transaction, inputIndex: number) => {\n\t\t\t\tif (tx.outputs.length < 2) {\n\t\t\t\t\tthrow new Error(\"Malformed transaction\")\n\t\t\t\t}\n\t\t\t\tconst script = new UnlockingScript()\n\t\t\t\t\t.writeBin(OrdLock.buildOutput(\n\t\t\t\t\t\ttx.outputs[0].satoshis || 0,\n\t\t\t\t\t\ttx.outputs[0].lockingScript.toBinary()\n\t\t\t\t\t))\n\t\t\t\tif (tx.outputs.length > 2) {\n\t\t\t\t\tconst writer = new Utils.Writer()\n\t\t\t\t\tfor (const output of tx.outputs.slice(2)) {\n\t\t\t\t\t\twriter.write(OrdLock.buildOutput(output.satoshis || 0, output.lockingScript.toBinary()))\n\t\t\t\t\t}\n\t\t\t\t\tscript.writeBin(writer.toArray())\n\t\t\t\t} else {\n\t\t\t\t\tscript.writeOpCode(OP.OP_0)\n\t\t\t\t}\n\n\t\t\t\tconst input = tx.inputs[inputIndex]\n\t\t\t\tlet sourceSats = sourceSatoshis as number\n\t\t\t\tif (!sourceSats && input.sourceTransaction) {\n\t\t\t\t\tsourceSats = input.sourceTransaction.outputs[input.sourceOutputIndex].satoshis as number\n\t\t\t\t} else if (!sourceSatoshis) {\n\t\t\t\t\tthrow new Error(\"sourceTransaction or sourceSatoshis is required\")\n\t\t\t\t}\n\n\t\t\t\tconst sourceTXID = (input.sourceTXID || input.sourceTransaction?.id('hex')) as string\n\t\t\t\tlet subscript = lockingScript as LockingScript\n\t\t\t\tif (!subscript) {\n\t\t\t\t\tsubscript = input.sourceTransaction?.outputs[input.sourceOutputIndex].lockingScript as LockingScript\n\t\t\t\t}\n\t\t\t\tconst preimage = TransactionSignature.format({\n\t\t\t\t\tsourceTXID,\n\t\t\t\t\tsourceOutputIndex: input.sourceOutputIndex,\n\t\t\t\t\tsourceSatoshis: sourceSats,\n\t\t\t\t\ttransactionVersion: tx.version,\n\t\t\t\t\totherInputs: [],\n\t\t\t\t\tinputIndex,\n\t\t\t\t\toutputs: tx.outputs,\n\t\t\t\t\tinputSequence: input.sequence || 0xffffffff,\n\t\t\t\t\tsubscript,\n\t\t\t\t\tlockTime: tx.lockTime,\n\t\t\t\t\tscope: TransactionSignature.SIGHASH_ALL |\n\t\t\t\t\t\tTransactionSignature.SIGHASH_ANYONECANPAY |\n\t\t\t\t\t\tTransactionSignature.SIGHASH_FORKID\n\t\t\t\t});\n\n\t\t\t\treturn script.writeBin(preimage).writeOpCode(OP.OP_0)\n\t\t\t},\n\t\t\testimateLength: async (tx: Transaction, inputIndex: number) => {\n\t\t\t\treturn (await purchase.sign(tx, inputIndex)).toBinary().length\n\t\t\t}\n\t\t}\n\t\treturn purchase\n\t}\n\n\tstatic buildOutput(satoshis: number, script: number[]): number[] {\n\t\tconst writer = new Utils.Writer()\n\t\twriter.writeUInt64LEBn(new BigNumber(satoshis))\n\t\twriter.writeVarIntNum(script.length)\n\t\twriter.write(script)\n\t\treturn writer.toArray()\n\t}\n}\n","import {\n  P2PKH,\n  SatoshisPerKilobyte,\n  Script,\n  Transaction,\n  Utils,\n} from \"@bsv/sdk\";\nimport { DEFAULT_SAT_PER_KB } from \"./constants\";\nimport OrdLock from \"./templates/ordLock\";\nimport OrdP2PKH from \"./templates/ordP2pkh\";\nimport {\n  type TokenChangeResult,\n  TokenType,\n  type CreateOrdListingsConfig,\n  type CreateOrdTokenListingsConfig,\n  type TokenUtxo,\n  type TransferBSV20Inscription,\n  type TransferBSV21Inscription,\n  type TransferTokenInscription,\n  type Utxo,\n} from \"./types\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\nimport { ReturnTypes, toToken, toTokenSat } from \"satoshi-token\";\nimport { signData } from \"./signData\";\nconst { toArray } = Utils;\n\nexport const createOrdListings = async (config: CreateOrdListingsConfig) => {\n  const {\n    utxos,\n    listings,\n    paymentPk,\n    ordPk,\n    satsPerKb = DEFAULT_SAT_PER_KB,\n    additionalPayments = [],\n    signer,\n  } = config;\n\n  const modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n  let tx = new Transaction();\n\n  // Warn if creating many inscriptions at once\n  if (listings.length > 100) {\n    console.warn(\n      \"Creating many inscriptions at once can be slow. Consider using multiple transactions instead.\",\n    );\n  }\n\n  // Outputs\n  // Add listing outputs\n  for (const listing of listings) {\n    tx.addOutput({\n      satoshis: 1,\n      lockingScript: new OrdLock().lock(\n        listing.ordAddress,\n        listing.payAddress,\n        listing.price,\n      ),\n    });\n    const inputScriptBinary = toArray(listing.listingUtxo.script, \"base64\");\n    const inputScript = Script.fromBinary(inputScriptBinary);\n\n    const ordKeyToUse = listing.listingUtxo.pk || ordPk;\n    if (!ordKeyToUse) {\n      throw new Error(\"Private key is required to sign the ordinal\");\n    }\n    tx.addInput(inputFromB64Utxo(\n      listing.listingUtxo,\n      new OrdP2PKH().unlock(\n        ordKeyToUse,\n        \"all\",\n        true,\n        listing.listingUtxo.satoshis,\n        inputScript,\n      ),\n    ));\n  }\n\n  // Add additional payments if any\n  for (const p of additionalPayments) {\n    tx.addOutput({\n      satoshis: p.amount,\n      lockingScript: new P2PKH().lock(p.to),\n    });\n  }\n\n  // Check if change is needed\n  let payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n  if(!changeAddress) {\n    throw new Error(\"changeAddress or private key is required\");\n  }\n  const changeScript = new P2PKH().lock(changeAddress);\n  const changeOutput = {\n    lockingScript: changeScript,\n    change: true,\n  };\n  tx.addOutput(changeOutput);\n\n  let totalSatsIn = 0n;\n  const totalSatsOut = tx.outputs.reduce(\n    (total, out) => total + BigInt(out.satoshis || 0),\n    0n,\n  );\n  let fee = 0;\n  for (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n    if (!payKeyToUse) {\n      throw new Error(\"Private key is required to sign the transaction\");\n    }\n    const input = inputFromB64Utxo(utxo, new P2PKH().unlock(\n      payKeyToUse,\n      \"all\",\n      true,\n      utxo.satoshis,\n      Script.fromBinary(Utils.toArray(utxo.script, 'base64'))\n    ));\n\n    tx.addInput(input);\n    // stop adding inputs if the total amount is enough\n    totalSatsIn += BigInt(utxo.satoshis);\n    fee = await modelOrFee.computeFee(tx);\n\n    if (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n      break;\n    }\n  }\n\n  // make sure we have enough\n  if (totalSatsIn < totalSatsOut + BigInt(fee)) {\n    throw new Error(\n      `Not enough funds to create ordinal listings. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n    );\n  }\n\n  if (signer) {\n    tx = await signData(tx, signer);\n  }\n\n  // Calculate fee\n  await tx.fee(modelOrFee);\n\n  // Sign the transaction\n  await tx.sign();\n\n  // check for change\n  const payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n  if (payChangeOutIdx !== -1) {\n    const changeOutput = tx.outputs[payChangeOutIdx];\n    payChange = {\n      satoshis: changeOutput.satoshis as number,\n      txid: tx.id(\"hex\") as string,\n      vout: payChangeOutIdx,\n      script: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n        \"base64\",\n      ),\n    };\n  }\n\n  if (payChange) {\n    const changeOutput = tx.outputs[tx.outputs.length - 1];\n    payChange.satoshis = changeOutput.satoshis as number;\n    payChange.txid = tx.id(\"hex\") as string;\n  }\n\n  return {\n    tx,\n    spentOutpoints: tx.inputs.map(\n      (i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n    ),\n    payChange,\n  };\n};\n\nexport const createOrdTokenListings = async (\n  config: CreateOrdTokenListingsConfig,\n): Promise<TokenChangeResult> => {\n  const {\n    utxos,\n    protocol,\n    tokenID,\n    ordPk,\n    paymentPk,\n    additionalPayments = [],\n    tokenChangeAddress,\n    inputTokens,\n    listings,\n    decimals,\n    satsPerKb = DEFAULT_SAT_PER_KB,\n    signer,\n  } = config;\n\n\n  // Warn if creating many inscriptions at once\n  if (listings.length > 100) {\n    console.warn(\n      \"Creating many inscriptions at once can be slow. Consider using multiple transactions instead.\",\n    );\n  }\n\n  // Ensure these inputs are for the expected token\n  if (!inputTokens.every((token) => token.id === tokenID)) {\n    throw new Error(\"Input tokens do not match the provided tokenID\");\n  }\n\n  // calculate change amount\n  let changeAmt = 0n;\n  let totalAmtIn = 0n;\n  let totalAmtOut = 0n;\n\n  // Ensure these inputs are for the expected token\n  if (!inputTokens.every((token) => token.id === tokenID)) {\n    throw new Error(\"Input tokens do not match the provided tokenID\");\n  }\n\n  const modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n  let tx = new Transaction();\n  // Outputs\n  // Add listing outputs\n  for (const listing of listings) {\n    // NewTokenListing is not adjusted for decimals\n    const bigAmt = toTokenSat(listing.tokens, decimals, ReturnTypes.BigInt);\n    const transferInscription: TransferTokenInscription = {\n      p: \"bsv-20\",\n      op: \"transfer\",\n      amt: bigAmt.toString(),\n    };\n    let inscription: TransferBSV20Inscription | TransferBSV21Inscription;\n    if (protocol === TokenType.BSV20) {\n      inscription = {\n        ...transferInscription,\n        tick: tokenID,\n      } as TransferBSV20Inscription;\n    } else if (protocol === TokenType.BSV21) {\n      inscription = {\n        ...transferInscription,\n        id: tokenID,\n      } as TransferBSV21Inscription;\n    } else {\n      throw new Error(\"Invalid protocol\");\n    }\n\n    tx.addOutput({\n      satoshis: 1,\n      lockingScript: new OrdLock().lock(\n        listing.ordAddress,\n        listing.payAddress,\n        listing.price,\n        {\n          dataB64: Buffer.from(JSON.stringify(inscription)).toString(\"base64\"),\n          contentType: \"application/bsv-20\",\n        },\n      ),\n    });\n    totalAmtOut += bigAmt;\n  }\n\n  // Input tokens are already adjusted for decimals\n  for (const token of inputTokens) {\n    const ordKeyToUse = token.pk || ordPk;\n    if(!ordKeyToUse) {\n      throw new Error(\"Private key is required to sign the ordinal\");\n    }\n    tx.addInput(inputFromB64Utxo(\n      token,\n      new OrdP2PKH().unlock(\n        ordKeyToUse,\n        \"all\",\n        true,\n        token.satoshis,\n        Script.fromBinary(toArray(token.script, \"base64\")),\n      ),\n    ));\n\n    totalAmtIn += BigInt(token.amt);\n  }\n  changeAmt = totalAmtIn - totalAmtOut;\n\n  let tokenChange: TokenUtxo[] | undefined;\n  // check that you have enough tokens to send and return change\n  if (changeAmt < 0n) {\n    throw new Error(\"Not enough tokens to send\");\n  }\n  if (changeAmt > 0n) {\n    const transferInscription: TransferTokenInscription = {\n      p: \"bsv-20\",\n      op: \"transfer\",\n      amt: changeAmt.toString(),\n    };\n    let inscription: TransferBSV20Inscription | TransferBSV21Inscription;\n    if (protocol === TokenType.BSV20) {\n      inscription = {\n        ...transferInscription,\n        tick: tokenID,\n      } as TransferBSV20Inscription;\n    } else if (protocol === TokenType.BSV21) {\n      inscription = {\n        ...transferInscription,\n        id: tokenID,\n      } as TransferBSV21Inscription;\n    } else {\n      throw new Error(\"Invalid protocol\");\n    }\n\n    const lockingScript = new OrdP2PKH().lock(tokenChangeAddress, {\n      dataB64: Buffer.from(JSON.stringify(inscription)).toString('base64'),\n      contentType: \"application/bsv-20\",\n    });\n    const vout = tx.outputs.length;\n    tx.addOutput({ lockingScript, satoshis: 1 });\n    tokenChange = [{\n      id: tokenID,\n      satoshis: 1,\n      script: Buffer.from(lockingScript.toBinary()).toString(\"base64\"),\n      txid: \"\",\n      vout,\n      amt: changeAmt.toString(),\n    }];\n  }\n\n  // Add additional payments if any\n  for (const p of additionalPayments) {\n    tx.addOutput({\n      satoshis: p.amount,\n      lockingScript: new P2PKH().lock(p.to),\n    });\n  }\n\n  // add change to the outputs\n  let payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n  if(!changeAddress) {\n    throw new Error(\"Either changeAddress or paymentPk is required\");\n  }\n\n  const changeScript = new P2PKH().lock(changeAddress);\n  const changeOut = {\n    lockingScript: changeScript,\n    change: true,\n  };\n  tx.addOutput(changeOut);\n\n  let totalSatsIn = 0n;\n  const totalSatsOut = tx.outputs.reduce(\n    (total, out) => total + BigInt(out.satoshis || 0),\n    0n,\n  );\n  let fee = 0;\n  for (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n    if(!payKeyToUse) {\n      throw new Error(\"Private key is required to sign the payment\");\n    }\n    const input = inputFromB64Utxo(utxo, new P2PKH().unlock(\n      payKeyToUse,\n      \"all\",\n      true,\n      utxo.satoshis,\n      Script.fromBinary(Utils.toArray(utxo.script, 'base64'))\n    ));\n\n    tx.addInput(input);\n    // stop adding inputs if the total amount is enough\n    totalSatsIn += BigInt(utxo.satoshis);\n    fee = await modelOrFee.computeFee(tx);\n\n    if (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n      break;\n    }\n  }\n\n  // make sure we have enough\n  if (totalSatsIn < totalSatsOut + BigInt(fee)) {\n    throw new Error(\n      `Not enough funds to create token listings. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n    );\n  }\n\n  if (signer) {\n    tx = await signData(tx, signer);\n  }\n\n  // estimate the cost of the transaction and assign change value\n  await tx.fee(modelOrFee);\n\n  // Sign the transaction\n  await tx.sign();\n\n  const txid = tx.id(\"hex\") as string;\n  if (tokenChange) {\n    tokenChange = tokenChange.map((tc) => ({ ...tc, txid }));\n  }\n  // check for change\n  const payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n  if (payChangeOutIdx !== -1) {\n    const changeOutput = tx.outputs[payChangeOutIdx];\n    payChange = {\n      satoshis: changeOutput.satoshis as number,\n      txid,\n      vout: payChangeOutIdx,\n      script: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n        \"base64\",\n      ),\n    };\n  }\n\n  if (payChange) {\n    const changeOutput = tx.outputs[tx.outputs.length - 1];\n    payChange.satoshis = changeOutput.satoshis as number;\n    payChange.txid = tx.id(\"hex\") as string;\n  }\n\n  return {\n    tx,\n    spentOutpoints: tx.inputs.map(\n      (i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n    ),\n    payChange,\n    tokenChange,\n  };\n};\n","import { P2PKH, SatoshisPerKilobyte, Script, Transaction, Utils } from \"@bsv/sdk\";\nimport {\n\tTokenType,\n\ttype TokenUtxo,\n\ttype CancelOrdListingsConfig,\n\ttype CancelOrdTokenListingsConfig,\n\ttype Destination,\n\ttype TransferBSV20Inscription,\n\ttype TransferBSV21Inscription,\n\ttype TransferTokenInscription,\n\ttype Utxo,\n  type ChangeResult,\n  type TokenChangeResult,\n} from \"./types\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\nimport { DEFAULT_SAT_PER_KB } from \"./constants\";\nimport OrdLock from \"./templates/ordLock\";\nimport OrdP2PKH from \"./templates/ordP2pkh\";\n\n/**\n * Cancel Ordinal Listings\n * @param {CancelOrdListingsConfig} config - Configuration object for cancelling ordinals\n * @param {PrivateKey} config.paymentPk - Private key to sign payment inputs\n * @param {PrivateKey} config.ordPk - Private key to sign ordinals\n * @param {Utxo[]} config.utxos - Utxos to spend (with base64 encoded scripts)\n * @param {Utxo[]} config.listingUtxos - Listing utxos to cancel (with base64 encoded scripts)\n * @param {string} [config.changeAddress] - Optional. Address to send change to\n * @param {number} [config.satsPerKb] - Optional. Satoshis per kilobyte for fee calculation\n * @param {Payment[]} [config.additionalPayments] - Optional. Additional payments to make\n * @returns {Promise<ChangeResult>} Transaction, spent outpoints, change utxo\n */\nexport const cancelOrdListings = async (config: CancelOrdListingsConfig): Promise<ChangeResult> => {\n\tconst {\n\t\tutxos,\n\t\tlistingUtxos,\n\t\tordPk,\n\t\tpaymentPk,\n\t\tadditionalPayments = [],\n\t\tsatsPerKb = DEFAULT_SAT_PER_KB,\n\t} = config;\n\n\t// Warn if creating many inscriptions at once\n\tif (listingUtxos.length > 100) {\n\t\tconsole.warn(\n\t\t\t\"Creating many inscriptions at once can be slow. Consider using multiple transactions instead.\",\n\t\t);\n\t}\n\t\n\tconst modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n\tconst tx = new Transaction();\n\n\t// Inputs\n\t// Add the locked ordinals we're cancelling\n\tfor (const listingUtxo of listingUtxos) {\n    const ordKeyToUse = listingUtxo.pk || ordPk;\n\t\tif(!ordKeyToUse) {\n\t\t\tthrow new Error(\"Private key required for token input\");\n\t\t}\n\t\ttx.addInput(inputFromB64Utxo(\n\t\t\tlistingUtxo,\n\t\t\tnew OrdLock().cancelListing(\n\t\t\t\tordKeyToUse,\n\t\t\t\t\"all\",\n\t\t\t\ttrue,\n\t\t\t\tlistingUtxo.satoshis,\n\t\t\t\tScript.fromBinary(Utils.toArray(listingUtxo.script, 'base64'))\n\t\t\t)\n\t\t));\n\t\t// Add cancel outputs returning listed ordinals\n\t\ttx.addOutput({\n\t\t\tsatoshis: 1,\n\t\t\tlockingScript: new P2PKH().lock((ordKeyToUse).toAddress().toString()),\n\t\t});\n\t}\n\n\t// Add additional payments if any\n\tfor (const p of additionalPayments) {\n\t\ttx.addOutput({\n\t\t\tsatoshis: p.amount,\n\t\t\tlockingScript: new P2PKH().lock(p.to),\n\t\t});\n\t}\n\n\t// add change to the outputs\n\tlet payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n\tif (!changeAddress) {\n\t\tthrow new Error(\"paymentPk or changeAddress required for payment change\");\n\t}\n\tconst change = changeAddress;\n\tconst changeScript = new P2PKH().lock(change);\n\tconst changeOut = {\n\t\tlockingScript: changeScript,\n\t\tchange: true,\n\t};\n\ttx.addOutput(changeOut);\n\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + BigInt(out.satoshis || 0),\n\t\t0n,\n\t);\n\tlet fee = 0;\n\tfor (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif(!payKeyToUse) {\n\t\t\tthrow new Error(\"paymentPk required for payment utxo\");\n\t\t}\n\t\tconst input = inputFromB64Utxo(\n\t\t\tutxo, \n\t\t\tnew P2PKH().unlock(\n\t\t\t\tpayKeyToUse,\n\t\t\t\t\"all\",\n\t\t\t\ttrue, \n\t\t\t\tutxo.satoshis,\n\t\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t\t)\n\t\t);\n\n\t\ttx.addInput(input);\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\n\t\tif (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// make sure we have enough\n\tif (totalSatsIn < totalSatsOut + BigInt(fee)) {\n\t\tthrow new Error(\n\t\t\t`Not enough funds to cancel ordinal listings. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n\t\t);\n\t}\n\n\t// estimate the cost of the transaction and assign change value\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\t// check for change\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid: tx.id(\"hex\") as string,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (payChange) {\n\t\tconst changeOutput = tx.outputs[tx.outputs.length - 1];\n\t\tpayChange.satoshis = changeOutput.satoshis as number;\n\t\tpayChange.txid = tx.id(\"hex\") as string;\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints: tx.inputs.map(\n\t\t\t(i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n\t\t),\n\t\tpayChange,\n\t};\n};\n\n/**\n * Cancel Ordinal Token Listings\n * @param {CancelOrdTokenListingsConfig} config - Configuration object for cancelling token ordinals\n * @param {PrivateKey} config.paymentPk - Private key to sign payment inputs\n * @param {PrivateKey} config.ordPk - Private key to sign ordinals\n * @param {Utxo[]} config.utxos - Utxos to spend (with base64 encoded scripts)\n * @param {Utxo[]} config.listingUtxos - Listing utxos to cancel (with base64 encoded scripts)\n * @param {string} config.tokenID - Token ID of the token to cancel listings for\n * @param {string} config.ordAddress - Address to send the cancelled token to\n * @param {number} [config.satsPerKb] - Optional. Satoshis per kilobyte for fee calculation\n * @param {Payment[]} [config.additionalPayments] - Optional. Additional payments to make\n * @returns {Promise<TokenChangeResult>} Transaction, spent outpoints, change utxo, token change utxos\n */\nexport const cancelOrdTokenListings = async (\n\tconfig: CancelOrdTokenListingsConfig,\n): Promise<TokenChangeResult> => {\n\tconst {\n\t\tprotocol,\n\t\ttokenID,\n\t\tpaymentPk,\n\t\tordPk,\n\t\tadditionalPayments,\n\t\tlistingUtxos,\n\t\tutxos,\n\t\tsatsPerKb = DEFAULT_SAT_PER_KB,\n\t} = config;\n\t// calculate change amount\n\tlet totalAmtIn = 0;\n\n\tif (listingUtxos.length > 100) {\n\t\tconsole.warn(\n\t\t\t\"Creating many inscriptions at once can be slow. Consider using multiple transactions instead.\",\n\t\t);\n\t}\n\n\t// Ensure these inputs are for the expected token\n\tif (!listingUtxos.every((token) => token.id === tokenID)) {\n\t\tthrow new Error(\"Input tokens do not match the provided tokenID\");\n\t}\n\n\tconst modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n\tconst tx = new Transaction();\n\n\t// Inputs\n\t// Add the locked ordinals we're cancelling\n\tfor (const listingUtxo of listingUtxos) {\n    const ordKeyToUse = listingUtxo.pk || ordPk;\n\t\tif(!ordKeyToUse) {\n\t\t\tthrow new Error(\"Private key required for token input\");\n\t\t}\n\t\ttx.addInput(inputFromB64Utxo(\n\t\t\tlistingUtxo,\n\t\t\tnew OrdLock().cancelListing(\n\t\t\t\tordKeyToUse,\n\t\t\t\t\"all\",\n\t\t\t\ttrue,\n\t\t\t\tlistingUtxo.satoshis,\n\t\t\t\tScript.fromBinary(Utils.toArray(listingUtxo.script, 'base64'))\n\t\t\t)\n\t\t));\n\t\ttotalAmtIn += Number.parseInt(listingUtxo.amt);\n\t}\n\n\tconst transferInscription: TransferTokenInscription = {\n\t\tp: \"bsv-20\",\n\t\top: \"transfer\",\n\t\tamt: totalAmtIn.toString(),\n\t};\n\tlet inscription: TransferBSV20Inscription | TransferBSV21Inscription;\n\tif (protocol === TokenType.BSV20) {\n\t\tinscription = {\n\t\t\t...transferInscription,\n\t\t\ttick: tokenID,\n\t\t} as TransferBSV20Inscription;\n\t} else if (protocol === TokenType.BSV21) {\n\t\tinscription = {\n\t\t\t...transferInscription,\n\t\t\tid: tokenID,\n\t\t} as TransferBSV21Inscription;\n\t} else {\n\t\tthrow new Error(\"Invalid protocol\");\n\t}\n\n  const ordAddress = config.ordAddress || ordPk?.toAddress();\n\tif(!ordAddress) {\n\t\tthrow new Error(\"ordAddress or ordPk required for token output\");\n\t}\n\tconst destination: Destination = {\n\t\taddress: ordAddress,\n\t\tinscription: {\n\t\t\tdataB64: Buffer.from(JSON.stringify(inscription)).toString(\"base64\"),\n\t\t\tcontentType: \"application/bsv-20\",\n\t\t},\n\t};\n\n  const lockingScript = new OrdP2PKH().lock(\n    destination.address,\n    destination.inscription\n  );\n\n\ttx.addOutput({\n\t\tsatoshis: 1,\n\t\tlockingScript,\n\t});\n\n\t// Add additional payments if any\n\tfor (const p of additionalPayments) {\n\t\ttx.addOutput({\n\t\t\tsatoshis: p.amount,\n\t\t\tlockingScript: new P2PKH().lock(p.to),\n\t\t});\n\t}\n\n\t// add change to the outputs\n\tlet payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n\tif (!changeAddress) {\n\t\tthrow new Error(\"paymentPk or changeAddress required for payment change\");\n\t}\n\tconst changeScript = new P2PKH().lock(changeAddress);\n\tconst changeOut = {\n\t\tlockingScript: changeScript,\n\t\tchange: true,\n\t};\n\ttx.addOutput(changeOut);\n\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + BigInt(out.satoshis || 0),\n\t\t0n,\n\t);\n\tlet fee = 0;\n\tfor (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif(!payKeyToUse) {\n\t\t\tthrow new Error(\"paymentPk required for payment utxo\");\n\t\t}\n\t\tconst input = inputFromB64Utxo(utxo, new P2PKH().unlock(\n\t\t\tpayKeyToUse, \n\t\t\t\"all\",\n\t\t\ttrue, \n\t\t\tutxo.satoshis,\n\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t));\n\n\t\ttx.addInput(input);\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\n\t\tif (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// make sure we have enough\n\tif (totalSatsIn < totalSatsOut + BigInt(fee)) {\n\t\tthrow new Error(\n\t\t\t`Not enough funds to cancel token listings. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n\t\t);\n\t}\n\n\t// estimate the cost of the transaction and assign change value\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n  const tokenChange: TokenUtxo[] = [{\n    amt: totalAmtIn.toString(),\n    script: Buffer.from(lockingScript.toHex(), 'hex').toString('base64'),\n    txid: tx.id(\"hex\") as string,\n    vout: 0,\n    id: tokenID,\n    satoshis: 1\n  }];\n\n\t// check for change\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid: tx.id(\"hex\") as string,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (payChange) {\n\t\tconst changeOutput = tx.outputs[tx.outputs.length - 1];\n\t\tpayChange.satoshis = changeOutput.satoshis as number;\n\t\tpayChange.txid = tx.id(\"hex\") as string;\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints: tx.inputs.map(\n\t\t\t(i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n\t\t),\n\t\tpayChange,\n    tokenChange,\n\t};\n};","import {\n\tLockingScript,\n\tP2PKH,\n\tSatoshisPerKilobyte,\n\tScript,\n\tTransaction,\n\tUtils,\n} from \"@bsv/sdk\";\nimport { DEFAULT_SAT_PER_KB } from \"./constants\";\nimport OrdLock from \"./templates/ordLock\";\nimport OrdP2PKH from \"./templates/ordP2pkh\";\nimport {\n\ttype ChangeResult,\n\tRoytaltyType,\n\tTokenType,\n\ttype PurchaseOrdListingConfig,\n\ttype PurchaseOrdTokenListingConfig,\n\ttype TransferBSV20Inscription,\n\ttype TransferBSV21Inscription,\n\ttype TransferTokenInscription,\n\ttype Utxo,\n\tMAP,\n} from \"./types\";\nimport { resolvePaymail } from \"./utils/paymail\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\n\n/**\n * Purchase a listing\n * @param {PurchaseOrdListingConfig} config - Configuration object for purchasing a listing\n * @param {Utxo[]} config.utxos - Utxos to spend (with base64 encoded scripts)\n * @param {PrivateKey} config.paymentPk - Private key to sign payment inputs\n * @param {ExistingListing} config.listing - Listing to purchase\n * @param {string} config.ordAddress - Address to send the ordinal to\n * @param {string} [config.changeAddress] - Optional. Address to send change to\n * @param {number} [config.satsPerKb] - Optional. Satoshis per kilobyte for fee calculation\n * @param {Payment[]} [config.additionalPayments] - Optional. Additional payments to make\n * @param {Royalty[]} [config.royalties] - Optional. Royalties to pay\n * @param {MAP} [config.metaData] - Optional. MAP (Magic Attribute Protocol) metadata to include on purchased output\n * @returns {Promise<ChangeResult>} Transaction, spent outpoints, change utxo\n */\nexport const purchaseOrdListing = async (\n\tconfig: PurchaseOrdListingConfig,\n): Promise<ChangeResult> => {\n\tconst {\n\t\tutxos,\n\t\tpaymentPk,\n\t\tlisting,\n\t\tordAddress,\n\t\tadditionalPayments = [],\n\t\tsatsPerKb = DEFAULT_SAT_PER_KB,\n\t\troyalties = [],\n\t\tmetaData,\n\t} = config;\n\n\tconst modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n\tconst tx = new Transaction();\n\n\t// Inputs\n\t// Add the locked ordinal we're purchasing\n\ttx.addInput(\n\t\tinputFromB64Utxo(\n\t\t\tlisting.listingUtxo,\n\t\t\tnew OrdLock().purchaseListing(\n\t\t\t\t1,\n\t\t\t\tScript.fromBinary(Utils.toArray(listing.listingUtxo.script, \"base64\")),\n\t\t\t),\n\t\t),\n\t);\n\n\t// Outputs\n\t// Add the purchased output\n\ttx.addOutput({\n\t\tsatoshis: 1,\n\t\tlockingScript: new OrdP2PKH().lock(ordAddress, undefined, metaData),\n\t});\n\n\t// add the payment output\n\tconst reader = new Utils.Reader(Utils.toArray(listing.payout, \"base64\"));\n\tconst satoshis = reader.readUInt64LEBn().toNumber();\n\tconst scriptLength = reader.readVarIntNum();\n\tconst scriptBin = reader.read(scriptLength);\n\tconst lockingScript = LockingScript.fromBinary(scriptBin);\n\ttx.addOutput({\n\t\tsatoshis,\n\t\tlockingScript,\n\t});\n\n\t// Add additional payments if any\n\tfor (const p of additionalPayments) {\n\t\ttx.addOutput({\n\t\t\tsatoshis: p.amount,\n\t\t\tlockingScript: new P2PKH().lock(p.to),\n\t\t});\n\t}\n\n\t// Add any royalties\n\tfor (const r of royalties) {\n\t\tlet lockingScript: LockingScript | undefined;\n\t\tconst royaltySats = Math.floor(Number(r.percentage) * satoshis);\n\n\t\tswitch (r.type as RoytaltyType) {\n\t\t\tcase RoytaltyType.Paymail:\n\t\t\t\t// resolve paymail address\n\t\t\t\tlockingScript = await resolvePaymail(r.destination, royaltySats);\n\t\t\t\tbreak;\n\t\t\tcase RoytaltyType.Script:\n\t\t\t\tlockingScript = Script.fromBinary(\n\t\t\t\t\tUtils.toArray(r.destination, \"base64\"),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase RoytaltyType.Address:\n\t\t\t\tlockingScript = new P2PKH().lock(r.destination);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Invalid royalty type\");\n\t\t}\n\t\tif (!lockingScript) {\n\t\t\tthrow new Error(\"Invalid royalty destination\");\n\t\t}\n\t\ttx.addOutput({\n\t\t\tsatoshis: royaltySats,\n\t\t\tlockingScript,\n\t\t});\n\t}\n\n\t// add change to the outputs\n\tlet payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n\tif (!changeAddress) {\n\t\tthrow new Error(\"Either changeAddress or paymentPk is required\");\n\t}\n\tconst changeScript = new P2PKH().lock(changeAddress);\n\tconst changeOut = {\n\t\tlockingScript: changeScript,\n\t\tchange: true,\n\t};\n\ttx.addOutput(changeOut);\n\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + BigInt(out.satoshis || 0),\n\t\t0n,\n\t);\n\tlet fee = 0;\n\tfor (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif(!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the payment\");\n\t\t}\n\t\tconst input = inputFromB64Utxo(\n\t\t\tutxo,\n\t\t\tnew P2PKH().unlock(\n\t\t\t\tpayKeyToUse,\n\t\t\t\t\"all\",\n\t\t\t\ttrue,\n\t\t\t\tutxo.satoshis,\n\t\t\t\tScript.fromBinary(Utils.toArray(utxo.script, \"base64\")),\n\t\t\t),\n\t\t);\n\n\t\ttx.addInput(input);\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\n\t\tif (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// make sure we have enough\n\tif (totalSatsIn < totalSatsOut + BigInt(fee)) {\n\t\tthrow new Error(\n\t\t\t`Not enough funds to purchase ordinal listing. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n\t\t);\n\t}\n\n\t// estimate the cost of the transaction and assign change value\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\t// check for change\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid: tx.id(\"hex\") as string,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (payChange) {\n\t\tconst changeOutput = tx.outputs[tx.outputs.length - 1];\n\t\tpayChange.satoshis = changeOutput.satoshis as number;\n\t\tpayChange.txid = tx.id(\"hex\") as string;\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints: tx.inputs.map(\n\t\t\t(i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n\t\t),\n\t\tpayChange,\n\t};\n};\n\n/**\n *\n * @param {PurchaseOrdTokenListingConfig} config  - Configuration object for purchasing a token listing\n * @param {TokenType} config.protocol - Token protocol\n * @param {string} config.tokenID - Token ID\n * @param {Utxo[]} config.utxos - Utxos to spend (with base64 encoded scripts)\n * @param {PrivateKey} config.paymentPk - Private key to sign payment inputs\n * @param {Utxo} config.listingUtxo - Listing UTXO\n * @param {string} config.ordAddress - Address to send the ordinal to\n * @param {string} [config.changeAddress] - Optional. Address to send change to\n * @param {number} [config.satsPerKb] - Optional. Satoshis per kilobyte for fee calculation\n * @param {Payment[]} [config.additionalPayments] - Optional. Additional payments to make\n * @param {MAP} [config.metaData] - Optional. MAP (Magic Attribute Protocol) metadata to include on the purchased transfer inscription output\n * @returns {Promise<ChangeResult>} Transaction, spent outpoints, change utxo\n */\nexport const purchaseOrdTokenListing = async (\n\tconfig: PurchaseOrdTokenListingConfig,\n): Promise<ChangeResult> => {\n\tconst {\n\t\tprotocol,\n\t\ttokenID,\n\t\tutxos,\n\t\tpaymentPk,\n\t\tlistingUtxo,\n\t\tordAddress,\n\t\tsatsPerKb = DEFAULT_SAT_PER_KB,\n\t\tadditionalPayments = [],\n\t\tmetaData,\n\t} = config;\n\n\tconst modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n\tconst tx = new Transaction();\n\n\t// Inputs\n\t// Add the locked ordinal we're purchasing\n\ttx.addInput(\n\t\tinputFromB64Utxo(\n\t\t\tlistingUtxo,\n\t\t\tnew OrdLock().purchaseListing(\n\t\t\t\t1,\n\t\t\t\tScript.fromBinary(Utils.toArray(listingUtxo.script, \"base64\")),\n\t\t\t),\n\t\t),\n\t);\n\n\t// Outputs\n\tconst transferInscription: TransferTokenInscription = {\n\t\tp: \"bsv-20\",\n\t\top: \"transfer\",\n\t\tamt: listingUtxo.amt,\n\t};\n\tlet inscription: TransferBSV20Inscription | TransferBSV21Inscription;\n\tif (protocol === TokenType.BSV20) {\n\t\tinscription = {\n\t\t\t...transferInscription,\n\t\t\ttick: tokenID,\n\t\t} as TransferBSV20Inscription;\n\t} else if (protocol === TokenType.BSV21) {\n\t\tinscription = {\n\t\t\t...transferInscription,\n\t\t\tid: tokenID,\n\t\t} as TransferBSV21Inscription;\n\t} else {\n\t\tthrow new Error(\"Invalid protocol\");\n\t}\n\tconst dataB64 = Buffer.from(JSON.stringify(inscription)).toString(\"base64\");\n\n\t// Add the purchased output\n\ttx.addOutput({\n\t\tsatoshis: 1,\n\t\tlockingScript: new OrdP2PKH().lock(\n\t\t\tordAddress,\n\t\t\t{\n\t\t\t\tdataB64,\n\t\t\t\tcontentType: \"application/bsv-20\",\n\t\t\t},\n\t\t\tmetaData,\n\t\t),\n\t});\n\n\tif (!listingUtxo.payout) {\n\t\tthrow new Error(\"Listing UTXO does not have a payout script\");\n\t}\n\n\t// Add the payment output\n\tconst reader = new Utils.Reader(Utils.toArray(listingUtxo.payout, \"base64\"));\n\tconst satoshis = reader.readUInt64LEBn().toNumber();\n\tconst scriptLength = reader.readVarIntNum();\n\tconst scriptBin = reader.read(scriptLength);\n\tconst lockingScript = LockingScript.fromBinary(scriptBin);\n\ttx.addOutput({\n\t\tsatoshis,\n\t\tlockingScript,\n\t});\n\n\t// Add additional payments if any\n\tfor (const p of additionalPayments) {\n\t\ttx.addOutput({\n\t\t\tsatoshis: p.amount,\n\t\t\tlockingScript: new P2PKH().lock(p.to),\n\t\t});\n\t}\n\n\t// add change to the outputs\n\tlet payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n\tif (!changeAddress) {\n\t\tthrow new Error(\"Either changeAddress or paymentPk is required\");\n\t}\n\tconst changeScript = new P2PKH().lock(changeAddress);\n\tconst changeOut = {\n\t\tlockingScript: changeScript,\n\t\tchange: true,\n\t};\n\ttx.addOutput(changeOut);\n\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + BigInt(out.satoshis || 0),\n\t\t0n,\n\t);\n\tlet fee = 0;\n\tfor (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif (!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the payment\");\n\t\t}\n\t\tconst input = inputFromB64Utxo(\n\t\t\tutxo,\n\t\t\tnew P2PKH().unlock(\n\t\t\t\tpayKeyToUse,\n\t\t\t\t\"all\",\n\t\t\t\ttrue,\n\t\t\t\tutxo.satoshis,\n\t\t\t\tScript.fromBinary(Utils.toArray(utxo.script, \"base64\")),\n\t\t\t),\n\t\t);\n\n\t\ttx.addInput(input);\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\n\t\tif (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// make sure we have enough\n\tif (totalSatsIn < totalSatsOut + BigInt(fee)) {\n\t\tthrow new Error(\n\t\t\t`Not enough funds to purchase token listing. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n\t\t);\n\t}\n\n\t// estimate the cost of the transaction and assign change value\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid: tx.id(\"hex\") as string,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (payChange) {\n\t\tconst changeOutput = tx.outputs[tx.outputs.length - 1];\n\t\tpayChange.satoshis = changeOutput.satoshis as number;\n\t\tpayChange.txid = tx.id(\"hex\") as string;\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints: tx.inputs.map(\n\t\t\t(i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n\t\t),\n\t\tpayChange,\n\t};\n};\n","import { imageMeta } from \"image-meta\";\nimport { Utils } from \"@bsv/sdk\";\nimport type { IconInscription, ImageContentType } from \"../types\";\nconst { toArray } = Utils;\n\nexport const ErrorOversizedIcon = new Error(\n    \"Image must be a square image with dimensions <= 400x400\",\n);\nexport const ErrorIconProportions = new Error(\"Image must be a square image\");\nexport const ErrorInvalidIconData = new Error(\"Error processing image\");\nexport const ErrorImageDimensionsUndefined = new Error(\n    \"Image dimensions are undefined\",\n);\n\nconst isImageContentType = (value: string): value is ImageContentType => {\n    return (value as ImageContentType) === value;\n};\n\nexport const validIconData = async (\n    icon: IconInscription,\n): Promise<Error | null> => {\n    const { dataB64, contentType } = icon;\n\n    if (contentType === \"image/svg+xml\") {\n        return validateSvg(dataB64);\n    }\n\n    if (!isImageContentType(contentType)) {\n        return ErrorInvalidIconData;\n    }\n\n    try {\n        const buffer = Uint8Array.from(toArray(dataB64, \"base64\"));\n\n        // Meta contains { type, width?, height?, orientation? }\n        const dimensions = imageMeta(buffer);\n\n        if (dimensions.width === undefined || dimensions.height === undefined) {\n            return ErrorImageDimensionsUndefined;\n        }\n        if (dimensions.width !== dimensions.height) {\n            return ErrorIconProportions;\n        }\n        if (dimensions.width > 400 || dimensions.height > 400) {\n            return ErrorOversizedIcon;\n        }\n\n        return null;\n    } catch (error) {\n        return ErrorInvalidIconData;\n    }\n};\n\nconst validateSvg = (svgBase64: string): Error | null => {\n    const svgString = Buffer.from(svgBase64, \"base64\").toString(\"utf-8\");\n    const widthMatch = svgString.match(/<svg[^>]*\\s+width=\"([^\"]+)\"/);\n    const heightMatch = svgString.match(/<svg[^>]*\\s+height=\"([^\"]+)\"/);\n    \n    if (!widthMatch || !heightMatch) {\n        return ErrorImageDimensionsUndefined;\n    }\n\n    const width = Number.parseInt(widthMatch[1], 10);\n    const height = Number.parseInt(heightMatch[1], 10);\n\n    if (Number.isNaN(width) || Number.isNaN(height)) {\n        return ErrorImageDimensionsUndefined;\n    }\n\n    if (width !== height) {\n        return ErrorIconProportions;\n    }\n    if (width > 400 || height > 400) {\n        return ErrorOversizedIcon;\n    }\n\n    return null;\n}\n\nexport const validIconFormat = (icon: string): boolean => {\n    if (!icon.includes(\"_\") || icon.endsWith(\"_\")) {\n        return false;\n    }\n\n    const iconVout = Number.parseInt(icon.split(\"_\")[1]);\n    if (Number.isNaN(iconVout)) {\n        return false;\n    }\n\n    if (!icon.startsWith(\"_\") && icon.split(\"_\")[0].length !== 64) {\n        return false;\n    }\n\n    return true;\n};\n\n","import {\n\tP2PKH,\n\tSatoshisPerKilobyte,\n\tScript,\n\tTransaction,\n\ttype TransactionOutput,\n\tUtils,\n} from \"@bsv/sdk\";\nimport { DEFAULT_SAT_PER_KB } from \"./constants\";\nimport { signData } from \"./signData\";\nimport OrdP2PKH from \"./templates/ordP2pkh\";\nimport type {\n\tChangeResult,\n\tDeployBsv21TokenConfig,\n\tDeployMintTokenInscription,\n\tInscription,\n\tUtxo,\n} from \"./types\";\nimport { validIconData, validIconFormat } from \"./utils/icon\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\n\n/**\n * Deploys & Mints a BSV21 token to the given destination address\n * @param {DeployBsv21TokenConfig} config - Configuration object for deploying BSV21 token\n * @param {string} config.symbol - Token ticker symbol\n * @param {number} config.decimals - Number of decimal places to display\n * @param {string | IconInscription} config.icon - outpoint (format: txid_vout) or Inscription. If Inscription, must be a valid image type\n * @param {Utxo[]} config.utxos - Payment Utxos available to spend. Will only consume what is needed.\n * @param {Distribution} config.initialDistribution - Initial distribution with addresses and total supply (not adjusted for decimals, library will add zeros)\n * @param {PrivateKey} config.paymentPk - Private key to sign paymentUtxos\n * @param {string} config.destinationAddress - Address to deploy token to.\n * @param {string} [config.changeAddress] - Optional. Address to send payment change to, if any. If not provided, defaults to paymentPk address\n * @param {number} [config.satsPerKb] - Optional. Satoshis per kilobyte for fee calculation. Default is DEFAULT_SAT_PER_KB\n * @param {Payment[]} [config.additionalPayments] - Optional. Additional payments to include in the transaction\n * @returns {Promise<ChangeResult>} Transaction to deploy BSV 2.1 token\n */\nexport const deployBsv21Token = async (\n\tconfig: DeployBsv21TokenConfig,\n): Promise<ChangeResult> => {\n\tconst {\n\t\tsymbol,\n\t\ticon,\n    decimals,\n\t\tutxos,\n\t\tinitialDistribution,\n\t\tpaymentPk,\n\t\tdestinationAddress,\n\t\tsatsPerKb = DEFAULT_SAT_PER_KB,\n\t\tadditionalPayments = [],\n\t\tsigner,\n\t} = config;\n\n\tconst modelOrFee = new SatoshisPerKilobyte(satsPerKb);\n\n\tlet tx = new Transaction();\n\n\tlet iconValue: string;\n\tif (typeof icon === \"string\") {\n\t\ticonValue = icon;\n\t} else {\n\t\tconst iconError = await validIconData(icon);\n\t\tif (iconError) {\n\t\t\tthrow iconError;\n\t\t}\n\t\t// add icon inscription to the transaction\n\t\tconst iconScript = new OrdP2PKH().lock(destinationAddress, icon);\n\t\tconst iconOut = {\n\t\t\tsatoshis: 1,\n\t\t\tlockingScript: iconScript,\n\t\t};\n\t\ttx.addOutput(iconOut);\n\t\t// relative output index of the icon\n\t\ticonValue = \"_0\";\n\t}\n\n\t// Ensure the icon format\n\tif (!validIconFormat(iconValue)) {\n\t\tthrow new Error(\n\t\t\t\"Invalid icon format. Must be either outpoint (format: txid_vout) or relative output index of the icon (format _vout). examples: ecb483eda58f26da1b1f8f15b782b1186abdf9c6399a1c3e63e0d429d5092a41_0 or _1\",\n\t\t);\n\t}\n  \n\t// Outputs\n  const tsatAmt = decimals ? BigInt(initialDistribution.tokens) * 10n ** BigInt(decimals) : BigInt(initialDistribution.tokens);\n\tconst fileData: DeployMintTokenInscription = {\n\t\tp: \"bsv-20\",\n\t\top: \"deploy+mint\",\n\t\tsym: symbol,\n\t\ticon: iconValue,\n\t\tamt: tsatAmt.toString(),\n\t};\n\n  if (decimals) {\n    fileData.dec = decimals.toString();\n  }\n\n\tconst b64File = Buffer.from(JSON.stringify(fileData)).toString(\"base64\");\n\tconst sendTxOut = {\n\t\tsatoshis: 1,\n\t\tlockingScript: new OrdP2PKH().lock(destinationAddress, {\n\t\t\tdataB64: b64File,\n\t\t\tcontentType: \"application/bsv-20\",\n\t\t} as Inscription),\n\t};\n\ttx.addOutput(sendTxOut);\n\n\t// Additional payments\n\tfor (const payment of additionalPayments) {\n\t\tconst sendTxOut: TransactionOutput = {\n\t\t\tsatoshis: payment.amount,\n\t\t\tlockingScript: new P2PKH().lock(payment.to),\n\t\t};\n\t\ttx.addOutput(sendTxOut);\n\t}\n\n\t// Inputs\n\tlet totalSatsIn = 0n;\n\tconst totalSatsOut = tx.outputs.reduce(\n\t\t(total, out) => total + BigInt(out.satoshis || 0),\n\t\t0n,\n\t);\n\n\tlet fee = 0;\n\n\tif(signer) {\n\t\tconst utxo = utxos.pop() as Utxo\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif(!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the transaction\");\n\t\t}\n\t\ttx.addInput(inputFromB64Utxo(utxo, new P2PKH().unlock(\n\t\t\tpayKeyToUse,\n\t\t\t\"all\",\n\t\t\ttrue,\n\t\t\tutxo.satoshis,\n\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t)));\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\ttx = await signData(tx, signer);\n\t\t// Calculate fee after signing since it adds OP_RETURN outputs\n\t\tfee = await modelOrFee.computeFee(tx);\n\t}\n\tfor (const utxo of utxos) {\n    const payKeyToUse = utxo.pk || paymentPk;\n\t\tif (!payKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the payment\");\n\t\t}\n\t\tconst input = inputFromB64Utxo(utxo, new P2PKH().unlock(\n\t\t\tpayKeyToUse,\n\t\t\t\"all\",\n\t\t\ttrue,\n\t\t\tutxo.satoshis,\n\t\t\tScript.fromBinary(Utils.toArray(utxo.script, 'base64'))\n\t\t));\n\t\ttx.addInput(input);\n\t\t// stop adding inputs if the total amount is enough\n\t\ttotalSatsIn += BigInt(utxo.satoshis);\n\t\tfee = await modelOrFee.computeFee(tx);\n\n\t\tif (totalSatsIn >= totalSatsOut + BigInt(fee)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// make sure we have enough\n\tif (totalSatsIn < totalSatsOut + BigInt(fee)) {\n\t\tthrow new Error(\n\t\t\t`Not enough funds to deploy token. Total sats in: ${totalSatsIn}, Total sats out: ${totalSatsOut}, Fee: ${fee}`,\n\t\t);\n\t}\n\n\t// if we need to send change, add it to the outputs\n\tlet payChange: Utxo | undefined;\n  const changeAddress = config.changeAddress || paymentPk?.toAddress();\n\tif(!changeAddress) {\n\t\tthrow new Error(\"Either changeAddress or paymentPk is required\");\n\t}\n\n\tconst changeScript = new P2PKH().lock(changeAddress);\n\tconst changeOut = {\n\t\tlockingScript: changeScript,\n\t\tchange: true,\n\t};\n\ttx.addOutput(changeOut);\n\n\t// estimate the cost of the transaction and assign change value\n\tawait tx.fee(modelOrFee);\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\t// check for change\n\tconst payChangeOutIdx = tx.outputs.findIndex((o) => o.change);\n\tif (payChangeOutIdx !== -1) {\n\t\tconst changeOutput = tx.outputs[payChangeOutIdx];\n\t\tpayChange = {\n\t\t\tsatoshis: changeOutput.satoshis as number,\n\t\t\ttxid: tx.id(\"hex\") as string,\n\t\t\tvout: payChangeOutIdx,\n\t\t\tscript: Buffer.from(changeOutput.lockingScript.toBinary()).toString(\n\t\t\t\t\"base64\",\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints: tx.inputs.map(\n\t\t\t(i) => `${i.sourceTXID}_${i.sourceOutputIndex}`,\n\t\t),\n\t\tpayChange,\n\t};\n};\n","\n/** fetch function interface limited to options needed by ts-sdk */\n\nimport type { HttpClient, HttpClientRequestOptions, HttpClientResponse } from \"@bsv/sdk\"\n\n/**\n   * Makes a request to the server.\n   * @param url The URL to make the request to.\n   * @param options The request configuration.\n   */\nexport type Fetch = (url: string, options: FetchOptions) => Promise<Response>\n\n/**\n * An interface for configuration of the request to be passed to the fetch method\n * limited to options needed by ts-sdk.\n */\nexport interface FetchOptions {\n  /** A string to set request's method. */\n  method?: string\n  /** An object literal set request's headers. */\n  headers?: Record<string, string>\n  /** An object or null to set request's body. */\n  body?: string | null\n}\n\n/**\n * Adapter for Node.js Https module to be used as HttpClient\n */\nexport class FetchHttpClient implements HttpClient {\n  constructor (private readonly fetch: Fetch) {}\n\n  async request<D>(url: string, options: HttpClientRequestOptions): Promise<HttpClientResponse<D>> {\n    const fetchOptions: FetchOptions = {\n      method: options.method,\n      headers: options.headers,\n      body: JSON.stringify(options.data)\n    }\n\n    const res = await this.fetch.call(window, url, fetchOptions)\n    const mediaType = res.headers.get('Content-Type')\n    const data = mediaType?.startsWith('application/json') ? await res.json() : await res.text()\n\n    return {\n      ok: res.ok,\n      status: res.status,\n      statusText: res.statusText,\n      data: data as D\n    }\n  }\n}\n","import {\n\ttype BroadcastFailure,\n\ttype Broadcaster,\n\ttype BroadcastResponse,\n\ttype Transaction,\n\ttype HttpClient,\n  Utils,\n} from \"@bsv/sdk\";\nimport { API_HOST } from \"../constants.js\";\nimport { defaultHttpClient } from \"./httpClient.js\";\n\nexport const oneSatBroadcaster = (): Broadcaster => {\n\treturn new OneSatBroadcaster();\n};\n\n/**\n * Represents a 1Sat API transaction broadcaster. This will broadcast through the 1Sat API.\n */\nexport default class OneSatBroadcaster implements Broadcaster {\n\tprivate readonly URL: string;\n\tprivate readonly httpClient: HttpClient;\n\n\t/**\n\t * Constructs an instance of the 1Sat API broadcaster.\n\t *\n\t * @param {HttpClient} httpClient - The HTTP client used to make requests to the API.\n\t */\n\tconstructor(\n\t\thttpClient: HttpClient = defaultHttpClient(),\n\t) {\n\t\tthis.URL = `${API_HOST}/tx`;\n\t\tthis.httpClient = httpClient;\n\t}\n\n\t/**\n\t * Broadcasts a transaction via WhatsOnChain.\n\t *\n\t * @param {Transaction} tx - The transaction to be broadcasted.\n\t * @returns {Promise<BroadcastResponse | BroadcastFailure>} A promise that resolves to either a success or failure response.\n\t */\n\tasync broadcast(\n\t\ttx: Transaction,\n\t): Promise<BroadcastResponse | BroadcastFailure> {\n\t\tconst rawtx = Utils.toBase64(tx.toBinary());\n\n\t\tconst requestOptions = {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAccept: \"application/json\",\n\t\t\t},\n\t\t\tdata: { rawtx },\n\t\t};\n\n\t\ttry {\n\t\t\tconst response = await this.httpClient.request<string>(\n\t\t\t\tthis.URL,\n\t\t\t\trequestOptions,\n\t\t\t);\n\t\t\tif (response.ok) {\n\t\t\t\tconst txid = response.data;\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"success\",\n\t\t\t\t\ttxid,\n\t\t\t\t\tmessage: \"broadcast successful\",\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tcode: response.status.toString() ?? \"ERR_UNKNOWN\",\n\t\t\t\tdescription: response.data.message ?? \"Unknown error\",\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tcode: \"500\",\n\t\t\t\tdescription: error instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: \"Internal Server Error\",\n\t\t\t};\n\t\t}\n\t}\n}\n\n","import { type HttpClient, type HttpClientResponse, NodejsHttpClient } from \"@bsv/sdk\"\nimport { FetchHttpClient } from \"./fetch\"\n\nexport function defaultHttpClient (): HttpClient {\n  const noHttpClient: HttpClient = {\n    async request (..._): Promise<HttpClientResponse> {\n      throw new Error('No method available to perform HTTP request')\n    }\n  }\n\n  if (typeof window !== 'undefined' && typeof window.fetch === 'function') {\n    // Use fetch in a browser environment\n    return new FetchHttpClient(window.fetch.bind(window))\n  }\n  if (typeof require !== 'undefined') {\n    // Use Node.js https module\n    try {\n      const https = require('node:https')\n      return new NodejsHttpClient(https)\n    } catch (e) {\n      return noHttpClient\n    }\n  } else {\n    return noHttpClient\n  }\n}\n","import {\n\tTransaction,\n\tSatoshisPerKilobyte,\n\tScript,\n\tUtils,\n  PrivateKey,\n} from \"@bsv/sdk\";\nimport { DEFAULT_SAT_PER_KB, MAP_PREFIX } from \"./constants\";\nimport OrdP2PKH from \"./templates/ordP2pkh\";\nimport type {\n  BaseResult,\n\tBurnOrdinalsConfig,\n} from \"./types\";\nimport { inputFromB64Utxo } from \"./utils/utxo\";\nimport { toHex } from \"./utils/strings\";\n\n/**\n * Burn ordinals by consuming them as fees\n * @param {BurnOrdinalsConfig} config - Configuration object for sending ordinals\n * @param {PrivateKey} config.ordPk - Private key to sign ordinals\n * @param {Utxo} config.ordinals - 1Sat Ordinal Utxos to spend (with base64 encoded scripts)\n * @param {BurnMAP} [config.metaData] - Optional. MAP (Magic Attribute Protocol) metadata to include in an unspendable output OP_FALSE OP_RETURN\n * @returns {Promise<BaseResult>} Transaction, spent outpoints\n */\nexport const burnOrdinals = async (\n\tconfig: BurnOrdinalsConfig,\n): Promise<BaseResult> => {\n\tconst tx = new Transaction();\n\tconst spentOutpoints: string[] = [];\n\tconst { ordinals, metaData, ordPk } = config;\n\n\t// Inputs\n\t// Add ordinal inputs\n\tfor (const ordUtxo of ordinals) {\n\t\tif (ordUtxo.satoshis !== 1) {\n\t\t\tthrow new Error(\"1Sat Ordinal utxos must have exactly 1 satoshi\");\n\t\t}\n    const ordKeyToUse = ordUtxo.pk || ordPk;\n\t\tif(!ordKeyToUse) {\n\t\t\tthrow new Error(\"Private key is required to sign the ordinal\");\n\t\t}\n\n\t\tconst input = inputFromB64Utxo(\n\t\t\tordUtxo,\n\t\t\tnew OrdP2PKH().unlock(\n\t\t\t\tordKeyToUse,\n\t\t\t\t\"all\",\n\t\t\t\ttrue,\n\t\t\t\tordUtxo.satoshis,\n\t\t\t\tScript.fromBinary(Utils.toArray(ordUtxo.script, \"base64\")),\n\t\t\t),\n\t\t);\n\t\tspentOutpoints.push(`${ordUtxo.txid}_${ordUtxo.vout}`);\n\t\ttx.addInput(input);\n\t}\n\n\t// Outputs\n\t// Add metadata output\n\n\t// MAP.app and MAP.type keys are required\n\tif (metaData && (!metaData.app || !metaData.type)) {\n\t\tthrow new Error(\"MAP.app and MAP.type are required fields\");\n\t}\n\n\tlet metaAsm = \"\";\n\n\tif (metaData?.app && metaData?.type) {\n\t\tconst mapPrefixHex = toHex(MAP_PREFIX);\n\t\tconst mapCmdValue = toHex(\"SET\");\n\t\tmetaAsm = `OP_FALSE OP_RETURN ${mapPrefixHex} ${mapCmdValue}`;\n\n\t\tfor (const [key, value] of Object.entries(metaData)) {\n\t\t\tif (key !== \"cmd\") {\n\t\t\t\tmetaAsm = `${metaAsm} ${toHex(key)} ${toHex(value as string)}`;\n\t\t\t}\n\t\t}\n\t}\n\n\ttx.addOutput({\n\t\tsatoshis: 0,\n\t\tlockingScript: Script.fromASM(metaAsm || \"OP_FALSE OP_RETURN\"),\n\t});\n\n\t// Sign the transaction\n\tawait tx.sign();\n\n\treturn {\n\t\ttx,\n\t\tspentOutpoints,\n\t};\n};\n","// import { PaymailClient } from \"@bsv/paymail\";\nimport { LockingScript } from \"@bsv/sdk\";\n\n// const client = new PaymailClient();\n\nexport const resolvePaymail = async (paymailAddress: string, amtToReceive: number): Promise<LockingScript> => {\n  // const destinationTx = await client.getP2pPaymentDestination(paymailAddress, amtToReceive);\n  // // TODO: we are assuming only one output but in reality it can be many\n  // return destinationTx.outputs[0].script as LockingScript;\n  throw new Error(\"Not implemented\");\n}","import type { CollectionItemSubTypeData, CollectionSubTypeData } from \"./types\";\n\n/**\n * Validates sub type data\n * @param {string} subType - Sub type of the ordinals token\n * @param {string} subTypeData - Sub type data of the ordinals token\n * @returns {Error | undefined} Error if validation fails, undefined if validation passes\n */\nexport const validateSubTypeData = (\n  subType: \"collection\" | \"collectionItem\",\n  subTypeData: CollectionItemSubTypeData | CollectionSubTypeData,\n): Error | undefined => {\n  try {\n    if (subType === \"collection\") {\n      const collectionData = subTypeData as CollectionSubTypeData;\n      if (!collectionData.description) {\n        return new Error(\"Collection description is required\");\n      }\n      if (!collectionData.quantity) {\n        return new Error(\"Collection quantity is required\");\n      }\n      if (collectionData.rarityLabels) {\n        if (!Array.isArray(collectionData.rarityLabels)) {\n          return new Error(\"Rarity labels must be an array\");\n        }\n        // make sure keys and values are strings\n        if (!collectionData.rarityLabels.every((label) => {\n          return Object.values(label).every(value => typeof value === 'string');\n        })) {\n          return new Error(`Invalid rarity labels ${collectionData.rarityLabels}`);\n        }\n      }\n      if (collectionData.traits ) {\n        if (typeof collectionData.traits !== \"object\") {\n        return new Error(\"Collection traits must be an object\");\n        }\n        if (collectionData.traits && !Object.keys(collectionData.traits).every(key => typeof key === 'string' && typeof collectionData.traits[key] === 'object')) {\n          return new Error(\"Collection traits must be a valid CollectionTraits object\");\n        }\n      }\n    }\n    if (subType === \"collectionItem\") {\n      const itemData = subTypeData as CollectionItemSubTypeData;\n      if (!itemData.collectionId) {\n        return new Error(\"Collection id is required\");\n      }\n      if (!itemData.collectionId.includes(\"_\")) {\n        return new Error(\"Collection id must be a valid outpoint\");\n      }\n      if (itemData.collectionId.split(\"_\")[0].length !== 64) {\n        return new Error(\"Collection id must contain a valid txid\");\n      }\n      if (Number.isNaN(Number.parseInt(itemData.collectionId.split(\"_\")[1]))) {\n        return new Error(\"Collection id must contain a valid vout\");\n      }\n\n      if (itemData.mintNumber && typeof itemData.mintNumber !== \"number\") {\n        return new Error(\"Mint number must be a number\");\n      }\n      if (itemData.rank && typeof itemData.rank !== \"number\") {\n        return new Error(\"Rank must be a number\");\n      }\n      if (itemData.rarityLabel && typeof itemData.rarityLabel !== \"string\") {\n        return new Error(\"Rarity label must be a string\");\n      }\n      if (itemData.traits && typeof itemData.traits !== \"object\") {\n        return new Error(\"Traits must be an object\");\n      }\n      if (itemData.attachments && !Array.isArray(itemData.attachments)) {\n        return new Error(\"Attachments must be an array\");\n      }\n    }\n    return undefined;\n  } catch (error) {\n    return new Error(\"Invalid JSON data\");\n  }\n};"],"names":["TokenSelectionStrategy","TokenType","RoytaltyType","TokenInputMode","MAP_PREFIX","DEFAULT_SAT_PER_KB","API_HOST","signData","tx","signer","_exit","_temp2","_result","Error","idKey","keyHost","_sigma$sign","Sigma","sign","Promise","resolve","signedTx","_temp","authToken","sigma","remoteSign","then","_ref","_catch","e","console","log","reject","toHex","utf8Str","Buffer","from","toString","OrdP2PKH","_P2PKH","apply","this","arguments","_inheritsLoose","prototype","lock","address","inscription","metaData","lockingScript","P2PKH","applyInscription","withSeparator","ordAsm","undefined","dataB64","contentType","ordHex","fileHex","trim","fileMediaType","inscriptionAsm","toASM","app","type","_i","_Object$entries","Object","entries","length","_Object$entries$_i","key","value","LockingScript","fromASM","stringifyMetaData","result","Array","isArray","JSON","stringify","String","MAX_TOKEN_SUPPLY","Math","pow","fromBase58Check","Utils","inputFromB64Utxo","utxo","unlockScriptTemplate","fromUtxo","_extends","script","pact","state","s","_Pact","o","bind","v","_settle","observer","onFulfilled","onRejected","_this","_isSettledPact","thenable","MAPCommand","BitCom","protocols","scriptPrefix","decode","scriptBytes","toBinary","pos","findReturn","prefix","slice","bitcom","currentPos","chunks","Script","fromBinary","chunkIndex","currentProtocolPos","protocol","protocolChunk","data","toUTF8","protocolChunks","chunk","push","protocolScript","op","writeBin","writeOpCode","OP","OP_RETURN","i","protocolBytes","toArray","_step","_iterator","_createForOfIteratorHelperLoose","done","pipeBytes","toScript","MAP","set","SET","add","values","join","ADD","del","keys","forEach","DEL","command","cleanString","scriptToProcess","bitcomData","mapProtocol","find","p","cmdChunk","cmd","mapData","keyChunk","valueChunk","adds","str","replace","keyValue","_this$set","appName","additionalData","callback","_iteratorSymbol","Symbol","iterator","MediaType","Encoding","OrdLock","_proto","ordAddress","payAddress","price","cancelPkh","payPkh","writeScript","fromHex","buildOutput","cancelListing","privateKey","signOutputs","anyoneCanPay","sourceSatoshis","p2pkh","unlock","inputIndex","_p2pkh$sign","OP_1","estimateLength","purchaseListing","purchase","_input$sourceTransact","outputs","UnlockingScript","satoshis","writer","Writer","output","write","OP_0","input","inputs","sourceSats","sourceTransaction","sourceOutputIndex","_input$sourceTransact2","sourceTXID","id","subscript","preimage","TransactionSignature","format","transactionVersion","version","otherInputs","inputSequence","sequence","lockTime","scope","SIGHASH_ALL","SIGHASH_ANYONECANPAY","SIGHASH_FORKID","_purchase$sign","writeUInt64LEBn","BigNumber","writeVarIntNum","B_PREFIX","B","mediaType","encoding","filename","dataBytes","TextPlain","UTF8","Hex","Base64","Uint8Array","bProtocol","dataChunk","mediaTypeChunk","encodingChunk","filenameChunk","text","binary","Binary","base64","base64Data","hex","hexData","_forOf","target","body","check","step","_cycle","next","return","_fixup","TypeError","array","_forTo","ErrorOversizedIcon","ErrorIconProportions","ErrorInvalidIconData","ErrorImageDimensionsUndefined","FetchHttpClient","fetch","request","url","options","fetchOptions","method","headers","call","window","res","get","startsWith","json","ok","status","statusText","OneSatBroadcaster","httpClient","noHttpClient","require","https","NodejsHttpClient","defaultHttpClient","URL","broadcast","requestOptions","Accept","rawtx","toBase64","response","_response$status$toSt","_response$data$messag","txid","message","code","description","error","config","Transaction","spentOutpoints","ordPk","ordinals","ordUtxo","ordKeyToUse","pk","vout","addInput","metaAsm","mapPrefixHex","addOutput","_interrupt","totalSatsIn","totalSatsOut","BigInt","fee","modelOrFee","payChangeOutIdx","findIndex","change","changeOutput","payChange","map","utxos","listingUtxos","paymentPk","_config$additionalPay","additionalPayments","_config$satsPerKb","satsPerKb","warn","SatoshisPerKilobyte","listingUtxo","toAddress","_iterator2","_step2","amount","to","changeAddress","changeScript","reduce","total","out","payKeyToUse","computeFee","_modelOrFee$computeFe","_interrupt2","_temp4","_result2","tokenChange","amt","totalAmtIn","tokenID","_config$satsPerKb2","every","token","_step3","_iterator3","Number","parseInt","transferInscription","BSV20","tick","BSV21","destination","_step4","_iterator4","_temp3","_modelOrFee$computeFe2","_exit2","_signData","listings","listing","inputScriptBinary","inputScript","_temp8","_temp6","tc","_temp5","_signData2","_config$additionalPay2","tokenChangeAddress","inputTokens","decimals","changeAmt","totalAmtOut","bigAmt","toTokenSat","tokens","ReturnTypes","_iterator5","_step5","_temp7","destinations","_Object$keys","pop","iconValue","_result3","_exit3","icon","includes","endsWith","iconVout","split","isNaN","validIconFormat","tsatAmt","initialDistribution","fileData","sym","symbol","dec","b64File","sendTxOut","destinationAddress","payment","svgBase64","svgString","widthMatch","match","heightMatch","width","height","validateSvg","buffer","dimensions","imageMeta","validIconData","iconError","iconScript","collectionId","limit","offset","scriptEncoding","subTypeData","nftUtxos","outpoints","filter","u","_u$data","list","concat","nftRes","nfts","nftUtxo","origin","outpoint","payRes","payUtxos","_utxo$data","pubKeyHash","p2pkhScript","tokenId","tokenUtxos","_config$royalties","royalties","reader","Reader","payout","readUInt64LEBn","toNumber","scriptLength","readVarIntNum","scriptBin","read","r","royaltySats","floor","percentage","_switch","Paymail","resolvePaymail","_resolvePaymail","Address","_interrupt3","_result4","requiredTokens","_options$inputStrateg","inputStrategy","RetainOrder","_options$outputStrate","outputStrategy","totalSelected","selectedUtxos","sort","a","b","amtA","amtB","SmallestFirst","LargestFirst","Random","random","toToken","isEnough","enforceUniformSend","_destination$inscript","_destination$inscript2","paymentUtxos","changeOut","payments","distributions","_config$burn","burn","_config$tokenInputMod","tokenInputMode","Needed","_config$splitConfig","splitConfig","omitMetaData","changeTsats","tokensToUse","totalTsatIn","totalTsatOut","totalAmtNeeded","acc","dist","All","dest","inscriptionObj","splitOutputs","tokenChanges","threshold","maxOutputs","min","baseChangeAmount","max","remainder","splitAmount","splitChangeOutputs","subType","collectionData","quantity","rarityLabels","label","traits","itemData","mintNumber","rank","rarityLabel","attachments"],"mappings":"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"}