@neuraiproject/neurai-assets 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -21
- package/dist/NeuraiAssets.global.js +85 -25
- package/dist/NeuraiAssets.global.js.map +1 -1
- package/dist/browser.js +85 -25
- package/dist/browser.js.map +1 -1
- package/dist/index.cjs +85 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +85 -25
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NeuraiAssets.global.js","sources":["../src/errors/ValidationErrors.js","../src/errors/AssetErrors.js","../src/errors/index.js","../src/queries/AssetQueries.js","../src/queries/index.js","../src/constants/assetTypes.js","../src/constants/fees.js","../src/constants/burnAddresses.js","../src/constants/networks.js","../src/constants/index.js","../src/managers/BurnManager.js","../src/utils/assetNameParser.js","../src/utils/amountConverter.js","../src/utils/networkDetector.js","../src/utils/outputFormatter.js","../src/utils/index.js","../src/managers/OwnerTokenManager.js","../src/managers/UTXOSelector.js","../src/managers/OutputOrderer.js","../src/managers/index.js","../src/validators/assetNameValidator.js","../src/validators/amountValidator.js","../src/validators/verifierValidator.js","../src/validators/ipfsValidator.js","../src/validators/index.js","../src/builders/BaseAssetTransactionBuilder.js","../src/builders/IssueRootBuilder.js","../src/builders/IssueSubBuilder.js","../src/builders/IssueDepinBuilder.js","../src/builders/ReissueBuilder.js","../src/builders/IssueUniqueBuilder.js","../src/builders/IssueQualifierBuilder.js","../src/builders/IssueRestrictedBuilder.js","../src/builders/ReissueRestrictedBuilder.js","../src/builders/TagAddressBuilder.js","../src/builders/FreezeAddressBuilder.js","../src/builders/index.js","../src/NeuraiAssets.js","../src/index.js","../src/entries/api.mjs","../src/entries/global.mjs"],"sourcesContent":["/**\n * Validation Error Classes\n * Errors thrown during parameter validation\n */\n\nclass ValidationError extends Error {\n constructor(message) {\n super(message);\n this.name = 'ValidationError';\n this.code = 'VALIDATION_ERROR';\n }\n}\n\nclass InvalidAssetNameError extends ValidationError {\n constructor(message, assetName) {\n super(message);\n this.name = 'InvalidAssetNameError';\n this.code = 'INVALID_ASSET_NAME';\n this.assetName = assetName;\n }\n}\n\nclass InvalidAmountError extends ValidationError {\n constructor(message, amount) {\n super(message);\n this.name = 'InvalidAmountError';\n this.code = 'INVALID_AMOUNT';\n this.amount = amount;\n }\n}\n\nclass InvalidUnitsError extends ValidationError {\n constructor(message, units) {\n super(message);\n this.name = 'InvalidUnitsError';\n this.code = 'INVALID_UNITS';\n this.units = units;\n }\n}\n\nclass InvalidVerifierStringError extends ValidationError {\n constructor(message, verifier) {\n super(message);\n this.name = 'InvalidVerifierStringError';\n this.code = 'INVALID_VERIFIER_STRING';\n this.verifier = verifier;\n }\n}\n\nclass InvalidIPFSHashError extends ValidationError {\n constructor(message, hash) {\n super(message);\n this.name = 'InvalidIPFSHashError';\n this.code = 'INVALID_IPFS_HASH';\n this.ipfsHash = hash;\n }\n}\n\nclass InvalidAddressError extends ValidationError {\n constructor(message, address) {\n super(message);\n this.name = 'InvalidAddressError';\n this.code = 'INVALID_ADDRESS';\n this.address = address;\n }\n}\n\nclass InsufficientFundsError extends ValidationError {\n constructor(message, required, available) {\n super(message);\n this.name = 'InsufficientFundsError';\n this.code = 'INSUFFICIENT_FUNDS';\n this.required = required;\n this.available = available;\n }\n}\n\nmodule.exports = {\n ValidationError,\n InvalidAssetNameError,\n InvalidAmountError,\n InvalidUnitsError,\n InvalidVerifierStringError,\n InvalidIPFSHashError,\n InvalidAddressError,\n InsufficientFundsError\n};\n","/**\n * Asset-Specific Error Classes\n * Errors related to asset operations\n */\n\nclass AssetError extends Error {\n constructor(message) {\n super(message);\n this.name = 'AssetError';\n this.code = 'ASSET_ERROR';\n }\n}\n\nclass AssetExistsError extends AssetError {\n constructor(message, assetName) {\n super(message);\n this.name = 'AssetExistsError';\n this.code = 'ASSET_EXISTS';\n this.assetName = assetName;\n }\n}\n\nclass AssetNotFoundError extends AssetError {\n constructor(message, assetName) {\n super(message);\n this.name = 'AssetNotFoundError';\n this.code = 'ASSET_NOT_FOUND';\n this.assetName = assetName;\n }\n}\n\nclass OwnerTokenNotFoundError extends AssetError {\n constructor(message, ownerTokenName) {\n super(message);\n this.name = 'OwnerTokenNotFoundError';\n this.code = 'OWNER_TOKEN_NOT_FOUND';\n this.ownerTokenName = ownerTokenName;\n this.severity = 'HIGH';\n }\n}\n\nclass OwnerTokenNotReturnedError extends AssetError {\n constructor(message, ownerTokenName) {\n super(message);\n this.name = 'OwnerTokenNotReturnedError';\n this.code = 'OWNER_TOKEN_NOT_RETURNED';\n this.ownerTokenName = ownerTokenName;\n this.severity = 'CRITICAL'; // This results in permanent loss\n }\n}\n\nclass AssetNotReissuableError extends AssetError {\n constructor(message, assetName) {\n super(message);\n this.name = 'AssetNotReissuableError';\n this.code = 'ASSET_NOT_REISSUABLE';\n this.assetName = assetName;\n }\n}\n\nclass InsufficientBurnAmountError extends AssetError {\n constructor(message, required, provided) {\n super(message);\n this.name = 'InsufficientBurnAmountError';\n this.code = 'INSUFFICIENT_BURN_AMOUNT';\n this.required = required;\n this.provided = provided;\n }\n}\n\nclass InvalidBurnAddressError extends AssetError {\n constructor(message, expectedAddress, providedAddress) {\n super(message);\n this.name = 'InvalidBurnAddressError';\n this.code = 'INVALID_BURN_ADDRESS';\n this.expectedAddress = expectedAddress;\n this.providedAddress = providedAddress;\n }\n}\n\nclass MaxSupplyExceededError extends AssetError {\n constructor(message, assetName, currentSupply, additionalAmount, maxSupply) {\n super(message);\n this.name = 'MaxSupplyExceededError';\n this.code = 'MAX_SUPPLY_EXCEEDED';\n this.assetName = assetName;\n this.currentSupply = currentSupply;\n this.additionalAmount = additionalAmount;\n this.maxSupply = maxSupply;\n }\n}\n\nclass RestrictedAssetViolationError extends AssetError {\n constructor(message, assetName, address, reason) {\n super(message);\n this.name = 'RestrictedAssetViolationError';\n this.code = 'RESTRICTED_ASSET_VIOLATION';\n this.assetName = assetName;\n this.address = address;\n this.reason = reason;\n }\n}\n\nclass QualifierNotFoundError extends AssetError {\n constructor(message, qualifierName) {\n super(message);\n this.name = 'QualifierNotFoundError';\n this.code = 'QUALIFIER_NOT_FOUND';\n this.qualifierName = qualifierName;\n }\n}\n\nclass ParentAssetNotFoundError extends AssetError {\n constructor(message, parentAssetName) {\n super(message);\n this.name = 'ParentAssetNotFoundError';\n this.code = 'PARENT_ASSET_NOT_FOUND';\n this.parentAssetName = parentAssetName;\n }\n}\n\nmodule.exports = {\n AssetError,\n AssetExistsError,\n AssetNotFoundError,\n OwnerTokenNotFoundError,\n OwnerTokenNotReturnedError,\n AssetNotReissuableError,\n InsufficientBurnAmountError,\n InvalidBurnAddressError,\n MaxSupplyExceededError,\n RestrictedAssetViolationError,\n QualifierNotFoundError,\n ParentAssetNotFoundError\n};\n","/**\n * Errors Module\n * Exports all error classes\n */\n\nconst {\n ValidationError,\n InvalidAssetNameError,\n InvalidAmountError,\n InvalidUnitsError,\n InvalidVerifierStringError,\n InvalidIPFSHashError,\n InvalidAddressError,\n InsufficientFundsError\n} = require('./ValidationErrors');\n\nconst {\n AssetError,\n AssetExistsError,\n AssetNotFoundError,\n OwnerTokenNotFoundError,\n OwnerTokenNotReturnedError,\n AssetNotReissuableError,\n InsufficientBurnAmountError,\n InvalidBurnAddressError,\n MaxSupplyExceededError,\n RestrictedAssetViolationError,\n QualifierNotFoundError,\n ParentAssetNotFoundError\n} = require('./AssetErrors');\n\nmodule.exports = {\n // Validation Errors\n ValidationError,\n InvalidAssetNameError,\n InvalidAmountError,\n InvalidUnitsError,\n InvalidVerifierStringError,\n InvalidIPFSHashError,\n InvalidAddressError,\n InsufficientFundsError,\n\n // Asset Errors\n AssetError,\n AssetExistsError,\n AssetNotFoundError,\n OwnerTokenNotFoundError,\n OwnerTokenNotReturnedError,\n AssetNotReissuableError,\n InsufficientBurnAmountError,\n InvalidBurnAddressError,\n MaxSupplyExceededError,\n RestrictedAssetViolationError,\n QualifierNotFoundError,\n ParentAssetNotFoundError\n};\n","/**\n * Asset Queries\n * Wrapper methods for querying asset information from the blockchain\n *\n * Provides convenient access to all asset-related RPC query methods:\n * - Asset metadata (getassetdata)\n * - Asset listings (listassets, listmyassets)\n * - Holder information (listaddressesbyasset)\n * - Balance queries (listassetbalancesbyaddress)\n * - Qualifier checks (checkaddresstag, listtagsforaddress)\n * - Restriction checks (checkaddressrestriction, checkglobalrestriction)\n * - Verifier validation (isvalidverifierstring)\n */\n\nconst { AssetNotFoundError, InvalidAddressError } = require('../errors');\n\nclass AssetQueries {\n /**\n * @param {Function} rpc - RPC function to call Neurai node\n */\n constructor(rpc) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n this.rpc = rpc;\n }\n\n /**\n * Get asset metadata\n * @param {string} assetName - Asset name\n * @returns {Promise<object>} Asset data\n * @throws {AssetNotFoundError} If asset doesn't exist\n */\n async getAssetData(assetName) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n try {\n const assetData = await this.rpc('getassetdata', [assetName]);\n\n if (!assetData) {\n throw new AssetNotFoundError(\n `Asset ${assetName} not found on blockchain`,\n assetName\n );\n }\n\n return assetData;\n } catch (error) {\n if (error instanceof AssetNotFoundError) {\n throw error;\n }\n\n // RPC error - likely asset doesn't exist\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Asset ${assetName} not found on blockchain`,\n assetName\n );\n }\n\n throw new Error(`Failed to get asset data: ${error.message}`);\n }\n }\n\n /**\n * List all assets on the blockchain\n * @param {string} filter - Filter pattern (e.g., 'MY*' for all assets starting with MY)\n * @param {boolean} verbose - Include detailed information\n * @param {number} count - Maximum number to return\n * @param {number} start - Starting index (for pagination)\n * @returns {Promise<Array|object>} Array of asset names or detailed objects\n */\n async listAssets(filter = '*', verbose = false, count = 100, start = 0) {\n try {\n const assets = await this.rpc('listassets', [filter, verbose, count, start]);\n return assets || [];\n } catch (error) {\n throw new Error(`Failed to list assets: ${error.message}`);\n }\n }\n\n /**\n * List assets owned by wallet\n * @param {string} assetName - Filter by asset name (default: '*' for all)\n * @param {boolean} verbose - Include detailed information\n * @param {number} count - Maximum number to return\n * @param {number} start - Starting index (for pagination)\n * @param {number} confs - Minimum confirmations (default: 1)\n * @returns {Promise<object>} Object with asset names as keys and amounts as values\n */\n async listMyAssets(assetName = '*', verbose = false, count = 100, start = 0, confs = 1) {\n try {\n const myAssets = await this.rpc('listmyassets', [assetName, verbose, count, start, confs]);\n return myAssets || {};\n } catch (error) {\n throw new Error(`Failed to list my assets: ${error.message}`);\n }\n }\n\n /**\n * List all addresses holding a specific asset\n * @param {string} assetName - Asset name\n * @param {boolean} onlyCount - Return only count instead of full list\n * @param {number} count - Maximum number to return\n * @param {number} start - Starting index (for pagination)\n * @returns {Promise<Array|number>} Array of {address, amount} or count\n */\n async listAddressesByAsset(assetName, onlyCount = false, count = 100, start = 0) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n try {\n const result = await this.rpc('listaddressesbyasset', [assetName, onlyCount, count, start]);\n return result || (onlyCount ? 0 : []);\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Asset ${assetName} not found on blockchain`,\n assetName\n );\n }\n throw new Error(`Failed to list addresses by asset: ${error.message}`);\n }\n }\n\n /**\n * List asset balances for a specific address\n * @param {string} address - Address to query\n * @param {boolean} onlyTotal - Return only count instead of full list\n * @param {number} count - Maximum number to return\n * @param {number} start - Starting index (for pagination)\n * @returns {Promise<Array|number>} Array of {asset, amount} or count\n */\n async listAssetBalancesByAddress(address, onlyTotal = false, count = 100, start = 0) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n try {\n const result = await this.rpc('listassetbalancesbyaddress', [address, onlyTotal, count, start]);\n return result || (onlyTotal ? 0 : []);\n } catch (error) {\n throw new Error(`Failed to list asset balances by address: ${error.message}`);\n }\n }\n\n /**\n * Check if an address has a specific qualifier tag\n * @param {string} address - Address to check\n * @param {string} qualifierName - Qualifier name (e.g., '#KYC_VERIFIED')\n * @returns {Promise<boolean>} True if address has the tag\n */\n async checkAddressTag(address, qualifierName) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n if (!qualifierName) {\n throw new Error('Qualifier name is required');\n }\n\n try {\n const result = await this.rpc('checkaddresstag', [address, qualifierName]);\n return result === true || result === 1;\n } catch (error) {\n // If tag doesn't exist or address doesn't have it, return false\n if (error.message && (error.message.includes('not found') || error.message.includes('does not have'))) {\n return false;\n }\n throw new Error(`Failed to check address tag: ${error.message}`);\n }\n }\n\n /**\n * List all qualifiers assigned to an address\n * @param {string} address - Address to query\n * @returns {Promise<Array>} Array of qualifier names\n */\n async listTagsForAddress(address) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n try {\n const tags = await this.rpc('listtagsforaddress', [address]);\n return tags || [];\n } catch (error) {\n // If no tags found, return empty array\n if (error.message && error.message.includes('not found')) {\n return [];\n }\n throw new Error(`Failed to list tags for address: ${error.message}`);\n }\n }\n\n /**\n * List all addresses with a specific qualifier tag\n * @param {string} qualifierName - Qualifier name\n * @returns {Promise<Array>} Array of addresses\n */\n async listAddressesForTag(qualifierName) {\n if (!qualifierName) {\n throw new Error('Qualifier name is required');\n }\n\n try {\n const addresses = await this.rpc('listaddressesfortag', [qualifierName]);\n return addresses || [];\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Qualifier ${qualifierName} not found on blockchain`,\n qualifierName\n );\n }\n throw new Error(`Failed to list addresses for tag: ${error.message}`);\n }\n }\n\n /**\n * Check if an address can hold a restricted asset\n * @param {string} address - Address to check\n * @param {string} restrictedAssetName - Restricted asset name (e.g., '$SECURITY')\n * @returns {Promise<boolean>} True if address meets verifier requirements\n */\n async checkAddressRestriction(address, restrictedAssetName) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n if (!restrictedAssetName) {\n throw new Error('Restricted asset name is required');\n }\n\n try {\n const result = await this.rpc('checkaddressrestriction', [address, restrictedAssetName]);\n return result === true || result === 1;\n } catch (error) {\n // If address doesn't meet requirements, return false\n if (error.message && (error.message.includes('not found') || error.message.includes('does not meet'))) {\n return false;\n }\n throw new Error(`Failed to check address restriction: ${error.message}`);\n }\n }\n\n /**\n * Check if an address is frozen for a restricted asset\n * @param {string} address - Address to check\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<boolean>} True if address is frozen\n */\n async isAddressFrozen(address, restrictedAssetName) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n if (!restrictedAssetName) {\n throw new Error('Restricted asset name is required');\n }\n\n try {\n const result = await this.rpc('checkaddressrestriction', [address, restrictedAssetName]);\n // If result has frozen property, check it\n if (typeof result === 'object' && result.frozen !== undefined) {\n return result.frozen === true || result.frozen === 1;\n }\n return false;\n } catch (error) {\n throw new Error(`Failed to check if address is frozen: ${error.message}`);\n }\n }\n\n /**\n * Check if an asset is globally frozen\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<boolean>} True if asset is globally frozen\n */\n async checkGlobalRestriction(restrictedAssetName) {\n if (!restrictedAssetName) {\n throw new Error('Restricted asset name is required');\n }\n\n try {\n const result = await this.rpc('checkglobalrestriction', [restrictedAssetName]);\n return result === true || result === 1;\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Restricted asset ${restrictedAssetName} not found on blockchain`,\n restrictedAssetName\n );\n }\n throw new Error(`Failed to check global restriction: ${error.message}`);\n }\n }\n\n /**\n * Get verifier string for a restricted asset\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<string>} Verifier string\n */\n async getVerifierString(restrictedAssetName) {\n if (!restrictedAssetName) {\n throw new Error('Restricted asset name is required');\n }\n\n try {\n const result = await this.rpc('getverifierstring', [restrictedAssetName]);\n return result || '';\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Restricted asset ${restrictedAssetName} not found on blockchain`,\n restrictedAssetName\n );\n }\n throw new Error(`Failed to get verifier string: ${error.message}`);\n }\n }\n\n /**\n * Validate verifier string syntax\n * @param {string} verifierString - Verifier string to validate\n * @returns {Promise<boolean>} True if valid\n */\n async isValidVerifierString(verifierString) {\n if (!verifierString) {\n throw new Error('Verifier string is required');\n }\n\n try {\n const result = await this.rpc('isvalidverifierstring', [verifierString]);\n return result === true || result === 1;\n } catch (error) {\n // If validation fails, return false\n return false;\n }\n }\n\n /**\n * Get snapshot of asset ownership at a specific block\n * @param {string} assetName - Asset name\n * @param {number} blockHeight - Block height for snapshot\n * @returns {Promise<object>} Snapshot request result\n */\n async getSnapshotRequest(assetName, blockHeight) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n if (!blockHeight || typeof blockHeight !== 'number') {\n throw new Error('Block height must be a number');\n }\n\n try {\n const result = await this.rpc('getsnapshotrequest', [assetName, blockHeight]);\n return result;\n } catch (error) {\n throw new Error(`Failed to get snapshot request: ${error.message}`);\n }\n }\n\n /**\n * Cancel a snapshot request\n * @param {string} assetName - Asset name\n * @param {number} blockHeight - Block height of snapshot to cancel\n * @returns {Promise<boolean>} True if cancelled successfully\n */\n async cancelSnapshotRequest(assetName, blockHeight) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n if (!blockHeight || typeof blockHeight !== 'number') {\n throw new Error('Block height must be a number');\n }\n\n try {\n const result = await this.rpc('cancelsnapshotrequest', [assetName, blockHeight]);\n return result === true || result === 1;\n } catch (error) {\n throw new Error(`Failed to cancel snapshot request: ${error.message}`);\n }\n }\n\n /**\n * List DEPIN holders with validity status\n * @param {string} assetName - DEPIN asset name\n * @returns {Promise<Array>} Array of holder objects\n */\n async listDepinHolders(assetName) {\n if (!assetName) {\n throw new Error('DEPIN asset name is required');\n }\n\n try {\n const result = await this.rpc('listdepinholders', [assetName]);\n return result || [];\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `DEPIN asset ${assetName} not found on blockchain`,\n assetName\n );\n }\n throw new Error(`Failed to list DEPIN holders: ${error.message}`);\n }\n }\n\n /**\n * Check DEPIN validity for a specific address\n * @param {string} assetName - DEPIN asset name\n * @param {string} address - Address to query\n * @returns {Promise<object>} Validity information\n */\n async checkDepinValidity(assetName, address) {\n if (!assetName) {\n throw new Error('DEPIN asset name is required');\n }\n\n if (!address) {\n throw new Error('Address is required');\n }\n\n try {\n const result = await this.rpc('checkdepinvalidity', [assetName, address]);\n return result || { has_asset: false };\n } catch (error) {\n throw new Error(`Failed to check DEPIN validity: ${error.message}`);\n }\n }\n\n /**\n * Get total count of assets on blockchain\n * @returns {Promise<number>} Total asset count\n */\n async getAssetCount() {\n try {\n // List all assets with count only\n const assets = await this.listAssets('*', false, 1, 0);\n return Array.isArray(assets) ? assets.length : 0;\n } catch (error) {\n throw new Error(`Failed to get asset count: ${error.message}`);\n }\n }\n\n /**\n * Check if asset exists\n * @param {string} assetName - Asset name\n * @returns {Promise<boolean>} True if asset exists\n */\n async assetExists(assetName) {\n try {\n await this.getAssetData(assetName);\n return true;\n } catch (error) {\n if (error instanceof AssetNotFoundError) {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * Get asset type from name\n * @param {string} assetName - Asset name\n * @returns {string} Asset type ('ROOT', 'SUB', 'UNIQUE', 'QUALIFIER', 'RESTRICTED', 'DEPIN', 'OWNER')\n */\n getAssetType(assetName) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n if (assetName.endsWith('!')) {\n return 'OWNER';\n } else if (assetName.startsWith('#')) {\n return assetName.includes('/') ? 'SUB_QUALIFIER' : 'QUALIFIER';\n } else if (assetName.startsWith('$')) {\n return 'RESTRICTED';\n } else if (assetName.startsWith('&')) {\n return 'DEPIN';\n } else if (assetName.includes('#')) {\n return 'UNIQUE';\n } else if (assetName.includes('/')) {\n return 'SUB';\n } else {\n return 'ROOT';\n }\n }\n}\n\nmodule.exports = AssetQueries;\n","/**\n * Query Module\n * Exports all asset query functionality\n */\n\nconst AssetQueries = require('./AssetQueries');\n\nmodule.exports = {\n AssetQueries\n};\n","/**\n * Neurai Asset Types\n * Based on: src/assets/assettypes.h\n */\n\nconst AssetType = {\n ROOT: 0, // Top-level asset (Cost: 1000 XNA)\n SUB: 1, // Sub-asset (Cost: 200 XNA, requires PARENT!)\n UNIQUE: 2, // NFT/Unique asset (Cost: 10 XNA per token)\n MSGCHANNEL: 3, // Message channel (Cost: 200 XNA, legacy)\n QUALIFIER: 4, // KYC qualifier tag (Cost: 2000 XNA)\n SUB_QUALIFIER: 5, // Sub-qualifier (Cost: 200 XNA)\n RESTRICTED: 6, // Restricted/security token (Cost: 3000 XNA)\n VOTE: 7, // Voting asset (Reserved for future use)\n REISSUE: 8, // Reissuance operation (Cost: 200 XNA)\n OWNER: 9, // Owner token (Cost: 0 XNA, auto-generated)\n NULL_ADD_QUALIFIER: 10, // Qualifier assignment (Cost: 0.1 XNA)\n DEPIN: 12 // Soulbound DePIN asset (Testnet only)\n};\n\nmodule.exports = {\n AssetType\n};\n","/**\n * Asset Operation Costs (in XNA)\n * These are burn amounts required for each operation\n */\n\nconst ASSET_COSTS = {\n ISSUE_ROOT: 1000,\n ISSUE_SUB: 200,\n ISSUE_UNIQUE: 10, // Per NFT\n ISSUE_MSGCHANNEL: 200,\n ISSUE_QUALIFIER: 2000,\n ISSUE_SUB_QUALIFIER: 200,\n ISSUE_RESTRICTED: 3000,\n REISSUE: 200,\n REISSUE_RESTRICTED: 200,\n TAG_ADDRESS: 0.2, // Per address\n UNTAG_ADDRESS: 0.2, // Per address\n FREEZE_ADDRESS: 0, // No cost (requires owner token)\n UNFREEZE_ADDRESS: 0, // No cost (requires owner token)\n FREEZE_ASSET: 0, // No cost (requires owner token)\n UNFREEZE_ASSET: 0, // No cost (requires owner token)\n OWNER_TOKEN: 0 // Auto-generated, no cost\n};\n\n/**\n * Get cost for a specific operation type\n * @param {string} operationType - Operation type (e.g., 'ISSUE_ROOT')\n * @returns {number} Cost in XNA\n */\nfunction getAssetCost(operationType) {\n const cost = ASSET_COSTS[operationType];\n if (cost === undefined) {\n throw new Error(`Unknown operation type: ${operationType}`);\n }\n return cost;\n}\n\n/**\n * Calculate total cost for unique asset issuance\n * @param {number} count - Number of unique assets to create\n * @returns {number} Total cost in XNA\n */\nfunction getUniqueAssetCost(count) {\n return ASSET_COSTS.ISSUE_UNIQUE * count;\n}\n\n/**\n * Calculate total cost for tagging multiple addresses\n * @param {number} addressCount - Number of addresses to tag\n * @returns {number} Total cost in XNA\n */\nfunction getTaggingCost(addressCount) {\n return ASSET_COSTS.TAG_ADDRESS * addressCount;\n}\n\nmodule.exports = {\n ASSET_COSTS,\n getAssetCost,\n getUniqueAssetCost,\n getTaggingCost\n};\n","/**\n * Burn Addresses for Asset Operations\n * Different addresses for mainnet and testnet\n */\n\nconst MAINNET_NETWORKS = ['xna', 'mainnet', 'xna-pq', 'mainnet-pq'];\nconst TESTNET_NETWORKS = ['xna-test', 'testnet', 'regtest', 'xna-pq-test', 'testnet-pq'];\n\nfunction resolveNetworkFamily(network) {\n if (MAINNET_NETWORKS.includes(network)) {\n return 'mainnet';\n }\n\n if (TESTNET_NETWORKS.includes(network)) {\n return 'testnet';\n }\n\n throw new Error(`Unknown network: ${network}`);\n}\n\nconst MAINNET_BURN_ADDRESSES = {\n ISSUE_ROOT: 'NbURNXXXXXXXXXXXXXXXXXXXXXXXT65Gdr',\n ISSUE_SUB: 'NXissueSubAssetXXXXXXXXXXXXXX6B2JF',\n ISSUE_UNIQUE: 'NXissueUniqueAssetXXXXXXXXXXUBzP4Z',\n ISSUE_MSGCHANNEL: 'NXissueMsgChanneLAssetXXXXXXTUzrtJ',\n REISSUE: 'NXReissueAssetXXXXXXXXXXXXXXWLe4Ao',\n ISSUE_RESTRICTED: 'NXissueRestrictedXXXXXXXXXXXWpXx4H',\n ISSUE_QUALIFIER: 'NXissueQuaLifierXXXXXXXXXXXXWurNcU',\n ISSUE_SUB_QUALIFIER: 'NXissueSubQuaLifierXXXXXXXXXV71vM3',\n TAG_ADDRESS: 'NXaddTagBurnXXXXXXXXXXXXXXXXWucUTr',\n UNTAG_ADDRESS: 'NXaddTagBurnXXXXXXXXXXXXXXXXWucUTr'\n};\n\nconst TESTNET_BURN_ADDRESSES = {\n ISSUE_ROOT: 'tBURNXXXXXXXXXXXXXXXXXXXXXXXVZLroy',\n ISSUE_SUB: 'tSubAssetXXXXXXXXXXXXXXXXXXXXGTvF4',\n ISSUE_UNIQUE: 'tUniqueAssetXXXXXXXXXXXXXXXXVCgpLs',\n ISSUE_MSGCHANNEL: 'tMsgChanneLAssetXXXXXXXXXXXXVsJoya',\n REISSUE: 'tAssetXXXXXXXXXXXXXXXXXXXXXXas6pz8',\n ISSUE_RESTRICTED: 'tRestrictedXXXXXXXXXXXXXXXXXVyPBEK',\n ISSUE_QUALIFIER: 'tQuaLifierXXXXXXXXXXXXXXXXXXT5czoV',\n ISSUE_SUB_QUALIFIER: 'tSubQuaLifierXXXXXXXXXXXXXXXW5MmGk',\n TAG_ADDRESS: 'tTagBurnXXXXXXXXXXXXXXXXXXXXYm6pxA',\n UNTAG_ADDRESS: 'tTagBurnXXXXXXXXXXXXXXXXXXXXYm6pxA'\n};\n\n/**\n * Get burn address for an operation and network\n * @param {string} operationType - Operation type (e.g., 'ISSUE_ROOT')\n * @param {string} network - Network type ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n * @returns {string} Burn address\n */\nfunction getBurnAddress(operationType, network) {\n const family = resolveNetworkFamily(network);\n const addresses = family === 'mainnet' ? MAINNET_BURN_ADDRESSES : TESTNET_BURN_ADDRESSES;\n\n const address = addresses[operationType];\n if (!address) {\n throw new Error(`Unknown operation type: ${operationType} for network: ${network}`);\n }\n\n return address;\n}\n\n/**\n * Check if an address is a burn address\n * @param {string} address - Address to check\n * @param {string} network - Network type ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n * @returns {boolean} True if it's a burn address\n */\nfunction isBurnAddress(address, network) {\n const family = resolveNetworkFamily(network);\n const addresses = family === 'mainnet' ? MAINNET_BURN_ADDRESSES : TESTNET_BURN_ADDRESSES;\n return Object.values(addresses).includes(address);\n}\n\nmodule.exports = {\n MAINNET_BURN_ADDRESSES,\n TESTNET_BURN_ADDRESSES,\n resolveNetworkFamily,\n getBurnAddress,\n isBurnAddress\n};\n","/**\n * Network Configuration for Neurai\n */\n\nconst NETWORKS = {\n MAINNET: {\n name: 'xna',\n displayName: 'Neurai Mainnet',\n addressPrefix: 'N',\n pqAddressPrefix: 'nq1',\n assetNameMaxLength: 32,\n defaultRPCPort: 19001,\n coin: 'XNA',\n baseNetwork: 'xna'\n },\n TESTNET: {\n name: 'xna-test',\n displayName: 'Neurai Testnet',\n addressPrefix: 't',\n pqAddressPrefix: 'tnq1',\n assetNameMaxLength: 32, // Same as mainnet\n defaultRPCPort: 19101,\n coin: 'TXNA',\n baseNetwork: 'xna-test'\n },\n MAINNET_PQ: {\n name: 'xna-pq',\n displayName: 'Neurai Mainnet PQ',\n addressPrefix: 'N',\n pqAddressPrefix: 'nq1',\n assetNameMaxLength: 32,\n defaultRPCPort: 19001,\n coin: 'XNA',\n baseNetwork: 'xna'\n },\n TESTNET_PQ: {\n name: 'xna-pq-test',\n displayName: 'Neurai Testnet PQ',\n addressPrefix: 't',\n pqAddressPrefix: 'tnq1',\n assetNameMaxLength: 32,\n defaultRPCPort: 19101,\n coin: 'TXNA',\n baseNetwork: 'xna-test'\n }\n};\n\n/**\n * Asset naming rules (same for all networks)\n */\nconst ASSET_NAME_RULES = {\n ROOT: {\n minLength: 3,\n maxLength: 30,\n pattern: /^[A-Z0-9_.]+$/,\n cannotStartWith: ['.', 'A', 'Z'],\n reserved: ['XNA', 'NEURAI']\n },\n SUB: {\n minLength: 1,\n maxLength: 30,\n pattern: /^[A-Z0-9_.]+$/,\n separator: '/',\n maxDepth: 1 // Only one level of sub-assets\n },\n UNIQUE: {\n minLength: 1,\n maxLength: 30,\n pattern: /^[A-Z0-9_.]+$/,\n separator: '#'\n },\n QUALIFIER: {\n minLength: 3,\n maxLength: 30,\n pattern: /^[A-Z0-9_]+$/,\n prefix: '#',\n separator: '/'\n },\n RESTRICTED: {\n minLength: 3,\n maxLength: 30,\n pattern: /^[A-Z0-9_.]+$/,\n prefix: '$'\n },\n DEPIN: {\n minLength: 3,\n maxLength: 120,\n pattern: /^[A-Z0-9_.]+$/,\n prefix: '&',\n separator: '/'\n }\n};\n\n/**\n * Asset quantity limits\n */\nconst ASSET_LIMITS = {\n MIN_QUANTITY: 1,\n MAX_QUANTITY: 21000000000, // 21 billion (same as Bitcoin's 21M with 3 extra decimals)\n MIN_UNITS: 0,\n MAX_UNITS: 8,\n OWNER_TOKEN_QUANTITY: 1, // Owner tokens are always exactly 1\n QUALIFIER_MIN_QUANTITY: 1,\n QUALIFIER_MAX_QUANTITY: 10 // Qualifiers are limited to 1-10 units\n};\n\n/**\n * Get network configuration\n * @param {string} networkName - Network name ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n * @returns {object} Network configuration\n */\nfunction getNetworkConfig(networkName) {\n if (networkName === 'xna' || networkName === 'mainnet') {\n return NETWORKS.MAINNET;\n } else if (networkName === 'xna-test' || networkName === 'testnet') {\n return NETWORKS.TESTNET;\n } else if (networkName === 'xna-pq' || networkName === 'mainnet-pq') {\n return NETWORKS.MAINNET_PQ;\n } else if (networkName === 'xna-pq-test' || networkName === 'testnet-pq') {\n return NETWORKS.TESTNET_PQ;\n } else {\n throw new Error(`Unknown network: ${networkName}`);\n }\n}\n\n/**\n * Detect network from address prefix\n * @param {string} address - Neurai address\n * @returns {string} Network name ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n */\nfunction detectNetworkFromAddress(address) {\n if (address.startsWith(NETWORKS.MAINNET_PQ.pqAddressPrefix)) {\n return 'xna-pq';\n } else if (address.startsWith(NETWORKS.TESTNET_PQ.pqAddressPrefix)) {\n return 'xna-pq-test';\n } else if (address.startsWith('N')) {\n return 'xna';\n } else if (address.startsWith('t')) {\n return 'xna-test';\n } else {\n throw new Error(`Cannot detect network from address: ${address}`);\n }\n}\n\nmodule.exports = {\n NETWORKS,\n ASSET_NAME_RULES,\n ASSET_LIMITS,\n getNetworkConfig,\n detectNetworkFromAddress\n};\n","/**\n * Constants Module\n * Exports all constant values and configurations\n */\n\nconst { AssetType } = require('./assetTypes');\nconst { ASSET_COSTS, getAssetCost, getUniqueAssetCost, getTaggingCost } = require('./fees');\nconst {\n MAINNET_BURN_ADDRESSES,\n TESTNET_BURN_ADDRESSES,\n resolveNetworkFamily,\n getBurnAddress,\n isBurnAddress\n} = require('./burnAddresses');\nconst {\n NETWORKS,\n ASSET_NAME_RULES,\n ASSET_LIMITS,\n getNetworkConfig,\n detectNetworkFromAddress\n} = require('./networks');\n\nmodule.exports = {\n // Asset Types\n AssetType,\n\n // Fees/Costs\n ASSET_COSTS,\n getAssetCost,\n getUniqueAssetCost,\n getTaggingCost,\n\n // Burn Addresses\n MAINNET_BURN_ADDRESSES,\n TESTNET_BURN_ADDRESSES,\n resolveNetworkFamily,\n getBurnAddress,\n isBurnAddress,\n\n // Networks\n NETWORKS,\n ASSET_NAME_RULES,\n ASSET_LIMITS,\n getNetworkConfig,\n detectNetworkFromAddress\n};\n","/**\n * Burn Manager\n * Manages burn addresses and amounts for asset operations\n *\n * Each asset operation requires burning XNA to specific addresses.\n * This manager ensures correct burn addresses and amounts are used\n * based on network (mainnet/testnet) and operation type.\n */\n\nconst { getBurnAddress, getAssetCost } = require('../constants');\nconst { InsufficientBurnAmountError, InvalidBurnAddressError } = require('../errors');\n\nclass BurnManager {\n /**\n * @param {string} network - Network type ('xna' or 'xna-test')\n */\n constructor(network) {\n if (!network) {\n throw new Error('Network is required');\n }\n this.network = network;\n }\n\n /**\n * Get burn address for an operation\n * @param {string} operationType - Operation type (e.g., 'ISSUE_ROOT')\n * @returns {string} Burn address for the network\n */\n getBurnAddress(operationType) {\n return getBurnAddress(operationType, this.network);\n }\n\n /**\n * Get burn amount for an operation\n * @param {string} operationType - Operation type (e.g., 'ISSUE_ROOT')\n * @param {number} multiplier - Multiplier for operations like UNIQUE (default: 1)\n * @returns {number} Burn amount in XNA\n */\n getBurnAmount(operationType, multiplier = 1) {\n const baseCost = getAssetCost(operationType);\n return baseCost * multiplier;\n }\n\n /**\n * Get burn info (address + amount) for an operation\n * @param {string} operationType - Operation type\n * @param {number} multiplier - Multiplier (default: 1)\n * @returns {object} { address, amount }\n */\n getBurnInfo(operationType, multiplier = 1) {\n return {\n address: this.getBurnAddress(operationType),\n amount: this.getBurnAmount(operationType, multiplier)\n };\n }\n\n /**\n * Get burn info for ROOT asset issuance\n * @returns {object} { address, amount }\n */\n getIssueRootBurn() {\n return this.getBurnInfo('ISSUE_ROOT');\n }\n\n /**\n * Get burn info for SUB asset issuance\n * @returns {object} { address, amount }\n */\n getIssueSubBurn() {\n return this.getBurnInfo('ISSUE_SUB');\n }\n\n /**\n * Get burn info for UNIQUE asset issuance\n * @param {number} count - Number of unique assets to create\n * @returns {object} { address, amount }\n */\n getIssueUniqueBurn(count) {\n return this.getBurnInfo('ISSUE_UNIQUE', count);\n }\n\n /**\n * Get burn info for DEPIN asset issuance\n * DEPIN assets reuse the UNIQUE burn amount/address.\n * @returns {object} { address, amount }\n */\n getIssueDepinBurn() {\n return this.getIssueUniqueBurn(1);\n }\n\n /**\n * Get burn info for QUALIFIER asset issuance\n * @returns {object} { address, amount }\n */\n getIssueQualifierBurn() {\n return this.getBurnInfo('ISSUE_QUALIFIER');\n }\n\n /**\n * Get burn info for SUB_QUALIFIER asset issuance\n * @returns {object} { address, amount }\n */\n getIssueSubQualifierBurn() {\n return this.getBurnInfo('ISSUE_SUB_QUALIFIER');\n }\n\n /**\n * Get burn info for RESTRICTED asset issuance\n * @returns {object} { address, amount }\n */\n getIssueRestrictedBurn() {\n return this.getBurnInfo('ISSUE_RESTRICTED');\n }\n\n /**\n * Get burn info for REISSUE operation\n * @returns {object} { address, amount }\n */\n getReissueBurn() {\n return this.getBurnInfo('REISSUE');\n }\n\n /**\n * Get burn info for TAG_ADDRESS operation\n * @param {number} addressCount - Number of addresses to tag\n * @returns {object} { address, amount }\n */\n getTagAddressBurn(addressCount) {\n return this.getBurnInfo('TAG_ADDRESS', addressCount);\n }\n\n /**\n * Get burn info for UNTAG_ADDRESS operation\n * @param {number} addressCount - Number of addresses to untag\n * @returns {object} { address, amount }\n */\n getUntagAddressBurn(addressCount) {\n return this.getBurnInfo('UNTAG_ADDRESS', addressCount);\n }\n\n /**\n * Validate that burn output is correct\n * @param {object} outputs - Transaction outputs\n * @param {string} operationType - Expected operation type\n * @param {number} multiplier - Expected multiplier (default: 1)\n * @returns {boolean} True if valid\n * @throws {Error} If burn is invalid\n */\n validateBurnOutput(outputs, operationType, multiplier = 1) {\n const expectedBurn = this.getBurnInfo(operationType, multiplier);\n\n // Check if burn address exists in outputs\n const burnAmount = outputs[expectedBurn.address];\n if (burnAmount === undefined) {\n throw new InvalidBurnAddressError(\n `Expected burn to ${expectedBurn.address} not found in outputs`,\n expectedBurn.address,\n null\n );\n }\n\n // Check if burn amount is correct\n if (burnAmount !== expectedBurn.amount) {\n throw new InsufficientBurnAmountError(\n `Incorrect burn amount. Expected ${expectedBurn.amount} XNA, got ${burnAmount} XNA`,\n expectedBurn.amount,\n burnAmount\n );\n }\n\n return true;\n }\n\n /**\n * Check if an address is a burn address for this network\n * @param {string} address - Address to check\n * @returns {boolean} True if it's a burn address\n */\n isBurnAddress(address) {\n const burnTypes = [\n 'ISSUE_ROOT',\n 'ISSUE_SUB',\n 'ISSUE_UNIQUE',\n 'ISSUE_MSGCHANNEL',\n 'REISSUE',\n 'ISSUE_RESTRICTED',\n 'ISSUE_QUALIFIER',\n 'ISSUE_SUB_QUALIFIER',\n 'TAG_ADDRESS',\n 'UNTAG_ADDRESS'\n ];\n\n for (const type of burnTypes) {\n if (this.getBurnAddress(type) === address) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Get operation type from burn address\n * @param {string} address - Burn address\n * @returns {string|null} Operation type or null if not a burn address\n */\n getOperationTypeFromBurnAddress(address) {\n const burnTypes = [\n 'ISSUE_ROOT',\n 'ISSUE_SUB',\n 'ISSUE_UNIQUE',\n 'ISSUE_MSGCHANNEL',\n 'REISSUE',\n 'ISSUE_RESTRICTED',\n 'ISSUE_QUALIFIER',\n 'ISSUE_SUB_QUALIFIER',\n 'TAG_ADDRESS',\n 'UNTAG_ADDRESS'\n ];\n\n for (const type of burnTypes) {\n if (this.getBurnAddress(type) === address) {\n return type;\n }\n }\n\n return null;\n }\n}\n\nmodule.exports = BurnManager;\n","/**\n * Asset Name Parser\n * Parses and analyzes asset names\n */\n\nconst { AssetType } = require('../constants');\n\nclass AssetNameParser {\n /**\n * Parse asset name and extract information\n * @param {string} name - Asset name\n * @returns {object} Parsed information\n */\n static parse(name) {\n const isOwner = name.endsWith('!');\n const isRestricted = name.startsWith('$');\n const isQualifier = name.startsWith('#');\n const isDepin = name.startsWith('&');\n const cleanName = isOwner ? name.slice(0, -1) : name;\n\n let type;\n let parent = null;\n let subName = null;\n let tag = null;\n let prefix = null;\n\n if (isQualifier) {\n // QUALIFIER or SUB_QUALIFIER: #NAME or #ROOT/SUB\n if (cleanName.includes('/')) {\n type = AssetType.SUB_QUALIFIER;\n const withoutHash = cleanName.substring(1);\n const parts = withoutHash.split('/');\n parent = '#' + parts[0];\n subName = parts[1];\n prefix = '#';\n } else {\n type = AssetType.QUALIFIER;\n prefix = '#';\n }\n } else if (isRestricted) {\n // RESTRICTED: $NAME\n type = AssetType.RESTRICTED;\n prefix = '$';\n } else if (isDepin) {\n // DEPIN: &NAME or &NAME/SUB\n type = AssetType.DEPIN;\n prefix = '&';\n if (cleanName.includes('/')) {\n const parts = cleanName.split('/');\n parent = parts[0];\n subName = parts.slice(1).join('/');\n }\n } else if (cleanName.includes('#')) {\n // UNIQUE: ROOT#TAG\n type = AssetType.UNIQUE;\n const parts = cleanName.split('#');\n parent = parts[0];\n tag = parts[1];\n } else if (cleanName.includes('/')) {\n // SUB: ROOT/SUB\n type = AssetType.SUB;\n const parts = cleanName.split('/');\n parent = parts[0];\n subName = parts[1];\n } else {\n // ROOT\n type = AssetType.ROOT;\n }\n\n // Override type if owner token\n if (isOwner) {\n const baseType = type;\n type = AssetType.OWNER;\n return {\n type,\n baseType,\n parent,\n name: cleanName,\n subName,\n tag,\n prefix,\n isOwner: true,\n isRestricted: cleanName.startsWith('$'),\n isDepin: cleanName.startsWith('&'),\n isQualifier: false,\n fullName: name,\n baseName: cleanName\n };\n }\n\n return {\n type,\n parent,\n name: cleanName,\n subName,\n tag,\n prefix,\n isOwner,\n isRestricted,\n isDepin,\n isQualifier,\n fullName: name,\n baseName: cleanName\n };\n }\n\n /**\n * Get asset type from name\n * @param {string} name - Asset name\n * @returns {number} AssetType enum value\n */\n static getType(name) {\n return this.parse(name).type;\n }\n\n /**\n * Get parent asset name\n * @param {string} name - Asset name\n * @returns {string|null} Parent asset name or null\n */\n static getParent(name) {\n return this.parse(name).parent;\n }\n\n /**\n * Check if asset is an owner token\n * @param {string} name - Asset name\n * @returns {boolean} True if owner token\n */\n static isOwnerToken(name) {\n return name.endsWith('!');\n }\n\n /**\n * Get owner token name for an asset\n * @param {string} assetName - Asset name\n * @returns {string} Owner token name (assetName + '!')\n */\n static getOwnerTokenName(assetName) {\n if (this.isOwnerToken(assetName)) {\n return assetName;\n }\n if (this.isRestricted(assetName)) {\n return assetName.slice(1) + '!';\n }\n return assetName + '!';\n }\n\n /**\n * Get base asset name from owner token\n * @param {string} ownerTokenName - Owner token name (with !)\n * @returns {string} Base asset name (without !)\n */\n static getBaseAssetName(ownerTokenName) {\n if (this.isOwnerToken(ownerTokenName)) {\n return ownerTokenName.slice(0, -1);\n }\n return ownerTokenName;\n }\n\n /**\n * Check if asset is restricted\n * @param {string} name - Asset name\n * @returns {boolean} True if restricted\n */\n static isRestricted(name) {\n return name.startsWith('$');\n }\n\n /**\n * Check if asset is a qualifier\n * @param {string} name - Asset name\n * @returns {boolean} True if qualifier\n */\n static isQualifier(name) {\n return name.startsWith('#');\n }\n\n /**\n * Check if asset is unique (NFT)\n * @param {string} name - Asset name\n * @returns {boolean} True if unique\n */\n static isUnique(name) {\n return name.includes('#') && !name.startsWith('#');\n }\n\n /**\n * Check if asset is a sub-asset\n * @param {string} name - Asset name\n * @returns {boolean} True if sub-asset\n */\n static isSub(name) {\n return name.includes('/') && !name.startsWith('#') && !name.startsWith('&');\n }\n\n /**\n * Check if asset is a DEPIN asset\n * @param {string} name - Asset name\n * @returns {boolean} True if DEPIN\n */\n static isDepin(name) {\n return name.startsWith('&');\n }\n\n /**\n * Build unique asset name\n * @param {string} rootName - Root asset name\n * @param {string} tag - Unique tag\n * @returns {string} Full unique asset name\n */\n static buildUniqueName(rootName, tag) {\n return `${rootName}#${tag}`;\n }\n\n /**\n * Build sub-asset name\n * @param {string} rootName - Root asset name\n * @param {string} subName - Sub-asset name\n * @returns {string} Full sub-asset name\n */\n static buildSubName(rootName, subName) {\n return `${rootName}/${subName}`;\n }\n}\n\nmodule.exports = AssetNameParser;\n","/**\n * Amount Converter\n * Converts between user amounts and satoshis (protocol internal format)\n */\n\nclass AmountConverter {\n /**\n * Convert user amount to satoshis\n * @param {number} amount - User-friendly amount (e.g., 1.5)\n * @param {number} units - Decimal places (0-8)\n * @returns {number} Amount in satoshis\n */\n static toSatoshis(amount, units) {\n if (typeof amount !== 'number' || isNaN(amount)) {\n throw new Error('Amount must be a valid number');\n }\n\n if (typeof units !== 'number' || isNaN(units) || units < 0 || units > 8) {\n throw new Error('Units must be a number between 0 and 8');\n }\n\n // Calculate multiplier\n const multiplier = Math.pow(10, units);\n\n // Convert to satoshis and round to avoid floating point issues\n const satoshis = Math.round(amount * multiplier);\n\n return satoshis;\n }\n\n /**\n * Convert satoshis to user amount\n * @param {number} satoshis - Amount in satoshis\n * @param {number} units - Decimal places (0-8)\n * @returns {number} User-friendly amount\n */\n static fromSatoshis(satoshis, units) {\n if (typeof satoshis !== 'number' || isNaN(satoshis)) {\n throw new Error('Satoshis must be a valid number');\n }\n\n if (typeof units !== 'number' || isNaN(units) || units < 0 || units > 8) {\n throw new Error('Units must be a number between 0 and 8');\n }\n\n // Calculate divisor\n const divisor = Math.pow(10, units);\n\n // Convert to user amount\n const amount = satoshis / divisor;\n\n return amount;\n }\n\n /**\n * Format amount with proper decimal places\n * @param {number} amount - Amount to format\n * @param {number} units - Decimal places\n * @returns {string} Formatted amount\n */\n static format(amount, units) {\n if (units === 0) {\n return amount.toString();\n }\n\n return amount.toFixed(units);\n }\n\n /**\n * Parse formatted amount string\n * @param {string} formattedAmount - Formatted amount string\n * @returns {number} Parsed amount\n */\n static parse(formattedAmount) {\n const num = parseFloat(formattedAmount);\n if (isNaN(num)) {\n throw new Error('Invalid number format');\n }\n return num;\n }\n\n /**\n * Get decimal places from amount\n * @param {number} amount - Amount to check\n * @returns {number} Number of decimal places\n */\n static getDecimalPlaces(amount) {\n const match = ('' + amount).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) return 0;\n return Math.max(\n 0,\n (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0)\n );\n }\n\n /**\n * Adjust amount to proper units\n * If amount has more decimals than units allow, round it\n * @param {number} amount - Amount to adjust\n * @param {number} units - Target decimal places\n * @returns {number} Adjusted amount\n */\n static adjustToUnits(amount, units) {\n const decimalPlaces = this.getDecimalPlaces(amount);\n if (decimalPlaces <= units) {\n return amount;\n }\n\n // Round to units decimal places\n const multiplier = Math.pow(10, units);\n return Math.round(amount * multiplier) / multiplier;\n }\n}\n\nmodule.exports = AmountConverter;\n","/**\n * Network Detector\n * Detects network type from various sources\n */\n\nconst { NETWORKS } = require('../constants');\n\nclass NetworkDetector {\n /**\n * Detect network from RPC client\n * Calls getblockchaininfo to determine network\n * @param {Function} rpc - RPC function\n * @returns {Promise<string>} Network name ('xna' or 'xna-test')\n */\n static async detectFromRPC(rpc) {\n try {\n const blockchainInfo = await rpc('getblockchaininfo', []);\n\n // Check chain name\n if (blockchainInfo.chain === 'main') {\n return 'xna';\n } else if (blockchainInfo.chain === 'test') {\n return 'xna-test';\n } else if (blockchainInfo.chain === 'regtest') {\n return 'xna-test'; // Treat regtest as testnet\n }\n\n // Fallback: check if testnet field exists\n if (blockchainInfo.testnet === true) {\n return 'xna-test';\n }\n\n // Default to mainnet\n return 'xna';\n } catch (error) {\n throw new Error(`Failed to detect network from RPC: ${error.message}`);\n }\n }\n\n /**\n * Detect network from address\n * @param {string} address - Neurai address\n * @returns {string} Network name ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n */\n static detectFromAddress(address) {\n if (!address || typeof address !== 'string') {\n throw new Error('Address must be a non-empty string');\n }\n\n if (address.startsWith(NETWORKS.MAINNET_PQ.pqAddressPrefix)) {\n return 'xna-pq';\n }\n\n if (address.startsWith(NETWORKS.TESTNET_PQ.pqAddressPrefix)) {\n return 'xna-pq-test';\n }\n\n // Mainnet addresses start with 'N'\n if (address.startsWith(NETWORKS.MAINNET.addressPrefix)) {\n return 'xna';\n }\n\n // Testnet addresses start with 't' (prefix byte 0x7f = 127)\n if (address.startsWith(NETWORKS.TESTNET.addressPrefix)) {\n return 'xna-test';\n }\n\n throw new Error(`Cannot detect network from address: ${address}`);\n }\n\n /**\n * Detect network from multiple addresses\n * @param {string[]} addresses - Array of addresses\n * @returns {string} Network name ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n */\n static detectFromAddresses(addresses) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses must be a non-empty array');\n }\n\n // Detect from first address\n const network = this.detectFromAddress(addresses[0]);\n\n // Verify all addresses are from the same network\n for (let i = 1; i < addresses.length; i++) {\n const otherNetwork = this.detectFromAddress(addresses[i]);\n if (otherNetwork !== network) {\n throw new Error(`Mixed network addresses detected: ${network} and ${otherNetwork}`);\n }\n }\n\n return network;\n }\n\n /**\n * Validate that addresses match expected network\n * @param {string[]} addresses - Array of addresses\n * @param {string} expectedNetwork - Expected network ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n * @returns {boolean} True if all addresses match network\n */\n static validateAddressesNetwork(addresses, expectedNetwork) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses must be a non-empty array');\n }\n\n for (const address of addresses) {\n const network = this.detectFromAddress(address);\n if (network !== expectedNetwork) {\n throw new Error(\n `Address ${address} is from ${network} but expected ${expectedNetwork}`\n );\n }\n }\n\n return true;\n }\n\n /**\n * Get network config from network name\n * @param {string} network - Network name\n * @returns {object} Network configuration\n */\n static getNetworkConfig(network) {\n if (network === 'xna' || network === 'mainnet') {\n return NETWORKS.MAINNET;\n } else if (network === 'xna-test' || network === 'testnet') {\n return NETWORKS.TESTNET;\n } else if (network === 'xna-pq' || network === 'mainnet-pq') {\n return NETWORKS.MAINNET_PQ;\n } else if (network === 'xna-pq-test' || network === 'testnet-pq') {\n return NETWORKS.TESTNET_PQ;\n } else {\n throw new Error(`Unknown network: ${network}`);\n }\n }\n\n /**\n * Check if network is mainnet\n * @param {string} network - Network name\n * @returns {boolean} True if mainnet\n */\n static isMainnet(network) {\n return network === 'xna' || network === 'mainnet' || network === 'xna-pq' || network === 'mainnet-pq';\n }\n\n /**\n * Check if network is testnet\n * @param {string} network - Network name\n * @returns {boolean} True if testnet\n */\n static isTestnet(network) {\n return network === 'xna-test' ||\n network === 'testnet' ||\n network === 'regtest' ||\n network === 'xna-pq-test' ||\n network === 'testnet-pq';\n }\n}\n\nmodule.exports = NetworkDetector;\n","/**\n * Output Formatter\n * Formats outputs for createrawtransaction RPC calls\n */\n\nclass OutputFormatter {\n /**\n * Format issue operation output\n * @param {object} params - Issue parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatIssueOutput(params) {\n const {\n asset_name,\n asset_quantity,\n units,\n reissuable,\n has_ipfs,\n ipfs_hash\n } = params;\n\n return {\n issue: {\n asset_name,\n asset_quantity,\n units,\n reissuable: reissuable ? 1 : 0,\n has_ipfs: has_ipfs ? 1 : 0,\n ipfs_hash: ipfs_hash || ''\n }\n };\n }\n\n /**\n * Format issue unique operation output\n * @param {object} params - Issue unique parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatIssueUniqueOutput(params) {\n const { root_name, asset_tags, ipfs_hashes } = params;\n\n const output = {\n issue_unique: {\n root_name,\n asset_tags\n }\n };\n\n if (ipfs_hashes && ipfs_hashes.length > 0) {\n output.issue_unique.ipfs_hashes = ipfs_hashes;\n }\n\n return output;\n }\n\n /**\n * Format issue restricted operation output\n * @param {object} params - Issue restricted parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatIssueRestrictedOutput(params) {\n const {\n asset_name,\n asset_quantity,\n verifier_string,\n units,\n reissuable,\n has_ipfs,\n ipfs_hash,\n owner_change_address\n } = params;\n\n const output = {\n issue_restricted: {\n asset_name,\n asset_quantity,\n verifier_string,\n units,\n reissuable: reissuable ? 1 : 0,\n has_ipfs: has_ipfs ? 1 : 0,\n ipfs_hash: ipfs_hash || ''\n }\n };\n\n if (owner_change_address) {\n output.issue_restricted.owner_change_address = owner_change_address;\n }\n\n return output;\n }\n\n /**\n * Format issue qualifier operation output\n * @param {object} params - Issue qualifier parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatIssueQualifierOutput(params) {\n const {\n asset_name,\n asset_quantity,\n has_ipfs,\n ipfs_hash,\n root_change_address,\n change_quantity\n } = params;\n\n const output = {\n issue_qualifier: {\n asset_name,\n asset_quantity,\n has_ipfs: has_ipfs ? 1 : 0,\n ipfs_hash: ipfs_hash || ''\n }\n };\n\n if (root_change_address) {\n output.issue_qualifier.root_change_address = root_change_address;\n }\n\n if (change_quantity !== undefined && change_quantity !== null) {\n output.issue_qualifier.change_quantity = change_quantity;\n }\n\n return output;\n }\n\n /**\n * Format reissue operation output\n * @param {object} params - Reissue parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatReissueOutput(params) {\n const {\n asset_name,\n asset_quantity,\n reissuable,\n new_ipfs,\n owner_change_address\n } = params;\n\n const output = {\n reissue: {\n asset_name,\n asset_quantity\n }\n };\n\n // Optional parameters\n if (reissuable !== undefined) {\n output.reissue.reissuable = reissuable ? 1 : 0;\n }\n\n if (new_ipfs) {\n output.reissue.ipfs_hash = new_ipfs;\n }\n\n if (owner_change_address) {\n output.reissue.owner_change_address = owner_change_address;\n }\n\n return output;\n }\n\n /**\n * Format reissue restricted operation output\n * @param {object} params - Reissue restricted parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatReissueRestrictedOutput(params) {\n const {\n asset_name,\n asset_quantity,\n change_verifier,\n new_verifier,\n reissuable,\n new_ipfs,\n owner_change_address\n } = params;\n\n const output = {\n reissue_restricted: {\n asset_name,\n asset_quantity\n }\n };\n\n // Optional parameters\n if (change_verifier && new_verifier) {\n output.reissue_restricted.verifier_string = new_verifier;\n }\n\n if (reissuable !== undefined) {\n output.reissue_restricted.reissuable = reissuable ? 1 : 0;\n }\n\n if (new_ipfs) {\n output.reissue_restricted.ipfs_hash = new_ipfs;\n }\n\n if (owner_change_address) {\n output.reissue_restricted.owner_change_address = owner_change_address;\n }\n\n return output;\n }\n\n /**\n * Format asset transfer output\n * @param {string} assetName - Asset name\n * @param {number} amount - Amount to transfer\n * @returns {object} Formatted transfer output\n */\n static formatTransferOutput(assetName, amount) {\n return {\n transfer: {\n [assetName]: amount\n }\n };\n }\n\n /**\n * Format tag addresses operation output\n * @param {object} params - Tag addresses parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatTagAddressesOutput(params) {\n const {\n qualifier,\n addresses,\n change_quantity\n } = params;\n\n const output = {\n tag_addresses: {\n qualifier,\n addresses\n }\n };\n\n if (change_quantity !== undefined && change_quantity !== null) {\n output.tag_addresses.change_quantity = change_quantity;\n }\n\n return output;\n }\n\n /**\n * Format untag addresses operation output\n * @param {object} params - Untag addresses parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatUntagAddressesOutput(params) {\n const {\n qualifier,\n addresses,\n change_quantity\n } = params;\n\n const output = {\n untag_addresses: {\n qualifier,\n addresses\n }\n };\n\n if (change_quantity !== undefined && change_quantity !== null) {\n output.untag_addresses.change_quantity = change_quantity;\n }\n\n return output;\n }\n\n /**\n * Format freeze addresses operation output\n * @param {object} params - Freeze addresses parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatFreezeAddressesOutput(params) {\n const {\n asset_name,\n addresses\n } = params;\n\n return {\n freeze_addresses: {\n asset_name,\n addresses\n }\n };\n }\n\n /**\n * Format unfreeze addresses operation output\n * @param {object} params - Unfreeze addresses parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatUnfreezeAddressesOutput(params) {\n const {\n asset_name,\n addresses\n } = params;\n\n return {\n unfreeze_addresses: {\n asset_name,\n addresses\n }\n };\n }\n\n /**\n * Format freeze asset operation output\n * @param {string} assetName - Restricted asset name\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatFreezeAssetOutput(assetName) {\n return {\n freeze_asset: {\n asset_name: assetName\n }\n };\n }\n\n /**\n * Format unfreeze asset operation output\n * @param {string} assetName - Restricted asset name\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatUnfreezeAssetOutput(assetName) {\n return {\n unfreeze_asset: {\n asset_name: assetName\n }\n };\n }\n}\n\nmodule.exports = OutputFormatter;\n","/**\n * Utils Module\n * Exports all utility classes\n */\n\nconst AssetNameParser = require('./assetNameParser');\nconst AmountConverter = require('./amountConverter');\nconst NetworkDetector = require('./networkDetector');\nconst OutputFormatter = require('./outputFormatter');\n\nmodule.exports = {\n AssetNameParser,\n AmountConverter,\n NetworkDetector,\n OutputFormatter\n};\n","/**\n * Owner Token Manager\n * CRITICAL: Manages owner token UTXOs and ensures they are properly returned\n *\n * Owner tokens (ASSET!) are required for:\n * - Reissuing assets\n * - Creating sub-assets\n * - Managing restricted assets (freeze/unfreeze)\n *\n * WARNING: If an owner token is not included in transaction outputs,\n * it will be PERMANENTLY LOST and the asset can never be reissued or managed.\n */\n\nconst { AssetNameParser } = require('../utils');\nconst {\n OwnerTokenNotFoundError,\n OwnerTokenNotReturnedError,\n AssetError\n} = require('../errors');\n\nclass OwnerTokenManager {\n /**\n * @param {Function} rpc - RPC function to call Neurai node\n */\n constructor(rpc) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n this.rpc = rpc;\n }\n\n /**\n * Find owner token UTXO in wallet addresses\n * @param {string} ownerTokenName - Owner token name (e.g., 'MYTOKEN!')\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<object>} Owner token UTXO\n * @throws {OwnerTokenNotFoundError} If owner token not found\n */\n async findOwnerTokenUTXO(ownerTokenName, addresses) {\n if (!ownerTokenName || !ownerTokenName.endsWith('!')) {\n throw new Error('Owner token name must end with !');\n }\n\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses array is required');\n }\n\n try {\n // Request UTXOs for the specific owner token via assetName param\n const utxos = await this.rpc('getaddressutxos', [{ addresses, assetName: ownerTokenName }]);\n\n // Filter for the specific owner token\n const ownerTokenUTXOs = utxos.filter(utxo => utxo.assetName === ownerTokenName);\n\n if (ownerTokenUTXOs.length === 0) {\n throw new OwnerTokenNotFoundError(\n `Owner token ${ownerTokenName} not found in wallet addresses. ` +\n `You must own the owner token to perform this operation.`,\n ownerTokenName\n );\n }\n\n // Owner tokens should be indivisible (only 1 UTXO typically)\n // But if split, return the first one found\n return ownerTokenUTXOs[0];\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw error;\n }\n\n throw new AssetError(\n `Failed to find owner token ${ownerTokenName}: ${error.message}`\n );\n }\n }\n\n /**\n * Find owner token UTXO by base asset name\n * @param {string} assetName - Base asset name (without !)\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<object>} Owner token UTXO\n */\n async findOwnerTokenByAssetName(assetName, addresses) {\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n return this.findOwnerTokenUTXO(ownerTokenName, addresses);\n }\n\n /**\n * Create owner token return output\n * Owner tokens must always be returned to an address or they're lost forever\n *\n * @param {string} ownerTokenName - Owner token name (e.g., 'MYTOKEN!')\n * @param {string} returnAddress - Address to return owner token to\n * @returns {object} Output object for owner token transfer\n */\n createOwnerTokenReturnOutput(ownerTokenName, returnAddress) {\n if (!ownerTokenName || !ownerTokenName.endsWith('!')) {\n throw new Error('Owner token name must end with !');\n }\n\n if (!returnAddress) {\n throw new Error('Return address is required');\n }\n\n // Owner tokens are always exactly 1.0\n return {\n [returnAddress]: {\n transfer: {\n [ownerTokenName]: 1.0\n }\n }\n };\n }\n\n /**\n * Validate that owner token inputs are properly returned in outputs\n * CRITICAL: This prevents permanent loss of owner tokens\n *\n * @param {Array} inputs - Transaction inputs\n * @param {object} outputs - Transaction outputs\n * @returns {boolean} True if valid\n * @throws {OwnerTokenNotReturnedError} If owner token not returned\n */\n validateOwnerTokenReturn(inputs, outputs) {\n // Find all owner token inputs\n const ownerTokenInputs = inputs.filter(input => {\n return input.assetName && input.assetName.endsWith('!');\n });\n\n // If no owner tokens in inputs, validation passes\n if (ownerTokenInputs.length === 0) {\n return true;\n }\n\n // Check each owner token is in outputs\n const outputEntries = Array.isArray(outputs)\n ? outputs.map(obj => Object.entries(obj)[0])\n : Object.entries(outputs);\n\n for (const ownerInput of ownerTokenInputs) {\n const ownerTokenName = ownerInput.assetName;\n let foundInOutputs = false;\n\n // Check all outputs for owner token\n for (const [address, output] of outputEntries) {\n // Check if output has transfer field\n if (output && typeof output === 'object' && output.transfer) {\n // Check if owner token is in the transfer\n if (output.transfer[ownerTokenName]) {\n foundInOutputs = true;\n break;\n }\n }\n }\n\n if (!foundInOutputs) {\n throw new OwnerTokenNotReturnedError(\n `CRITICAL: Owner token ${ownerTokenName} is not returned in outputs! ` +\n `This will result in PERMANENT LOSS of the owner token and you will ` +\n `never be able to reissue or manage this asset again. ` +\n `The owner token MUST be included in the transaction outputs.`,\n ownerTokenName\n );\n }\n }\n\n return true;\n }\n\n /**\n * Check if wallet owns an owner token\n * @param {string} ownerTokenName - Owner token name (e.g., 'MYTOKEN!')\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<boolean>} True if wallet owns the owner token\n */\n async hasOwnerToken(ownerTokenName, addresses) {\n try {\n await this.findOwnerTokenUTXO(ownerTokenName, addresses);\n return true;\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * Get all owner tokens in wallet\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<Array>} Array of owner token UTXOs\n */\n async getAllOwnerTokens(addresses) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses array is required');\n }\n\n try {\n // Request all asset UTXOs with assetName='*'\n const utxos = await this.rpc('getaddressutxos', [{ addresses, assetName: '*' }]);\n\n // Filter for owner tokens (asset names ending with !)\n const ownerTokenUTXOs = utxos.filter(utxo => {\n return utxo.assetName && utxo.assetName.endsWith('!');\n });\n\n return ownerTokenUTXOs;\n } catch (error) {\n throw new AssetError(\n `Failed to get owner tokens: ${error.message}`\n );\n }\n }\n\n /**\n * Verify owner token quantity is correct (always 1)\n * @param {object} ownerTokenUTXO - Owner token UTXO\n * @returns {boolean} True if valid\n * @throws {Error} If quantity is not 1\n */\n validateOwnerTokenQuantity(ownerTokenUTXO) {\n // Owner tokens should always have satoshis = 100000000 (1.0 with 8 decimals)\n const expectedSatoshis = 100000000;\n\n if (ownerTokenUTXO.satoshis !== expectedSatoshis) {\n throw new Error(\n `Invalid owner token quantity. Expected ${expectedSatoshis} satoshis, ` +\n `got ${ownerTokenUTXO.satoshis}. Owner tokens must always be exactly 1.0`\n );\n }\n\n return true;\n }\n\n /**\n * Add owner token input and output to transaction\n * Convenience method that handles both finding and returning owner token\n *\n * @param {string} assetName - Base asset name (without !)\n * @param {string[]} addresses - Wallet addresses\n * @param {string} returnAddress - Address to return owner token to\n * @returns {Promise<object>} { input, output }\n */\n async prepareOwnerTokenForTransaction(assetName, addresses, returnAddress) {\n // Find owner token UTXO\n const ownerTokenUTXO = await this.findOwnerTokenByAssetName(assetName, addresses);\n\n // Validate quantity\n this.validateOwnerTokenQuantity(ownerTokenUTXO);\n\n // Create input\n const input = {\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n };\n\n // Create output\n const output = this.createOwnerTokenReturnOutput(\n ownerTokenUTXO.assetName,\n returnAddress\n );\n\n return { input, output, utxo: ownerTokenUTXO };\n }\n}\n\nmodule.exports = OwnerTokenManager;\n","/**\n * UTXO Selector\n * Selects appropriate UTXOs for asset transactions\n *\n * Handles selection of:\n * - Base currency (XNA) UTXOs for fees and burns\n * - Asset UTXOs for transfers and operations\n * - Mempool filtering to prevent double-spending\n */\n\nconst { InsufficientFundsError } = require('../errors');\n\nclass UTXOSelector {\n /**\n * @param {Function} rpc - RPC function to call Neurai node\n */\n constructor(rpc) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n this.rpc = rpc;\n }\n\n /**\n * Get all UTXOs for addresses\n * @param {string[]} addresses - Array of wallet addresses\n * @param {string|null} assetName - Filter by asset name (null for XNA)\n * @returns {Promise<Array>} Array of UTXOs\n */\n async getUTXOs(addresses, assetName = null) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses array is required');\n }\n\n try {\n // assetName goes inside the params object; omit it for XNA UTXOs\n const queryParams = assetName ? { addresses, assetName } : { addresses };\n const utxos = await this.rpc('getaddressutxos', [queryParams]);\n\n // Filter for specific asset or XNA\n if (assetName) {\n return utxos.filter(utxo => utxo.assetName === assetName);\n } else {\n // XNA UTXOs don't have assetName or have assetName === 'XNA'\n return utxos.filter(utxo => !utxo.assetName || utxo.assetName === 'XNA');\n }\n } catch (error) {\n throw new Error(`Failed to get UTXOs: ${error.message}`);\n }\n }\n\n /**\n * Get mempool entries for addresses\n * Used to filter out UTXOs that are already being spent\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<Array>} Array of mempool entries\n */\n async getMempoolEntries(addresses) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses array is required');\n }\n\n try {\n const mempool = await this.rpc('getaddressmempool', [{ addresses }]);\n return mempool || [];\n } catch (error) {\n // If RPC method not available, return empty array\n return [];\n }\n }\n\n /**\n * Filter out UTXOs that are being spent in mempool\n * @param {Array} utxos - Array of UTXOs\n * @param {Array} mempoolEntries - Array of mempool entries\n * @returns {Array} Filtered UTXOs\n */\n filterMempoolSpentUTXOs(utxos, mempoolEntries) {\n if (mempoolEntries.length === 0) {\n return utxos;\n }\n\n return utxos.filter(utxo => {\n // Check if this UTXO is being spent in mempool\n const isSpent = mempoolEntries.some(entry => {\n return entry.prevtxid === utxo.txid && entry.prevout === utxo.outputIndex;\n });\n\n return !isSpent;\n });\n }\n\n /**\n * Select UTXOs for base currency (XNA)\n * Uses greedy algorithm: selects UTXOs until sum >= required amount\n *\n * @param {string[]} addresses - Wallet addresses\n * @param {number} requiredAmount - Required amount in XNA\n * @param {number} buffer - Safety buffer percentage (default: 0.1 = 10%)\n * @returns {Promise<object>} { utxos, totalAmount }\n * @throws {InsufficientFundsError} If not enough funds\n */\n async selectBaseCurrencyUTXOs(addresses, requiredAmount, buffer = 0.1) {\n // Get all XNA UTXOs\n const allUTXOs = await this.getUTXOs(addresses, null);\n\n // Get mempool and filter\n const mempool = await this.getMempoolEntries(addresses);\n const availableUTXOs = this.filterMempoolSpentUTXOs(allUTXOs, mempool);\n\n // Sort by value (largest first) for efficiency\n const sortedUTXOs = availableUTXOs.sort((a, b) => b.satoshis - a.satoshis);\n\n // Add buffer to required amount\n const requiredWithBuffer = requiredAmount * (1 + buffer);\n\n // Select UTXOs greedily\n const selected = [];\n let totalSatoshis = 0;\n const requiredSatoshis = Math.ceil(requiredWithBuffer * 100000000); // Convert XNA to satoshis\n\n for (const utxo of sortedUTXOs) {\n selected.push(utxo);\n totalSatoshis += utxo.satoshis;\n\n if (totalSatoshis >= requiredSatoshis) {\n break;\n }\n }\n\n // Check if we have enough\n if (totalSatoshis < requiredSatoshis) {\n const available = totalSatoshis / 100000000;\n throw new InsufficientFundsError(\n `Insufficient XNA balance. Required: ${requiredAmount.toFixed(8)} XNA (+ ${(buffer * 100).toFixed(0)}% buffer), ` +\n `Available: ${available.toFixed(8)} XNA`,\n requiredAmount,\n available\n );\n }\n\n return {\n utxos: selected,\n totalAmount: totalSatoshis / 100000000\n };\n }\n\n /**\n * Select UTXOs for asset transfer\n * @param {string[]} addresses - Wallet addresses\n * @param {string} assetName - Asset name\n * @param {number} requiredAmount - Required amount (in asset units)\n * @returns {Promise<object>} { utxos, totalAmount }\n * @throws {InsufficientFundsError} If not enough asset balance\n */\n async selectAssetUTXOs(addresses, assetName, requiredAmount) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n // Get all asset UTXOs\n const allUTXOs = await this.getUTXOs(addresses, assetName);\n\n // Get mempool and filter\n const mempool = await this.getMempoolEntries(addresses);\n const availableUTXOs = this.filterMempoolSpentUTXOs(allUTXOs, mempool);\n\n // Sort by value (largest first)\n const sortedUTXOs = availableUTXOs.sort((a, b) => b.satoshis - a.satoshis);\n\n // Select UTXOs greedily\n const selected = [];\n let totalSatoshis = 0;\n const requiredSatoshis = Math.ceil(requiredAmount * 100000000); // Assuming 8 decimals\n\n for (const utxo of sortedUTXOs) {\n selected.push(utxo);\n totalSatoshis += utxo.satoshis;\n\n if (totalSatoshis >= requiredSatoshis) {\n break;\n }\n }\n\n // Check if we have enough\n if (totalSatoshis < requiredSatoshis) {\n const available = totalSatoshis / 100000000;\n throw new InsufficientFundsError(\n `Insufficient ${assetName} balance. Required: ${requiredAmount}, Available: ${available}`,\n requiredAmount,\n available\n );\n }\n\n return {\n utxos: selected,\n totalAmount: totalSatoshis / 100000000\n };\n }\n\n /**\n * Select UTXOs for a transaction requiring both XNA and assets\n * @param {string[]} addresses - Wallet addresses\n * @param {number} xnaAmount - Required XNA amount\n * @param {string|null} assetName - Asset name (null if not needed)\n * @param {number} assetAmount - Required asset amount\n * @returns {Promise<object>} { xnaUTXOs, assetUTXOs, totalXNA, totalAsset }\n */\n async selectMixedUTXOs(addresses, xnaAmount, assetName = null, assetAmount = 0) {\n const result = {\n xnaUTXOs: [],\n assetUTXOs: [],\n totalXNA: 0,\n totalAsset: 0\n };\n\n // Select XNA UTXOs if needed\n if (xnaAmount > 0) {\n const xnaSelection = await this.selectBaseCurrencyUTXOs(addresses, xnaAmount);\n result.xnaUTXOs = xnaSelection.utxos;\n result.totalXNA = xnaSelection.totalAmount;\n }\n\n // Select asset UTXOs if needed\n if (assetName && assetAmount > 0) {\n const assetSelection = await this.selectAssetUTXOs(addresses, assetName, assetAmount);\n result.assetUTXOs = assetSelection.utxos;\n result.totalAsset = assetSelection.totalAmount;\n }\n\n return result;\n }\n\n /**\n * Get total balance for an asset\n * @param {string[]} addresses - Wallet addresses\n * @param {string|null} assetName - Asset name (null for XNA)\n * @returns {Promise<number>} Total balance\n */\n async getBalance(addresses, assetName = null) {\n const utxos = await this.getUTXOs(addresses, assetName);\n const mempool = await this.getMempoolEntries(addresses);\n const availableUTXOs = this.filterMempoolSpentUTXOs(utxos, mempool);\n\n const totalSatoshis = availableUTXOs.reduce((sum, utxo) => sum + utxo.satoshis, 0);\n return totalSatoshis / 100000000;\n }\n\n /**\n * Estimate transaction size in bytes\n * Used for fee calculation\n *\n * @param {number} inputCount - Number of inputs\n * @param {number} outputCount - Number of outputs\n * @returns {number} Estimated size in bytes\n */\n estimateTransactionSize(inputCount, outputCount) {\n // Rough estimation:\n // - Each input: ~180 bytes\n // - Each output: ~34 bytes\n // - Transaction overhead: ~10 bytes\n const inputSize = inputCount * 180;\n const outputSize = outputCount * 34;\n const overhead = 10;\n\n return inputSize + outputSize + overhead;\n }\n\n /**\n * Estimate fee for a transaction\n * @param {number} inputCount - Number of inputs\n * @param {number} outputCount - Number of outputs\n * @param {number} feeRate - Fee rate in XNA per KB (default: 0.015)\n * @returns {number} Estimated fee in XNA\n */\n estimateFee(inputCount, outputCount, feeRate = 0.015) {\n const sizeBytes = this.estimateTransactionSize(inputCount, outputCount);\n const sizeKB = sizeBytes / 1000;\n const fee = sizeKB * feeRate;\n\n // Round up to 8 decimals\n return Math.ceil(fee * 100000000) / 100000000;\n }\n\n /**\n * Get fee rate from network\n * @param {number} confirmationTarget - Target confirmations (default: 20)\n * @returns {Promise<number>} Fee rate in XNA per KB\n */\n async getFeeRate(confirmationTarget = 20) {\n try {\n const result = await this.rpc('estimatesmartfee', [confirmationTarget]);\n\n if (result && result.feerate && result.feerate > 0) {\n return result.feerate;\n }\n\n // Fallback to default\n return 0.015;\n } catch (error) {\n // Fallback to default if estimation fails\n return 0.015;\n }\n }\n}\n\nmodule.exports = UTXOSelector;\n","/**\n * Output Orderer\n * Orders transaction outputs according to Neurai protocol requirements\n *\n * CRITICAL: Output ordering is mandatory for asset transactions\n *\n * Correct order:\n * 1. All XNA outputs (burn addresses + change) FIRST\n * 2. Owner token change outputs SECOND\n * 3. Asset operations (issue, reissue, transfer, etc.) LAST\n *\n * Incorrect ordering will cause transaction rejection by the network.\n */\n\nconst { AssetNameParser } = require('../utils');\n\nclass OutputOrderer {\n /**\n * Order outputs according to protocol requirements\n * @param {object|Array} outputs - Unordered outputs object or array of single-key objects\n * @returns {Array} Ordered array of single-key output objects\n */\n order(outputs) {\n // Normalize to array of {address, value} pairs\n let pairs;\n if (Array.isArray(outputs)) {\n pairs = outputs.map(obj => {\n const [address, value] = Object.entries(obj)[0];\n return { address, value };\n });\n } else if (outputs && typeof outputs === 'object') {\n pairs = Object.entries(outputs).map(([address, value]) => ({ address, value }));\n } else {\n throw new Error('Outputs must be an object or array');\n }\n\n // Categorize\n const xnaOutputs = [];\n const ownerOutputs = [];\n const assetOutputs = [];\n\n for (const { address, value } of pairs) {\n if (typeof value === 'number') {\n xnaOutputs.push({ address, value });\n } else if (typeof value === 'object') {\n if (value.transfer && this.isOwnerTokenTransfer(value.transfer)) {\n ownerOutputs.push({ address, value });\n } else {\n assetOutputs.push({ address, value });\n }\n }\n }\n\n // Return ordered array of single-key objects\n return [\n ...xnaOutputs.map(({ address, value }) => ({ [address]: value })),\n ...ownerOutputs.map(({ address, value }) => ({ [address]: value })),\n ...assetOutputs.map(({ address, value }) => ({ [address]: value })),\n ];\n }\n\n /**\n * Check if a transfer output contains an owner token\n * @param {object} transfer - Transfer object\n * @returns {boolean} True if contains owner token\n */\n isOwnerTokenTransfer(transfer) {\n if (!transfer || typeof transfer !== 'object') {\n return false;\n }\n\n // Check if any asset name in transfer ends with '!'\n return Object.keys(transfer).some(assetName => {\n return AssetNameParser.isOwnerToken(assetName);\n });\n }\n\n /**\n * Validate output ordering\n * Ensures outputs are in correct order\n *\n * @param {object} outputs - Outputs to validate\n * @returns {boolean} True if valid\n * @throws {Error} If ordering is invalid\n */\n validateOrdering(outputs) {\n const entries = Array.isArray(outputs)\n ? outputs.map(obj => Object.entries(obj)[0])\n : Object.entries(outputs);\n let currentCategory = 0; // 0 = not started, 1 = XNA, 2 = owner, 3 = assets\n\n for (const [address, value] of entries) {\n let category;\n\n if (typeof value === 'number') {\n category = 1; // XNA\n } else if (value.transfer && this.isOwnerTokenTransfer(value.transfer)) {\n category = 2; // Owner token\n } else {\n category = 3; // Asset operation/transfer\n }\n\n // Check if we're going backwards in category order\n if (category < currentCategory) {\n throw new Error(\n 'Invalid output ordering. Outputs must be ordered as: ' +\n '1) XNA outputs, 2) Owner token outputs, 3) Asset operations'\n );\n }\n\n currentCategory = category;\n }\n\n return true;\n }\n\n /**\n * Get output category for debugging\n * @param {*} value - Output value\n * @returns {string} Category name\n */\n getOutputCategory(value) {\n if (typeof value === 'number') {\n return 'XNA';\n } else if (value.transfer && this.isOwnerTokenTransfer(value.transfer)) {\n return 'OWNER_TOKEN';\n } else if (value.transfer) {\n return 'ASSET_TRANSFER';\n } else if (value.issue) {\n return 'ISSUE';\n } else if (value.issue_unique) {\n return 'ISSUE_UNIQUE';\n } else if (value.issue_restricted) {\n return 'ISSUE_RESTRICTED';\n } else if (value.issue_qualifier) {\n return 'ISSUE_QUALIFIER';\n } else if (value.reissue) {\n return 'REISSUE';\n } else if (value.reissue_restricted) {\n return 'REISSUE_RESTRICTED';\n } else if (value.tag_addresses) {\n return 'TAG_ADDRESSES';\n } else if (value.untag_addresses) {\n return 'UNTAG_ADDRESSES';\n } else if (value.freeze_addresses) {\n return 'FREEZE_ADDRESSES';\n } else if (value.unfreeze_addresses) {\n return 'UNFREEZE_ADDRESSES';\n } else if (value.freeze_asset) {\n return 'FREEZE_ASSET';\n } else if (value.unfreeze_asset) {\n return 'UNFREEZE_ASSET';\n } else {\n return 'UNKNOWN';\n }\n }\n\n /**\n * Debug output ordering\n * Returns detailed information about output categories\n *\n * @param {object} outputs - Outputs to analyze\n * @returns {Array} Array of { address, category, order }\n */\n debugOrdering(outputs) {\n const debug = [];\n const entries = Array.isArray(outputs)\n ? outputs.map(obj => Object.entries(obj)[0])\n : Object.entries(outputs);\n\n for (const [address, value] of entries) {\n const category = this.getOutputCategory(value);\n let order;\n\n if (typeof value === 'number') {\n order = 1;\n } else if (value.transfer && this.isOwnerTokenTransfer(value.transfer)) {\n order = 2;\n } else {\n order = 3;\n }\n\n debug.push({\n address,\n category,\n order,\n value\n });\n }\n\n return debug;\n }\n\n /**\n * Merge multiple output objects with proper ordering\n * Useful when building outputs from multiple sources\n *\n * @param {...object} outputObjects - Multiple output objects to merge\n * @returns {object} Merged and ordered outputs\n */\n merge(...outputObjects) {\n const merged = {};\n\n // Merge all objects\n for (const outputs of outputObjects) {\n if (outputs && typeof outputs === 'object') {\n Object.assign(merged, outputs);\n }\n }\n\n // Order the merged result\n return this.order(merged);\n }\n\n /**\n * Add XNA output (convenience method)\n * @param {object} outputs - Existing outputs\n * @param {string} address - Address\n * @param {number} amount - XNA amount\n * @returns {object} Updated outputs (not ordered yet)\n */\n addXNAOutput(outputs, address, amount) {\n return {\n ...outputs,\n [address]: amount\n };\n }\n\n /**\n * Add owner token output (convenience method)\n * @param {object} outputs - Existing outputs\n * @param {string} address - Address\n * @param {string} ownerTokenName - Owner token name\n * @returns {object} Updated outputs (not ordered yet)\n */\n addOwnerTokenOutput(outputs, address, ownerTokenName) {\n return {\n ...outputs,\n [address]: {\n transfer: {\n [ownerTokenName]: 1.0\n }\n }\n };\n }\n\n /**\n * Add asset transfer output (convenience method)\n * @param {object} outputs - Existing outputs\n * @param {string} address - Address\n * @param {string} assetName - Asset name\n * @param {number} amount - Amount\n * @returns {object} Updated outputs (not ordered yet)\n */\n addAssetTransferOutput(outputs, address, assetName, amount) {\n return {\n ...outputs,\n [address]: {\n transfer: {\n [assetName]: amount\n }\n }\n };\n }\n\n /**\n * Add asset operation output (convenience method)\n * @param {object} outputs - Existing outputs\n * @param {string} address - Address\n * @param {object} operation - Operation object (issue, reissue, etc.)\n * @returns {object} Updated outputs (not ordered yet)\n */\n addOperationOutput(outputs, address, operation) {\n return {\n ...outputs,\n [address]: operation\n };\n }\n}\n\nmodule.exports = OutputOrderer;\n","/**\n * Managers Module\n * Exports all manager classes\n */\n\nconst BurnManager = require('./BurnManager');\nconst OwnerTokenManager = require('./OwnerTokenManager');\nconst UTXOSelector = require('./UTXOSelector');\nconst OutputOrderer = require('./OutputOrderer');\n\nmodule.exports = {\n BurnManager,\n OwnerTokenManager,\n UTXOSelector,\n OutputOrderer\n};\n","/**\n * Asset Name Validator\n * Validates asset names according to Neurai protocol rules\n */\n\nconst { ASSET_NAME_RULES } = require('../constants');\nconst { InvalidAssetNameError } = require('../errors');\n\nclass AssetNameValidator {\n /**\n * Validate ROOT asset name\n * Rules: 3-30 uppercase characters, A-Z, 0-9, underscore, period\n * Cannot start with period, A, or Z\n * Cannot be reserved names\n */\n static validateRoot(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('Asset name must be a non-empty string', name);\n }\n\n // Length check\n if (name.length < ASSET_NAME_RULES.ROOT.minLength || name.length > ASSET_NAME_RULES.ROOT.maxLength) {\n throw new InvalidAssetNameError(\n `ROOT asset name must be ${ASSET_NAME_RULES.ROOT.minLength}-${ASSET_NAME_RULES.ROOT.maxLength} characters`,\n name\n );\n }\n\n // Uppercase check\n if (name !== name.toUpperCase()) {\n throw new InvalidAssetNameError('Asset name must be uppercase', name);\n }\n\n // Starting character check\n if (ASSET_NAME_RULES.ROOT.cannotStartWith.some(char => name.startsWith(char))) {\n throw new InvalidAssetNameError(\n `Asset name cannot start with: ${ASSET_NAME_RULES.ROOT.cannotStartWith.join(', ')}`,\n name\n );\n }\n\n // Pattern check\n if (!ASSET_NAME_RULES.ROOT.pattern.test(name)) {\n throw new InvalidAssetNameError(\n 'Asset name can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n\n // Reserved names check\n if (ASSET_NAME_RULES.ROOT.reserved.includes(name)) {\n throw new InvalidAssetNameError(`${name} is a reserved asset name`, name);\n }\n\n return true;\n }\n\n /**\n * Validate SUB asset name\n * Format: ROOT/SUBNAME\n */\n static validateSub(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('SUB asset name must be a non-empty string', name);\n }\n\n const parts = name.split(ASSET_NAME_RULES.SUB.separator);\n if (parts.length !== 2) {\n throw new InvalidAssetNameError(\n `SUB asset must be in ${ASSET_NAME_RULES.SUB.separator} format (ROOT/SUBNAME)`,\n name\n );\n }\n\n const [rootName, subName] = parts;\n\n // Validate root part\n this.validateRoot(rootName);\n\n // Validate sub part\n if (subName.length < ASSET_NAME_RULES.SUB.minLength || subName.length > ASSET_NAME_RULES.SUB.maxLength) {\n throw new InvalidAssetNameError(\n `SUB asset name must be ${ASSET_NAME_RULES.SUB.minLength}-${ASSET_NAME_RULES.SUB.maxLength} characters`,\n name\n );\n }\n\n if (subName !== subName.toUpperCase()) {\n throw new InvalidAssetNameError('SUB asset name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.SUB.pattern.test(subName)) {\n throw new InvalidAssetNameError(\n 'SUB asset name can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n\n return true;\n }\n\n /**\n * Validate UNIQUE asset name\n * Format: ROOT#TAG\n */\n static validateUnique(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('UNIQUE asset name must be a non-empty string', name);\n }\n\n const parts = name.split(ASSET_NAME_RULES.UNIQUE.separator);\n if (parts.length !== 2) {\n throw new InvalidAssetNameError(\n `UNIQUE asset must be in ROOT${ASSET_NAME_RULES.UNIQUE.separator}TAG format`,\n name\n );\n }\n\n const [rootName, tag] = parts;\n\n // Validate root part\n this.validateRoot(rootName);\n\n // Validate tag\n if (tag.length < ASSET_NAME_RULES.UNIQUE.minLength || tag.length > ASSET_NAME_RULES.UNIQUE.maxLength) {\n throw new InvalidAssetNameError(\n `UNIQUE tag must be ${ASSET_NAME_RULES.UNIQUE.minLength}-${ASSET_NAME_RULES.UNIQUE.maxLength} characters`,\n name\n );\n }\n\n if (tag !== tag.toUpperCase()) {\n throw new InvalidAssetNameError('UNIQUE tag must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.UNIQUE.pattern.test(tag)) {\n throw new InvalidAssetNameError(\n 'UNIQUE tag can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n\n return true;\n }\n\n /**\n * Validate QUALIFIER asset name\n * Format: #NAME or #ROOT/SUB\n */\n static validateQualifier(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('QUALIFIER asset name must be a non-empty string', name);\n }\n\n if (!name.startsWith(ASSET_NAME_RULES.QUALIFIER.prefix)) {\n throw new InvalidAssetNameError(\n `QUALIFIER asset must start with ${ASSET_NAME_RULES.QUALIFIER.prefix}`,\n name\n );\n }\n\n const withoutPrefix = name.substring(1);\n\n if (withoutPrefix.includes(ASSET_NAME_RULES.QUALIFIER.separator)) {\n // Sub-qualifier: #ROOT/SUB\n const parts = withoutPrefix.split(ASSET_NAME_RULES.QUALIFIER.separator);\n if (parts.length !== 2) {\n throw new InvalidAssetNameError(\n 'SUB_QUALIFIER must be in #ROOT/SUB format',\n name\n );\n }\n\n // Validate each part as a qualifier name (without the #)\n parts.forEach(part => {\n if (part.length < ASSET_NAME_RULES.QUALIFIER.minLength || part.length > ASSET_NAME_RULES.QUALIFIER.maxLength) {\n throw new InvalidAssetNameError(\n `QUALIFIER name must be ${ASSET_NAME_RULES.QUALIFIER.minLength}-${ASSET_NAME_RULES.QUALIFIER.maxLength} characters`,\n name\n );\n }\n\n if (part !== part.toUpperCase()) {\n throw new InvalidAssetNameError('QUALIFIER name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.QUALIFIER.pattern.test(part)) {\n throw new InvalidAssetNameError(\n 'QUALIFIER name can only contain A-Z, 0-9, and underscore',\n name\n );\n }\n });\n } else {\n // Root qualifier: #NAME\n if (withoutPrefix.length < ASSET_NAME_RULES.QUALIFIER.minLength ||\n withoutPrefix.length > ASSET_NAME_RULES.QUALIFIER.maxLength) {\n throw new InvalidAssetNameError(\n `QUALIFIER name must be ${ASSET_NAME_RULES.QUALIFIER.minLength}-${ASSET_NAME_RULES.QUALIFIER.maxLength} characters`,\n name\n );\n }\n\n if (withoutPrefix !== withoutPrefix.toUpperCase()) {\n throw new InvalidAssetNameError('QUALIFIER name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.QUALIFIER.pattern.test(withoutPrefix)) {\n throw new InvalidAssetNameError(\n 'QUALIFIER name can only contain A-Z, 0-9, and underscore',\n name\n );\n }\n }\n\n return true;\n }\n\n /**\n * Validate RESTRICTED asset name\n * Format: $NAME\n */\n static validateRestricted(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('RESTRICTED asset name must be a non-empty string', name);\n }\n\n if (!name.startsWith(ASSET_NAME_RULES.RESTRICTED.prefix)) {\n throw new InvalidAssetNameError(\n `RESTRICTED asset must start with ${ASSET_NAME_RULES.RESTRICTED.prefix}`,\n name\n );\n }\n\n const withoutPrefix = name.substring(1);\n\n // Validate the part after $ as a ROOT asset name\n this.validateRoot(withoutPrefix);\n\n return true;\n }\n\n /**\n * Validate DEPIN asset name\n * Format: &NAME or &NAME/SUB[/...]\n */\n static validateDepin(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('DEPIN asset name must be a non-empty string', name);\n }\n\n if (!name.startsWith(ASSET_NAME_RULES.DEPIN.prefix)) {\n throw new InvalidAssetNameError(\n `DEPIN asset must start with ${ASSET_NAME_RULES.DEPIN.prefix}`,\n name\n );\n }\n\n if (name.length > ASSET_NAME_RULES.DEPIN.maxLength) {\n throw new InvalidAssetNameError(\n `DEPIN asset name cannot exceed ${ASSET_NAME_RULES.DEPIN.maxLength} characters`,\n name\n );\n }\n\n const parts = name.split(ASSET_NAME_RULES.DEPIN.separator);\n if (parts.length === 0) {\n throw new InvalidAssetNameError('DEPIN asset name is invalid', name);\n }\n\n const rootPart = parts[0].substring(1);\n if (rootPart.length < ASSET_NAME_RULES.DEPIN.minLength) {\n throw new InvalidAssetNameError(\n `DEPIN root name must be at least ${ASSET_NAME_RULES.DEPIN.minLength} characters`,\n name\n );\n }\n\n if (rootPart !== rootPart.toUpperCase()) {\n throw new InvalidAssetNameError('DEPIN asset name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.DEPIN.pattern.test(rootPart)) {\n throw new InvalidAssetNameError(\n 'DEPIN asset name can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n\n const subParts = parts.slice(1);\n subParts.forEach(part => {\n if (part.length < ASSET_NAME_RULES.DEPIN.minLength) {\n throw new InvalidAssetNameError(\n `Each DEPIN sub-part must be at least ${ASSET_NAME_RULES.DEPIN.minLength} characters`,\n name\n );\n }\n\n if (part !== part.toUpperCase()) {\n throw new InvalidAssetNameError('DEPIN asset name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.DEPIN.pattern.test(part)) {\n throw new InvalidAssetNameError(\n 'DEPIN asset name can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n });\n\n return true;\n }\n\n /**\n * Validate owner token name\n * Format: ASSETNAME!\n */\n static validateOwnerToken(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('Owner token name must be a non-empty string', name);\n }\n\n if (!name.endsWith('!')) {\n throw new InvalidAssetNameError('Owner token must end with !', name);\n }\n\n const assetName = name.substring(0, name.length - 1);\n\n // Validate the asset name part (could be ROOT, RESTRICTED, or DEPIN)\n if (assetName.startsWith('$')) {\n this.validateRestricted(assetName);\n } else if (assetName.startsWith('&')) {\n this.validateDepin(assetName);\n } else {\n this.validateRoot(assetName);\n }\n\n return true;\n }\n\n /**\n * Auto-detect asset type and validate\n * @param {string} name - Asset name\n * @returns {string} Asset type ('ROOT', 'SUB', 'UNIQUE', 'QUALIFIER', 'RESTRICTED', 'DEPIN', 'OWNER')\n */\n static validateAndDetectType(name) {\n if (name.endsWith('!')) {\n this.validateOwnerToken(name);\n return 'OWNER';\n } else if (name.startsWith('#')) {\n this.validateQualifier(name);\n return name.includes('/') ? 'SUB_QUALIFIER' : 'QUALIFIER';\n } else if (name.startsWith('$')) {\n this.validateRestricted(name);\n return 'RESTRICTED';\n } else if (name.startsWith('&')) {\n this.validateDepin(name);\n return 'DEPIN';\n } else if (name.includes('#')) {\n this.validateUnique(name);\n return 'UNIQUE';\n } else if (name.includes('/')) {\n this.validateSub(name);\n return 'SUB';\n } else {\n this.validateRoot(name);\n return 'ROOT';\n }\n }\n}\n\nmodule.exports = AssetNameValidator;\n","/**\n * Amount Validator\n * Validates asset quantities and units\n */\n\nconst { ASSET_LIMITS } = require('../constants');\nconst { InvalidAmountError, InvalidUnitsError } = require('../errors');\n\nclass AmountValidator {\n /**\n * Validate asset quantity\n * @param {number} quantity - Asset quantity\n * @param {number} units - Decimal places (0-8)\n */\n static validate(quantity, units = 0) {\n // Validate quantity is a number\n if (typeof quantity !== 'number' || isNaN(quantity)) {\n throw new InvalidAmountError('Quantity must be a valid number', quantity);\n }\n\n // Validate quantity is positive\n if (quantity <= 0) {\n throw new InvalidAmountError('Quantity must be greater than 0', quantity);\n }\n\n // Validate quantity is within limits\n if (quantity < ASSET_LIMITS.MIN_QUANTITY) {\n throw new InvalidAmountError(\n `Quantity must be at least ${ASSET_LIMITS.MIN_QUANTITY}`,\n quantity\n );\n }\n\n if (quantity > ASSET_LIMITS.MAX_QUANTITY) {\n throw new InvalidAmountError(\n `Quantity cannot exceed ${ASSET_LIMITS.MAX_QUANTITY}`,\n quantity\n );\n }\n\n // Validate units\n this.validateUnits(units);\n\n // Validate quantity doesn't have more decimals than units allow\n const decimalPlaces = this.getDecimalPlaces(quantity);\n if (decimalPlaces > units) {\n throw new InvalidAmountError(\n `Quantity has ${decimalPlaces} decimal places but units is ${units}`,\n quantity\n );\n }\n\n return true;\n }\n\n /**\n * Validate units (decimal places)\n * @param {number} units - Decimal places (0-8)\n */\n static validateUnits(units) {\n if (typeof units !== 'number' || isNaN(units)) {\n throw new InvalidUnitsError('Units must be a valid number', units);\n }\n\n if (!Number.isInteger(units)) {\n throw new InvalidUnitsError('Units must be an integer', units);\n }\n\n if (units < ASSET_LIMITS.MIN_UNITS || units > ASSET_LIMITS.MAX_UNITS) {\n throw new InvalidUnitsError(\n `Units must be between ${ASSET_LIMITS.MIN_UNITS} and ${ASSET_LIMITS.MAX_UNITS}`,\n units\n );\n }\n\n return true;\n }\n\n /**\n * Validate qualifier quantity (1-10 only)\n * @param {number} quantity - Qualifier quantity\n */\n static validateQualifierQuantity(quantity) {\n if (typeof quantity !== 'number' || isNaN(quantity)) {\n throw new InvalidAmountError('Qualifier quantity must be a valid number', quantity);\n }\n\n if (!Number.isInteger(quantity)) {\n throw new InvalidAmountError('Qualifier quantity must be an integer', quantity);\n }\n\n if (quantity < ASSET_LIMITS.QUALIFIER_MIN_QUANTITY || quantity > ASSET_LIMITS.QUALIFIER_MAX_QUANTITY) {\n throw new InvalidAmountError(\n `Qualifier quantity must be between ${ASSET_LIMITS.QUALIFIER_MIN_QUANTITY} and ${ASSET_LIMITS.QUALIFIER_MAX_QUANTITY}`,\n quantity\n );\n }\n\n return true;\n }\n\n /**\n * Validate owner token quantity (always 1)\n * @param {number} quantity - Owner token quantity\n */\n static validateOwnerTokenQuantity(quantity) {\n if (quantity !== ASSET_LIMITS.OWNER_TOKEN_QUANTITY) {\n throw new InvalidAmountError(\n `Owner token quantity must be exactly ${ASSET_LIMITS.OWNER_TOKEN_QUANTITY}`,\n quantity\n );\n }\n\n return true;\n }\n\n /**\n * Get number of decimal places in a number\n * @param {number} num - Number to check\n * @returns {number} Number of decimal places\n */\n static getDecimalPlaces(num) {\n const match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) return 0;\n return Math.max(\n 0,\n (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0)\n );\n }\n\n /**\n * Validate that sum of amounts doesn't exceed max\n * @param {number} current - Current amount\n * @param {number} additional - Additional amount\n * @returns {boolean} True if sum is valid\n */\n static validateSum(current, additional) {\n if (current + additional > ASSET_LIMITS.MAX_QUANTITY) {\n throw new InvalidAmountError(\n `Sum of current (${current}) and additional (${additional}) exceeds maximum ${ASSET_LIMITS.MAX_QUANTITY}`,\n current + additional\n );\n }\n\n return true;\n }\n}\n\nmodule.exports = AmountValidator;\n","/**\n * Verifier String Validator\n * Validates verifier strings for restricted assets\n */\n\nconst { InvalidVerifierStringError } = require('../errors');\nconst AssetNameValidator = require('./assetNameValidator');\n\nclass VerifierValidator {\n /**\n * Validate verifier string syntax\n * Verifier syntax: #TAG, !#TAG, &, |, (, )\n * Examples:\n * \"#KYC\"\n * \"#KYC & #ACCREDITED\"\n * \"#KYC | #INSTITUTION\"\n * \"(#KYC & #ACCREDITED) | #INSTITUTION\"\n * \"!#BANNED\"\n *\n * @param {string} verifierString - Verifier string to validate\n * @returns {boolean} True if valid\n */\n static validate(verifierString) {\n if (!verifierString || typeof verifierString !== 'string') {\n throw new InvalidVerifierStringError(\n 'Verifier string must be a non-empty string',\n verifierString\n );\n }\n\n // Trim whitespace\n const trimmed = verifierString.trim();\n if (trimmed.length === 0) {\n throw new InvalidVerifierStringError(\n 'Verifier string cannot be empty',\n verifierString\n );\n }\n\n // Check for valid characters only\n // Valid: #, A-Z, 0-9, _, &, |, !, (, ), space, /\n const validPattern = /^[#A-Z0-9_&|()\\s!/]+$/;\n if (!validPattern.test(trimmed)) {\n throw new InvalidVerifierStringError(\n 'Verifier contains invalid characters. Valid: #, A-Z, 0-9, _, &, |, !, (, ), space, /',\n verifierString\n );\n }\n\n // Extract all qualifiers (tokens starting with # or !#)\n const qualifierMatches = trimmed.match(/!?#[A-Z0-9_/]+/g) || [];\n\n if (qualifierMatches.length === 0) {\n throw new InvalidVerifierStringError(\n 'Verifier must contain at least one qualifier (#TAG)',\n verifierString\n );\n }\n\n // Validate each qualifier\n for (const match of qualifierMatches) {\n const qualifier = match.startsWith('!') ? match.substring(1) : match;\n\n try {\n AssetNameValidator.validateQualifier(qualifier);\n } catch (e) {\n throw new InvalidVerifierStringError(\n `Invalid qualifier in verifier: ${qualifier} - ${e.message}`,\n verifierString\n );\n }\n }\n\n // Check balanced parentheses\n let depth = 0;\n for (const char of trimmed) {\n if (char === '(') depth++;\n if (char === ')') depth--;\n if (depth < 0) {\n throw new InvalidVerifierStringError(\n 'Unbalanced parentheses in verifier string',\n verifierString\n );\n }\n }\n if (depth !== 0) {\n throw new InvalidVerifierStringError(\n 'Unbalanced parentheses in verifier string',\n verifierString\n );\n }\n\n // Check for valid operators placement\n // & and | must be between qualifiers, not at start/end\n const operatorPattern = /(&|\\|)/g;\n const operators = trimmed.match(operatorPattern);\n if (operators) {\n // Check operators are not at start or end\n if (trimmed.trim().match(/^(&|\\|)/) || trimmed.trim().match(/(&|\\|)$/)) {\n throw new InvalidVerifierStringError(\n 'Operators & or | cannot be at start or end of verifier',\n verifierString\n );\n }\n\n // Check no consecutive operators\n if (trimmed.match(/(&|\\|)\\s*(&|\\|)/)) {\n throw new InvalidVerifierStringError(\n 'Consecutive operators are not allowed',\n verifierString\n );\n }\n }\n\n return true;\n }\n\n /**\n * Extract all qualifiers from verifier string\n * @param {string} verifierString - Verifier string\n * @returns {string[]} Array of qualifier names (including #)\n */\n static extractQualifiers(verifierString) {\n this.validate(verifierString);\n\n const qualifierMatches = verifierString.match(/!?#[A-Z0-9_/]+/g) || [];\n\n // Remove ! prefix and deduplicate\n const qualifiers = [...new Set(qualifierMatches.map(q => q.replace('!', '')))];\n\n return qualifiers;\n }\n\n /**\n * Check if verifier string uses a specific qualifier\n * @param {string} verifierString - Verifier string\n * @param {string} qualifierName - Qualifier to check (with #)\n * @returns {boolean} True if qualifier is used\n */\n static usesQualifier(verifierString, qualifierName) {\n const qualifiers = this.extractQualifiers(verifierString);\n return qualifiers.includes(qualifierName);\n }\n}\n\nmodule.exports = VerifierValidator;\n","/**\n * IPFS Hash Validator\n * Validates IPFS CID formats\n */\n\nconst { InvalidIPFSHashError } = require('../errors');\n\nclass IpfsValidator {\n /**\n * Validate IPFS hash format\n * Accepts:\n * - CIDv0: Qm... (46 characters, base58)\n * - CIDv1: bafy... or bafk... (various lengths, base32)\n * - Neurai TXID: 64 hex characters (for on-chain metadata)\n *\n * @param {string} hash - IPFS hash or TXID\n * @returns {boolean} True if valid\n */\n static validate(hash) {\n if (!hash || typeof hash !== 'string') {\n throw new InvalidIPFSHashError('IPFS hash must be a non-empty string', hash);\n }\n\n const trimmed = hash.trim();\n\n // Check maximum length (Neurai allows up to 40 bytes in protocol)\n if (trimmed.length > 80) {\n throw new InvalidIPFSHashError('IPFS hash too long (max 80 characters)', hash);\n }\n\n // Check if it's a valid format\n const isCIDv0 = this.isCIDv0(trimmed);\n const isCIDv1 = this.isCIDv1(trimmed);\n const isTXID = this.isTXID(trimmed);\n\n if (!isCIDv0 && !isCIDv1 && !isTXID) {\n throw new InvalidIPFSHashError(\n 'Invalid IPFS hash format. Must be CIDv0 (Qm...), CIDv1 (bafy...), or TXID (64 hex chars)',\n hash\n );\n }\n\n return true;\n }\n\n /**\n * Check if hash is CIDv0 format\n * @param {string} hash - Hash to check\n * @returns {boolean} True if CIDv0\n */\n static isCIDv0(hash) {\n // CIDv0: Starts with \"Qm\", 46 characters, base58\n if (!hash.startsWith('Qm')) return false;\n if (hash.length !== 46) return false;\n\n // Base58 characters: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\n const base58Pattern = /^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/;\n return base58Pattern.test(hash);\n }\n\n /**\n * Check if hash is CIDv1 format\n * @param {string} hash - Hash to check\n * @returns {boolean} True if CIDv1\n */\n static isCIDv1(hash) {\n // CIDv1: Starts with \"bafy\" or \"bafk\" (base32), various lengths\n if (!hash.startsWith('bafy') && !hash.startsWith('bafk')) return false;\n\n // Base32 characters: a-z, 2-7\n const base32Pattern = /^[a-z2-7]+$/;\n return base32Pattern.test(hash);\n }\n\n /**\n * Check if hash is a transaction ID\n * @param {string} hash - Hash to check\n * @returns {boolean} True if TXID\n */\n static isTXID(hash) {\n // TXID: 64 hexadecimal characters\n if (hash.length !== 64) return false;\n\n const hexPattern = /^[0-9a-fA-F]+$/;\n return hexPattern.test(hash);\n }\n\n /**\n * Get IPFS hash type\n * @param {string} hash - IPFS hash\n * @returns {string} Type ('CIDv0', 'CIDv1', 'TXID', or 'UNKNOWN')\n */\n static getHashType(hash) {\n if (this.isCIDv0(hash)) return 'CIDv0';\n if (this.isCIDv1(hash)) return 'CIDv1';\n if (this.isTXID(hash)) return 'TXID';\n return 'UNKNOWN';\n }\n}\n\nmodule.exports = IpfsValidator;\n","/**\n * Validators Module\n * Exports all validator classes\n */\n\nconst AssetNameValidator = require('./assetNameValidator');\nconst AmountValidator = require('./amountValidator');\nconst VerifierValidator = require('./verifierValidator');\nconst IpfsValidator = require('./ipfsValidator');\n\nmodule.exports = {\n AssetNameValidator,\n AmountValidator,\n VerifierValidator,\n IpfsValidator\n};\n","/**\n * Base Asset Transaction Builder\n * Abstract base class for all transaction builders\n *\n * Provides common functionality:\n * - UTXO selection\n * - Fee estimation\n * - Output ordering\n * - Raw transaction creation\n * - Validation\n *\n * Subclasses must implement:\n * - validateParams(params)\n * - build()\n */\n\nconst { BurnManager, OwnerTokenManager, UTXOSelector, OutputOrderer } = require('../managers');\nconst { AssetNameValidator, AmountValidator } = require('../validators');\n\nclass BaseAssetTransactionBuilder {\n /**\n * @param {Function} rpc - RPC function\n * @param {string} network - Network type ('xna' or 'xna-test')\n * @param {string[]|Function} addresses - Wallet addresses or function that returns addresses\n * @param {object} params - Transaction parameters\n */\n constructor(rpc, networkOrParams, addresses, params) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n\n // Support both (rpc, network, addresses, params) and (rpc, params) calling forms.\n // NeuraiAssets passes a single merged params object as the second argument.\n let network, actualAddresses, actualParams;\n if (\n typeof networkOrParams === 'object' &&\n networkOrParams !== null &&\n !Array.isArray(networkOrParams) &&\n addresses === undefined\n ) {\n network = networkOrParams.network;\n actualAddresses = networkOrParams.walletAddresses || networkOrParams.addresses;\n actualParams = networkOrParams;\n } else {\n network = networkOrParams;\n actualAddresses = addresses;\n actualParams = params;\n }\n\n if (!network) {\n throw new Error('Network is required');\n }\n\n // Addresses can be an array or a function that returns addresses\n if (typeof actualAddresses === 'function') {\n this.getAddresses = actualAddresses;\n } else if (Array.isArray(actualAddresses)) {\n this.getAddresses = () => actualAddresses;\n } else {\n throw new Error('Addresses must be an array or a function');\n }\n\n this.rpc = rpc;\n this.network = network;\n this.params = actualParams || {};\n\n // Initialize managers\n this.burnManager = new BurnManager(network);\n this.ownerTokenManager = new OwnerTokenManager(rpc);\n this.utxoSelector = new UTXOSelector(rpc);\n this.outputOrderer = new OutputOrderer();\n }\n\n /**\n * Get wallet addresses\n * @returns {string[]} Array of addresses\n */\n async _getAddresses() {\n const addresses = await this.getAddresses();\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('No addresses available');\n }\n return addresses;\n }\n\n /**\n * Validate transaction parameters\n * Must be implemented by subclasses\n * @param {object} params - Parameters to validate\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n throw new Error('validateParams must be implemented by subclass');\n }\n\n /**\n * Build the transaction\n * Must be implemented by subclasses\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n throw new Error('build must be implemented by subclass');\n }\n\n /**\n * Estimate transaction fee\n * @param {number} inputCount - Number of inputs\n * @param {number} outputCount - Number of outputs\n * @returns {Promise<number>} Estimated fee in XNA\n */\n async estimateFee(inputCount, outputCount) {\n const feeRate = await this.utxoSelector.getFeeRate();\n return this.utxoSelector.estimateFee(inputCount, outputCount, feeRate);\n }\n\n /**\n * Select UTXOs for transaction\n * @param {number} xnaAmount - Required XNA amount (for fees + burn)\n * @param {string|null} assetName - Asset name if needed\n * @param {number} assetAmount - Asset amount if needed\n * @returns {Promise<object>} Selected UTXOs\n */\n async selectUTXOs(xnaAmount, assetName = null, assetAmount = 0) {\n const addresses = await this._getAddresses();\n return this.utxoSelector.selectMixedUTXOs(\n addresses,\n xnaAmount,\n assetName,\n assetAmount\n );\n }\n\n /**\n * Build raw transaction using RPC\n * @param {Array} inputs - Transaction inputs\n * @param {object} outputs - Transaction outputs (must be ordered)\n * @returns {Promise<string>} Raw transaction hex\n */\n async buildRawTransaction(inputs, outputs) {\n try {\n // Format inputs for createrawtransaction\n const formattedInputs = inputs.map(input => ({\n txid: input.txid,\n vout: input.vout !== undefined ? input.vout : input.outputIndex\n }));\n\n // Call createrawtransaction\n const rawTx = await this.rpc('createrawtransaction', [\n formattedInputs,\n outputs\n ]);\n\n return rawTx;\n } catch (error) {\n throw new Error(`Failed to create raw transaction: ${error.message}`);\n }\n }\n\n /**\n * Calculate change amount\n * @param {number} totalInput - Total input amount\n * @param {number} totalOutput - Total output amount (including fee)\n * @returns {number} Change amount\n */\n calculateChange(totalInput, totalOutput) {\n const change = totalInput - totalOutput;\n if (change < 0) {\n throw new Error('Insufficient funds: inputs < outputs');\n }\n return change;\n }\n\n /**\n * Get change address\n * Uses first address from wallet by default\n * Can be overridden by params.changeAddress\n * @returns {Promise<string>} Change address\n */\n async getChangeAddress() {\n if (this.params.changeAddress) {\n return this.params.changeAddress;\n }\n\n const addresses = await this._getAddresses();\n return addresses[0];\n }\n\n /**\n * Get recipient address\n * Uses first address from wallet if not specified\n * @returns {Promise<string>} Recipient address\n */\n async getToAddress() {\n if (this.params.toAddress) {\n return this.params.toAddress;\n }\n\n const addresses = await this._getAddresses();\n return addresses[0];\n }\n\n /**\n * Common validation for asset name\n * @param {string} assetName - Asset name to validate\n * @param {string} type - Expected type ('ROOT', 'SUB', etc.)\n */\n validateAssetName(assetName, type) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n switch (type) {\n case 'ROOT':\n AssetNameValidator.validateRoot(assetName);\n break;\n case 'SUB':\n AssetNameValidator.validateSub(assetName);\n break;\n case 'UNIQUE':\n AssetNameValidator.validateUnique(assetName);\n break;\n case 'QUALIFIER':\n AssetNameValidator.validateQualifier(assetName);\n break;\n case 'RESTRICTED':\n AssetNameValidator.validateRestricted(assetName);\n break;\n case 'DEPIN':\n AssetNameValidator.validateDepin(assetName);\n break;\n default:\n throw new Error(`Unknown asset type: ${type}`);\n }\n }\n\n /**\n * Common validation for amount and units\n * @param {number} quantity - Quantity to validate\n * @param {number} units - Units (decimal places)\n */\n validateAmount(quantity, units) {\n AmountValidator.validate(quantity, units);\n }\n\n /**\n * Convert asset amount to protocol raw units.\n * Asset raw quantities in transaction payloads are always encoded with\n * 8 decimal places, regardless of the asset's displayed `units`.\n *\n * @param {number} amount - User-facing asset amount\n * @param {number} units - Asset decimal places (kept for API compatibility)\n * @returns {number} Amount in protocol raw units\n */\n toSatoshis(amount, units) {\n void units;\n return Math.round(amount * 100000000);\n }\n\n /**\n * Convert protocol raw units back to a user-facing asset amount.\n *\n * @param {number} satoshis - Amount in protocol raw units\n * @param {number} units - Asset decimal places (kept for API compatibility)\n * @returns {number} Amount in asset units\n */\n fromSatoshis(satoshis, units) {\n void units;\n return satoshis / 100000000;\n }\n\n /**\n * Normalize builder inputs to raw transaction inputs\n * @param {Array} inputs - Builder inputs\n * @returns {Array<{txid: string, vout: number}>} Raw transaction inputs\n */\n toRawTxInputs(inputs) {\n return (inputs || []).map(input => ({\n txid: input.txid,\n vout: input.vout !== undefined ? input.vout : input.outputIndex\n }));\n }\n\n /**\n * Convert XNA amount to satoshis\n * @param {number|null|undefined} amount - Amount in XNA\n * @returns {number|undefined} Amount in satoshis\n */\n xnaToSatoshis(amount) {\n if (amount === undefined || amount === null) {\n return undefined;\n }\n\n return Math.round(amount * 100000000);\n }\n\n /**\n * Build a typed local raw build payload compatible with\n * @neuraiproject/neurai-create-transaction createFromOperation(...)\n *\n * @param {string} operationType - Operation type\n * @param {Array} inputs - Builder inputs\n * @param {object|null} burnInfo - Burn metadata\n * @param {string|null} changeAddress - XNA change address\n * @param {number|null} changeAmount - XNA change amount in XNA\n * @param {object} operationParams - Operation-specific params\n * @returns {{ operationType: string, params: object }} Local raw build\n */\n buildLocalRawBuild(\n operationType,\n inputs,\n burnInfo = null,\n changeAddress = null,\n changeAmount = null,\n operationParams = {}\n ) {\n const params = {\n inputs: this.toRawTxInputs(inputs),\n ...operationParams\n };\n\n if (burnInfo && burnInfo.address && burnInfo.amount !== undefined && burnInfo.amount !== null) {\n params.burnAddress = burnInfo.address;\n params.burnAmountSats = this.xnaToSatoshis(burnInfo.amount);\n }\n\n if (changeAddress && changeAmount !== undefined && changeAmount !== null) {\n params.xnaChangeAddress = changeAddress;\n params.xnaChangeSats = this.xnaToSatoshis(changeAmount);\n }\n\n return {\n operationType,\n params\n };\n }\n\n /**\n * Normalize ordered outputs into flat entries\n * @param {Array|object} outputs - Transaction outputs\n * @returns {Array<{address: string, value: unknown}>} Output entries\n */\n getOutputEntries(outputs) {\n if (Array.isArray(outputs)) {\n return outputs.map(output => {\n const [address, value] = Object.entries(output)[0];\n return { address, value };\n });\n }\n\n if (outputs && typeof outputs === 'object') {\n return Object.entries(outputs).map(([address, value]) => ({ address, value }));\n }\n\n return [];\n }\n\n /**\n * Extract burn metadata from outputs\n * @param {Array<{address: string, value: unknown}>} entries - Output entries\n * @param {number} burnAmount - Burn amount in XNA\n * @returns {{ burnAddress: string|null, burnAmount: number }}\n */\n extractBurnMetadata(entries, burnAmount) {\n if (!burnAmount || burnAmount <= 0) {\n return {\n burnAddress: null,\n burnAmount: 0\n };\n }\n\n const burnEntry = entries.find(({ address, value }) => {\n return typeof value === 'number' &&\n value === burnAmount &&\n this.burnManager.isBurnAddress(address);\n });\n\n return {\n burnAddress: burnEntry ? burnEntry.address : null,\n burnAmount\n };\n }\n\n /**\n * Extract XNA change metadata from outputs\n * @param {Array<{address: string, value: unknown}>} entries - Output entries\n * @param {string|null} burnAddress - Burn address if present\n * @returns {{ changeAddress: string|null, changeAmount: number|null }}\n */\n extractChangeMetadata(entries, burnAddress = null) {\n const xnaOutputs = entries.filter(({ address, value }) => {\n return typeof value === 'number' && address !== burnAddress;\n });\n\n if (xnaOutputs.length !== 1) {\n return {\n changeAddress: null,\n changeAmount: null\n };\n }\n\n return {\n changeAddress: xnaOutputs[0].address,\n changeAmount: xnaOutputs[0].value\n };\n }\n\n /**\n * Format transaction result\n * @param {string} rawTx - Raw transaction hex\n * @param {Array} utxos - UTXOs used\n * @param {Array} inputs - Transaction inputs\n * @param {object} outputs - Transaction outputs\n * @param {number} fee - Transaction fee\n * @param {number} burnAmount - Burn amount\n * @param {object} extra - Extra information\n * @returns {object} Formatted result\n */\n formatResult(rawTx, utxos, inputs, outputs, fee, burnAmount, extra = {}) {\n const outputEntries = this.getOutputEntries(outputs);\n const burnMetadata = this.extractBurnMetadata(outputEntries, burnAmount);\n const changeMetadata = this.extractChangeMetadata(outputEntries, burnMetadata.burnAddress);\n\n return {\n rawTx,\n utxos,\n inputs,\n outputs,\n fee,\n burnAmount: burnMetadata.burnAmount,\n network: this.network,\n buildStrategy: 'rpc-node',\n burnAddress: burnMetadata.burnAddress,\n changeAddress: extra.changeAddress !== undefined\n ? extra.changeAddress\n : changeMetadata.changeAddress,\n changeAmount: extra.changeAmount !== undefined\n ? extra.changeAmount\n : changeMetadata.changeAmount,\n ...extra\n };\n }\n\n /**\n * Check if asset exists (to prevent creating duplicates)\n * @param {string} assetName - Asset name to check\n * @returns {Promise<boolean>} True if exists\n */\n async assetExists(assetName) {\n try {\n const assetData = await this.rpc('getassetdata', [assetName]);\n return assetData !== null && assetData !== undefined;\n } catch (error) {\n // If asset doesn't exist, RPC will throw error\n if (error.message && error.message.includes('not found')) {\n return false;\n }\n // Re-throw other errors\n throw error;\n }\n }\n\n /**\n * Get asset data from blockchain\n * @param {string} assetName - Asset name\n * @returns {Promise<object|null>} Asset data or null if not found\n */\n async getAssetData(assetName) {\n try {\n return await this.rpc('getassetdata', [assetName]);\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n return null;\n }\n throw error;\n }\n }\n}\n\nmodule.exports = BaseAssetTransactionBuilder;\n","/**\n * Issue Root Builder\n * Builds transactions for creating ROOT assets\n *\n * ROOT assets:\n * - Top-level assets (3-30 uppercase characters)\n * - Cost: 1000 XNA (burned)\n * - Automatically creates owner token (ASSET!)\n * - Can be reissuable or non-reissuable\n * - Optional IPFS metadata\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter } = require('../utils');\nconst { AssetExistsError, InvalidIPFSHashError } = require('../errors');\nconst { IpfsValidator } = require('../validators');\n\nclass IssueRootBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue ROOT parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n // Validate asset name (ROOT format)\n this.validateAssetName(params.assetName, 'ROOT');\n\n // Validate quantity and units\n const units = params.units !== undefined ? params.units : 0;\n this.validateAmount(params.quantity, units);\n\n // Validate IPFS hash if provided\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n // Validate reissuable is boolean if provided\n if (params.reissuable !== undefined && typeof params.reissuable !== 'boolean') {\n throw new Error('reissuable must be a boolean');\n }\n\n return true;\n }\n\n /**\n * Build ROOT asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n units = 0,\n reissuable = true,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n // 2. Check if asset already exists\n const exists = await this.assetExists(assetName);\n if (exists) {\n throw new AssetExistsError(\n `Asset ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n // 3. Get burn information\n const burnInfo = this.burnManager.getIssueRootBurn();\n\n // 4. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 5. Estimate fee (rough estimate for initial UTXO selection)\n const estimatedFee = await this.estimateFee(1, 3);\n\n // 6. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 7. Select UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 8. Recalculate fee with actual input count\n const actualFee = await this.estimateFee(baseCurrencyUTXOs.length, 3);\n\n // 9. Verify we still have enough after fee recalculation\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n // Need to select more UTXOs\n const additionalNeeded = totalRequired - totalXNAInput + 0.001; // Add small buffer\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 10. Calculate final totals\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 11. Build inputs\n const inputs = baseCurrencyUTXOs.map(utxo => ({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n }));\n\n // 12. Build outputs (ORDER MATTERS!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n // Only add change if meaningful amount\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Issue operation\n const issueOutput = OutputFormatter.formatIssueOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n units: units,\n reissuable: reissuable,\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash\n });\n\n outputs.push({ [toAddress]: issueOutput });\n\n // 13. Order outputs (critical for protocol)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 14. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 15. Format and return result\n return this.formatResult(\n rawTx,\n baseCurrencyUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenName: assetName + '!',\n operationType: 'ISSUE_ROOT',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_ROOT',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, units),\n units,\n reissuable,\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n ownerTokenAddress: changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueRootBuilder;\n","/**\n * Issue Sub Builder\n * Builds transactions for creating SUB assets\n *\n * SUB assets:\n * - Child of a ROOT asset (format: ROOT/SUBNAME)\n * - Cost: 200 XNA (burned)\n * - Requires parent's owner token (ROOT!)\n * - Creates own owner token (ROOT/SUB!)\n * - Parent owner token must be returned in outputs\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst {\n AssetExistsError,\n ParentAssetNotFoundError,\n OwnerTokenNotFoundError\n} = require('../errors');\nconst { IpfsValidator } = require('../validators');\n\nclass IssueSubBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue SUB parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n // Validate asset name (SUB format: ROOT/SUBNAME)\n this.validateAssetName(params.assetName, 'SUB');\n\n // Validate quantity and units\n const units = params.units !== undefined ? params.units : 0;\n this.validateAmount(params.quantity, units);\n\n // Validate IPFS hash if provided\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n return true;\n }\n\n /**\n * Build SUB asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n units = 0,\n reissuable = true,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n // 2. Parse asset name to get parent\n const parsed = AssetNameParser.parse(assetName);\n const parentAssetName = parsed.parent;\n\n if (!parentAssetName) {\n throw new Error('Cannot parse parent asset from SUB asset name');\n }\n\n // 3. Check if parent asset exists\n const parentExists = await this.assetExists(parentAssetName);\n if (!parentExists) {\n throw new ParentAssetNotFoundError(\n `Parent asset ${parentAssetName} does not exist. You must create the ROOT asset first.`,\n parentAssetName\n );\n }\n\n // 4. Check if SUB asset already exists\n const subExists = await this.assetExists(assetName);\n if (subExists) {\n throw new AssetExistsError(\n `Asset ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n // 5. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 6. Find parent's owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(parentAssetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the parent asset's owner token (${ownerTokenName}) to create a SUB asset. ` +\n `The owner token proves you control the parent asset.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 7. Get burn information\n const burnInfo = this.burnManager.getIssueSubBurn();\n\n // 8. Estimate fee\n // Inputs: XNA UTXOs + owner token UTXO\n // Outputs: burn + change + owner token return + issue operation\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 9. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 10. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 11. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 4);\n\n // 12. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 13. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 14. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 15. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Third: Owner token return (CRITICAL - must return or lost forever!)\n const ownerTokenReturn = this.ownerTokenManager.createOwnerTokenReturnOutput(\n ownerTokenName,\n changeAddress // Return owner token to change address\n );\n outputs.push(ownerTokenReturn);\n\n // Last: Issue operation\n const issueOutput = OutputFormatter.formatIssueOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n units: units,\n reissuable: reissuable,\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash\n });\n\n outputs.push({ [toAddress]: issueOutput });\n\n // 16. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 17. Validate owner token is returned (safety check)\n this.ownerTokenManager.validateOwnerTokenReturn(inputs, orderedOutputs);\n\n // 18. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 19. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n parentAssetName,\n ownerTokenName: assetName + '!',\n parentOwnerTokenUsed: ownerTokenName,\n operationType: 'ISSUE_SUB',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_SUB',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, units),\n units,\n reissuable,\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n parentOwnerAddress: changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueSubBuilder;\n","/**\n * Issue DePIN Builder\n * Builds transactions for creating DEPIN assets.\n *\n * DEPIN assets:\n * - Soulbound assets\n * - Format: &NAME or &NAME/SUB\n * - Cost: 10 XNA (same burn as UNIQUE assets)\n * - Units: Always 0\n * - Owner token is auto-created by the node\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter } = require('../utils');\nconst { AssetExistsError } = require('../errors');\nconst { IpfsValidator } = require('../validators');\n\nclass IssueDepinBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue DEPIN parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n this.validateAssetName(params.assetName, 'DEPIN');\n this.validateAmount(params.quantity, 0);\n\n if (params.units !== undefined && params.units !== 0) {\n throw new Error('DEPIN assets must use units=0');\n }\n\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n if (params.reissuable !== undefined && typeof params.reissuable !== 'boolean') {\n throw new Error('reissuable must be a boolean');\n }\n\n return true;\n }\n\n /**\n * Build DEPIN asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n reissuable = true,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n const exists = await this.assetExists(assetName);\n if (exists) {\n throw new AssetExistsError(\n `Asset ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n const burnInfo = this.burnManager.getIssueDepinBurn();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n const estimatedFee = await this.estimateFee(1, 3);\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n const actualFee = await this.estimateFee(baseCurrencyUTXOs.length, 3);\n const totalRequired = burnInfo.amount + actualFee;\n\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n const inputs = baseCurrencyUTXOs.map(utxo => ({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n }));\n\n const outputs = [];\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n const issueOutput = OutputFormatter.formatIssueOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, 0),\n units: 0,\n reissuable,\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash\n });\n\n outputs.push({ [toAddress]: issueOutput });\n\n const orderedOutputs = this.outputOrderer.order(outputs);\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n return this.formatResult(\n rawTx,\n baseCurrencyUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenName: `${assetName}!`,\n operationType: 'ISSUE_DEPIN',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_DEPIN',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, 0),\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n ownerTokenAddress: changeAddress,\n reissuable\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueDepinBuilder;\n","/**\n * Reissue Builder\n * Builds transactions for reissuing (minting more supply) assets\n *\n * Reissue:\n * - Mints additional supply of an existing asset\n * - Cost: 200 XNA (burned)\n * - Requires asset's owner token (ASSET!)\n * - Can lock asset (make it non-reissuable)\n * - Can update IPFS metadata\n * - Owner token must be returned\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst {\n AssetNotFoundError,\n AssetNotReissuableError,\n OwnerTokenNotFoundError,\n MaxSupplyExceededError\n} = require('../errors');\nconst { IpfsValidator } = require('../validators');\nconst { ASSET_LIMITS } = require('../constants');\n\nclass ReissueBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate reissue parameters\n * @param {object} params - Reissue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required (amount to mint)');\n }\n\n if (params.quantity <= 0) {\n throw new Error('quantity must be greater than 0');\n }\n\n // Validate new IPFS hash if provided\n if (params.newIpfs) {\n IpfsValidator.validate(params.newIpfs);\n }\n\n return true;\n }\n\n /**\n * Build reissue transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n reissuable,\n newIpfs\n } = this.params;\n\n // 2. Get asset data to verify it exists and is reissuable\n const assetData = await this.getAssetData(assetName);\n if (!assetData) {\n throw new AssetNotFoundError(\n `Asset ${assetName} does not exist on the blockchain`,\n assetName\n );\n }\n\n // 3. Check if asset is reissuable\n if (!assetData.reissuable) {\n throw new AssetNotReissuableError(\n `Asset ${assetName} is not reissuable. The supply has been locked.`,\n assetName\n );\n }\n\n // 4. Check if reissuing would exceed max supply\n const currentSupply = assetData.amount || 0;\n const additionalAmount = quantity;\n const newTotalSupply = currentSupply + additionalAmount;\n\n if (newTotalSupply > ASSET_LIMITS.MAX_QUANTITY) {\n throw new MaxSupplyExceededError(\n `Reissuing ${additionalAmount} would exceed maximum supply. ` +\n `Current: ${currentSupply}, Additional: ${additionalAmount}, ` +\n `Max: ${ASSET_LIMITS.MAX_QUANTITY}`,\n assetName,\n currentSupply,\n additionalAmount,\n ASSET_LIMITS.MAX_QUANTITY\n );\n }\n\n // 5. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n const isDepinAsset = AssetNameParser.isDepin(assetName);\n\n // 6. Find owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the asset's owner token (${ownerTokenName}) to reissue it. ` +\n `The owner token proves you have the right to mint more supply.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 7. Get burn information\n const burnInfo = this.burnManager.getReissueBurn();\n\n // 8. Estimate fee\n // Inputs: XNA UTXOs + owner token UTXO\n // Outputs: burn + change + reissue operation\n // (node auto-generates owner token return from the reissue entry, total = 4 physical outputs)\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 9. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 10. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 11. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 4);\n\n // 12. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 13. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 14. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 15. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Reissue operation\n // Note: the node auto-generates the owner token return as part of processing\n // the reissue entry — no explicit transfer output needed here.\n const units = assetData.units || 0;\n const reissueOutput = OutputFormatter.formatReissueOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n reissuable: reissuable !== undefined ? reissuable : undefined,\n new_ipfs: newIpfs || undefined,\n owner_change_address: isDepinAsset ? toAddress : changeAddress\n });\n\n outputs.push({ [toAddress]: reissueOutput });\n\n // 16. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 17. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 18. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenUsed: ownerTokenName,\n quantityMinted: quantity,\n newTotalSupply,\n previousSupply: currentSupply,\n reissuableLocked: reissuable === false,\n operationType: 'REISSUE',\n localRawBuild: this.buildLocalRawBuild(\n 'REISSUE',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, units),\n units,\n reissuable: reissuable !== undefined ? reissuable : undefined,\n ipfsHash: newIpfs || undefined,\n ownerChangeAddress: isDepinAsset ? toAddress : changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = ReissueBuilder;\n","/**\n * Issue Unique Builder\n * Builds transactions for creating UNIQUE assets (NFTs)\n *\n * UNIQUE assets:\n * - Non-fungible tokens (NFTs)\n * - Format: ROOT#TAG (e.g., MYNFT#001)\n * - Cost: 10 XNA per NFT (burned)\n * - Requires parent's owner token (ROOT!)\n * - Properties: quantity=1, units=0, reissuable=false (always)\n * - Can create multiple NFTs in single transaction\n * - Each NFT can have unique IPFS metadata\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst {\n ParentAssetNotFoundError,\n OwnerTokenNotFoundError,\n AssetExistsError\n} = require('../errors');\nconst { IpfsValidator } = require('../validators');\n\nclass IssueUniqueBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue UNIQUE parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.rootName) {\n throw new Error('rootName is required (parent asset name)');\n }\n\n if (!params.assetTags || !Array.isArray(params.assetTags) || params.assetTags.length === 0) {\n throw new Error('assetTags is required and must be a non-empty array');\n }\n\n // Validate root name\n this.validateAssetName(params.rootName, 'ROOT');\n\n // Validate each tag\n params.assetTags.forEach((tag, index) => {\n if (!tag || typeof tag !== 'string') {\n throw new Error(`assetTags[${index}] must be a non-empty string`);\n }\n\n // Validate full unique asset name\n const fullName = `${params.rootName}#${tag}`;\n this.validateAssetName(fullName, 'UNIQUE');\n });\n\n // Validate IPFS hashes if provided\n if (params.ipfsHashes) {\n if (!Array.isArray(params.ipfsHashes)) {\n throw new Error('ipfsHashes must be an array');\n }\n\n if (params.ipfsHashes.length !== params.assetTags.length) {\n throw new Error(\n `ipfsHashes array length (${params.ipfsHashes.length}) must match ` +\n `assetTags array length (${params.assetTags.length})`\n );\n }\n\n params.ipfsHashes.forEach((hash, index) => {\n if (hash) {\n IpfsValidator.validate(hash);\n }\n });\n }\n\n return true;\n }\n\n /**\n * Build UNIQUE asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n rootName,\n assetTags,\n ipfsHashes = []\n } = this.params;\n\n // 2. Check if parent asset exists\n const parentExists = await this.assetExists(rootName);\n if (!parentExists) {\n throw new ParentAssetNotFoundError(\n `Parent asset ${rootName} does not exist. You must create the ROOT asset first.`,\n rootName\n );\n }\n\n // 3. Check if any of the unique assets already exist\n for (const tag of assetTags) {\n const fullName = `${rootName}#${tag}`;\n const exists = await this.assetExists(fullName);\n if (exists) {\n throw new AssetExistsError(\n `Unique asset ${fullName} already exists on the blockchain`,\n fullName\n );\n }\n }\n\n // 4. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 5. Find parent's owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(rootName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the parent asset's owner token (${ownerTokenName}) to create UNIQUE assets. ` +\n `The owner token proves you control the parent asset.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 6. Get burn information (cost = 10 XNA per NFT)\n const nftCount = assetTags.length;\n const burnInfo = this.burnManager.getIssueUniqueBurn(nftCount);\n\n // 7. Estimate fee\n // Inputs: XNA UTXOs + owner token UTXO\n // Outputs: burn + change + owner token return + issue_unique operation\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 8. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 9. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 10. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 4);\n\n // 11. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 12. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 13. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 14. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Issue unique operation\n // NOTE: owner token return is handled automatically by the node when processing\n // issue_unique — adding it manually would cause TOKEN! to appear twice in outputs\n const issueUniqueOutput = OutputFormatter.formatIssueUniqueOutput({\n root_name: rootName,\n asset_tags: assetTags,\n ipfs_hashes: ipfsHashes.length > 0 ? ipfsHashes : undefined\n });\n\n outputs.push({ [toAddress]: issueUniqueOutput });\n\n // 15. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 16. Create raw transaction\n // NOTE: validateOwnerTokenReturn removed — the node returns TOKEN! automatically\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 17. Build list of created NFT names\n const createdNFTs = assetTags.map(tag => `${rootName}#${tag}`);\n\n // 18. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n rootName,\n assetTags,\n createdNFTs,\n nftCount,\n ownerTokenUsed: ownerTokenName,\n operationType: 'ISSUE_UNIQUE',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_UNIQUE',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n rootName,\n assetTags,\n ipfsHashes: ipfsHashes.length > 0 ? ipfsHashes : undefined,\n ownerTokenAddress: changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueUniqueBuilder;\n","/**\n * Issue Qualifier Builder\n * Builds transactions for creating QUALIFIER assets\n *\n * QUALIFIER assets:\n * - KYC/compliance tags (e.g., #KYC_VERIFIED, #ACCREDITED)\n * - Format: #NAME or #ROOT/SUB\n * - Cost: 2000 XNA (root) or 200 XNA (sub-qualifier)\n * - Quantity: 1-10 units only\n * - Units: Always 0 (non-divisible)\n * - Used to tag addresses for restricted asset compliance\n * - Root qualifiers do not create owner tokens\n * - Sub-qualifiers consume and return the parent qualifier asset itself\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst { AssetExistsError, ParentAssetNotFoundError, OwnerTokenNotFoundError } = require('../errors');\nconst { IpfsValidator, AmountValidator } = require('../validators');\n\nclass IssueQualifierBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue QUALIFIER parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n // Validate asset name (QUALIFIER format: #NAME)\n this.validateAssetName(params.assetName, 'QUALIFIER');\n\n // Validate quantity (1-10 only for qualifiers)\n AmountValidator.validateQualifierQuantity(params.quantity);\n\n // Validate IPFS hash if provided\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n return true;\n }\n\n /**\n * Determine if this is a sub-qualifier\n * @param {string} assetName - Qualifier name\n * @returns {boolean} True if sub-qualifier\n */\n isSubQualifier(assetName) {\n return assetName.includes('/');\n }\n\n /**\n * Build QUALIFIER asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n // 2. Determine if root or sub-qualifier\n const isSub = this.isSubQualifier(assetName);\n const parsed = AssetNameParser.parse(assetName);\n\n // 3. If sub-qualifier, check parent exists and get parent qualifier input\n let parentQualifierUTXOs = [];\n let parentQualifierQuantity = null;\n let parentQualifierName = null;\n const addresses = await this._getAddresses();\n\n if (isSub) {\n parentQualifierName = parsed.parent;\n\n // Check parent qualifier exists\n const parentExists = await this.assetExists(parentQualifierName);\n if (!parentExists) {\n throw new ParentAssetNotFoundError(\n `Parent qualifier ${parentQualifierName} does not exist. You must create the parent qualifier first.`,\n parentQualifierName\n );\n }\n\n // Find parent qualifier balance to spend and return as change\n try {\n const selection = await this.utxoSelector.selectAssetUTXOs(addresses, parentQualifierName, 1);\n parentQualifierUTXOs = selection.utxos;\n parentQualifierQuantity = selection.totalAmount;\n } catch (error) {\n if (error.name === 'InsufficientFundsError') {\n throw new OwnerTokenNotFoundError(\n `You must own the parent qualifier asset (${parentQualifierName}) to create a sub-qualifier.`,\n parentQualifierName\n );\n }\n throw error;\n }\n }\n\n // 4. Check if qualifier already exists\n const exists = await this.assetExists(assetName);\n if (exists) {\n throw new AssetExistsError(\n `Qualifier ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n // 5. Get burn information (2000 XNA for root, 200 XNA for sub)\n const burnInfo = isSub\n ? this.burnManager.getIssueSubQualifierBurn()\n : this.burnManager.getIssueQualifierBurn();\n\n // 6. Get addresses\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 7. Estimate fee\n const outputCount = 3;\n const estimatedFee = await this.estimateFee(2, outputCount);\n\n // 8. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 9. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 10. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + parentQualifierUTXOs.length;\n const actualFee = await this.estimateFee(actualInputCount, outputCount);\n\n // 11. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 12. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 13. Build inputs\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add parent qualifier inputs if sub-qualifier\n parentQualifierUTXOs.forEach(parentUTXO => {\n inputs.push({\n txid: parentUTXO.txid,\n vout: parentUTXO.outputIndex,\n address: parentUTXO.address,\n assetName: parentUTXO.assetName,\n satoshis: parentUTXO.satoshis\n });\n });\n\n // 14. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Issue qualifier operation\n const issueQualifierOutput = OutputFormatter.formatIssueQualifierOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, 0),\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash,\n root_change_address: isSub ? changeAddress : undefined,\n change_quantity: isSub && parentQualifierQuantity !== null\n ? this.toSatoshis(parentQualifierQuantity, 0)\n : undefined\n });\n\n outputs.push({ [toAddress]: issueQualifierOutput });\n\n // 15. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 16. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 17. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ...parentQualifierUTXOs];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n qualifierType: isSub ? 'SUB_QUALIFIER' : 'QUALIFIER',\n parentQualifier: isSub ? parsed.parent : null,\n parentQualifierUsed: parentQualifierName,\n operationType: isSub ? 'ISSUE_SUB_QUALIFIER' : 'ISSUE_QUALIFIER',\n localRawBuild: this.buildLocalRawBuild(\n isSub ? 'ISSUE_SUB_QUALIFIER' : 'ISSUE_QUALIFIER',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, 0),\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n rootChangeAddress: isSub ? changeAddress : undefined,\n changeQuantityRaw: isSub && parentQualifierQuantity !== null\n ? this.toSatoshis(parentQualifierQuantity, 0)\n : undefined\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueQualifierBuilder;\n","/**\n * Issue Restricted Builder\n * Builds transactions for creating RESTRICTED assets (security tokens)\n *\n * RESTRICTED assets:\n * - Security tokens with KYC/compliance controls\n * - Format: $NAME (e.g., $SECURITY, $STOCK)\n * - Cost: 3000 XNA (burned)\n * - Requires verifier string (boolean logic with qualifiers)\n * - Only addresses meeting verifier requirements can receive/hold\n * - Can freeze individual addresses or entire asset\n * - Creates owner token (ASSET!)\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst { AssetExistsError, OwnerTokenNotFoundError } = require('../errors');\nconst { IpfsValidator, VerifierValidator } = require('../validators');\n\nclass IssueRestrictedBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue RESTRICTED parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n if (!params.verifierString) {\n throw new Error('verifierString is required for restricted assets');\n }\n\n // Validate asset name (RESTRICTED format: $NAME)\n this.validateAssetName(params.assetName, 'RESTRICTED');\n\n // Validate quantity and units\n const units = params.units !== undefined ? params.units : 0;\n this.validateAmount(params.quantity, units);\n\n // Validate verifier string (critical for compliance)\n VerifierValidator.validate(params.verifierString);\n\n // Validate IPFS hash if provided\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n // Validate reissuable is boolean if provided\n if (params.reissuable !== undefined && typeof params.reissuable !== 'boolean') {\n throw new Error('reissuable must be a boolean');\n }\n\n return true;\n }\n\n /**\n * Build RESTRICTED asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n units = 0,\n verifierString,\n reissuable = true,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n // 2. Check if asset already exists\n const exists = await this.assetExists(assetName);\n if (exists) {\n throw new AssetExistsError(\n `Asset ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n // 3. Extract qualifiers from verifier string for info\n const requiredQualifiers = VerifierValidator.extractQualifiers(verifierString);\n\n // 4. Get burn information (3000 XNA for restricted assets)\n const burnInfo = this.burnManager.getIssueRestrictedBurn();\n\n // 5. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 6. Find owner token UTXO (CRITICAL: node requires it as input)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the owner token (${ownerTokenName}) to issue the restricted asset ${assetName}.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 7. Estimate fee (+1 for owner token input)\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 8. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 9. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 10. Recalculate fee with actual input count (+1 for owner token)\n const actualFee = await this.estimateFee(baseCurrencyUTXOs.length + 1, 4);\n\n // 11. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 12. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 13. Build inputs (XNA + owner token)\n const inputs = [];\n\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input (node requires it to issue restricted asset)\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 14. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Issue restricted operation\n const issueRestrictedOutput = OutputFormatter.formatIssueRestrictedOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n verifier_string: verifierString,\n units: units,\n reissuable: reissuable,\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash,\n owner_change_address: changeAddress\n });\n\n outputs.push({ [toAddress]: issueRestrictedOutput });\n\n // 15. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 16. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 17. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenName,\n verifierString,\n requiredQualifiers,\n operationType: 'ISSUE_RESTRICTED',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_RESTRICTED',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, units),\n verifierString,\n units,\n reissuable,\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n ownerChangeAddress: changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueRestrictedBuilder;\n","/**\n * Reissue Restricted Builder\n * Builds transactions for reissuing RESTRICTED assets\n *\n * Reissue Restricted:\n * - Mints additional supply of restricted asset\n * - Cost: 200 XNA (burned)\n * - Requires asset's owner token (ASSET!)\n * - Can update verifier string\n * - Can lock asset (make it non-reissuable)\n * - Can update IPFS metadata\n * - Owner token must be returned\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst {\n AssetNotFoundError,\n AssetNotReissuableError,\n OwnerTokenNotFoundError,\n MaxSupplyExceededError\n} = require('../errors');\nconst { IpfsValidator, VerifierValidator } = require('../validators');\nconst { ASSET_LIMITS } = require('../constants');\n\nclass ReissueRestrictedBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate reissue restricted parameters\n * @param {object} params - Reissue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n // Validate asset name is restricted\n this.validateAssetName(params.assetName, 'RESTRICTED');\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required (amount to mint)');\n }\n\n if (params.quantity <= 0) {\n throw new Error('quantity must be greater than 0');\n }\n\n // Validate verifier string if changing\n if (params.changeVerifier && params.newVerifier) {\n VerifierValidator.validate(params.newVerifier);\n }\n\n // Validate new IPFS hash if provided\n if (params.newIpfs) {\n IpfsValidator.validate(params.newIpfs);\n }\n\n return true;\n }\n\n /**\n * Build reissue restricted transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n changeVerifier = false,\n newVerifier,\n reissuable,\n newIpfs\n } = this.params;\n\n // 2. Get asset data to verify it exists and is reissuable\n const assetData = await this.getAssetData(assetName);\n if (!assetData) {\n throw new AssetNotFoundError(\n `Asset ${assetName} does not exist on the blockchain`,\n assetName\n );\n }\n\n // 3. Check if asset is reissuable\n if (!assetData.reissuable) {\n throw new AssetNotReissuableError(\n `Asset ${assetName} is not reissuable. The supply has been locked.`,\n assetName\n );\n }\n\n // 4. Check if reissuing would exceed max supply\n const currentSupply = assetData.amount || 0;\n const additionalAmount = quantity;\n const newTotalSupply = currentSupply + additionalAmount;\n\n if (newTotalSupply > ASSET_LIMITS.MAX_QUANTITY) {\n throw new MaxSupplyExceededError(\n `Reissuing ${additionalAmount} would exceed maximum supply. ` +\n `Current: ${currentSupply}, Additional: ${additionalAmount}, ` +\n `Max: ${ASSET_LIMITS.MAX_QUANTITY}`,\n assetName,\n currentSupply,\n additionalAmount,\n ASSET_LIMITS.MAX_QUANTITY\n );\n }\n\n // 5. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 6. Find owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the asset's owner token (${ownerTokenName}) to reissue it. ` +\n `The owner token proves you have the right to mint more supply and manage the asset.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 7. Get burn information\n const burnInfo = this.burnManager.getReissueBurn();\n\n // 8. Estimate fee\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 9. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 10. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 11. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 4);\n\n // 12. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 13. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 14. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 15. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Reissue restricted operation\n const units = assetData.units || 0;\n const reissueRestrictedOutput = OutputFormatter.formatReissueRestrictedOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n change_verifier: changeVerifier,\n new_verifier: changeVerifier ? newVerifier : undefined,\n reissuable: reissuable !== undefined ? reissuable : undefined,\n new_ipfs: newIpfs || undefined,\n owner_change_address: this.params.ownerChangeAddress || changeAddress\n });\n\n outputs.push({ [toAddress]: reissueRestrictedOutput });\n\n // 16. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 17. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 18. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n // Extract qualifiers from new verifier if changed\n const requiredQualifiers = changeVerifier && newVerifier\n ? VerifierValidator.extractQualifiers(newVerifier)\n : null;\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenUsed: ownerTokenName,\n quantityMinted: quantity,\n newTotalSupply,\n previousSupply: currentSupply,\n verifierChanged: changeVerifier,\n newVerifier: changeVerifier ? newVerifier : undefined,\n requiredQualifiers,\n reissuableLocked: reissuable === false,\n operationType: 'REISSUE_RESTRICTED',\n localRawBuild: this.buildLocalRawBuild(\n 'REISSUE_RESTRICTED',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, assetData.units || 0),\n units: assetData.units || 0,\n reissuable: reissuable !== undefined ? reissuable : undefined,\n ipfsHash: newIpfs || undefined,\n ownerChangeAddress: this.params.ownerChangeAddress || changeAddress,\n verifierString: changeVerifier ? newVerifier : undefined\n }\n )\n }\n );\n }\n}\n\nmodule.exports = ReissueRestrictedBuilder;\n","/**\n * Tag Address Builder\n * Builds transactions for tagging/untagging addresses with qualifiers\n *\n * Tag operations:\n * - Assign qualifier tags to addresses (for restricted asset compliance)\n * - Remove qualifier tags from addresses\n * - Cost: 0.1 XNA per address (burned)\n * - Requires spending the qualifier asset itself (#QUALIFIER)\n * - Used to mark addresses as KYC'd, accredited, etc.\n * - Owner token must be returned\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter } = require('../utils');\nconst { AssetNotFoundError, OwnerTokenNotFoundError, InvalidAddressError } = require('../errors');\n\nclass TagAddressBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate tag/untag parameters\n * @param {object} params - Tag parameters\n * @param {boolean} isUntag - True if untag operation\n * @throws {Error} If validation fails\n */\n validateParams(params, isUntag = false) {\n // Validate required parameters\n if (!params.qualifierName) {\n throw new Error('qualifierName is required');\n }\n\n if (!params.addresses || !Array.isArray(params.addresses) || params.addresses.length === 0) {\n throw new Error('addresses is required and must be a non-empty array');\n }\n\n if (params.addresses.length > 10) {\n throw new Error('addresses array cannot exceed 10 entries per transaction (node limit)');\n }\n\n // Validate qualifier name\n this.validateAssetName(params.qualifierName, 'QUALIFIER');\n\n // Validate addresses\n params.addresses.forEach((address, index) => {\n if (!address || typeof address !== 'string') {\n throw new InvalidAddressError(\n `addresses[${index}] must be a non-empty string`,\n address\n );\n }\n\n // Address prefix validation is left to the node (varies by network)\n });\n\n return true;\n }\n\n /**\n * Build tag addresses transaction\n * @param {boolean} isUntag - True for untag operation, false for tag\n * @returns {Promise<object>} Transaction result\n */\n async buildTagOperation(isUntag = false) {\n // 1. Validate parameters\n await this.validateParams(this.params, isUntag);\n\n const {\n qualifierName,\n addresses: targetAddresses,\n } = this.params;\n\n // 2. Check if qualifier exists\n const qualifierExists = await this.assetExists(qualifierName);\n if (!qualifierExists) {\n throw new AssetNotFoundError(\n `Qualifier ${qualifierName} does not exist. You must create the qualifier first.`,\n qualifierName\n );\n }\n\n // 3. Get wallet addresses\n const addresses = await this._getAddresses();\n const changeAddress = await this.getChangeAddress();\n\n // 4. Find qualifier asset balance (CRITICAL: must have this)\n let qualifierUTXOs;\n let qualifierQuantity;\n try {\n const selection = await this.utxoSelector.selectAssetUTXOs(addresses, qualifierName, 1);\n qualifierUTXOs = selection.utxos;\n qualifierQuantity = selection.totalAmount;\n } catch (error) {\n if (error.name === 'InsufficientFundsError') {\n throw new OwnerTokenNotFoundError(\n `You must own the qualifier asset (${qualifierName}) to tag/untag addresses.`,\n qualifierName\n );\n }\n throw error;\n }\n\n // 5. Get burn information (0.1 XNA per address)\n const addressCount = targetAddresses.length;\n const burnInfo = isUntag\n ? this.burnManager.getUntagAddressBurn(addressCount)\n : this.burnManager.getTagAddressBurn(addressCount);\n\n // 6. Estimate fee\n const estimatedFee = await this.estimateFee(2, 3);\n\n // 7. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 8. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 9. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + qualifierUTXOs.length;\n const actualFee = await this.estimateFee(actualInputCount, 3);\n\n // 10. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 11. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 12. Build inputs (XNA + qualifier asset)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n qualifierUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n assetName: utxo.assetName,\n satoshis: utxo.satoshis\n });\n });\n\n // 13. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Tag/Untag operation. The node creates the qualifier change output\n // from the operation object itself, so this must be sent to the change address.\n const operationOutput = isUntag\n ? OutputFormatter.formatUntagAddressesOutput({\n qualifier: qualifierName,\n addresses: targetAddresses,\n change_quantity: this.toSatoshis(qualifierQuantity, 0)\n })\n : OutputFormatter.formatTagAddressesOutput({\n qualifier: qualifierName,\n addresses: targetAddresses,\n change_quantity: this.toSatoshis(qualifierQuantity, 0)\n });\n\n outputs.push({ [changeAddress]: operationOutput });\n\n // 14. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 15. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 16. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ...qualifierUTXOs];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n qualifierName,\n qualifierAssetUsed: qualifierName,\n targetAddresses,\n addressCount,\n operationType: isUntag ? 'UNTAG_ADDRESSES' : 'TAG_ADDRESSES',\n localRawBuild: this.buildLocalRawBuild(\n isUntag ? 'UNTAG_ADDRESSES' : 'TAG_ADDRESSES',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n qualifierName,\n targetAddresses,\n qualifierChangeAddress: changeAddress,\n qualifierChangeAmountRaw: this.toSatoshis(qualifierQuantity, 0)\n }\n )\n }\n );\n }\n\n /**\n * Build tag addresses transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n return this.buildTagOperation(false);\n }\n\n /**\n * Build untag addresses transaction\n * @returns {Promise<object>} Transaction result\n */\n async buildUntag() {\n return this.buildTagOperation(true);\n }\n}\n\nmodule.exports = TagAddressBuilder;\n","/**\n * Freeze Address Builder\n * Builds transactions for freezing/unfreezing addresses and assets\n *\n * Freeze operations (restricted assets only):\n * - Freeze specific addresses (prevent trading)\n * - Unfreeze specific addresses (allow trading again)\n * - Global asset freeze (freeze entire asset)\n * - Global asset unfreeze (unfreeze entire asset)\n * - Cost: No burn (but requires fee)\n * - Requires restricted asset's owner token ($ASSET!)\n * - Owner token must be returned\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst { AssetNotFoundError, OwnerTokenNotFoundError, InvalidAddressError } = require('../errors');\n\nclass FreezeAddressBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate freeze/unfreeze parameters\n * @param {object} params - Freeze parameters\n * @param {string} operationType - Operation type\n * @throws {Error} If validation fails\n */\n validateParams(params, operationType) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n // Validate asset name is restricted\n this.validateAssetName(params.assetName, 'RESTRICTED');\n\n // For address-specific operations, validate addresses\n if (operationType === 'FREEZE_ADDRESSES' || operationType === 'UNFREEZE_ADDRESSES') {\n if (!params.addresses || !Array.isArray(params.addresses) || params.addresses.length === 0) {\n throw new Error('addresses is required and must be a non-empty array');\n }\n\n // Validate each address\n params.addresses.forEach((address, index) => {\n if (!address || typeof address !== 'string') {\n throw new InvalidAddressError(\n `addresses[${index}] must be a non-empty string`,\n address\n );\n }\n\n // Address prefix validation is left to the node (varies by network)\n });\n }\n\n return true;\n }\n\n /**\n * Build freeze operation transaction\n * @param {string} operationType - Operation type\n * @returns {Promise<object>} Transaction result\n */\n async buildFreezeOperation(operationType) {\n // 1. Validate parameters\n await this.validateParams(this.params, operationType);\n\n const { assetName } = this.params;\n\n // 2. Check if asset exists and is restricted\n const assetData = await this.getAssetData(assetName);\n if (!assetData) {\n throw new AssetNotFoundError(\n `Asset ${assetName} does not exist on the blockchain`,\n assetName\n );\n }\n\n // 3. Get wallet addresses\n const addresses = await this._getAddresses();\n const changeAddress = await this.getChangeAddress();\n\n // 4. Find owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the restricted asset's owner token (${ownerTokenName}) to freeze/unfreeze addresses or the asset.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 5. No burn for freeze operations (only fee)\n const burnAmount = 0;\n\n // 6. Estimate fee\n const estimatedFee = await this.estimateFee(2, 3);\n\n // 7. Select XNA UTXOs (only for fee, no burn)\n const utxoSelection = await this.selectUTXOs(estimatedFee, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 8. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 3);\n\n // 9. Verify we have enough XNA for fee\n if (totalXNAInput < actualFee) {\n const additionalNeeded = actualFee - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 10. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - actualFee;\n\n // 11. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 12. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Freeze/Unfreeze operation\n let operationOutput;\n let targetAddresses = [];\n\n switch (operationType) {\n case 'FREEZE_ADDRESSES':\n targetAddresses = this.params.addresses;\n operationOutput = OutputFormatter.formatFreezeAddressesOutput({\n asset_name: assetName,\n addresses: targetAddresses\n });\n outputs.push({ [changeAddress]: operationOutput });\n break;\n\n case 'UNFREEZE_ADDRESSES':\n targetAddresses = this.params.addresses;\n operationOutput = OutputFormatter.formatUnfreezeAddressesOutput({\n asset_name: assetName,\n addresses: targetAddresses\n });\n outputs.push({ [changeAddress]: operationOutput });\n break;\n\n case 'FREEZE_ASSET':\n operationOutput = OutputFormatter.formatFreezeAssetOutput(assetName);\n outputs.push({ [changeAddress]: operationOutput });\n break;\n\n case 'UNFREEZE_ASSET':\n operationOutput = OutputFormatter.formatUnfreezeAssetOutput(assetName);\n outputs.push({ [changeAddress]: operationOutput });\n break;\n\n default:\n throw new Error(`Unknown freeze operation type: ${operationType}`);\n }\n\n // 13. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 14. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 15. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnAmount,\n {\n assetName,\n ownerTokenUsed: ownerTokenName,\n targetAddresses: targetAddresses.length > 0 ? targetAddresses : null,\n addressCount: targetAddresses.length,\n operationType,\n localRawBuild: this.buildLocalRawBuild(\n operationType,\n inputs,\n null,\n xnaChange > 0.00000001 ? changeAddress : null,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n operationType === 'FREEZE_ADDRESSES' || operationType === 'UNFREEZE_ADDRESSES'\n ? {\n assetName,\n targetAddresses,\n ownerChangeAddress: changeAddress\n }\n : {\n assetName,\n ownerChangeAddress: changeAddress\n }\n )\n }\n );\n }\n\n /**\n * Build freeze addresses transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n return this.buildFreezeOperation('FREEZE_ADDRESSES');\n }\n\n /**\n * Build unfreeze addresses transaction\n * @returns {Promise<object>} Transaction result\n */\n async buildUnfreeze() {\n return this.buildFreezeOperation('UNFREEZE_ADDRESSES');\n }\n\n /**\n * Build global freeze asset transaction\n * @returns {Promise<object>} Transaction result\n */\n async buildGlobalFreeze() {\n return this.buildFreezeOperation('FREEZE_ASSET');\n }\n\n /**\n * Build global unfreeze asset transaction\n * @returns {Promise<object>} Transaction result\n */\n async buildGlobalUnfreeze() {\n return this.buildFreezeOperation('UNFREEZE_ASSET');\n }\n}\n\nmodule.exports = FreezeAddressBuilder;\n","/**\n * Builders Module\n * Exports all transaction builder classes\n */\n\n// Base\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\n\n// Basic Builders\nconst IssueRootBuilder = require('./IssueRootBuilder');\nconst IssueSubBuilder = require('./IssueSubBuilder');\nconst IssueDepinBuilder = require('./IssueDepinBuilder');\nconst ReissueBuilder = require('./ReissueBuilder');\n\n// Advanced Builders\nconst IssueUniqueBuilder = require('./IssueUniqueBuilder');\nconst IssueQualifierBuilder = require('./IssueQualifierBuilder');\nconst IssueRestrictedBuilder = require('./IssueRestrictedBuilder');\nconst ReissueRestrictedBuilder = require('./ReissueRestrictedBuilder');\nconst TagAddressBuilder = require('./TagAddressBuilder');\nconst FreezeAddressBuilder = require('./FreezeAddressBuilder');\n\nmodule.exports = {\n // Base\n BaseAssetTransactionBuilder,\n\n // Basic Builders\n IssueRootBuilder,\n IssueSubBuilder,\n IssueDepinBuilder,\n ReissueBuilder,\n\n // Advanced Builders\n IssueUniqueBuilder,\n IssueQualifierBuilder,\n IssueRestrictedBuilder,\n ReissueRestrictedBuilder,\n TagAddressBuilder,\n FreezeAddressBuilder\n};\n","/**\n * NeuraiAssets - Main API Class\n * Unified interface for all Neurai asset operations\n *\n * Usage:\n * const assets = new NeuraiAssets(rpc, {\n * network: 'xna',\n * addresses: ['N...'],\n * changeAddress: 'N...',\n * toAddress: 'N...'\n * });\n *\n * // Create asset\n * const result = await assets.createRootAsset({\n * assetName: 'MYTOKEN',\n * quantity: 1000000,\n * units: 2\n * });\n *\n * // Query asset\n * const assetData = await assets.getAssetData('MYTOKEN');\n */\n\nconst { AssetQueries } = require('./queries');\nconst {\n IssueRootBuilder,\n IssueSubBuilder,\n IssueDepinBuilder,\n IssueUniqueBuilder,\n IssueQualifierBuilder,\n IssueRestrictedBuilder,\n ReissueBuilder,\n ReissueRestrictedBuilder,\n TagAddressBuilder,\n FreezeAddressBuilder\n} = require('./builders');\n\nclass NeuraiAssets {\n /**\n * @param {Function} rpc - RPC function to call Neurai node\n * @param {object} config - Configuration options\n * @param {string} config.network - Network identifier ('xna' or 'xna-test')\n * @param {Array<string>} config.addresses - Wallet addresses\n * @param {string} config.changeAddress - Default change address\n * @param {string} config.toAddress - Default receiving address\n */\n constructor(rpc, config = {}) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n\n this.rpc = rpc;\n this.config = {\n network: config.network || 'xna',\n addresses: config.addresses || [],\n changeAddress: config.changeAddress || null,\n toAddress: config.toAddress || null\n };\n\n // Initialize query interface\n this.queries = new AssetQueries(rpc);\n }\n\n /**\n * Update configuration\n * @param {object} config - New configuration\n */\n updateConfig(config) {\n Object.assign(this.config, config);\n }\n\n /**\n * Build transaction parameters object\n * @param {object} params - Operation-specific parameters\n * @returns {object} Complete parameters with config\n */\n _buildParams(params) {\n return {\n ...params,\n network: this.config.network,\n walletAddresses: this.config.addresses,\n changeAddress: params.changeAddress || this.config.changeAddress,\n toAddress: params.toAddress || this.config.toAddress\n };\n }\n\n // ========================================\n // ROOT ASSET OPERATIONS\n // ========================================\n\n /**\n * Create a ROOT asset\n * @param {object} params - Asset creation parameters\n * @param {string} params.assetName - Asset name (3-30 chars, A-Z 0-9 _ .)\n * @param {number} params.quantity - Total supply\n * @param {number} [params.units=0] - Decimal places (0-8)\n * @param {boolean} [params.reissuable=true] - Can mint more later\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash (if hasIpfs=true)\n * @returns {Promise<object>} Transaction data\n */\n async createRootAsset(params) {\n const builder = new IssueRootBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Create a SUB asset\n * @param {object} params - Sub-asset creation parameters\n * @param {string} params.assetName - Asset name (ROOT/SUB format)\n * @param {number} params.quantity - Total supply\n * @param {number} [params.units=0] - Decimal places (0-8)\n * @param {boolean} [params.reissuable=true] - Can mint more later\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash (if hasIpfs=true)\n * @returns {Promise<object>} Transaction data\n */\n async createSubAsset(params) {\n const builder = new IssueSubBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Create a DEPIN asset\n * @param {object} params - DEPIN creation parameters\n * @param {string} params.assetName - Asset name (&NAME or &NAME/SUB)\n * @param {number} params.quantity - Total supply\n * @param {boolean} [params.reissuable=true] - Can mint more later\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash\n * @returns {Promise<object>} Transaction data\n */\n async createDepinAsset(params) {\n const builder = new IssueDepinBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Reissue (mint more) of a ROOT or SUB asset\n * @param {object} params - Reissue parameters\n * @param {string} params.assetName - Asset name\n * @param {number} params.quantity - Amount to mint\n * @param {boolean} [params.reissuable] - Lock supply if false\n * @param {string} [params.newIpfs] - Update IPFS hash\n * @returns {Promise<object>} Transaction data\n */\n async reissueAsset(params) {\n const builder = new ReissueBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n // ========================================\n // UNIQUE ASSET (NFT) OPERATIONS\n // ========================================\n\n /**\n * Create UNIQUE assets (NFTs)\n * @param {object} params - NFT creation parameters\n * @param {string} params.rootAssetName - Root asset name\n * @param {Array<object>} params.assetTags - NFT tags and metadata\n * @param {string} params.assetTags[].tag - Unique identifier for this NFT\n * @param {boolean} [params.assetTags[].hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.assetTags[].ipfsHash] - IPFS hash for this NFT\n * @returns {Promise<object>} Transaction data\n */\n async createUniqueAssets(params) {\n const builder = new IssueUniqueBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n // ========================================\n // QUALIFIER OPERATIONS (KYC Tags)\n // ========================================\n\n /**\n * Create a QUALIFIER (root or sub)\n * @param {object} params - Qualifier creation parameters\n * @param {string} params.qualifierName - Qualifier name (#NAME or #ROOT/#SUB)\n * @param {number} [params.quantity=1] - Quantity (1-10)\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash\n * @param {string} [params.changeAddress] - Override change address\n * @returns {Promise<object>} Transaction data\n */\n async createQualifier(params) {\n const normalized = { ...params, assetName: params.assetName || params.qualifierName };\n const builder = new IssueQualifierBuilder(this.rpc, this._buildParams(normalized));\n return await builder.build();\n }\n\n /**\n * Assign qualifier tag(s) to address(es)\n * @param {object} params - Tag assignment parameters\n * @param {string} params.qualifierName - Qualifier name (#NAME)\n * @param {Array<string>} params.addresses - Addresses to tag\n * @param {string} [params.assetData=''] - Optional data\n * @returns {Promise<object>} Transaction data\n */\n async tagAddresses(params) {\n const builder = new TagAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Remove qualifier tag(s) from address(es)\n * @param {object} params - Tag removal parameters\n * @param {string} params.qualifierName - Qualifier name (#NAME)\n * @param {Array<string>} params.addresses - Addresses to untag\n * @returns {Promise<object>} Transaction data\n */\n async untagAddresses(params) {\n const builder = new TagAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.buildUntag();\n }\n\n // ========================================\n // RESTRICTED ASSET OPERATIONS (Security Tokens)\n // ========================================\n\n /**\n * Create a RESTRICTED asset (security token)\n * @param {object} params - Restricted asset creation parameters\n * @param {string} params.assetName - Asset name ($NAME format)\n * @param {number} params.quantity - Total supply\n * @param {string} params.verifierString - Boolean logic for compliance (e.g., \"#KYC & #ACCREDITED\")\n * @param {number} [params.units=0] - Decimal places (0-8)\n * @param {boolean} [params.reissuable=true] - Can mint more later\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash\n * @returns {Promise<object>} Transaction data\n */\n async createRestrictedAsset(params) {\n const builder = new IssueRestrictedBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Reissue (mint more) of a RESTRICTED asset\n * @param {object} params - Reissue parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @param {number} params.quantity - Amount to mint\n * @param {boolean} [params.changeVerifier=false] - Update verifier string\n * @param {string} [params.newVerifier] - New verifier string (if changeVerifier=true)\n * @param {boolean} [params.reissuable] - Lock supply if false\n * @param {string} [params.newIpfs] - Update IPFS hash\n * @returns {Promise<object>} Transaction data\n */\n async reissueRestrictedAsset(params) {\n const builder = new ReissueRestrictedBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Freeze specific addresses for a restricted asset\n * @param {object} params - Freeze parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @param {Array<string>} params.addresses - Addresses to freeze\n * @returns {Promise<object>} Transaction data\n */\n async freezeAddresses(params) {\n const builder = new FreezeAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Unfreeze specific addresses for a restricted asset\n * @param {object} params - Unfreeze parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @param {Array<string>} params.addresses - Addresses to unfreeze\n * @returns {Promise<object>} Transaction data\n */\n async unfreezeAddresses(params) {\n const builder = new FreezeAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.buildUnfreeze();\n }\n\n /**\n * Freeze entire restricted asset globally\n * @param {object} params - Global freeze parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @returns {Promise<object>} Transaction data\n */\n async freezeAssetGlobally(params) {\n const builder = new FreezeAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.buildGlobalFreeze();\n }\n\n /**\n * Unfreeze entire restricted asset globally\n * @param {object} params - Global unfreeze parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @returns {Promise<object>} Transaction data\n */\n async unfreezeAssetGlobally(params) {\n const builder = new FreezeAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.buildGlobalUnfreeze();\n }\n\n // ========================================\n // QUERY OPERATIONS\n // Delegates to AssetQueries instance\n // ========================================\n // Note: Asset transfers are handled by neurai-jswallet\n\n /**\n * Get asset metadata\n * @param {string} assetName - Asset name\n * @returns {Promise<object>} Asset data\n */\n async getAssetData(assetName) {\n return await this.queries.getAssetData(assetName);\n }\n\n /**\n * List all assets on blockchain\n * @param {string} [filter='*'] - Filter pattern (e.g., 'MY*')\n * @param {boolean} [verbose=false] - Include detailed information\n * @param {number} [count=100] - Maximum number to return\n * @param {number} [start=0] - Starting index for pagination\n * @returns {Promise<Array|object>} Array of asset names or detailed objects\n */\n async listAssets(filter = '*', verbose = false, count = 100, start = 0) {\n return await this.queries.listAssets(filter, verbose, count, start);\n }\n\n /**\n * List assets owned by wallet\n * @param {string} [assetName='*'] - Filter by asset name\n * @param {boolean} [verbose=false] - Include detailed information\n * @param {number} [count=100] - Maximum number to return\n * @param {number} [start=0] - Starting index\n * @param {number} [confs=1] - Minimum confirmations\n * @returns {Promise<object>} Object with asset names as keys and amounts as values\n */\n async listMyAssets(assetName = '*', verbose = false, count = 100, start = 0, confs = 1) {\n return await this.queries.listMyAssets(assetName, verbose, count, start, confs);\n }\n\n /**\n * List all addresses holding a specific asset\n * @param {string} assetName - Asset name\n * @param {boolean} [onlyCount=false] - Return only count instead of full list\n * @param {number} [count=100] - Maximum number to return\n * @param {number} [start=0] - Starting index\n * @returns {Promise<Array|number>} Array of {address, amount} or count\n */\n async listAddressesByAsset(assetName, onlyCount = false, count = 100, start = 0) {\n return await this.queries.listAddressesByAsset(assetName, onlyCount, count, start);\n }\n\n /**\n * List asset balances for a specific address\n * @param {string} address - Address to query\n * @param {boolean} [onlyTotal=false] - Return only count instead of full list\n * @param {number} [count=100] - Maximum number to return\n * @param {number} [start=0] - Starting index\n * @returns {Promise<Array|number>} Array of {asset, amount} or count\n */\n async listAssetBalancesByAddress(address, onlyTotal = false, count = 100, start = 0) {\n return await this.queries.listAssetBalancesByAddress(address, onlyTotal, count, start);\n }\n\n /**\n * Check if an address has a specific qualifier tag\n * @param {string} address - Address to check\n * @param {string} qualifierName - Qualifier name (e.g., '#KYC_VERIFIED')\n * @returns {Promise<boolean>} True if address has the tag\n */\n async checkAddressTag(address, qualifierName) {\n return await this.queries.checkAddressTag(address, qualifierName);\n }\n\n /**\n * List all qualifiers assigned to an address\n * @param {string} address - Address to query\n * @returns {Promise<Array>} Array of qualifier names\n */\n async listTagsForAddress(address) {\n return await this.queries.listTagsForAddress(address);\n }\n\n /**\n * List all addresses with a specific qualifier tag\n * @param {string} qualifierName - Qualifier name\n * @returns {Promise<Array>} Array of addresses\n */\n async listAddressesForTag(qualifierName) {\n return await this.queries.listAddressesForTag(qualifierName);\n }\n\n /**\n * Check if an address can hold a restricted asset\n * @param {string} address - Address to check\n * @param {string} restrictedAssetName - Restricted asset name (e.g., '$SECURITY')\n * @returns {Promise<boolean>} True if address meets verifier requirements\n */\n async checkAddressRestriction(address, restrictedAssetName) {\n return await this.queries.checkAddressRestriction(address, restrictedAssetName);\n }\n\n /**\n * Check if an address is frozen for a restricted asset\n * @param {string} address - Address to check\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<boolean>} True if address is frozen\n */\n async isAddressFrozen(address, restrictedAssetName) {\n return await this.queries.isAddressFrozen(address, restrictedAssetName);\n }\n\n /**\n * Check if an asset is globally frozen\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<boolean>} True if asset is globally frozen\n */\n async checkGlobalRestriction(restrictedAssetName) {\n return await this.queries.checkGlobalRestriction(restrictedAssetName);\n }\n\n /**\n * Get verifier string for a restricted asset\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<string>} Verifier string\n */\n async getVerifierString(restrictedAssetName) {\n return await this.queries.getVerifierString(restrictedAssetName);\n }\n\n /**\n * Validate verifier string syntax\n * @param {string} verifierString - Verifier string to validate\n * @returns {Promise<boolean>} True if valid\n */\n async isValidVerifierString(verifierString) {\n return await this.queries.isValidVerifierString(verifierString);\n }\n\n /**\n * Get snapshot of asset ownership at a specific block\n * @param {string} assetName - Asset name\n * @param {number} blockHeight - Block height for snapshot\n * @returns {Promise<object>} Snapshot request result\n */\n async getSnapshotRequest(assetName, blockHeight) {\n return await this.queries.getSnapshotRequest(assetName, blockHeight);\n }\n\n /**\n * Cancel a snapshot request\n * @param {string} assetName - Asset name\n * @param {number} blockHeight - Block height of snapshot to cancel\n * @returns {Promise<boolean>} True if cancelled successfully\n */\n async cancelSnapshotRequest(assetName, blockHeight) {\n return await this.queries.cancelSnapshotRequest(assetName, blockHeight);\n }\n\n /**\n * List DEPIN holders with validity status\n * @param {string} assetName - DEPIN asset name\n * @returns {Promise<Array>} Holder entries\n */\n async listDepinHolders(assetName) {\n return await this.queries.listDepinHolders(assetName);\n }\n\n /**\n * Check DEPIN validity for an address\n * @param {string} assetName - DEPIN asset name\n * @param {string} address - Address to query\n * @returns {Promise<object>} Validity details\n */\n async checkDepinValidity(assetName, address) {\n return await this.queries.checkDepinValidity(assetName, address);\n }\n\n /**\n * Check if asset exists\n * @param {string} assetName - Asset name\n * @returns {Promise<boolean>} True if asset exists\n */\n async assetExists(assetName) {\n return await this.queries.assetExists(assetName);\n }\n\n /**\n * Get asset type from name\n * @param {string} assetName - Asset name\n * @returns {string} Asset type ('ROOT', 'SUB', 'UNIQUE', 'QUALIFIER', 'RESTRICTED', 'DEPIN', 'OWNER')\n */\n getAssetType(assetName) {\n return this.queries.getAssetType(assetName);\n }\n\n /**\n * Get total count of assets on blockchain\n * @returns {Promise<number>} Total asset count\n */\n async getAssetCount() {\n return await this.queries.getAssetCount();\n }\n}\n\nmodule.exports = NeuraiAssets;\n","/**\n * @neuraiproject/neurai-assets\n * Non-custodial Neurai asset management library\n *\n * Comprehensive asset management library for Neurai blockchain\n * Supports creation, reissuance, transfers, and queries for all asset types:\n * - ROOT assets (standard tokens)\n * - SUB assets (sub-tokens)\n * - UNIQUE assets (NFTs)\n * - QUALIFIER assets (KYC/compliance tags)\n * - RESTRICTED assets (security tokens with compliance)\n * - DEPIN assets (soulbound assets)\n *\n * @example\n * const NeuraiAssets = require('@neuraiproject/neurai-assets');\n *\n * // Initialize with RPC function\n * const assets = new NeuraiAssets(rpc, {\n * network: 'xna',\n * addresses: walletAddresses,\n * changeAddress: myChangeAddress,\n * toAddress: myReceivingAddress\n * });\n *\n * // Create a ROOT asset\n * const result = await assets.createRootAsset({\n * assetName: 'MYTOKEN',\n * quantity: 1000000,\n * units: 2,\n * reissuable: true\n * });\n *\n * // Sign and broadcast\n * const signedTx = await wallet.signTransaction(result.rawTx);\n * const txid = await wallet.broadcastTransaction(signedTx);\n */\n\n// Main API class\nconst NeuraiAssets = require('./NeuraiAssets');\n\n// Builders\nconst builders = require('./builders');\n\n// Queries\nconst { AssetQueries } = require('./queries');\n\n// Constants\nconst constants = require('./constants');\n\n// Errors\nconst errors = require('./errors');\n\n// Validators\nconst validators = require('./validators');\n\n// Utils\nconst utils = require('./utils');\n\n// Export main class as default\nmodule.exports = NeuraiAssets;\n\n// Export everything as named exports\nmodule.exports.NeuraiAssets = NeuraiAssets;\nmodule.exports.AssetQueries = AssetQueries;\nmodule.exports.builders = builders;\nmodule.exports.constants = constants;\nmodule.exports.errors = errors;\nmodule.exports.validators = validators;\nmodule.exports.utils = utils;\n","import packageApi from '../index.js';\n\nconst NeuraiAssets = packageApi?.NeuraiAssets ?? packageApi;\nconst AssetQueries = packageApi?.AssetQueries;\nconst builders = packageApi?.builders ?? {};\nconst constants = packageApi?.constants ?? {};\nconst errors = packageApi?.errors ?? {};\nconst validators = packageApi?.validators ?? {};\nconst utils = packageApi?.utils ?? {};\n\nconst publicApi = Object.assign(NeuraiAssets, {\n NeuraiAssets,\n AssetQueries,\n builders,\n constants,\n errors,\n validators,\n utils\n});\n\nexport default publicApi;\nexport {\n AssetQueries,\n NeuraiAssets,\n builders,\n constants,\n errors,\n utils,\n validators\n};\n","import publicApi, {\n AssetQueries,\n NeuraiAssets,\n builders,\n constants,\n errors,\n utils,\n validators\n} from './api.mjs';\n\nconst globalScope =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : window;\n\nglobalScope.NeuraiAssets = publicApi;\n\nexport default publicApi;\nexport {\n AssetQueries,\n NeuraiAssets,\n builders,\n constants,\n errors,\n utils,\n validators\n};\n"],"names":["require$$0","require$$1","errors","require$$2","require$$3","constants","utils","validators","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","builders","srcModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NeuraiAssets.global.js","sources":["../src/errors/ValidationErrors.js","../src/errors/AssetErrors.js","../src/errors/index.js","../src/queries/AssetQueries.js","../src/queries/index.js","../src/constants/assetTypes.js","../src/constants/fees.js","../src/constants/burnAddresses.js","../src/constants/networks.js","../src/constants/index.js","../src/managers/BurnManager.js","../src/utils/assetNameParser.js","../src/utils/amountConverter.js","../src/utils/networkDetector.js","../src/utils/outputFormatter.js","../src/utils/index.js","../src/managers/OwnerTokenManager.js","../src/managers/UTXOSelector.js","../src/managers/OutputOrderer.js","../src/managers/index.js","../src/validators/assetNameValidator.js","../src/validators/amountValidator.js","../src/validators/verifierValidator.js","../src/validators/ipfsValidator.js","../src/validators/index.js","../src/builders/BaseAssetTransactionBuilder.js","../src/builders/IssueRootBuilder.js","../src/builders/IssueSubBuilder.js","../src/builders/IssueDepinBuilder.js","../src/builders/ReissueBuilder.js","../src/builders/IssueUniqueBuilder.js","../src/builders/IssueQualifierBuilder.js","../src/builders/IssueRestrictedBuilder.js","../src/builders/ReissueRestrictedBuilder.js","../src/builders/TagAddressBuilder.js","../src/builders/FreezeAddressBuilder.js","../src/builders/index.js","../src/NeuraiAssets.js","../src/index.js","../src/entries/api.mjs","../src/entries/global.mjs"],"sourcesContent":["/**\n * Validation Error Classes\n * Errors thrown during parameter validation\n */\n\nclass ValidationError extends Error {\n constructor(message) {\n super(message);\n this.name = 'ValidationError';\n this.code = 'VALIDATION_ERROR';\n }\n}\n\nclass InvalidAssetNameError extends ValidationError {\n constructor(message, assetName) {\n super(message);\n this.name = 'InvalidAssetNameError';\n this.code = 'INVALID_ASSET_NAME';\n this.assetName = assetName;\n }\n}\n\nclass InvalidAmountError extends ValidationError {\n constructor(message, amount) {\n super(message);\n this.name = 'InvalidAmountError';\n this.code = 'INVALID_AMOUNT';\n this.amount = amount;\n }\n}\n\nclass InvalidUnitsError extends ValidationError {\n constructor(message, units) {\n super(message);\n this.name = 'InvalidUnitsError';\n this.code = 'INVALID_UNITS';\n this.units = units;\n }\n}\n\nclass InvalidVerifierStringError extends ValidationError {\n constructor(message, verifier) {\n super(message);\n this.name = 'InvalidVerifierStringError';\n this.code = 'INVALID_VERIFIER_STRING';\n this.verifier = verifier;\n }\n}\n\nclass InvalidIPFSHashError extends ValidationError {\n constructor(message, hash) {\n super(message);\n this.name = 'InvalidIPFSHashError';\n this.code = 'INVALID_IPFS_HASH';\n this.ipfsHash = hash;\n }\n}\n\nclass InvalidAddressError extends ValidationError {\n constructor(message, address) {\n super(message);\n this.name = 'InvalidAddressError';\n this.code = 'INVALID_ADDRESS';\n this.address = address;\n }\n}\n\nclass InsufficientFundsError extends ValidationError {\n constructor(message, required, available) {\n super(message);\n this.name = 'InsufficientFundsError';\n this.code = 'INSUFFICIENT_FUNDS';\n this.required = required;\n this.available = available;\n }\n}\n\nmodule.exports = {\n ValidationError,\n InvalidAssetNameError,\n InvalidAmountError,\n InvalidUnitsError,\n InvalidVerifierStringError,\n InvalidIPFSHashError,\n InvalidAddressError,\n InsufficientFundsError\n};\n","/**\n * Asset-Specific Error Classes\n * Errors related to asset operations\n */\n\nclass AssetError extends Error {\n constructor(message) {\n super(message);\n this.name = 'AssetError';\n this.code = 'ASSET_ERROR';\n }\n}\n\nclass AssetExistsError extends AssetError {\n constructor(message, assetName) {\n super(message);\n this.name = 'AssetExistsError';\n this.code = 'ASSET_EXISTS';\n this.assetName = assetName;\n }\n}\n\nclass AssetNotFoundError extends AssetError {\n constructor(message, assetName) {\n super(message);\n this.name = 'AssetNotFoundError';\n this.code = 'ASSET_NOT_FOUND';\n this.assetName = assetName;\n }\n}\n\nclass OwnerTokenNotFoundError extends AssetError {\n constructor(message, ownerTokenName) {\n super(message);\n this.name = 'OwnerTokenNotFoundError';\n this.code = 'OWNER_TOKEN_NOT_FOUND';\n this.ownerTokenName = ownerTokenName;\n this.severity = 'HIGH';\n }\n}\n\nclass OwnerTokenNotReturnedError extends AssetError {\n constructor(message, ownerTokenName) {\n super(message);\n this.name = 'OwnerTokenNotReturnedError';\n this.code = 'OWNER_TOKEN_NOT_RETURNED';\n this.ownerTokenName = ownerTokenName;\n this.severity = 'CRITICAL'; // This results in permanent loss\n }\n}\n\nclass AssetNotReissuableError extends AssetError {\n constructor(message, assetName) {\n super(message);\n this.name = 'AssetNotReissuableError';\n this.code = 'ASSET_NOT_REISSUABLE';\n this.assetName = assetName;\n }\n}\n\nclass InsufficientBurnAmountError extends AssetError {\n constructor(message, required, provided) {\n super(message);\n this.name = 'InsufficientBurnAmountError';\n this.code = 'INSUFFICIENT_BURN_AMOUNT';\n this.required = required;\n this.provided = provided;\n }\n}\n\nclass InvalidBurnAddressError extends AssetError {\n constructor(message, expectedAddress, providedAddress) {\n super(message);\n this.name = 'InvalidBurnAddressError';\n this.code = 'INVALID_BURN_ADDRESS';\n this.expectedAddress = expectedAddress;\n this.providedAddress = providedAddress;\n }\n}\n\nclass MaxSupplyExceededError extends AssetError {\n constructor(message, assetName, currentSupply, additionalAmount, maxSupply) {\n super(message);\n this.name = 'MaxSupplyExceededError';\n this.code = 'MAX_SUPPLY_EXCEEDED';\n this.assetName = assetName;\n this.currentSupply = currentSupply;\n this.additionalAmount = additionalAmount;\n this.maxSupply = maxSupply;\n }\n}\n\nclass RestrictedAssetViolationError extends AssetError {\n constructor(message, assetName, address, reason) {\n super(message);\n this.name = 'RestrictedAssetViolationError';\n this.code = 'RESTRICTED_ASSET_VIOLATION';\n this.assetName = assetName;\n this.address = address;\n this.reason = reason;\n }\n}\n\nclass QualifierNotFoundError extends AssetError {\n constructor(message, qualifierName) {\n super(message);\n this.name = 'QualifierNotFoundError';\n this.code = 'QUALIFIER_NOT_FOUND';\n this.qualifierName = qualifierName;\n }\n}\n\nclass ParentAssetNotFoundError extends AssetError {\n constructor(message, parentAssetName) {\n super(message);\n this.name = 'ParentAssetNotFoundError';\n this.code = 'PARENT_ASSET_NOT_FOUND';\n this.parentAssetName = parentAssetName;\n }\n}\n\nmodule.exports = {\n AssetError,\n AssetExistsError,\n AssetNotFoundError,\n OwnerTokenNotFoundError,\n OwnerTokenNotReturnedError,\n AssetNotReissuableError,\n InsufficientBurnAmountError,\n InvalidBurnAddressError,\n MaxSupplyExceededError,\n RestrictedAssetViolationError,\n QualifierNotFoundError,\n ParentAssetNotFoundError\n};\n","/**\n * Errors Module\n * Exports all error classes\n */\n\nconst {\n ValidationError,\n InvalidAssetNameError,\n InvalidAmountError,\n InvalidUnitsError,\n InvalidVerifierStringError,\n InvalidIPFSHashError,\n InvalidAddressError,\n InsufficientFundsError\n} = require('./ValidationErrors');\n\nconst {\n AssetError,\n AssetExistsError,\n AssetNotFoundError,\n OwnerTokenNotFoundError,\n OwnerTokenNotReturnedError,\n AssetNotReissuableError,\n InsufficientBurnAmountError,\n InvalidBurnAddressError,\n MaxSupplyExceededError,\n RestrictedAssetViolationError,\n QualifierNotFoundError,\n ParentAssetNotFoundError\n} = require('./AssetErrors');\n\nmodule.exports = {\n // Validation Errors\n ValidationError,\n InvalidAssetNameError,\n InvalidAmountError,\n InvalidUnitsError,\n InvalidVerifierStringError,\n InvalidIPFSHashError,\n InvalidAddressError,\n InsufficientFundsError,\n\n // Asset Errors\n AssetError,\n AssetExistsError,\n AssetNotFoundError,\n OwnerTokenNotFoundError,\n OwnerTokenNotReturnedError,\n AssetNotReissuableError,\n InsufficientBurnAmountError,\n InvalidBurnAddressError,\n MaxSupplyExceededError,\n RestrictedAssetViolationError,\n QualifierNotFoundError,\n ParentAssetNotFoundError\n};\n","/**\n * Asset Queries\n * Wrapper methods for querying asset information from the blockchain\n *\n * Provides convenient access to all asset-related RPC query methods:\n * - Asset metadata (getassetdata)\n * - Asset listings (listassets, listmyassets)\n * - Holder information (listaddressesbyasset)\n * - Balance queries (listassetbalancesbyaddress)\n * - Qualifier checks (checkaddresstag, listtagsforaddress)\n * - Restriction checks (checkaddressrestriction, checkglobalrestriction)\n * - Verifier validation (isvalidverifierstring)\n */\n\nconst { AssetNotFoundError, InvalidAddressError } = require('../errors');\n\nclass AssetQueries {\n /**\n * @param {Function} rpc - RPC function to call Neurai node\n */\n constructor(rpc) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n this.rpc = rpc;\n }\n\n /**\n * Get asset metadata\n * @param {string} assetName - Asset name\n * @returns {Promise<object>} Asset data\n * @throws {AssetNotFoundError} If asset doesn't exist\n */\n async getAssetData(assetName) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n try {\n const assetData = await this.rpc('getassetdata', [assetName]);\n\n if (!assetData) {\n throw new AssetNotFoundError(\n `Asset ${assetName} not found on blockchain`,\n assetName\n );\n }\n\n return assetData;\n } catch (error) {\n if (error instanceof AssetNotFoundError) {\n throw error;\n }\n\n // RPC error - likely asset doesn't exist\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Asset ${assetName} not found on blockchain`,\n assetName\n );\n }\n\n throw new Error(`Failed to get asset data: ${error.message}`);\n }\n }\n\n /**\n * List all assets on the blockchain\n * @param {string} filter - Filter pattern (e.g., 'MY*' for all assets starting with MY)\n * @param {boolean} verbose - Include detailed information\n * @param {number} count - Maximum number to return\n * @param {number} start - Starting index (for pagination)\n * @returns {Promise<Array|object>} Array of asset names or detailed objects\n */\n async listAssets(filter = '*', verbose = false, count = 100, start = 0) {\n try {\n const assets = await this.rpc('listassets', [filter, verbose, count, start]);\n return assets || [];\n } catch (error) {\n throw new Error(`Failed to list assets: ${error.message}`);\n }\n }\n\n /**\n * List assets owned by wallet\n * @param {string} assetName - Filter by asset name (default: '*' for all)\n * @param {boolean} verbose - Include detailed information\n * @param {number} count - Maximum number to return\n * @param {number} start - Starting index (for pagination)\n * @param {number} confs - Minimum confirmations (default: 1)\n * @returns {Promise<object>} Object with asset names as keys and amounts as values\n */\n async listMyAssets(assetName = '*', verbose = false, count = 100, start = 0, confs = 1) {\n try {\n const myAssets = await this.rpc('listmyassets', [assetName, verbose, count, start, confs]);\n return myAssets || {};\n } catch (error) {\n throw new Error(`Failed to list my assets: ${error.message}`);\n }\n }\n\n /**\n * List all addresses holding a specific asset\n * @param {string} assetName - Asset name\n * @param {boolean} onlyCount - Return only count instead of full list\n * @param {number} count - Maximum number to return\n * @param {number} start - Starting index (for pagination)\n * @returns {Promise<Array|number>} Array of {address, amount} or count\n */\n async listAddressesByAsset(assetName, onlyCount = false, count = 100, start = 0) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n try {\n const result = await this.rpc('listaddressesbyasset', [assetName, onlyCount, count, start]);\n return result || (onlyCount ? 0 : []);\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Asset ${assetName} not found on blockchain`,\n assetName\n );\n }\n throw new Error(`Failed to list addresses by asset: ${error.message}`);\n }\n }\n\n /**\n * List asset balances for a specific address\n * @param {string} address - Address to query\n * @param {boolean} onlyTotal - Return only count instead of full list\n * @param {number} count - Maximum number to return\n * @param {number} start - Starting index (for pagination)\n * @returns {Promise<Array|number>} Array of {asset, amount} or count\n */\n async listAssetBalancesByAddress(address, onlyTotal = false, count = 100, start = 0) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n try {\n const result = await this.rpc('listassetbalancesbyaddress', [address, onlyTotal, count, start]);\n return result || (onlyTotal ? 0 : []);\n } catch (error) {\n throw new Error(`Failed to list asset balances by address: ${error.message}`);\n }\n }\n\n /**\n * Check if an address has a specific qualifier tag\n * @param {string} address - Address to check\n * @param {string} qualifierName - Qualifier name (e.g., '#KYC_VERIFIED')\n * @returns {Promise<boolean>} True if address has the tag\n */\n async checkAddressTag(address, qualifierName) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n if (!qualifierName) {\n throw new Error('Qualifier name is required');\n }\n\n try {\n const result = await this.rpc('checkaddresstag', [address, qualifierName]);\n return result === true || result === 1;\n } catch (error) {\n // If tag doesn't exist or address doesn't have it, return false\n if (error.message && (error.message.includes('not found') || error.message.includes('does not have'))) {\n return false;\n }\n throw new Error(`Failed to check address tag: ${error.message}`);\n }\n }\n\n /**\n * List all qualifiers assigned to an address\n * @param {string} address - Address to query\n * @returns {Promise<Array>} Array of qualifier names\n */\n async listTagsForAddress(address) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n try {\n const tags = await this.rpc('listtagsforaddress', [address]);\n return tags || [];\n } catch (error) {\n // If no tags found, return empty array\n if (error.message && error.message.includes('not found')) {\n return [];\n }\n throw new Error(`Failed to list tags for address: ${error.message}`);\n }\n }\n\n /**\n * List all addresses with a specific qualifier tag\n * @param {string} qualifierName - Qualifier name\n * @returns {Promise<Array>} Array of addresses\n */\n async listAddressesForTag(qualifierName) {\n if (!qualifierName) {\n throw new Error('Qualifier name is required');\n }\n\n try {\n const addresses = await this.rpc('listaddressesfortag', [qualifierName]);\n return addresses || [];\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Qualifier ${qualifierName} not found on blockchain`,\n qualifierName\n );\n }\n throw new Error(`Failed to list addresses for tag: ${error.message}`);\n }\n }\n\n /**\n * Check if an address can hold a restricted asset\n * @param {string} address - Address to check\n * @param {string} restrictedAssetName - Restricted asset name (e.g., '$SECURITY')\n * @returns {Promise<boolean>} True if address meets verifier requirements\n */\n async checkAddressRestriction(address, restrictedAssetName) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n if (!restrictedAssetName) {\n throw new Error('Restricted asset name is required');\n }\n\n try {\n const result = await this.rpc('checkaddressrestriction', [address, restrictedAssetName]);\n return result === true || result === 1;\n } catch (error) {\n // If address doesn't meet requirements, return false\n if (error.message && (error.message.includes('not found') || error.message.includes('does not meet'))) {\n return false;\n }\n throw new Error(`Failed to check address restriction: ${error.message}`);\n }\n }\n\n /**\n * Check if an address is frozen for a restricted asset\n * @param {string} address - Address to check\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<boolean>} True if address is frozen\n */\n async isAddressFrozen(address, restrictedAssetName) {\n if (!address) {\n throw new Error('Address is required');\n }\n\n if (!restrictedAssetName) {\n throw new Error('Restricted asset name is required');\n }\n\n try {\n const result = await this.rpc('checkaddressrestriction', [address, restrictedAssetName]);\n // If result has frozen property, check it\n if (typeof result === 'object' && result.frozen !== undefined) {\n return result.frozen === true || result.frozen === 1;\n }\n return false;\n } catch (error) {\n throw new Error(`Failed to check if address is frozen: ${error.message}`);\n }\n }\n\n /**\n * Check if an asset is globally frozen\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<boolean>} True if asset is globally frozen\n */\n async checkGlobalRestriction(restrictedAssetName) {\n if (!restrictedAssetName) {\n throw new Error('Restricted asset name is required');\n }\n\n try {\n const result = await this.rpc('checkglobalrestriction', [restrictedAssetName]);\n return result === true || result === 1;\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Restricted asset ${restrictedAssetName} not found on blockchain`,\n restrictedAssetName\n );\n }\n throw new Error(`Failed to check global restriction: ${error.message}`);\n }\n }\n\n /**\n * Get verifier string for a restricted asset\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<string>} Verifier string\n */\n async getVerifierString(restrictedAssetName) {\n if (!restrictedAssetName) {\n throw new Error('Restricted asset name is required');\n }\n\n try {\n const result = await this.rpc('getverifierstring', [restrictedAssetName]);\n return result || '';\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `Restricted asset ${restrictedAssetName} not found on blockchain`,\n restrictedAssetName\n );\n }\n throw new Error(`Failed to get verifier string: ${error.message}`);\n }\n }\n\n /**\n * Validate verifier string syntax\n * @param {string} verifierString - Verifier string to validate\n * @returns {Promise<boolean>} True if valid\n */\n async isValidVerifierString(verifierString) {\n if (!verifierString) {\n throw new Error('Verifier string is required');\n }\n\n try {\n const result = await this.rpc('isvalidverifierstring', [verifierString]);\n return result === true || result === 1;\n } catch (error) {\n // If validation fails, return false\n return false;\n }\n }\n\n /**\n * Get snapshot of asset ownership at a specific block\n * @param {string} assetName - Asset name\n * @param {number} blockHeight - Block height for snapshot\n * @returns {Promise<object>} Snapshot request result\n */\n async getSnapshotRequest(assetName, blockHeight) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n if (!blockHeight || typeof blockHeight !== 'number') {\n throw new Error('Block height must be a number');\n }\n\n try {\n const result = await this.rpc('getsnapshotrequest', [assetName, blockHeight]);\n return result;\n } catch (error) {\n throw new Error(`Failed to get snapshot request: ${error.message}`);\n }\n }\n\n /**\n * Cancel a snapshot request\n * @param {string} assetName - Asset name\n * @param {number} blockHeight - Block height of snapshot to cancel\n * @returns {Promise<boolean>} True if cancelled successfully\n */\n async cancelSnapshotRequest(assetName, blockHeight) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n if (!blockHeight || typeof blockHeight !== 'number') {\n throw new Error('Block height must be a number');\n }\n\n try {\n const result = await this.rpc('cancelsnapshotrequest', [assetName, blockHeight]);\n return result === true || result === 1;\n } catch (error) {\n throw new Error(`Failed to cancel snapshot request: ${error.message}`);\n }\n }\n\n /**\n * List DEPIN holders with validity status\n * @param {string} assetName - DEPIN asset name\n * @returns {Promise<Array>} Array of holder objects\n */\n async listDepinHolders(assetName) {\n if (!assetName) {\n throw new Error('DEPIN asset name is required');\n }\n\n try {\n const result = await this.rpc('listdepinholders', [assetName]);\n return result || [];\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n throw new AssetNotFoundError(\n `DEPIN asset ${assetName} not found on blockchain`,\n assetName\n );\n }\n throw new Error(`Failed to list DEPIN holders: ${error.message}`);\n }\n }\n\n /**\n * Check DEPIN validity for a specific address\n * @param {string} assetName - DEPIN asset name\n * @param {string} address - Address to query\n * @returns {Promise<object>} Validity information\n */\n async checkDepinValidity(assetName, address) {\n if (!assetName) {\n throw new Error('DEPIN asset name is required');\n }\n\n if (!address) {\n throw new Error('Address is required');\n }\n\n try {\n const result = await this.rpc('checkdepinvalidity', [assetName, address]);\n return result || { has_asset: false };\n } catch (error) {\n throw new Error(`Failed to check DEPIN validity: ${error.message}`);\n }\n }\n\n /**\n * Get total count of assets on blockchain\n * @returns {Promise<number>} Total asset count\n */\n async getAssetCount() {\n try {\n // List all assets with count only\n const assets = await this.listAssets('*', false, 1, 0);\n return Array.isArray(assets) ? assets.length : 0;\n } catch (error) {\n throw new Error(`Failed to get asset count: ${error.message}`);\n }\n }\n\n /**\n * Check if asset exists\n * @param {string} assetName - Asset name\n * @returns {Promise<boolean>} True if asset exists\n */\n async assetExists(assetName) {\n try {\n await this.getAssetData(assetName);\n return true;\n } catch (error) {\n if (error instanceof AssetNotFoundError) {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * Get asset type from name\n * @param {string} assetName - Asset name\n * @returns {string} Asset type ('ROOT', 'SUB', 'UNIQUE', 'QUALIFIER', 'RESTRICTED', 'DEPIN', 'OWNER')\n */\n getAssetType(assetName) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n if (assetName.endsWith('!')) {\n return 'OWNER';\n } else if (assetName.startsWith('#')) {\n return assetName.includes('/') ? 'SUB_QUALIFIER' : 'QUALIFIER';\n } else if (assetName.startsWith('$')) {\n return 'RESTRICTED';\n } else if (assetName.startsWith('&')) {\n return 'DEPIN';\n } else if (assetName.includes('#')) {\n return 'UNIQUE';\n } else if (assetName.includes('/')) {\n return 'SUB';\n } else {\n return 'ROOT';\n }\n }\n}\n\nmodule.exports = AssetQueries;\n","/**\n * Query Module\n * Exports all asset query functionality\n */\n\nconst AssetQueries = require('./AssetQueries');\n\nmodule.exports = {\n AssetQueries\n};\n","/**\n * Neurai Asset Types\n * Based on: src/assets/assettypes.h\n */\n\nconst AssetType = {\n ROOT: 0, // Top-level asset (Cost: 1000 XNA)\n SUB: 1, // Sub-asset (Cost: 200 XNA, requires PARENT!)\n UNIQUE: 2, // NFT/Unique asset (Cost: 10 XNA per token)\n MSGCHANNEL: 3, // Message channel (Cost: 200 XNA, legacy)\n QUALIFIER: 4, // KYC qualifier tag (Cost: 2000 XNA)\n SUB_QUALIFIER: 5, // Sub-qualifier (Cost: 200 XNA)\n RESTRICTED: 6, // Restricted/security token (Cost: 3000 XNA)\n VOTE: 7, // Voting asset (Reserved for future use)\n REISSUE: 8, // Reissuance operation (Cost: 200 XNA)\n OWNER: 9, // Owner token (Cost: 0 XNA, auto-generated)\n NULL_ADD_QUALIFIER: 10, // Qualifier assignment (Cost: 0.1 XNA)\n DEPIN: 12 // Soulbound DePIN asset (Testnet only)\n};\n\nmodule.exports = {\n AssetType\n};\n","/**\n * Asset Operation Costs (in XNA)\n * These are burn amounts required for each operation\n */\n\nconst ASSET_COSTS = {\n ISSUE_ROOT: 1000,\n ISSUE_SUB: 200,\n ISSUE_UNIQUE: 10, // Per NFT\n ISSUE_MSGCHANNEL: 200,\n ISSUE_QUALIFIER: 2000,\n ISSUE_SUB_QUALIFIER: 200,\n ISSUE_RESTRICTED: 3000,\n REISSUE: 200,\n REISSUE_RESTRICTED: 200,\n TAG_ADDRESS: 0.2, // Per address\n UNTAG_ADDRESS: 0.2, // Per address\n FREEZE_ADDRESS: 0, // No cost (requires owner token)\n UNFREEZE_ADDRESS: 0, // No cost (requires owner token)\n FREEZE_ASSET: 0, // No cost (requires owner token)\n UNFREEZE_ASSET: 0, // No cost (requires owner token)\n OWNER_TOKEN: 0 // Auto-generated, no cost\n};\n\n/**\n * Get cost for a specific operation type\n * @param {string} operationType - Operation type (e.g., 'ISSUE_ROOT')\n * @returns {number} Cost in XNA\n */\nfunction getAssetCost(operationType) {\n const cost = ASSET_COSTS[operationType];\n if (cost === undefined) {\n throw new Error(`Unknown operation type: ${operationType}`);\n }\n return cost;\n}\n\n/**\n * Calculate total cost for unique asset issuance\n * @param {number} count - Number of unique assets to create\n * @returns {number} Total cost in XNA\n */\nfunction getUniqueAssetCost(count) {\n return ASSET_COSTS.ISSUE_UNIQUE * count;\n}\n\n/**\n * Calculate total cost for tagging multiple addresses\n * @param {number} addressCount - Number of addresses to tag\n * @returns {number} Total cost in XNA\n */\nfunction getTaggingCost(addressCount) {\n return ASSET_COSTS.TAG_ADDRESS * addressCount;\n}\n\nmodule.exports = {\n ASSET_COSTS,\n getAssetCost,\n getUniqueAssetCost,\n getTaggingCost\n};\n","/**\n * Burn Addresses for Asset Operations\n * Different addresses for mainnet and testnet\n */\n\nconst MAINNET_NETWORKS = ['xna', 'mainnet', 'xna-pq', 'mainnet-pq'];\nconst TESTNET_NETWORKS = ['xna-test', 'testnet', 'regtest', 'xna-pq-test', 'testnet-pq'];\n\nfunction resolveNetworkFamily(network) {\n if (MAINNET_NETWORKS.includes(network)) {\n return 'mainnet';\n }\n\n if (TESTNET_NETWORKS.includes(network)) {\n return 'testnet';\n }\n\n throw new Error(`Unknown network: ${network}`);\n}\n\nconst MAINNET_BURN_ADDRESSES = {\n ISSUE_ROOT: 'NbURNXXXXXXXXXXXXXXXXXXXXXXXT65Gdr',\n ISSUE_SUB: 'NXissueSubAssetXXXXXXXXXXXXXX6B2JF',\n ISSUE_UNIQUE: 'NXissueUniqueAssetXXXXXXXXXXUBzP4Z',\n ISSUE_MSGCHANNEL: 'NXissueMsgChanneLAssetXXXXXXTUzrtJ',\n REISSUE: 'NXReissueAssetXXXXXXXXXXXXXXWLe4Ao',\n ISSUE_RESTRICTED: 'NXissueRestrictedXXXXXXXXXXXWpXx4H',\n ISSUE_QUALIFIER: 'NXissueQuaLifierXXXXXXXXXXXXWurNcU',\n ISSUE_SUB_QUALIFIER: 'NXissueSubQuaLifierXXXXXXXXXV71vM3',\n TAG_ADDRESS: 'NXaddTagBurnXXXXXXXXXXXXXXXXWucUTr',\n UNTAG_ADDRESS: 'NXaddTagBurnXXXXXXXXXXXXXXXXWucUTr'\n};\n\nconst TESTNET_BURN_ADDRESSES = {\n ISSUE_ROOT: 'tBURNXXXXXXXXXXXXXXXXXXXXXXXVZLroy',\n ISSUE_SUB: 'tSubAssetXXXXXXXXXXXXXXXXXXXXGTvF4',\n ISSUE_UNIQUE: 'tUniqueAssetXXXXXXXXXXXXXXXXVCgpLs',\n ISSUE_MSGCHANNEL: 'tMsgChanneLAssetXXXXXXXXXXXXVsJoya',\n REISSUE: 'tAssetXXXXXXXXXXXXXXXXXXXXXXas6pz8',\n ISSUE_RESTRICTED: 'tRestrictedXXXXXXXXXXXXXXXXXVyPBEK',\n ISSUE_QUALIFIER: 'tQuaLifierXXXXXXXXXXXXXXXXXXT5czoV',\n ISSUE_SUB_QUALIFIER: 'tSubQuaLifierXXXXXXXXXXXXXXXW5MmGk',\n TAG_ADDRESS: 'tTagBurnXXXXXXXXXXXXXXXXXXXXYm6pxA',\n UNTAG_ADDRESS: 'tTagBurnXXXXXXXXXXXXXXXXXXXXYm6pxA'\n};\n\n/**\n * Get burn address for an operation and network\n * @param {string} operationType - Operation type (e.g., 'ISSUE_ROOT')\n * @param {string} network - Network type ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n * @returns {string} Burn address\n */\nfunction getBurnAddress(operationType, network) {\n const family = resolveNetworkFamily(network);\n const addresses = family === 'mainnet' ? MAINNET_BURN_ADDRESSES : TESTNET_BURN_ADDRESSES;\n\n const address = addresses[operationType];\n if (!address) {\n throw new Error(`Unknown operation type: ${operationType} for network: ${network}`);\n }\n\n return address;\n}\n\n/**\n * Check if an address is a burn address\n * @param {string} address - Address to check\n * @param {string} network - Network type ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n * @returns {boolean} True if it's a burn address\n */\nfunction isBurnAddress(address, network) {\n const family = resolveNetworkFamily(network);\n const addresses = family === 'mainnet' ? MAINNET_BURN_ADDRESSES : TESTNET_BURN_ADDRESSES;\n return Object.values(addresses).includes(address);\n}\n\nmodule.exports = {\n MAINNET_BURN_ADDRESSES,\n TESTNET_BURN_ADDRESSES,\n resolveNetworkFamily,\n getBurnAddress,\n isBurnAddress\n};\n","/**\n * Network Configuration for Neurai\n */\n\nconst MAINNET_NETWORKS = ['xna', 'mainnet', 'xna-pq', 'mainnet-pq'];\nconst TESTNET_NETWORKS = ['xna-test', 'testnet', 'regtest', 'xna-pq-test', 'testnet-pq'];\n\nconst NETWORKS = {\n MAINNET: {\n name: 'xna',\n displayName: 'Neurai Mainnet',\n addressPrefix: 'N',\n authScriptAddressPrefix: 'nq1',\n pqAddressPrefix: 'nq1',\n assetNameMaxLength: 32,\n defaultRPCPort: 19001,\n coin: 'XNA',\n baseNetwork: 'xna'\n },\n TESTNET: {\n name: 'xna-test',\n displayName: 'Neurai Testnet',\n addressPrefix: 't',\n authScriptAddressPrefix: 'tnq1',\n pqAddressPrefix: 'tnq1',\n assetNameMaxLength: 32, // Same as mainnet\n defaultRPCPort: 19101,\n coin: 'TXNA',\n baseNetwork: 'xna-test'\n },\n MAINNET_PQ: {\n name: 'xna-pq',\n displayName: 'Neurai Mainnet AuthScript',\n addressPrefix: 'N',\n authScriptAddressPrefix: 'nq1',\n pqAddressPrefix: 'nq1',\n assetNameMaxLength: 32,\n defaultRPCPort: 19001,\n coin: 'XNA',\n baseNetwork: 'xna'\n },\n TESTNET_PQ: {\n name: 'xna-pq-test',\n displayName: 'Neurai Testnet AuthScript',\n addressPrefix: 't',\n authScriptAddressPrefix: 'tnq1',\n pqAddressPrefix: 'tnq1',\n assetNameMaxLength: 32,\n defaultRPCPort: 19101,\n coin: 'TXNA',\n baseNetwork: 'xna-test'\n }\n};\n\n/**\n * Asset naming rules (same for all networks)\n */\nconst ASSET_NAME_RULES = {\n ROOT: {\n minLength: 3,\n maxLength: 30,\n pattern: /^[A-Z0-9_.]+$/,\n cannotStartWith: ['.', 'A', 'Z'],\n reserved: ['XNA', 'NEURAI']\n },\n SUB: {\n minLength: 1,\n maxLength: 30,\n pattern: /^[A-Z0-9_.]+$/,\n separator: '/',\n maxDepth: 1 // Only one level of sub-assets\n },\n UNIQUE: {\n minLength: 1,\n maxLength: 30,\n pattern: /^[A-Z0-9_.]+$/,\n separator: '#'\n },\n QUALIFIER: {\n minLength: 3,\n maxLength: 30,\n pattern: /^[A-Z0-9_]+$/,\n prefix: '#',\n separator: '/'\n },\n RESTRICTED: {\n minLength: 3,\n maxLength: 30,\n pattern: /^[A-Z0-9_.]+$/,\n prefix: '$'\n },\n DEPIN: {\n minLength: 3,\n maxLength: 120,\n pattern: /^[A-Z0-9_.]+$/,\n prefix: '&',\n separator: '/'\n }\n};\n\n/**\n * Asset quantity limits\n */\nconst ASSET_LIMITS = {\n MIN_QUANTITY: 1,\n MAX_QUANTITY: 21000000000, // 21 billion (same as Bitcoin's 21M with 3 extra decimals)\n MIN_UNITS: 0,\n MAX_UNITS: 8,\n OWNER_TOKEN_QUANTITY: 1, // Owner tokens are always exactly 1\n QUALIFIER_MIN_QUANTITY: 1,\n QUALIFIER_MAX_QUANTITY: 10 // Qualifiers are limited to 1-10 units\n};\n\n/**\n * Get network configuration\n * `xna-pq` / `xna-pq-test` are preserved as compatibility aliases for\n * AuthScript address flows on the same mainnet/testnet families.\n *\n * @param {string} networkName - Network name ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n * @returns {object} Network configuration\n */\nfunction getNetworkConfig(networkName) {\n if (MAINNET_NETWORKS.includes(networkName)) {\n return networkName === 'xna-pq' || networkName === 'mainnet-pq'\n ? NETWORKS.MAINNET_PQ\n : NETWORKS.MAINNET;\n } else if (TESTNET_NETWORKS.includes(networkName)) {\n return networkName === 'xna-pq-test' || networkName === 'testnet-pq'\n ? NETWORKS.TESTNET_PQ\n : NETWORKS.TESTNET;\n } else {\n throw new Error(`Unknown network: ${networkName}`);\n }\n}\n\n/**\n * Resolve a network name to its chain family.\n * AuthScript aliases share the same family as legacy addresses.\n *\n * @param {string} networkName - Network name\n * @returns {'mainnet'|'testnet'} Network family\n */\nfunction resolveAddressNetworkFamily(networkName) {\n if (MAINNET_NETWORKS.includes(networkName)) {\n return 'mainnet';\n }\n\n if (TESTNET_NETWORKS.includes(networkName)) {\n return 'testnet';\n }\n\n throw new Error(`Unknown network: ${networkName}`);\n}\n\n/**\n * Determine whether two network labels are compatible for address use.\n * This treats legacy and AuthScript labels on the same chain as compatible.\n *\n * @param {string} left - First network name\n * @param {string} right - Second network name\n * @returns {boolean} True if both belong to the same chain family\n */\nfunction areAddressNetworksCompatible(left, right) {\n return resolveAddressNetworkFamily(left) === resolveAddressNetworkFamily(right);\n}\n\n/**\n * Detect network from address prefix.\n * `nq1...` / `tnq1...` are AuthScript witness-v1 destinations.\n *\n * @param {string} address - Neurai address\n * @returns {string} Network name ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n */\nfunction detectNetworkFromAddress(address) {\n if (address.startsWith(NETWORKS.MAINNET_PQ.authScriptAddressPrefix)) {\n return 'xna-pq';\n } else if (address.startsWith(NETWORKS.TESTNET_PQ.authScriptAddressPrefix)) {\n return 'xna-pq-test';\n } else if (address.startsWith('N')) {\n return 'xna';\n } else if (address.startsWith('t')) {\n return 'xna-test';\n } else {\n throw new Error(`Cannot detect network from address: ${address}`);\n }\n}\n\nmodule.exports = {\n NETWORKS,\n MAINNET_NETWORKS,\n TESTNET_NETWORKS,\n ASSET_NAME_RULES,\n ASSET_LIMITS,\n getNetworkConfig,\n resolveAddressNetworkFamily,\n areAddressNetworksCompatible,\n detectNetworkFromAddress\n};\n","/**\n * Constants Module\n * Exports all constant values and configurations\n */\n\nconst { AssetType } = require('./assetTypes');\nconst { ASSET_COSTS, getAssetCost, getUniqueAssetCost, getTaggingCost } = require('./fees');\nconst {\n MAINNET_BURN_ADDRESSES,\n TESTNET_BURN_ADDRESSES,\n resolveNetworkFamily,\n getBurnAddress,\n isBurnAddress\n} = require('./burnAddresses');\nconst {\n NETWORKS,\n MAINNET_NETWORKS,\n TESTNET_NETWORKS,\n ASSET_NAME_RULES,\n ASSET_LIMITS,\n getNetworkConfig,\n resolveAddressNetworkFamily,\n areAddressNetworksCompatible,\n detectNetworkFromAddress\n} = require('./networks');\n\nmodule.exports = {\n // Asset Types\n AssetType,\n\n // Fees/Costs\n ASSET_COSTS,\n getAssetCost,\n getUniqueAssetCost,\n getTaggingCost,\n\n // Burn Addresses\n MAINNET_BURN_ADDRESSES,\n TESTNET_BURN_ADDRESSES,\n resolveNetworkFamily,\n getBurnAddress,\n isBurnAddress,\n\n // Networks\n NETWORKS,\n MAINNET_NETWORKS,\n TESTNET_NETWORKS,\n ASSET_NAME_RULES,\n ASSET_LIMITS,\n getNetworkConfig,\n resolveAddressNetworkFamily,\n areAddressNetworksCompatible,\n detectNetworkFromAddress\n};\n","/**\n * Burn Manager\n * Manages burn addresses and amounts for asset operations\n *\n * Each asset operation requires burning XNA to specific addresses.\n * This manager ensures correct burn addresses and amounts are used\n * based on network (mainnet/testnet) and operation type.\n */\n\nconst { getBurnAddress, getAssetCost } = require('../constants');\nconst { InsufficientBurnAmountError, InvalidBurnAddressError } = require('../errors');\n\nclass BurnManager {\n /**\n * @param {string} network - Network type ('xna' or 'xna-test')\n */\n constructor(network) {\n if (!network) {\n throw new Error('Network is required');\n }\n this.network = network;\n }\n\n /**\n * Get burn address for an operation\n * @param {string} operationType - Operation type (e.g., 'ISSUE_ROOT')\n * @returns {string} Burn address for the network\n */\n getBurnAddress(operationType) {\n return getBurnAddress(operationType, this.network);\n }\n\n /**\n * Get burn amount for an operation\n * @param {string} operationType - Operation type (e.g., 'ISSUE_ROOT')\n * @param {number} multiplier - Multiplier for operations like UNIQUE (default: 1)\n * @returns {number} Burn amount in XNA\n */\n getBurnAmount(operationType, multiplier = 1) {\n const baseCost = getAssetCost(operationType);\n return baseCost * multiplier;\n }\n\n /**\n * Get burn info (address + amount) for an operation\n * @param {string} operationType - Operation type\n * @param {number} multiplier - Multiplier (default: 1)\n * @returns {object} { address, amount }\n */\n getBurnInfo(operationType, multiplier = 1) {\n return {\n address: this.getBurnAddress(operationType),\n amount: this.getBurnAmount(operationType, multiplier)\n };\n }\n\n /**\n * Get burn info for ROOT asset issuance\n * @returns {object} { address, amount }\n */\n getIssueRootBurn() {\n return this.getBurnInfo('ISSUE_ROOT');\n }\n\n /**\n * Get burn info for SUB asset issuance\n * @returns {object} { address, amount }\n */\n getIssueSubBurn() {\n return this.getBurnInfo('ISSUE_SUB');\n }\n\n /**\n * Get burn info for UNIQUE asset issuance\n * @param {number} count - Number of unique assets to create\n * @returns {object} { address, amount }\n */\n getIssueUniqueBurn(count) {\n return this.getBurnInfo('ISSUE_UNIQUE', count);\n }\n\n /**\n * Get burn info for DEPIN asset issuance\n * DEPIN assets reuse the UNIQUE burn amount/address.\n * @returns {object} { address, amount }\n */\n getIssueDepinBurn() {\n return this.getIssueUniqueBurn(1);\n }\n\n /**\n * Get burn info for QUALIFIER asset issuance\n * @returns {object} { address, amount }\n */\n getIssueQualifierBurn() {\n return this.getBurnInfo('ISSUE_QUALIFIER');\n }\n\n /**\n * Get burn info for SUB_QUALIFIER asset issuance\n * @returns {object} { address, amount }\n */\n getIssueSubQualifierBurn() {\n return this.getBurnInfo('ISSUE_SUB_QUALIFIER');\n }\n\n /**\n * Get burn info for RESTRICTED asset issuance\n * @returns {object} { address, amount }\n */\n getIssueRestrictedBurn() {\n return this.getBurnInfo('ISSUE_RESTRICTED');\n }\n\n /**\n * Get burn info for REISSUE operation\n * @returns {object} { address, amount }\n */\n getReissueBurn() {\n return this.getBurnInfo('REISSUE');\n }\n\n /**\n * Get burn info for TAG_ADDRESS operation\n * @param {number} addressCount - Number of addresses to tag\n * @returns {object} { address, amount }\n */\n getTagAddressBurn(addressCount) {\n return this.getBurnInfo('TAG_ADDRESS', addressCount);\n }\n\n /**\n * Get burn info for UNTAG_ADDRESS operation\n * @param {number} addressCount - Number of addresses to untag\n * @returns {object} { address, amount }\n */\n getUntagAddressBurn(addressCount) {\n return this.getBurnInfo('UNTAG_ADDRESS', addressCount);\n }\n\n /**\n * Validate that burn output is correct\n * @param {object} outputs - Transaction outputs\n * @param {string} operationType - Expected operation type\n * @param {number} multiplier - Expected multiplier (default: 1)\n * @returns {boolean} True if valid\n * @throws {Error} If burn is invalid\n */\n validateBurnOutput(outputs, operationType, multiplier = 1) {\n const expectedBurn = this.getBurnInfo(operationType, multiplier);\n\n // Check if burn address exists in outputs\n const burnAmount = outputs[expectedBurn.address];\n if (burnAmount === undefined) {\n throw new InvalidBurnAddressError(\n `Expected burn to ${expectedBurn.address} not found in outputs`,\n expectedBurn.address,\n null\n );\n }\n\n // Check if burn amount is correct\n if (burnAmount !== expectedBurn.amount) {\n throw new InsufficientBurnAmountError(\n `Incorrect burn amount. Expected ${expectedBurn.amount} XNA, got ${burnAmount} XNA`,\n expectedBurn.amount,\n burnAmount\n );\n }\n\n return true;\n }\n\n /**\n * Check if an address is a burn address for this network\n * @param {string} address - Address to check\n * @returns {boolean} True if it's a burn address\n */\n isBurnAddress(address) {\n const burnTypes = [\n 'ISSUE_ROOT',\n 'ISSUE_SUB',\n 'ISSUE_UNIQUE',\n 'ISSUE_MSGCHANNEL',\n 'REISSUE',\n 'ISSUE_RESTRICTED',\n 'ISSUE_QUALIFIER',\n 'ISSUE_SUB_QUALIFIER',\n 'TAG_ADDRESS',\n 'UNTAG_ADDRESS'\n ];\n\n for (const type of burnTypes) {\n if (this.getBurnAddress(type) === address) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Get operation type from burn address\n * @param {string} address - Burn address\n * @returns {string|null} Operation type or null if not a burn address\n */\n getOperationTypeFromBurnAddress(address) {\n const burnTypes = [\n 'ISSUE_ROOT',\n 'ISSUE_SUB',\n 'ISSUE_UNIQUE',\n 'ISSUE_MSGCHANNEL',\n 'REISSUE',\n 'ISSUE_RESTRICTED',\n 'ISSUE_QUALIFIER',\n 'ISSUE_SUB_QUALIFIER',\n 'TAG_ADDRESS',\n 'UNTAG_ADDRESS'\n ];\n\n for (const type of burnTypes) {\n if (this.getBurnAddress(type) === address) {\n return type;\n }\n }\n\n return null;\n }\n}\n\nmodule.exports = BurnManager;\n","/**\n * Asset Name Parser\n * Parses and analyzes asset names\n */\n\nconst { AssetType } = require('../constants');\n\nclass AssetNameParser {\n /**\n * Parse asset name and extract information\n * @param {string} name - Asset name\n * @returns {object} Parsed information\n */\n static parse(name) {\n const isOwner = name.endsWith('!');\n const isRestricted = name.startsWith('$');\n const isQualifier = name.startsWith('#');\n const isDepin = name.startsWith('&');\n const cleanName = isOwner ? name.slice(0, -1) : name;\n\n let type;\n let parent = null;\n let subName = null;\n let tag = null;\n let prefix = null;\n\n if (isQualifier) {\n // QUALIFIER or SUB_QUALIFIER: #NAME or #ROOT/SUB\n if (cleanName.includes('/')) {\n type = AssetType.SUB_QUALIFIER;\n const withoutHash = cleanName.substring(1);\n const parts = withoutHash.split('/');\n parent = '#' + parts[0];\n subName = parts[1];\n prefix = '#';\n } else {\n type = AssetType.QUALIFIER;\n prefix = '#';\n }\n } else if (isRestricted) {\n // RESTRICTED: $NAME\n type = AssetType.RESTRICTED;\n prefix = '$';\n } else if (isDepin) {\n // DEPIN: &NAME or &NAME/SUB\n type = AssetType.DEPIN;\n prefix = '&';\n if (cleanName.includes('/')) {\n const parts = cleanName.split('/');\n parent = parts[0];\n subName = parts.slice(1).join('/');\n }\n } else if (cleanName.includes('#')) {\n // UNIQUE: ROOT#TAG\n type = AssetType.UNIQUE;\n const parts = cleanName.split('#');\n parent = parts[0];\n tag = parts[1];\n } else if (cleanName.includes('/')) {\n // SUB: ROOT/SUB\n type = AssetType.SUB;\n const parts = cleanName.split('/');\n parent = parts[0];\n subName = parts[1];\n } else {\n // ROOT\n type = AssetType.ROOT;\n }\n\n // Override type if owner token\n if (isOwner) {\n const baseType = type;\n type = AssetType.OWNER;\n return {\n type,\n baseType,\n parent,\n name: cleanName,\n subName,\n tag,\n prefix,\n isOwner: true,\n isRestricted: cleanName.startsWith('$'),\n isDepin: cleanName.startsWith('&'),\n isQualifier: false,\n fullName: name,\n baseName: cleanName\n };\n }\n\n return {\n type,\n parent,\n name: cleanName,\n subName,\n tag,\n prefix,\n isOwner,\n isRestricted,\n isDepin,\n isQualifier,\n fullName: name,\n baseName: cleanName\n };\n }\n\n /**\n * Get asset type from name\n * @param {string} name - Asset name\n * @returns {number} AssetType enum value\n */\n static getType(name) {\n return this.parse(name).type;\n }\n\n /**\n * Get parent asset name\n * @param {string} name - Asset name\n * @returns {string|null} Parent asset name or null\n */\n static getParent(name) {\n return this.parse(name).parent;\n }\n\n /**\n * Check if asset is an owner token\n * @param {string} name - Asset name\n * @returns {boolean} True if owner token\n */\n static isOwnerToken(name) {\n return name.endsWith('!');\n }\n\n /**\n * Get owner token name for an asset\n * @param {string} assetName - Asset name\n * @returns {string} Owner token name (assetName + '!')\n */\n static getOwnerTokenName(assetName) {\n if (this.isOwnerToken(assetName)) {\n return assetName;\n }\n if (this.isRestricted(assetName)) {\n return assetName.slice(1) + '!';\n }\n return assetName + '!';\n }\n\n /**\n * Get base asset name from owner token\n * @param {string} ownerTokenName - Owner token name (with !)\n * @returns {string} Base asset name (without !)\n */\n static getBaseAssetName(ownerTokenName) {\n if (this.isOwnerToken(ownerTokenName)) {\n return ownerTokenName.slice(0, -1);\n }\n return ownerTokenName;\n }\n\n /**\n * Check if asset is restricted\n * @param {string} name - Asset name\n * @returns {boolean} True if restricted\n */\n static isRestricted(name) {\n return name.startsWith('$');\n }\n\n /**\n * Check if asset is a qualifier\n * @param {string} name - Asset name\n * @returns {boolean} True if qualifier\n */\n static isQualifier(name) {\n return name.startsWith('#');\n }\n\n /**\n * Check if asset is unique (NFT)\n * @param {string} name - Asset name\n * @returns {boolean} True if unique\n */\n static isUnique(name) {\n return name.includes('#') && !name.startsWith('#');\n }\n\n /**\n * Check if asset is a sub-asset\n * @param {string} name - Asset name\n * @returns {boolean} True if sub-asset\n */\n static isSub(name) {\n return name.includes('/') && !name.startsWith('#') && !name.startsWith('&');\n }\n\n /**\n * Check if asset is a DEPIN asset\n * @param {string} name - Asset name\n * @returns {boolean} True if DEPIN\n */\n static isDepin(name) {\n return name.startsWith('&');\n }\n\n /**\n * Build unique asset name\n * @param {string} rootName - Root asset name\n * @param {string} tag - Unique tag\n * @returns {string} Full unique asset name\n */\n static buildUniqueName(rootName, tag) {\n return `${rootName}#${tag}`;\n }\n\n /**\n * Build sub-asset name\n * @param {string} rootName - Root asset name\n * @param {string} subName - Sub-asset name\n * @returns {string} Full sub-asset name\n */\n static buildSubName(rootName, subName) {\n return `${rootName}/${subName}`;\n }\n}\n\nmodule.exports = AssetNameParser;\n","/**\n * Amount Converter\n * Converts between user amounts and satoshis (protocol internal format)\n */\n\nclass AmountConverter {\n /**\n * Convert user amount to satoshis\n * @param {number} amount - User-friendly amount (e.g., 1.5)\n * @param {number} units - Decimal places (0-8)\n * @returns {number} Amount in satoshis\n */\n static toSatoshis(amount, units) {\n if (typeof amount !== 'number' || isNaN(amount)) {\n throw new Error('Amount must be a valid number');\n }\n\n if (typeof units !== 'number' || isNaN(units) || units < 0 || units > 8) {\n throw new Error('Units must be a number between 0 and 8');\n }\n\n // Calculate multiplier\n const multiplier = Math.pow(10, units);\n\n // Convert to satoshis and round to avoid floating point issues\n const satoshis = Math.round(amount * multiplier);\n\n return satoshis;\n }\n\n /**\n * Convert satoshis to user amount\n * @param {number} satoshis - Amount in satoshis\n * @param {number} units - Decimal places (0-8)\n * @returns {number} User-friendly amount\n */\n static fromSatoshis(satoshis, units) {\n if (typeof satoshis !== 'number' || isNaN(satoshis)) {\n throw new Error('Satoshis must be a valid number');\n }\n\n if (typeof units !== 'number' || isNaN(units) || units < 0 || units > 8) {\n throw new Error('Units must be a number between 0 and 8');\n }\n\n // Calculate divisor\n const divisor = Math.pow(10, units);\n\n // Convert to user amount\n const amount = satoshis / divisor;\n\n return amount;\n }\n\n /**\n * Format amount with proper decimal places\n * @param {number} amount - Amount to format\n * @param {number} units - Decimal places\n * @returns {string} Formatted amount\n */\n static format(amount, units) {\n if (units === 0) {\n return amount.toString();\n }\n\n return amount.toFixed(units);\n }\n\n /**\n * Parse formatted amount string\n * @param {string} formattedAmount - Formatted amount string\n * @returns {number} Parsed amount\n */\n static parse(formattedAmount) {\n const num = parseFloat(formattedAmount);\n if (isNaN(num)) {\n throw new Error('Invalid number format');\n }\n return num;\n }\n\n /**\n * Get decimal places from amount\n * @param {number} amount - Amount to check\n * @returns {number} Number of decimal places\n */\n static getDecimalPlaces(amount) {\n const match = ('' + amount).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) return 0;\n return Math.max(\n 0,\n (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0)\n );\n }\n\n /**\n * Adjust amount to proper units\n * If amount has more decimals than units allow, round it\n * @param {number} amount - Amount to adjust\n * @param {number} units - Target decimal places\n * @returns {number} Adjusted amount\n */\n static adjustToUnits(amount, units) {\n const decimalPlaces = this.getDecimalPlaces(amount);\n if (decimalPlaces <= units) {\n return amount;\n }\n\n // Round to units decimal places\n const multiplier = Math.pow(10, units);\n return Math.round(amount * multiplier) / multiplier;\n }\n}\n\nmodule.exports = AmountConverter;\n","/**\n * Network Detector\n * Detects network type from various sources\n */\n\nconst {\n NETWORKS,\n areAddressNetworksCompatible,\n resolveAddressNetworkFamily\n} = require('../constants');\n\nclass NetworkDetector {\n /**\n * Detect network from RPC client\n * Calls getblockchaininfo to determine network\n * @param {Function} rpc - RPC function\n * @returns {Promise<string>} Network name ('xna' or 'xna-test')\n */\n static async detectFromRPC(rpc) {\n try {\n const blockchainInfo = await rpc('getblockchaininfo', []);\n\n // Check chain name\n if (blockchainInfo.chain === 'main') {\n return 'xna';\n } else if (blockchainInfo.chain === 'test') {\n return 'xna-test';\n } else if (blockchainInfo.chain === 'regtest') {\n return 'xna-test'; // Treat regtest as testnet\n }\n\n // Fallback: check if testnet field exists\n if (blockchainInfo.testnet === true) {\n return 'xna-test';\n }\n\n // Default to mainnet\n return 'xna';\n } catch (error) {\n throw new Error(`Failed to detect network from RPC: ${error.message}`);\n }\n }\n\n /**\n * Detect network from address\n * @param {string} address - Neurai address\n * @returns {string} Network label ('xna', 'xna-test', 'xna-pq', or 'xna-pq-test')\n */\n static detectFromAddress(address) {\n if (!address || typeof address !== 'string') {\n throw new Error('Address must be a non-empty string');\n }\n\n if (address.startsWith(NETWORKS.MAINNET_PQ.authScriptAddressPrefix)) {\n return 'xna-pq';\n }\n\n if (address.startsWith(NETWORKS.TESTNET_PQ.authScriptAddressPrefix)) {\n return 'xna-pq-test';\n }\n\n // Mainnet addresses start with 'N'\n if (address.startsWith(NETWORKS.MAINNET.addressPrefix)) {\n return 'xna';\n }\n\n // Testnet addresses start with 't' (prefix byte 0x7f = 127)\n if (address.startsWith(NETWORKS.TESTNET.addressPrefix)) {\n return 'xna-test';\n }\n\n throw new Error(`Cannot detect network from address: ${address}`);\n }\n\n /**\n * Detect network from multiple addresses\n * @param {string[]} addresses - Array of addresses\n * @returns {string} Network label. Mixed legacy/AuthScript addresses on the same\n * chain are normalized to the chain family label (`xna` or `xna-test`).\n */\n static detectFromAddresses(addresses) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses must be a non-empty array');\n }\n\n const firstNetwork = this.detectFromAddress(addresses[0]);\n const family = resolveAddressNetworkFamily(firstNetwork);\n\n // Verify all addresses are from the same network\n for (let i = 1; i < addresses.length; i++) {\n const otherNetwork = this.detectFromAddress(addresses[i]);\n if (!areAddressNetworksCompatible(firstNetwork, otherNetwork)) {\n throw new Error(`Mixed network addresses detected: ${firstNetwork} and ${otherNetwork}`);\n }\n }\n\n return family === 'mainnet' ? 'xna' : 'xna-test';\n }\n\n /**\n * Validate that addresses match expected network\n * @param {string[]} addresses - Array of addresses\n * @param {string} expectedNetwork - Expected network label\n * @returns {boolean} True if all addresses match network\n */\n static validateAddressesNetwork(addresses, expectedNetwork) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses must be a non-empty array');\n }\n\n for (const address of addresses) {\n const network = this.detectFromAddress(address);\n if (!areAddressNetworksCompatible(network, expectedNetwork)) {\n throw new Error(\n `Address ${address} is from ${network} but expected ${expectedNetwork}`\n );\n }\n }\n\n return true;\n }\n\n /**\n * Get network config from network name\n * @param {string} network - Network name\n * @returns {object} Network configuration\n */\n static getNetworkConfig(network) {\n if (network === 'xna' || network === 'mainnet') {\n return NETWORKS.MAINNET;\n } else if (network === 'xna-test' || network === 'testnet') {\n return NETWORKS.TESTNET;\n } else if (network === 'xna-pq' || network === 'mainnet-pq') {\n return NETWORKS.MAINNET_PQ;\n } else if (network === 'xna-pq-test' || network === 'testnet-pq') {\n return NETWORKS.TESTNET_PQ;\n } else {\n throw new Error(`Unknown network: ${network}`);\n }\n }\n\n /**\n * Check if network is mainnet\n * @param {string} network - Network name\n * @returns {boolean} True if mainnet\n */\n static isMainnet(network) {\n return network === 'xna' || network === 'mainnet' || network === 'xna-pq' || network === 'mainnet-pq';\n }\n\n /**\n * Check if network is testnet\n * @param {string} network - Network name\n * @returns {boolean} True if testnet\n */\n static isTestnet(network) {\n return network === 'xna-test' ||\n network === 'testnet' ||\n network === 'regtest' ||\n network === 'xna-pq-test' ||\n network === 'testnet-pq';\n }\n}\n\nmodule.exports = NetworkDetector;\n","/**\n * Output Formatter\n * Formats outputs for createrawtransaction RPC calls\n */\n\nclass OutputFormatter {\n /**\n * Format issue operation output\n * @param {object} params - Issue parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatIssueOutput(params) {\n const {\n asset_name,\n asset_quantity,\n units,\n reissuable,\n has_ipfs,\n ipfs_hash\n } = params;\n\n return {\n issue: {\n asset_name,\n asset_quantity,\n units,\n reissuable: reissuable ? 1 : 0,\n has_ipfs: has_ipfs ? 1 : 0,\n ipfs_hash: ipfs_hash || ''\n }\n };\n }\n\n /**\n * Format issue unique operation output\n * @param {object} params - Issue unique parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatIssueUniqueOutput(params) {\n const { root_name, asset_tags, ipfs_hashes } = params;\n\n const output = {\n issue_unique: {\n root_name,\n asset_tags\n }\n };\n\n if (ipfs_hashes && ipfs_hashes.length > 0) {\n output.issue_unique.ipfs_hashes = ipfs_hashes;\n }\n\n return output;\n }\n\n /**\n * Format issue restricted operation output\n * @param {object} params - Issue restricted parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatIssueRestrictedOutput(params) {\n const {\n asset_name,\n asset_quantity,\n verifier_string,\n units,\n reissuable,\n has_ipfs,\n ipfs_hash,\n owner_change_address\n } = params;\n\n const output = {\n issue_restricted: {\n asset_name,\n asset_quantity,\n verifier_string,\n units,\n reissuable: reissuable ? 1 : 0,\n has_ipfs: has_ipfs ? 1 : 0,\n ipfs_hash: ipfs_hash || ''\n }\n };\n\n if (owner_change_address) {\n output.issue_restricted.owner_change_address = owner_change_address;\n }\n\n return output;\n }\n\n /**\n * Format issue qualifier operation output\n * @param {object} params - Issue qualifier parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatIssueQualifierOutput(params) {\n const {\n asset_name,\n asset_quantity,\n has_ipfs,\n ipfs_hash,\n root_change_address,\n change_quantity\n } = params;\n\n const output = {\n issue_qualifier: {\n asset_name,\n asset_quantity,\n has_ipfs: has_ipfs ? 1 : 0,\n ipfs_hash: ipfs_hash || ''\n }\n };\n\n if (root_change_address) {\n output.issue_qualifier.root_change_address = root_change_address;\n }\n\n if (change_quantity !== undefined && change_quantity !== null) {\n output.issue_qualifier.change_quantity = change_quantity;\n }\n\n return output;\n }\n\n /**\n * Format reissue operation output\n * @param {object} params - Reissue parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatReissueOutput(params) {\n const {\n asset_name,\n asset_quantity,\n reissuable,\n new_ipfs,\n owner_change_address\n } = params;\n\n const output = {\n reissue: {\n asset_name,\n asset_quantity\n }\n };\n\n // Optional parameters\n if (reissuable !== undefined) {\n output.reissue.reissuable = reissuable ? 1 : 0;\n }\n\n if (new_ipfs) {\n output.reissue.ipfs_hash = new_ipfs;\n }\n\n if (owner_change_address) {\n output.reissue.owner_change_address = owner_change_address;\n }\n\n return output;\n }\n\n /**\n * Format reissue restricted operation output\n * @param {object} params - Reissue restricted parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatReissueRestrictedOutput(params) {\n const {\n asset_name,\n asset_quantity,\n change_verifier,\n new_verifier,\n reissuable,\n new_ipfs,\n owner_change_address\n } = params;\n\n const output = {\n reissue_restricted: {\n asset_name,\n asset_quantity\n }\n };\n\n // Optional parameters\n if (change_verifier && new_verifier) {\n output.reissue_restricted.verifier_string = new_verifier;\n }\n\n if (reissuable !== undefined) {\n output.reissue_restricted.reissuable = reissuable ? 1 : 0;\n }\n\n if (new_ipfs) {\n output.reissue_restricted.ipfs_hash = new_ipfs;\n }\n\n if (owner_change_address) {\n output.reissue_restricted.owner_change_address = owner_change_address;\n }\n\n return output;\n }\n\n /**\n * Format asset transfer output\n * @param {string} assetName - Asset name\n * @param {number} amount - Amount to transfer\n * @returns {object} Formatted transfer output\n */\n static formatTransferOutput(assetName, amount) {\n return {\n transfer: {\n [assetName]: amount\n }\n };\n }\n\n /**\n * Format tag addresses operation output\n * @param {object} params - Tag addresses parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatTagAddressesOutput(params) {\n const {\n qualifier,\n addresses,\n change_quantity\n } = params;\n\n const output = {\n tag_addresses: {\n qualifier,\n addresses\n }\n };\n\n if (change_quantity !== undefined && change_quantity !== null) {\n output.tag_addresses.change_quantity = change_quantity;\n }\n\n return output;\n }\n\n /**\n * Format untag addresses operation output\n * @param {object} params - Untag addresses parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatUntagAddressesOutput(params) {\n const {\n qualifier,\n addresses,\n change_quantity\n } = params;\n\n const output = {\n untag_addresses: {\n qualifier,\n addresses\n }\n };\n\n if (change_quantity !== undefined && change_quantity !== null) {\n output.untag_addresses.change_quantity = change_quantity;\n }\n\n return output;\n }\n\n /**\n * Format freeze addresses operation output\n * @param {object} params - Freeze addresses parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatFreezeAddressesOutput(params) {\n const {\n asset_name,\n addresses\n } = params;\n\n return {\n freeze_addresses: {\n asset_name,\n addresses\n }\n };\n }\n\n /**\n * Format unfreeze addresses operation output\n * @param {object} params - Unfreeze addresses parameters\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatUnfreezeAddressesOutput(params) {\n const {\n asset_name,\n addresses\n } = params;\n\n return {\n unfreeze_addresses: {\n asset_name,\n addresses\n }\n };\n }\n\n /**\n * Format freeze asset operation output\n * @param {string} assetName - Restricted asset name\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatFreezeAssetOutput(assetName) {\n return {\n freeze_asset: {\n asset_name: assetName\n }\n };\n }\n\n /**\n * Format unfreeze asset operation output\n * @param {string} assetName - Restricted asset name\n * @returns {object} Formatted output for createrawtransaction\n */\n static formatUnfreezeAssetOutput(assetName) {\n return {\n unfreeze_asset: {\n asset_name: assetName\n }\n };\n }\n}\n\nmodule.exports = OutputFormatter;\n","/**\n * Utils Module\n * Exports all utility classes\n */\n\nconst AssetNameParser = require('./assetNameParser');\nconst AmountConverter = require('./amountConverter');\nconst NetworkDetector = require('./networkDetector');\nconst OutputFormatter = require('./outputFormatter');\n\nmodule.exports = {\n AssetNameParser,\n AmountConverter,\n NetworkDetector,\n OutputFormatter\n};\n","/**\n * Owner Token Manager\n * CRITICAL: Manages owner token UTXOs and ensures they are properly returned\n *\n * Owner tokens (ASSET!) are required for:\n * - Reissuing assets\n * - Creating sub-assets\n * - Managing restricted assets (freeze/unfreeze)\n *\n * WARNING: If an owner token is not included in transaction outputs,\n * it will be PERMANENTLY LOST and the asset can never be reissued or managed.\n */\n\nconst { AssetNameParser } = require('../utils');\nconst {\n OwnerTokenNotFoundError,\n OwnerTokenNotReturnedError,\n AssetError\n} = require('../errors');\n\nclass OwnerTokenManager {\n /**\n * @param {Function} rpc - RPC function to call Neurai node\n */\n constructor(rpc) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n this.rpc = rpc;\n }\n\n /**\n * Find owner token UTXO in wallet addresses\n * @param {string} ownerTokenName - Owner token name (e.g., 'MYTOKEN!')\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<object>} Owner token UTXO\n * @throws {OwnerTokenNotFoundError} If owner token not found\n */\n async findOwnerTokenUTXO(ownerTokenName, addresses) {\n if (!ownerTokenName || !ownerTokenName.endsWith('!')) {\n throw new Error('Owner token name must end with !');\n }\n\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses array is required');\n }\n\n try {\n // Request UTXOs for the specific owner token via assetName param\n const utxos = await this.rpc('getaddressutxos', [{ addresses, assetName: ownerTokenName }]);\n\n // Filter for the specific owner token\n const ownerTokenUTXOs = utxos.filter(utxo => utxo.assetName === ownerTokenName);\n\n if (ownerTokenUTXOs.length === 0) {\n throw new OwnerTokenNotFoundError(\n `Owner token ${ownerTokenName} not found in wallet addresses. ` +\n `You must own the owner token to perform this operation.`,\n ownerTokenName\n );\n }\n\n // Owner tokens should be indivisible (only 1 UTXO typically)\n // But if split, return the first one found\n return ownerTokenUTXOs[0];\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw error;\n }\n\n throw new AssetError(\n `Failed to find owner token ${ownerTokenName}: ${error.message}`\n );\n }\n }\n\n /**\n * Find owner token UTXO by base asset name\n * @param {string} assetName - Base asset name (without !)\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<object>} Owner token UTXO\n */\n async findOwnerTokenByAssetName(assetName, addresses) {\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n return this.findOwnerTokenUTXO(ownerTokenName, addresses);\n }\n\n /**\n * Create owner token return output\n * Owner tokens must always be returned to an address or they're lost forever\n *\n * @param {string} ownerTokenName - Owner token name (e.g., 'MYTOKEN!')\n * @param {string} returnAddress - Address to return owner token to\n * @returns {object} Output object for owner token transfer\n */\n createOwnerTokenReturnOutput(ownerTokenName, returnAddress) {\n if (!ownerTokenName || !ownerTokenName.endsWith('!')) {\n throw new Error('Owner token name must end with !');\n }\n\n if (!returnAddress) {\n throw new Error('Return address is required');\n }\n\n // Owner tokens are always exactly 1.0\n return {\n [returnAddress]: {\n transfer: {\n [ownerTokenName]: 1.0\n }\n }\n };\n }\n\n /**\n * Validate that owner token inputs are properly returned in outputs\n * CRITICAL: This prevents permanent loss of owner tokens\n *\n * @param {Array} inputs - Transaction inputs\n * @param {object} outputs - Transaction outputs\n * @returns {boolean} True if valid\n * @throws {OwnerTokenNotReturnedError} If owner token not returned\n */\n validateOwnerTokenReturn(inputs, outputs) {\n // Find all owner token inputs\n const ownerTokenInputs = inputs.filter(input => {\n return input.assetName && input.assetName.endsWith('!');\n });\n\n // If no owner tokens in inputs, validation passes\n if (ownerTokenInputs.length === 0) {\n return true;\n }\n\n // Check each owner token is in outputs\n const outputEntries = Array.isArray(outputs)\n ? outputs.map(obj => Object.entries(obj)[0])\n : Object.entries(outputs);\n\n for (const ownerInput of ownerTokenInputs) {\n const ownerTokenName = ownerInput.assetName;\n let foundInOutputs = false;\n\n // Check all outputs for owner token\n for (const [address, output] of outputEntries) {\n // Check if output has transfer field\n if (output && typeof output === 'object' && output.transfer) {\n // Check if owner token is in the transfer\n if (output.transfer[ownerTokenName]) {\n foundInOutputs = true;\n break;\n }\n }\n }\n\n if (!foundInOutputs) {\n throw new OwnerTokenNotReturnedError(\n `CRITICAL: Owner token ${ownerTokenName} is not returned in outputs! ` +\n `This will result in PERMANENT LOSS of the owner token and you will ` +\n `never be able to reissue or manage this asset again. ` +\n `The owner token MUST be included in the transaction outputs.`,\n ownerTokenName\n );\n }\n }\n\n return true;\n }\n\n /**\n * Check if wallet owns an owner token\n * @param {string} ownerTokenName - Owner token name (e.g., 'MYTOKEN!')\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<boolean>} True if wallet owns the owner token\n */\n async hasOwnerToken(ownerTokenName, addresses) {\n try {\n await this.findOwnerTokenUTXO(ownerTokenName, addresses);\n return true;\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * Get all owner tokens in wallet\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<Array>} Array of owner token UTXOs\n */\n async getAllOwnerTokens(addresses) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses array is required');\n }\n\n try {\n // Request all asset UTXOs with assetName='*'\n const utxos = await this.rpc('getaddressutxos', [{ addresses, assetName: '*' }]);\n\n // Filter for owner tokens (asset names ending with !)\n const ownerTokenUTXOs = utxos.filter(utxo => {\n return utxo.assetName && utxo.assetName.endsWith('!');\n });\n\n return ownerTokenUTXOs;\n } catch (error) {\n throw new AssetError(\n `Failed to get owner tokens: ${error.message}`\n );\n }\n }\n\n /**\n * Verify owner token quantity is correct (always 1)\n * @param {object} ownerTokenUTXO - Owner token UTXO\n * @returns {boolean} True if valid\n * @throws {Error} If quantity is not 1\n */\n validateOwnerTokenQuantity(ownerTokenUTXO) {\n // Owner tokens should always have satoshis = 100000000 (1.0 with 8 decimals)\n const expectedSatoshis = 100000000;\n\n if (ownerTokenUTXO.satoshis !== expectedSatoshis) {\n throw new Error(\n `Invalid owner token quantity. Expected ${expectedSatoshis} satoshis, ` +\n `got ${ownerTokenUTXO.satoshis}. Owner tokens must always be exactly 1.0`\n );\n }\n\n return true;\n }\n\n /**\n * Add owner token input and output to transaction\n * Convenience method that handles both finding and returning owner token\n *\n * @param {string} assetName - Base asset name (without !)\n * @param {string[]} addresses - Wallet addresses\n * @param {string} returnAddress - Address to return owner token to\n * @returns {Promise<object>} { input, output }\n */\n async prepareOwnerTokenForTransaction(assetName, addresses, returnAddress) {\n // Find owner token UTXO\n const ownerTokenUTXO = await this.findOwnerTokenByAssetName(assetName, addresses);\n\n // Validate quantity\n this.validateOwnerTokenQuantity(ownerTokenUTXO);\n\n // Create input\n const input = {\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n };\n\n // Create output\n const output = this.createOwnerTokenReturnOutput(\n ownerTokenUTXO.assetName,\n returnAddress\n );\n\n return { input, output, utxo: ownerTokenUTXO };\n }\n}\n\nmodule.exports = OwnerTokenManager;\n","/**\n * UTXO Selector\n * Selects appropriate UTXOs for asset transactions\n *\n * Handles selection of:\n * - Base currency (XNA) UTXOs for fees and burns\n * - Asset UTXOs for transfers and operations\n * - Mempool filtering to prevent double-spending\n */\n\nconst { InsufficientFundsError } = require('../errors');\n\nclass UTXOSelector {\n /**\n * @param {Function} rpc - RPC function to call Neurai node\n */\n constructor(rpc) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n this.rpc = rpc;\n }\n\n /**\n * Get all UTXOs for addresses\n * @param {string[]} addresses - Array of wallet addresses\n * @param {string|null} assetName - Filter by asset name (null for XNA)\n * @returns {Promise<Array>} Array of UTXOs\n */\n async getUTXOs(addresses, assetName = null) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses array is required');\n }\n\n try {\n // assetName goes inside the params object; omit it for XNA UTXOs\n const queryParams = assetName ? { addresses, assetName } : { addresses };\n const utxos = await this.rpc('getaddressutxos', [queryParams]);\n\n // Filter for specific asset or XNA\n if (assetName) {\n return utxos.filter(utxo => utxo.assetName === assetName);\n } else {\n // XNA UTXOs don't have assetName or have assetName === 'XNA'\n return utxos.filter(utxo => !utxo.assetName || utxo.assetName === 'XNA');\n }\n } catch (error) {\n throw new Error(`Failed to get UTXOs: ${error.message}`);\n }\n }\n\n /**\n * Get mempool entries for addresses\n * Used to filter out UTXOs that are already being spent\n * @param {string[]} addresses - Array of wallet addresses\n * @returns {Promise<Array>} Array of mempool entries\n */\n async getMempoolEntries(addresses) {\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('Addresses array is required');\n }\n\n try {\n const mempool = await this.rpc('getaddressmempool', [{ addresses }]);\n return mempool || [];\n } catch (error) {\n // If RPC method not available, return empty array\n return [];\n }\n }\n\n /**\n * Filter out UTXOs that are being spent in mempool\n * @param {Array} utxos - Array of UTXOs\n * @param {Array} mempoolEntries - Array of mempool entries\n * @returns {Array} Filtered UTXOs\n */\n filterMempoolSpentUTXOs(utxos, mempoolEntries) {\n if (mempoolEntries.length === 0) {\n return utxos;\n }\n\n return utxos.filter(utxo => {\n // Check if this UTXO is being spent in mempool\n const isSpent = mempoolEntries.some(entry => {\n return entry.prevtxid === utxo.txid && entry.prevout === utxo.outputIndex;\n });\n\n return !isSpent;\n });\n }\n\n /**\n * Select UTXOs for base currency (XNA)\n * Uses greedy algorithm: selects UTXOs until sum >= required amount\n *\n * @param {string[]} addresses - Wallet addresses\n * @param {number} requiredAmount - Required amount in XNA\n * @param {number} buffer - Safety buffer percentage (default: 0.1 = 10%)\n * @returns {Promise<object>} { utxos, totalAmount }\n * @throws {InsufficientFundsError} If not enough funds\n */\n async selectBaseCurrencyUTXOs(addresses, requiredAmount, buffer = 0.1) {\n // Get all XNA UTXOs\n const allUTXOs = await this.getUTXOs(addresses, null);\n\n // Get mempool and filter\n const mempool = await this.getMempoolEntries(addresses);\n const availableUTXOs = this.filterMempoolSpentUTXOs(allUTXOs, mempool);\n\n // Sort by value (largest first) for efficiency\n const sortedUTXOs = availableUTXOs.sort((a, b) => b.satoshis - a.satoshis);\n\n // Add buffer to required amount\n const requiredWithBuffer = requiredAmount * (1 + buffer);\n\n // Select UTXOs greedily\n const selected = [];\n let totalSatoshis = 0;\n const requiredSatoshis = Math.ceil(requiredWithBuffer * 100000000); // Convert XNA to satoshis\n\n for (const utxo of sortedUTXOs) {\n selected.push(utxo);\n totalSatoshis += utxo.satoshis;\n\n if (totalSatoshis >= requiredSatoshis) {\n break;\n }\n }\n\n // Check if we have enough\n if (totalSatoshis < requiredSatoshis) {\n const available = totalSatoshis / 100000000;\n throw new InsufficientFundsError(\n `Insufficient XNA balance. Required: ${requiredAmount.toFixed(8)} XNA (+ ${(buffer * 100).toFixed(0)}% buffer), ` +\n `Available: ${available.toFixed(8)} XNA`,\n requiredAmount,\n available\n );\n }\n\n return {\n utxos: selected,\n totalAmount: totalSatoshis / 100000000\n };\n }\n\n /**\n * Select UTXOs for asset transfer\n * @param {string[]} addresses - Wallet addresses\n * @param {string} assetName - Asset name\n * @param {number} requiredAmount - Required amount (in asset units)\n * @returns {Promise<object>} { utxos, totalAmount }\n * @throws {InsufficientFundsError} If not enough asset balance\n */\n async selectAssetUTXOs(addresses, assetName, requiredAmount) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n // Get all asset UTXOs\n const allUTXOs = await this.getUTXOs(addresses, assetName);\n\n // Get mempool and filter\n const mempool = await this.getMempoolEntries(addresses);\n const availableUTXOs = this.filterMempoolSpentUTXOs(allUTXOs, mempool);\n\n // Sort by value (largest first)\n const sortedUTXOs = availableUTXOs.sort((a, b) => b.satoshis - a.satoshis);\n\n // Select UTXOs greedily\n const selected = [];\n let totalSatoshis = 0;\n const requiredSatoshis = Math.ceil(requiredAmount * 100000000); // Assuming 8 decimals\n\n for (const utxo of sortedUTXOs) {\n selected.push(utxo);\n totalSatoshis += utxo.satoshis;\n\n if (totalSatoshis >= requiredSatoshis) {\n break;\n }\n }\n\n // Check if we have enough\n if (totalSatoshis < requiredSatoshis) {\n const available = totalSatoshis / 100000000;\n throw new InsufficientFundsError(\n `Insufficient ${assetName} balance. Required: ${requiredAmount}, Available: ${available}`,\n requiredAmount,\n available\n );\n }\n\n return {\n utxos: selected,\n totalAmount: totalSatoshis / 100000000\n };\n }\n\n /**\n * Select UTXOs for a transaction requiring both XNA and assets\n * @param {string[]} addresses - Wallet addresses\n * @param {number} xnaAmount - Required XNA amount\n * @param {string|null} assetName - Asset name (null if not needed)\n * @param {number} assetAmount - Required asset amount\n * @returns {Promise<object>} { xnaUTXOs, assetUTXOs, totalXNA, totalAsset }\n */\n async selectMixedUTXOs(addresses, xnaAmount, assetName = null, assetAmount = 0) {\n const result = {\n xnaUTXOs: [],\n assetUTXOs: [],\n totalXNA: 0,\n totalAsset: 0\n };\n\n // Select XNA UTXOs if needed\n if (xnaAmount > 0) {\n const xnaSelection = await this.selectBaseCurrencyUTXOs(addresses, xnaAmount);\n result.xnaUTXOs = xnaSelection.utxos;\n result.totalXNA = xnaSelection.totalAmount;\n }\n\n // Select asset UTXOs if needed\n if (assetName && assetAmount > 0) {\n const assetSelection = await this.selectAssetUTXOs(addresses, assetName, assetAmount);\n result.assetUTXOs = assetSelection.utxos;\n result.totalAsset = assetSelection.totalAmount;\n }\n\n return result;\n }\n\n /**\n * Get total balance for an asset\n * @param {string[]} addresses - Wallet addresses\n * @param {string|null} assetName - Asset name (null for XNA)\n * @returns {Promise<number>} Total balance\n */\n async getBalance(addresses, assetName = null) {\n const utxos = await this.getUTXOs(addresses, assetName);\n const mempool = await this.getMempoolEntries(addresses);\n const availableUTXOs = this.filterMempoolSpentUTXOs(utxos, mempool);\n\n const totalSatoshis = availableUTXOs.reduce((sum, utxo) => sum + utxo.satoshis, 0);\n return totalSatoshis / 100000000;\n }\n\n /**\n * Estimate transaction size in bytes\n * Used for fee calculation\n *\n * @param {number} inputCount - Number of inputs\n * @param {number} outputCount - Number of outputs\n * @returns {number} Estimated size in bytes\n */\n estimateTransactionSize(inputCount, outputCount) {\n // Rough estimation:\n // - Each input: ~180 bytes\n // - Each output: ~34 bytes\n // - Transaction overhead: ~10 bytes\n const inputSize = inputCount * 180;\n const outputSize = outputCount * 34;\n const overhead = 10;\n\n return inputSize + outputSize + overhead;\n }\n\n /**\n * Estimate fee for a transaction\n * @param {number} inputCount - Number of inputs\n * @param {number} outputCount - Number of outputs\n * @param {number} feeRate - Fee rate in XNA per KB (default: 0.015)\n * @returns {number} Estimated fee in XNA\n */\n estimateFee(inputCount, outputCount, feeRate = 0.015) {\n const sizeBytes = this.estimateTransactionSize(inputCount, outputCount);\n const sizeKB = sizeBytes / 1000;\n const fee = sizeKB * feeRate;\n\n // Round up to 8 decimals\n return Math.ceil(fee * 100000000) / 100000000;\n }\n\n /**\n * Get fee rate from network\n * @param {number} confirmationTarget - Target confirmations (default: 20)\n * @returns {Promise<number>} Fee rate in XNA per KB\n */\n async getFeeRate(confirmationTarget = 20) {\n try {\n const result = await this.rpc('estimatesmartfee', [confirmationTarget]);\n\n if (result && result.feerate && result.feerate > 0) {\n return result.feerate;\n }\n\n // Fallback to default\n return 0.015;\n } catch (error) {\n // Fallback to default if estimation fails\n return 0.015;\n }\n }\n}\n\nmodule.exports = UTXOSelector;\n","/**\n * Output Orderer\n * Orders transaction outputs according to Neurai protocol requirements\n *\n * CRITICAL: Output ordering is mandatory for asset transactions\n *\n * Correct order:\n * 1. All XNA outputs (burn addresses + change) FIRST\n * 2. Owner token change outputs SECOND\n * 3. Asset operations (issue, reissue, transfer, etc.) LAST\n *\n * Incorrect ordering will cause transaction rejection by the network.\n */\n\nconst { AssetNameParser } = require('../utils');\n\nclass OutputOrderer {\n /**\n * Order outputs according to protocol requirements\n * @param {object|Array} outputs - Unordered outputs object or array of single-key objects\n * @returns {Array} Ordered array of single-key output objects\n */\n order(outputs) {\n // Normalize to array of {address, value} pairs\n let pairs;\n if (Array.isArray(outputs)) {\n pairs = outputs.map(obj => {\n const [address, value] = Object.entries(obj)[0];\n return { address, value };\n });\n } else if (outputs && typeof outputs === 'object') {\n pairs = Object.entries(outputs).map(([address, value]) => ({ address, value }));\n } else {\n throw new Error('Outputs must be an object or array');\n }\n\n // Categorize\n const xnaOutputs = [];\n const ownerOutputs = [];\n const assetOutputs = [];\n\n for (const { address, value } of pairs) {\n if (typeof value === 'number') {\n xnaOutputs.push({ address, value });\n } else if (typeof value === 'object') {\n if (value.transfer && this.isOwnerTokenTransfer(value.transfer)) {\n ownerOutputs.push({ address, value });\n } else {\n assetOutputs.push({ address, value });\n }\n }\n }\n\n // Return ordered array of single-key objects\n return [\n ...xnaOutputs.map(({ address, value }) => ({ [address]: value })),\n ...ownerOutputs.map(({ address, value }) => ({ [address]: value })),\n ...assetOutputs.map(({ address, value }) => ({ [address]: value })),\n ];\n }\n\n /**\n * Check if a transfer output contains an owner token\n * @param {object} transfer - Transfer object\n * @returns {boolean} True if contains owner token\n */\n isOwnerTokenTransfer(transfer) {\n if (!transfer || typeof transfer !== 'object') {\n return false;\n }\n\n // Check if any asset name in transfer ends with '!'\n return Object.keys(transfer).some(assetName => {\n return AssetNameParser.isOwnerToken(assetName);\n });\n }\n\n /**\n * Validate output ordering\n * Ensures outputs are in correct order\n *\n * @param {object} outputs - Outputs to validate\n * @returns {boolean} True if valid\n * @throws {Error} If ordering is invalid\n */\n validateOrdering(outputs) {\n const entries = Array.isArray(outputs)\n ? outputs.map(obj => Object.entries(obj)[0])\n : Object.entries(outputs);\n let currentCategory = 0; // 0 = not started, 1 = XNA, 2 = owner, 3 = assets\n\n for (const [address, value] of entries) {\n let category;\n\n if (typeof value === 'number') {\n category = 1; // XNA\n } else if (value.transfer && this.isOwnerTokenTransfer(value.transfer)) {\n category = 2; // Owner token\n } else {\n category = 3; // Asset operation/transfer\n }\n\n // Check if we're going backwards in category order\n if (category < currentCategory) {\n throw new Error(\n 'Invalid output ordering. Outputs must be ordered as: ' +\n '1) XNA outputs, 2) Owner token outputs, 3) Asset operations'\n );\n }\n\n currentCategory = category;\n }\n\n return true;\n }\n\n /**\n * Get output category for debugging\n * @param {*} value - Output value\n * @returns {string} Category name\n */\n getOutputCategory(value) {\n if (typeof value === 'number') {\n return 'XNA';\n } else if (value.transfer && this.isOwnerTokenTransfer(value.transfer)) {\n return 'OWNER_TOKEN';\n } else if (value.transfer) {\n return 'ASSET_TRANSFER';\n } else if (value.issue) {\n return 'ISSUE';\n } else if (value.issue_unique) {\n return 'ISSUE_UNIQUE';\n } else if (value.issue_restricted) {\n return 'ISSUE_RESTRICTED';\n } else if (value.issue_qualifier) {\n return 'ISSUE_QUALIFIER';\n } else if (value.reissue) {\n return 'REISSUE';\n } else if (value.reissue_restricted) {\n return 'REISSUE_RESTRICTED';\n } else if (value.tag_addresses) {\n return 'TAG_ADDRESSES';\n } else if (value.untag_addresses) {\n return 'UNTAG_ADDRESSES';\n } else if (value.freeze_addresses) {\n return 'FREEZE_ADDRESSES';\n } else if (value.unfreeze_addresses) {\n return 'UNFREEZE_ADDRESSES';\n } else if (value.freeze_asset) {\n return 'FREEZE_ASSET';\n } else if (value.unfreeze_asset) {\n return 'UNFREEZE_ASSET';\n } else {\n return 'UNKNOWN';\n }\n }\n\n /**\n * Debug output ordering\n * Returns detailed information about output categories\n *\n * @param {object} outputs - Outputs to analyze\n * @returns {Array} Array of { address, category, order }\n */\n debugOrdering(outputs) {\n const debug = [];\n const entries = Array.isArray(outputs)\n ? outputs.map(obj => Object.entries(obj)[0])\n : Object.entries(outputs);\n\n for (const [address, value] of entries) {\n const category = this.getOutputCategory(value);\n let order;\n\n if (typeof value === 'number') {\n order = 1;\n } else if (value.transfer && this.isOwnerTokenTransfer(value.transfer)) {\n order = 2;\n } else {\n order = 3;\n }\n\n debug.push({\n address,\n category,\n order,\n value\n });\n }\n\n return debug;\n }\n\n /**\n * Merge multiple output objects with proper ordering\n * Useful when building outputs from multiple sources\n *\n * @param {...object} outputObjects - Multiple output objects to merge\n * @returns {object} Merged and ordered outputs\n */\n merge(...outputObjects) {\n const merged = {};\n\n // Merge all objects\n for (const outputs of outputObjects) {\n if (outputs && typeof outputs === 'object') {\n Object.assign(merged, outputs);\n }\n }\n\n // Order the merged result\n return this.order(merged);\n }\n\n /**\n * Add XNA output (convenience method)\n * @param {object} outputs - Existing outputs\n * @param {string} address - Address\n * @param {number} amount - XNA amount\n * @returns {object} Updated outputs (not ordered yet)\n */\n addXNAOutput(outputs, address, amount) {\n return {\n ...outputs,\n [address]: amount\n };\n }\n\n /**\n * Add owner token output (convenience method)\n * @param {object} outputs - Existing outputs\n * @param {string} address - Address\n * @param {string} ownerTokenName - Owner token name\n * @returns {object} Updated outputs (not ordered yet)\n */\n addOwnerTokenOutput(outputs, address, ownerTokenName) {\n return {\n ...outputs,\n [address]: {\n transfer: {\n [ownerTokenName]: 1.0\n }\n }\n };\n }\n\n /**\n * Add asset transfer output (convenience method)\n * @param {object} outputs - Existing outputs\n * @param {string} address - Address\n * @param {string} assetName - Asset name\n * @param {number} amount - Amount\n * @returns {object} Updated outputs (not ordered yet)\n */\n addAssetTransferOutput(outputs, address, assetName, amount) {\n return {\n ...outputs,\n [address]: {\n transfer: {\n [assetName]: amount\n }\n }\n };\n }\n\n /**\n * Add asset operation output (convenience method)\n * @param {object} outputs - Existing outputs\n * @param {string} address - Address\n * @param {object} operation - Operation object (issue, reissue, etc.)\n * @returns {object} Updated outputs (not ordered yet)\n */\n addOperationOutput(outputs, address, operation) {\n return {\n ...outputs,\n [address]: operation\n };\n }\n}\n\nmodule.exports = OutputOrderer;\n","/**\n * Managers Module\n * Exports all manager classes\n */\n\nconst BurnManager = require('./BurnManager');\nconst OwnerTokenManager = require('./OwnerTokenManager');\nconst UTXOSelector = require('./UTXOSelector');\nconst OutputOrderer = require('./OutputOrderer');\n\nmodule.exports = {\n BurnManager,\n OwnerTokenManager,\n UTXOSelector,\n OutputOrderer\n};\n","/**\n * Asset Name Validator\n * Validates asset names according to Neurai protocol rules\n */\n\nconst { ASSET_NAME_RULES } = require('../constants');\nconst { InvalidAssetNameError } = require('../errors');\n\nclass AssetNameValidator {\n /**\n * Validate ROOT asset name\n * Rules: 3-30 uppercase characters, A-Z, 0-9, underscore, period\n * Cannot start with period, A, or Z\n * Cannot be reserved names\n */\n static validateRoot(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('Asset name must be a non-empty string', name);\n }\n\n // Length check\n if (name.length < ASSET_NAME_RULES.ROOT.minLength || name.length > ASSET_NAME_RULES.ROOT.maxLength) {\n throw new InvalidAssetNameError(\n `ROOT asset name must be ${ASSET_NAME_RULES.ROOT.minLength}-${ASSET_NAME_RULES.ROOT.maxLength} characters`,\n name\n );\n }\n\n // Uppercase check\n if (name !== name.toUpperCase()) {\n throw new InvalidAssetNameError('Asset name must be uppercase', name);\n }\n\n // Starting character check\n if (ASSET_NAME_RULES.ROOT.cannotStartWith.some(char => name.startsWith(char))) {\n throw new InvalidAssetNameError(\n `Asset name cannot start with: ${ASSET_NAME_RULES.ROOT.cannotStartWith.join(', ')}`,\n name\n );\n }\n\n // Pattern check\n if (!ASSET_NAME_RULES.ROOT.pattern.test(name)) {\n throw new InvalidAssetNameError(\n 'Asset name can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n\n // Reserved names check\n if (ASSET_NAME_RULES.ROOT.reserved.includes(name)) {\n throw new InvalidAssetNameError(`${name} is a reserved asset name`, name);\n }\n\n return true;\n }\n\n /**\n * Validate SUB asset name\n * Format: ROOT/SUBNAME\n */\n static validateSub(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('SUB asset name must be a non-empty string', name);\n }\n\n const parts = name.split(ASSET_NAME_RULES.SUB.separator);\n if (parts.length !== 2) {\n throw new InvalidAssetNameError(\n `SUB asset must be in ${ASSET_NAME_RULES.SUB.separator} format (ROOT/SUBNAME)`,\n name\n );\n }\n\n const [rootName, subName] = parts;\n\n // Validate root part\n this.validateRoot(rootName);\n\n // Validate sub part\n if (subName.length < ASSET_NAME_RULES.SUB.minLength || subName.length > ASSET_NAME_RULES.SUB.maxLength) {\n throw new InvalidAssetNameError(\n `SUB asset name must be ${ASSET_NAME_RULES.SUB.minLength}-${ASSET_NAME_RULES.SUB.maxLength} characters`,\n name\n );\n }\n\n if (subName !== subName.toUpperCase()) {\n throw new InvalidAssetNameError('SUB asset name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.SUB.pattern.test(subName)) {\n throw new InvalidAssetNameError(\n 'SUB asset name can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n\n return true;\n }\n\n /**\n * Validate UNIQUE asset name\n * Format: ROOT#TAG\n */\n static validateUnique(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('UNIQUE asset name must be a non-empty string', name);\n }\n\n const parts = name.split(ASSET_NAME_RULES.UNIQUE.separator);\n if (parts.length !== 2) {\n throw new InvalidAssetNameError(\n `UNIQUE asset must be in ROOT${ASSET_NAME_RULES.UNIQUE.separator}TAG format`,\n name\n );\n }\n\n const [rootName, tag] = parts;\n\n // Validate root part\n this.validateRoot(rootName);\n\n // Validate tag\n if (tag.length < ASSET_NAME_RULES.UNIQUE.minLength || tag.length > ASSET_NAME_RULES.UNIQUE.maxLength) {\n throw new InvalidAssetNameError(\n `UNIQUE tag must be ${ASSET_NAME_RULES.UNIQUE.minLength}-${ASSET_NAME_RULES.UNIQUE.maxLength} characters`,\n name\n );\n }\n\n if (tag !== tag.toUpperCase()) {\n throw new InvalidAssetNameError('UNIQUE tag must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.UNIQUE.pattern.test(tag)) {\n throw new InvalidAssetNameError(\n 'UNIQUE tag can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n\n return true;\n }\n\n /**\n * Validate QUALIFIER asset name\n * Format: #NAME or #ROOT/SUB\n */\n static validateQualifier(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('QUALIFIER asset name must be a non-empty string', name);\n }\n\n if (!name.startsWith(ASSET_NAME_RULES.QUALIFIER.prefix)) {\n throw new InvalidAssetNameError(\n `QUALIFIER asset must start with ${ASSET_NAME_RULES.QUALIFIER.prefix}`,\n name\n );\n }\n\n const withoutPrefix = name.substring(1);\n\n if (withoutPrefix.includes(ASSET_NAME_RULES.QUALIFIER.separator)) {\n // Sub-qualifier: #ROOT/SUB\n const parts = withoutPrefix.split(ASSET_NAME_RULES.QUALIFIER.separator);\n if (parts.length !== 2) {\n throw new InvalidAssetNameError(\n 'SUB_QUALIFIER must be in #ROOT/SUB format',\n name\n );\n }\n\n // Validate each part as a qualifier name (without the #)\n parts.forEach(part => {\n if (part.length < ASSET_NAME_RULES.QUALIFIER.minLength || part.length > ASSET_NAME_RULES.QUALIFIER.maxLength) {\n throw new InvalidAssetNameError(\n `QUALIFIER name must be ${ASSET_NAME_RULES.QUALIFIER.minLength}-${ASSET_NAME_RULES.QUALIFIER.maxLength} characters`,\n name\n );\n }\n\n if (part !== part.toUpperCase()) {\n throw new InvalidAssetNameError('QUALIFIER name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.QUALIFIER.pattern.test(part)) {\n throw new InvalidAssetNameError(\n 'QUALIFIER name can only contain A-Z, 0-9, and underscore',\n name\n );\n }\n });\n } else {\n // Root qualifier: #NAME\n if (withoutPrefix.length < ASSET_NAME_RULES.QUALIFIER.minLength ||\n withoutPrefix.length > ASSET_NAME_RULES.QUALIFIER.maxLength) {\n throw new InvalidAssetNameError(\n `QUALIFIER name must be ${ASSET_NAME_RULES.QUALIFIER.minLength}-${ASSET_NAME_RULES.QUALIFIER.maxLength} characters`,\n name\n );\n }\n\n if (withoutPrefix !== withoutPrefix.toUpperCase()) {\n throw new InvalidAssetNameError('QUALIFIER name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.QUALIFIER.pattern.test(withoutPrefix)) {\n throw new InvalidAssetNameError(\n 'QUALIFIER name can only contain A-Z, 0-9, and underscore',\n name\n );\n }\n }\n\n return true;\n }\n\n /**\n * Validate RESTRICTED asset name\n * Format: $NAME\n */\n static validateRestricted(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('RESTRICTED asset name must be a non-empty string', name);\n }\n\n if (!name.startsWith(ASSET_NAME_RULES.RESTRICTED.prefix)) {\n throw new InvalidAssetNameError(\n `RESTRICTED asset must start with ${ASSET_NAME_RULES.RESTRICTED.prefix}`,\n name\n );\n }\n\n const withoutPrefix = name.substring(1);\n\n // Validate the part after $ as a ROOT asset name\n this.validateRoot(withoutPrefix);\n\n return true;\n }\n\n /**\n * Validate DEPIN asset name\n * Format: &NAME or &NAME/SUB[/...]\n */\n static validateDepin(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('DEPIN asset name must be a non-empty string', name);\n }\n\n if (!name.startsWith(ASSET_NAME_RULES.DEPIN.prefix)) {\n throw new InvalidAssetNameError(\n `DEPIN asset must start with ${ASSET_NAME_RULES.DEPIN.prefix}`,\n name\n );\n }\n\n if (name.length > ASSET_NAME_RULES.DEPIN.maxLength) {\n throw new InvalidAssetNameError(\n `DEPIN asset name cannot exceed ${ASSET_NAME_RULES.DEPIN.maxLength} characters`,\n name\n );\n }\n\n const parts = name.split(ASSET_NAME_RULES.DEPIN.separator);\n if (parts.length === 0) {\n throw new InvalidAssetNameError('DEPIN asset name is invalid', name);\n }\n\n const rootPart = parts[0].substring(1);\n if (rootPart.length < ASSET_NAME_RULES.DEPIN.minLength) {\n throw new InvalidAssetNameError(\n `DEPIN root name must be at least ${ASSET_NAME_RULES.DEPIN.minLength} characters`,\n name\n );\n }\n\n if (rootPart !== rootPart.toUpperCase()) {\n throw new InvalidAssetNameError('DEPIN asset name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.DEPIN.pattern.test(rootPart)) {\n throw new InvalidAssetNameError(\n 'DEPIN asset name can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n\n const subParts = parts.slice(1);\n subParts.forEach(part => {\n if (part.length < ASSET_NAME_RULES.DEPIN.minLength) {\n throw new InvalidAssetNameError(\n `Each DEPIN sub-part must be at least ${ASSET_NAME_RULES.DEPIN.minLength} characters`,\n name\n );\n }\n\n if (part !== part.toUpperCase()) {\n throw new InvalidAssetNameError('DEPIN asset name must be uppercase', name);\n }\n\n if (!ASSET_NAME_RULES.DEPIN.pattern.test(part)) {\n throw new InvalidAssetNameError(\n 'DEPIN asset name can only contain A-Z, 0-9, underscore, and period',\n name\n );\n }\n });\n\n return true;\n }\n\n /**\n * Validate owner token name\n * Format: ASSETNAME!\n */\n static validateOwnerToken(name) {\n if (!name || typeof name !== 'string') {\n throw new InvalidAssetNameError('Owner token name must be a non-empty string', name);\n }\n\n if (!name.endsWith('!')) {\n throw new InvalidAssetNameError('Owner token must end with !', name);\n }\n\n const assetName = name.substring(0, name.length - 1);\n\n // Validate the asset name part (could be ROOT, RESTRICTED, or DEPIN)\n if (assetName.startsWith('$')) {\n this.validateRestricted(assetName);\n } else if (assetName.startsWith('&')) {\n this.validateDepin(assetName);\n } else {\n this.validateRoot(assetName);\n }\n\n return true;\n }\n\n /**\n * Auto-detect asset type and validate\n * @param {string} name - Asset name\n * @returns {string} Asset type ('ROOT', 'SUB', 'UNIQUE', 'QUALIFIER', 'RESTRICTED', 'DEPIN', 'OWNER')\n */\n static validateAndDetectType(name) {\n if (name.endsWith('!')) {\n this.validateOwnerToken(name);\n return 'OWNER';\n } else if (name.startsWith('#')) {\n this.validateQualifier(name);\n return name.includes('/') ? 'SUB_QUALIFIER' : 'QUALIFIER';\n } else if (name.startsWith('$')) {\n this.validateRestricted(name);\n return 'RESTRICTED';\n } else if (name.startsWith('&')) {\n this.validateDepin(name);\n return 'DEPIN';\n } else if (name.includes('#')) {\n this.validateUnique(name);\n return 'UNIQUE';\n } else if (name.includes('/')) {\n this.validateSub(name);\n return 'SUB';\n } else {\n this.validateRoot(name);\n return 'ROOT';\n }\n }\n}\n\nmodule.exports = AssetNameValidator;\n","/**\n * Amount Validator\n * Validates asset quantities and units\n */\n\nconst { ASSET_LIMITS } = require('../constants');\nconst { InvalidAmountError, InvalidUnitsError } = require('../errors');\n\nclass AmountValidator {\n /**\n * Validate asset quantity\n * @param {number} quantity - Asset quantity\n * @param {number} units - Decimal places (0-8)\n */\n static validate(quantity, units = 0) {\n // Validate quantity is a number\n if (typeof quantity !== 'number' || isNaN(quantity)) {\n throw new InvalidAmountError('Quantity must be a valid number', quantity);\n }\n\n // Validate quantity is positive\n if (quantity <= 0) {\n throw new InvalidAmountError('Quantity must be greater than 0', quantity);\n }\n\n // Validate quantity is within limits\n if (quantity < ASSET_LIMITS.MIN_QUANTITY) {\n throw new InvalidAmountError(\n `Quantity must be at least ${ASSET_LIMITS.MIN_QUANTITY}`,\n quantity\n );\n }\n\n if (quantity > ASSET_LIMITS.MAX_QUANTITY) {\n throw new InvalidAmountError(\n `Quantity cannot exceed ${ASSET_LIMITS.MAX_QUANTITY}`,\n quantity\n );\n }\n\n // Validate units\n this.validateUnits(units);\n\n // Validate quantity doesn't have more decimals than units allow\n const decimalPlaces = this.getDecimalPlaces(quantity);\n if (decimalPlaces > units) {\n throw new InvalidAmountError(\n `Quantity has ${decimalPlaces} decimal places but units is ${units}`,\n quantity\n );\n }\n\n return true;\n }\n\n /**\n * Validate units (decimal places)\n * @param {number} units - Decimal places (0-8)\n */\n static validateUnits(units) {\n if (typeof units !== 'number' || isNaN(units)) {\n throw new InvalidUnitsError('Units must be a valid number', units);\n }\n\n if (!Number.isInteger(units)) {\n throw new InvalidUnitsError('Units must be an integer', units);\n }\n\n if (units < ASSET_LIMITS.MIN_UNITS || units > ASSET_LIMITS.MAX_UNITS) {\n throw new InvalidUnitsError(\n `Units must be between ${ASSET_LIMITS.MIN_UNITS} and ${ASSET_LIMITS.MAX_UNITS}`,\n units\n );\n }\n\n return true;\n }\n\n /**\n * Validate qualifier quantity (1-10 only)\n * @param {number} quantity - Qualifier quantity\n */\n static validateQualifierQuantity(quantity) {\n if (typeof quantity !== 'number' || isNaN(quantity)) {\n throw new InvalidAmountError('Qualifier quantity must be a valid number', quantity);\n }\n\n if (!Number.isInteger(quantity)) {\n throw new InvalidAmountError('Qualifier quantity must be an integer', quantity);\n }\n\n if (quantity < ASSET_LIMITS.QUALIFIER_MIN_QUANTITY || quantity > ASSET_LIMITS.QUALIFIER_MAX_QUANTITY) {\n throw new InvalidAmountError(\n `Qualifier quantity must be between ${ASSET_LIMITS.QUALIFIER_MIN_QUANTITY} and ${ASSET_LIMITS.QUALIFIER_MAX_QUANTITY}`,\n quantity\n );\n }\n\n return true;\n }\n\n /**\n * Validate owner token quantity (always 1)\n * @param {number} quantity - Owner token quantity\n */\n static validateOwnerTokenQuantity(quantity) {\n if (quantity !== ASSET_LIMITS.OWNER_TOKEN_QUANTITY) {\n throw new InvalidAmountError(\n `Owner token quantity must be exactly ${ASSET_LIMITS.OWNER_TOKEN_QUANTITY}`,\n quantity\n );\n }\n\n return true;\n }\n\n /**\n * Get number of decimal places in a number\n * @param {number} num - Number to check\n * @returns {number} Number of decimal places\n */\n static getDecimalPlaces(num) {\n const match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) return 0;\n return Math.max(\n 0,\n (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0)\n );\n }\n\n /**\n * Validate that sum of amounts doesn't exceed max\n * @param {number} current - Current amount\n * @param {number} additional - Additional amount\n * @returns {boolean} True if sum is valid\n */\n static validateSum(current, additional) {\n if (current + additional > ASSET_LIMITS.MAX_QUANTITY) {\n throw new InvalidAmountError(\n `Sum of current (${current}) and additional (${additional}) exceeds maximum ${ASSET_LIMITS.MAX_QUANTITY}`,\n current + additional\n );\n }\n\n return true;\n }\n}\n\nmodule.exports = AmountValidator;\n","/**\n * Verifier String Validator\n * Validates verifier strings for restricted assets\n */\n\nconst { InvalidVerifierStringError } = require('../errors');\nconst AssetNameValidator = require('./assetNameValidator');\n\nclass VerifierValidator {\n /**\n * Validate verifier string syntax\n * Verifier syntax: #TAG, !#TAG, &, |, (, )\n * Examples:\n * \"#KYC\"\n * \"#KYC & #ACCREDITED\"\n * \"#KYC | #INSTITUTION\"\n * \"(#KYC & #ACCREDITED) | #INSTITUTION\"\n * \"!#BANNED\"\n *\n * @param {string} verifierString - Verifier string to validate\n * @returns {boolean} True if valid\n */\n static validate(verifierString) {\n if (!verifierString || typeof verifierString !== 'string') {\n throw new InvalidVerifierStringError(\n 'Verifier string must be a non-empty string',\n verifierString\n );\n }\n\n // Trim whitespace\n const trimmed = verifierString.trim();\n if (trimmed.length === 0) {\n throw new InvalidVerifierStringError(\n 'Verifier string cannot be empty',\n verifierString\n );\n }\n\n // Check for valid characters only\n // Valid: #, A-Z, 0-9, _, &, |, !, (, ), space, /\n const validPattern = /^[#A-Z0-9_&|()\\s!/]+$/;\n if (!validPattern.test(trimmed)) {\n throw new InvalidVerifierStringError(\n 'Verifier contains invalid characters. Valid: #, A-Z, 0-9, _, &, |, !, (, ), space, /',\n verifierString\n );\n }\n\n // Extract all qualifiers (tokens starting with # or !#)\n const qualifierMatches = trimmed.match(/!?#[A-Z0-9_/]+/g) || [];\n\n if (qualifierMatches.length === 0) {\n throw new InvalidVerifierStringError(\n 'Verifier must contain at least one qualifier (#TAG)',\n verifierString\n );\n }\n\n // Validate each qualifier\n for (const match of qualifierMatches) {\n const qualifier = match.startsWith('!') ? match.substring(1) : match;\n\n try {\n AssetNameValidator.validateQualifier(qualifier);\n } catch (e) {\n throw new InvalidVerifierStringError(\n `Invalid qualifier in verifier: ${qualifier} - ${e.message}`,\n verifierString\n );\n }\n }\n\n // Check balanced parentheses\n let depth = 0;\n for (const char of trimmed) {\n if (char === '(') depth++;\n if (char === ')') depth--;\n if (depth < 0) {\n throw new InvalidVerifierStringError(\n 'Unbalanced parentheses in verifier string',\n verifierString\n );\n }\n }\n if (depth !== 0) {\n throw new InvalidVerifierStringError(\n 'Unbalanced parentheses in verifier string',\n verifierString\n );\n }\n\n // Check for valid operators placement\n // & and | must be between qualifiers, not at start/end\n const operatorPattern = /(&|\\|)/g;\n const operators = trimmed.match(operatorPattern);\n if (operators) {\n // Check operators are not at start or end\n if (trimmed.trim().match(/^(&|\\|)/) || trimmed.trim().match(/(&|\\|)$/)) {\n throw new InvalidVerifierStringError(\n 'Operators & or | cannot be at start or end of verifier',\n verifierString\n );\n }\n\n // Check no consecutive operators\n if (trimmed.match(/(&|\\|)\\s*(&|\\|)/)) {\n throw new InvalidVerifierStringError(\n 'Consecutive operators are not allowed',\n verifierString\n );\n }\n }\n\n return true;\n }\n\n /**\n * Extract all qualifiers from verifier string\n * @param {string} verifierString - Verifier string\n * @returns {string[]} Array of qualifier names (including #)\n */\n static extractQualifiers(verifierString) {\n this.validate(verifierString);\n\n const qualifierMatches = verifierString.match(/!?#[A-Z0-9_/]+/g) || [];\n\n // Remove ! prefix and deduplicate\n const qualifiers = [...new Set(qualifierMatches.map(q => q.replace('!', '')))];\n\n return qualifiers;\n }\n\n /**\n * Check if verifier string uses a specific qualifier\n * @param {string} verifierString - Verifier string\n * @param {string} qualifierName - Qualifier to check (with #)\n * @returns {boolean} True if qualifier is used\n */\n static usesQualifier(verifierString, qualifierName) {\n const qualifiers = this.extractQualifiers(verifierString);\n return qualifiers.includes(qualifierName);\n }\n}\n\nmodule.exports = VerifierValidator;\n","/**\n * IPFS Hash Validator\n * Validates IPFS CID formats\n */\n\nconst { InvalidIPFSHashError } = require('../errors');\n\nclass IpfsValidator {\n /**\n * Validate IPFS hash format\n * Accepts:\n * - CIDv0: Qm... (46 characters, base58)\n * - CIDv1: bafy... or bafk... (various lengths, base32)\n * - Neurai TXID: 64 hex characters (for on-chain metadata)\n *\n * @param {string} hash - IPFS hash or TXID\n * @returns {boolean} True if valid\n */\n static validate(hash) {\n if (!hash || typeof hash !== 'string') {\n throw new InvalidIPFSHashError('IPFS hash must be a non-empty string', hash);\n }\n\n const trimmed = hash.trim();\n\n // Check maximum length (Neurai allows up to 40 bytes in protocol)\n if (trimmed.length > 80) {\n throw new InvalidIPFSHashError('IPFS hash too long (max 80 characters)', hash);\n }\n\n // Check if it's a valid format\n const isCIDv0 = this.isCIDv0(trimmed);\n const isCIDv1 = this.isCIDv1(trimmed);\n const isTXID = this.isTXID(trimmed);\n\n if (!isCIDv0 && !isCIDv1 && !isTXID) {\n throw new InvalidIPFSHashError(\n 'Invalid IPFS hash format. Must be CIDv0 (Qm...), CIDv1 (bafy...), or TXID (64 hex chars)',\n hash\n );\n }\n\n return true;\n }\n\n /**\n * Check if hash is CIDv0 format\n * @param {string} hash - Hash to check\n * @returns {boolean} True if CIDv0\n */\n static isCIDv0(hash) {\n // CIDv0: Starts with \"Qm\", 46 characters, base58\n if (!hash.startsWith('Qm')) return false;\n if (hash.length !== 46) return false;\n\n // Base58 characters: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\n const base58Pattern = /^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/;\n return base58Pattern.test(hash);\n }\n\n /**\n * Check if hash is CIDv1 format\n * @param {string} hash - Hash to check\n * @returns {boolean} True if CIDv1\n */\n static isCIDv1(hash) {\n // CIDv1: Starts with \"bafy\" or \"bafk\" (base32), various lengths\n if (!hash.startsWith('bafy') && !hash.startsWith('bafk')) return false;\n\n // Base32 characters: a-z, 2-7\n const base32Pattern = /^[a-z2-7]+$/;\n return base32Pattern.test(hash);\n }\n\n /**\n * Check if hash is a transaction ID\n * @param {string} hash - Hash to check\n * @returns {boolean} True if TXID\n */\n static isTXID(hash) {\n // TXID: 64 hexadecimal characters\n if (hash.length !== 64) return false;\n\n const hexPattern = /^[0-9a-fA-F]+$/;\n return hexPattern.test(hash);\n }\n\n /**\n * Get IPFS hash type\n * @param {string} hash - IPFS hash\n * @returns {string} Type ('CIDv0', 'CIDv1', 'TXID', or 'UNKNOWN')\n */\n static getHashType(hash) {\n if (this.isCIDv0(hash)) return 'CIDv0';\n if (this.isCIDv1(hash)) return 'CIDv1';\n if (this.isTXID(hash)) return 'TXID';\n return 'UNKNOWN';\n }\n}\n\nmodule.exports = IpfsValidator;\n","/**\n * Validators Module\n * Exports all validator classes\n */\n\nconst AssetNameValidator = require('./assetNameValidator');\nconst AmountValidator = require('./amountValidator');\nconst VerifierValidator = require('./verifierValidator');\nconst IpfsValidator = require('./ipfsValidator');\n\nmodule.exports = {\n AssetNameValidator,\n AmountValidator,\n VerifierValidator,\n IpfsValidator\n};\n","/**\n * Base Asset Transaction Builder\n * Abstract base class for all transaction builders\n *\n * Provides common functionality:\n * - UTXO selection\n * - Fee estimation\n * - Output ordering\n * - Raw transaction creation\n * - Validation\n *\n * Subclasses must implement:\n * - validateParams(params)\n * - build()\n */\n\nconst { BurnManager, OwnerTokenManager, UTXOSelector, OutputOrderer } = require('../managers');\nconst { AssetNameValidator, AmountValidator } = require('../validators');\n\nclass BaseAssetTransactionBuilder {\n /**\n * @param {Function} rpc - RPC function\n * @param {string} network - Network type ('xna' or 'xna-test')\n * @param {string[]|Function} addresses - Wallet addresses or function that returns addresses\n * @param {object} params - Transaction parameters\n */\n constructor(rpc, networkOrParams, addresses, params) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n\n // Support both (rpc, network, addresses, params) and (rpc, params) calling forms.\n // NeuraiAssets passes a single merged params object as the second argument.\n let network, actualAddresses, actualParams;\n if (\n typeof networkOrParams === 'object' &&\n networkOrParams !== null &&\n !Array.isArray(networkOrParams) &&\n addresses === undefined\n ) {\n network = networkOrParams.network;\n actualAddresses = networkOrParams.walletAddresses || networkOrParams.addresses;\n actualParams = networkOrParams;\n } else {\n network = networkOrParams;\n actualAddresses = addresses;\n actualParams = params;\n }\n\n if (!network) {\n throw new Error('Network is required');\n }\n\n // Addresses can be an array or a function that returns addresses\n if (typeof actualAddresses === 'function') {\n this.getAddresses = actualAddresses;\n } else if (Array.isArray(actualAddresses)) {\n this.getAddresses = () => actualAddresses;\n } else {\n throw new Error('Addresses must be an array or a function');\n }\n\n this.rpc = rpc;\n this.network = network;\n this.params = actualParams || {};\n\n // Initialize managers\n this.burnManager = new BurnManager(network);\n this.ownerTokenManager = new OwnerTokenManager(rpc);\n this.utxoSelector = new UTXOSelector(rpc);\n this.outputOrderer = new OutputOrderer();\n }\n\n /**\n * Get wallet addresses\n * @returns {string[]} Array of addresses\n */\n async _getAddresses() {\n const addresses = await this.getAddresses();\n if (!Array.isArray(addresses) || addresses.length === 0) {\n throw new Error('No addresses available');\n }\n return addresses;\n }\n\n /**\n * Validate transaction parameters\n * Must be implemented by subclasses\n * @param {object} params - Parameters to validate\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n throw new Error('validateParams must be implemented by subclass');\n }\n\n /**\n * Build the transaction\n * Must be implemented by subclasses\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n throw new Error('build must be implemented by subclass');\n }\n\n /**\n * Estimate transaction fee\n * @param {number} inputCount - Number of inputs\n * @param {number} outputCount - Number of outputs\n * @returns {Promise<number>} Estimated fee in XNA\n */\n async estimateFee(inputCount, outputCount) {\n const feeRate = await this.utxoSelector.getFeeRate();\n return this.utxoSelector.estimateFee(inputCount, outputCount, feeRate);\n }\n\n /**\n * Select UTXOs for transaction\n * @param {number} xnaAmount - Required XNA amount (for fees + burn)\n * @param {string|null} assetName - Asset name if needed\n * @param {number} assetAmount - Asset amount if needed\n * @returns {Promise<object>} Selected UTXOs\n */\n async selectUTXOs(xnaAmount, assetName = null, assetAmount = 0) {\n const addresses = await this._getAddresses();\n return this.utxoSelector.selectMixedUTXOs(\n addresses,\n xnaAmount,\n assetName,\n assetAmount\n );\n }\n\n /**\n * Build raw transaction using RPC\n * @param {Array} inputs - Transaction inputs\n * @param {object} outputs - Transaction outputs (must be ordered)\n * @returns {Promise<string>} Raw transaction hex\n */\n async buildRawTransaction(inputs, outputs) {\n try {\n // Format inputs for createrawtransaction\n const formattedInputs = inputs.map(input => ({\n txid: input.txid,\n vout: input.vout !== undefined ? input.vout : input.outputIndex\n }));\n\n // Call createrawtransaction\n const rawTx = await this.rpc('createrawtransaction', [\n formattedInputs,\n outputs\n ]);\n\n return rawTx;\n } catch (error) {\n throw new Error(`Failed to create raw transaction: ${error.message}`);\n }\n }\n\n /**\n * Calculate change amount\n * @param {number} totalInput - Total input amount\n * @param {number} totalOutput - Total output amount (including fee)\n * @returns {number} Change amount\n */\n calculateChange(totalInput, totalOutput) {\n const change = totalInput - totalOutput;\n if (change < 0) {\n throw new Error('Insufficient funds: inputs < outputs');\n }\n return change;\n }\n\n /**\n * Get change address\n * Uses first address from wallet by default\n * Can be overridden by params.changeAddress\n * @returns {Promise<string>} Change address\n */\n async getChangeAddress() {\n if (this.params.changeAddress) {\n return this.params.changeAddress;\n }\n\n const addresses = await this._getAddresses();\n return addresses[0];\n }\n\n /**\n * Get recipient address\n * Uses first address from wallet if not specified\n * @returns {Promise<string>} Recipient address\n */\n async getToAddress() {\n if (this.params.toAddress) {\n return this.params.toAddress;\n }\n\n const addresses = await this._getAddresses();\n return addresses[0];\n }\n\n /**\n * Common validation for asset name\n * @param {string} assetName - Asset name to validate\n * @param {string} type - Expected type ('ROOT', 'SUB', etc.)\n */\n validateAssetName(assetName, type) {\n if (!assetName) {\n throw new Error('Asset name is required');\n }\n\n switch (type) {\n case 'ROOT':\n AssetNameValidator.validateRoot(assetName);\n break;\n case 'SUB':\n AssetNameValidator.validateSub(assetName);\n break;\n case 'UNIQUE':\n AssetNameValidator.validateUnique(assetName);\n break;\n case 'QUALIFIER':\n AssetNameValidator.validateQualifier(assetName);\n break;\n case 'RESTRICTED':\n AssetNameValidator.validateRestricted(assetName);\n break;\n case 'DEPIN':\n AssetNameValidator.validateDepin(assetName);\n break;\n default:\n throw new Error(`Unknown asset type: ${type}`);\n }\n }\n\n /**\n * Common validation for amount and units\n * @param {number} quantity - Quantity to validate\n * @param {number} units - Units (decimal places)\n */\n validateAmount(quantity, units) {\n AmountValidator.validate(quantity, units);\n }\n\n /**\n * Convert asset amount to protocol raw units.\n * Asset raw quantities in transaction payloads are always encoded with\n * 8 decimal places, regardless of the asset's displayed `units`.\n *\n * @param {number} amount - User-facing asset amount\n * @param {number} units - Asset decimal places (kept for API compatibility)\n * @returns {number} Amount in protocol raw units\n */\n toSatoshis(amount, units) {\n void units;\n return Math.round(amount * 100000000);\n }\n\n /**\n * Convert protocol raw units back to a user-facing asset amount.\n *\n * @param {number} satoshis - Amount in protocol raw units\n * @param {number} units - Asset decimal places (kept for API compatibility)\n * @returns {number} Amount in asset units\n */\n fromSatoshis(satoshis, units) {\n void units;\n return satoshis / 100000000;\n }\n\n /**\n * Normalize builder inputs to raw transaction inputs\n * @param {Array} inputs - Builder inputs\n * @returns {Array<{txid: string, vout: number}>} Raw transaction inputs\n */\n toRawTxInputs(inputs) {\n return (inputs || []).map(input => ({\n txid: input.txid,\n vout: input.vout !== undefined ? input.vout : input.outputIndex\n }));\n }\n\n /**\n * Convert XNA amount to satoshis\n * @param {number|null|undefined} amount - Amount in XNA\n * @returns {number|undefined} Amount in satoshis\n */\n xnaToSatoshis(amount) {\n if (amount === undefined || amount === null) {\n return undefined;\n }\n\n return Math.round(amount * 100000000);\n }\n\n /**\n * Build a typed local raw build payload compatible with\n * @neuraiproject/neurai-create-transaction createFromOperation(...)\n *\n * @param {string} operationType - Operation type\n * @param {Array} inputs - Builder inputs\n * @param {object|null} burnInfo - Burn metadata\n * @param {string|null} changeAddress - XNA change address\n * @param {number|null} changeAmount - XNA change amount in XNA\n * @param {object} operationParams - Operation-specific params\n * @returns {{ operationType: string, params: object }} Local raw build\n */\n buildLocalRawBuild(\n operationType,\n inputs,\n burnInfo = null,\n changeAddress = null,\n changeAmount = null,\n operationParams = {}\n ) {\n const params = {\n inputs: this.toRawTxInputs(inputs),\n ...operationParams\n };\n\n if (burnInfo && burnInfo.address && burnInfo.amount !== undefined && burnInfo.amount !== null) {\n params.burnAddress = burnInfo.address;\n params.burnAmountSats = this.xnaToSatoshis(burnInfo.amount);\n }\n\n if (changeAddress && changeAmount !== undefined && changeAmount !== null) {\n params.xnaChangeAddress = changeAddress;\n params.xnaChangeSats = this.xnaToSatoshis(changeAmount);\n }\n\n return {\n operationType,\n params\n };\n }\n\n /**\n * Normalize ordered outputs into flat entries\n * @param {Array|object} outputs - Transaction outputs\n * @returns {Array<{address: string, value: unknown}>} Output entries\n */\n getOutputEntries(outputs) {\n if (Array.isArray(outputs)) {\n return outputs.map(output => {\n const [address, value] = Object.entries(output)[0];\n return { address, value };\n });\n }\n\n if (outputs && typeof outputs === 'object') {\n return Object.entries(outputs).map(([address, value]) => ({ address, value }));\n }\n\n return [];\n }\n\n /**\n * Extract burn metadata from outputs\n * @param {Array<{address: string, value: unknown}>} entries - Output entries\n * @param {number} burnAmount - Burn amount in XNA\n * @returns {{ burnAddress: string|null, burnAmount: number }}\n */\n extractBurnMetadata(entries, burnAmount) {\n if (!burnAmount || burnAmount <= 0) {\n return {\n burnAddress: null,\n burnAmount: 0\n };\n }\n\n const burnEntry = entries.find(({ address, value }) => {\n return typeof value === 'number' &&\n value === burnAmount &&\n this.burnManager.isBurnAddress(address);\n });\n\n return {\n burnAddress: burnEntry ? burnEntry.address : null,\n burnAmount\n };\n }\n\n /**\n * Extract XNA change metadata from outputs\n * @param {Array<{address: string, value: unknown}>} entries - Output entries\n * @param {string|null} burnAddress - Burn address if present\n * @returns {{ changeAddress: string|null, changeAmount: number|null }}\n */\n extractChangeMetadata(entries, burnAddress = null) {\n const xnaOutputs = entries.filter(({ address, value }) => {\n return typeof value === 'number' && address !== burnAddress;\n });\n\n if (xnaOutputs.length !== 1) {\n return {\n changeAddress: null,\n changeAmount: null\n };\n }\n\n return {\n changeAddress: xnaOutputs[0].address,\n changeAmount: xnaOutputs[0].value\n };\n }\n\n /**\n * Format transaction result\n * @param {string} rawTx - Raw transaction hex\n * @param {Array} utxos - UTXOs used\n * @param {Array} inputs - Transaction inputs\n * @param {object} outputs - Transaction outputs\n * @param {number} fee - Transaction fee\n * @param {number} burnAmount - Burn amount\n * @param {object} extra - Extra information\n * @returns {object} Formatted result\n */\n formatResult(rawTx, utxos, inputs, outputs, fee, burnAmount, extra = {}) {\n const outputEntries = this.getOutputEntries(outputs);\n const burnMetadata = this.extractBurnMetadata(outputEntries, burnAmount);\n const changeMetadata = this.extractChangeMetadata(outputEntries, burnMetadata.burnAddress);\n\n return {\n rawTx,\n utxos,\n inputs,\n outputs,\n fee,\n burnAmount: burnMetadata.burnAmount,\n network: this.network,\n buildStrategy: 'rpc-node',\n burnAddress: burnMetadata.burnAddress,\n changeAddress: extra.changeAddress !== undefined\n ? extra.changeAddress\n : changeMetadata.changeAddress,\n changeAmount: extra.changeAmount !== undefined\n ? extra.changeAmount\n : changeMetadata.changeAmount,\n ...extra\n };\n }\n\n /**\n * Check if asset exists (to prevent creating duplicates)\n * @param {string} assetName - Asset name to check\n * @returns {Promise<boolean>} True if exists\n */\n async assetExists(assetName) {\n try {\n const assetData = await this.rpc('getassetdata', [assetName]);\n return assetData !== null && assetData !== undefined;\n } catch (error) {\n // If asset doesn't exist, RPC will throw error\n if (error.message && error.message.includes('not found')) {\n return false;\n }\n // Re-throw other errors\n throw error;\n }\n }\n\n /**\n * Get asset data from blockchain\n * @param {string} assetName - Asset name\n * @returns {Promise<object|null>} Asset data or null if not found\n */\n async getAssetData(assetName) {\n try {\n return await this.rpc('getassetdata', [assetName]);\n } catch (error) {\n if (error.message && error.message.includes('not found')) {\n return null;\n }\n throw error;\n }\n }\n}\n\nmodule.exports = BaseAssetTransactionBuilder;\n","/**\n * Issue Root Builder\n * Builds transactions for creating ROOT assets\n *\n * ROOT assets:\n * - Top-level assets (3-30 uppercase characters)\n * - Cost: 1000 XNA (burned)\n * - Automatically creates owner token (ASSET!)\n * - Can be reissuable or non-reissuable\n * - Optional IPFS metadata\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter } = require('../utils');\nconst { AssetExistsError, InvalidIPFSHashError } = require('../errors');\nconst { IpfsValidator } = require('../validators');\n\nclass IssueRootBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue ROOT parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n // Validate asset name (ROOT format)\n this.validateAssetName(params.assetName, 'ROOT');\n\n // Validate quantity and units\n const units = params.units !== undefined ? params.units : 0;\n this.validateAmount(params.quantity, units);\n\n // Validate IPFS hash if provided\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n // Validate reissuable is boolean if provided\n if (params.reissuable !== undefined && typeof params.reissuable !== 'boolean') {\n throw new Error('reissuable must be a boolean');\n }\n\n return true;\n }\n\n /**\n * Build ROOT asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n units = 0,\n reissuable = true,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n // 2. Check if asset already exists\n const exists = await this.assetExists(assetName);\n if (exists) {\n throw new AssetExistsError(\n `Asset ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n // 3. Get burn information\n const burnInfo = this.burnManager.getIssueRootBurn();\n\n // 4. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 5. Estimate fee (rough estimate for initial UTXO selection)\n const estimatedFee = await this.estimateFee(1, 3);\n\n // 6. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 7. Select UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 8. Recalculate fee with actual input count\n const actualFee = await this.estimateFee(baseCurrencyUTXOs.length, 3);\n\n // 9. Verify we still have enough after fee recalculation\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n // Need to select more UTXOs\n const additionalNeeded = totalRequired - totalXNAInput + 0.001; // Add small buffer\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 10. Calculate final totals\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 11. Build inputs\n const inputs = baseCurrencyUTXOs.map(utxo => ({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n }));\n\n // 12. Build outputs (ORDER MATTERS!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n // Only add change if meaningful amount\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Issue operation\n const issueOutput = OutputFormatter.formatIssueOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n units: units,\n reissuable: reissuable,\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash\n });\n\n outputs.push({ [toAddress]: issueOutput });\n\n // 13. Order outputs (critical for protocol)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 14. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 15. Format and return result\n return this.formatResult(\n rawTx,\n baseCurrencyUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenName: assetName + '!',\n operationType: 'ISSUE_ROOT',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_ROOT',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, units),\n units,\n reissuable,\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n ownerTokenAddress: changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueRootBuilder;\n","/**\n * Issue Sub Builder\n * Builds transactions for creating SUB assets\n *\n * SUB assets:\n * - Child of a ROOT asset (format: ROOT/SUBNAME)\n * - Cost: 200 XNA (burned)\n * - Requires parent's owner token (ROOT!)\n * - Creates own owner token (ROOT/SUB!)\n * - Parent owner token must be returned in outputs\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst {\n AssetExistsError,\n ParentAssetNotFoundError,\n OwnerTokenNotFoundError\n} = require('../errors');\nconst { IpfsValidator } = require('../validators');\n\nclass IssueSubBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue SUB parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n // Validate asset name (SUB format: ROOT/SUBNAME)\n this.validateAssetName(params.assetName, 'SUB');\n\n // Validate quantity and units\n const units = params.units !== undefined ? params.units : 0;\n this.validateAmount(params.quantity, units);\n\n // Validate IPFS hash if provided\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n return true;\n }\n\n /**\n * Build SUB asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n units = 0,\n reissuable = true,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n // 2. Parse asset name to get parent\n const parsed = AssetNameParser.parse(assetName);\n const parentAssetName = parsed.parent;\n\n if (!parentAssetName) {\n throw new Error('Cannot parse parent asset from SUB asset name');\n }\n\n // 3. Check if parent asset exists\n const parentExists = await this.assetExists(parentAssetName);\n if (!parentExists) {\n throw new ParentAssetNotFoundError(\n `Parent asset ${parentAssetName} does not exist. You must create the ROOT asset first.`,\n parentAssetName\n );\n }\n\n // 4. Check if SUB asset already exists\n const subExists = await this.assetExists(assetName);\n if (subExists) {\n throw new AssetExistsError(\n `Asset ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n // 5. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 6. Find parent's owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(parentAssetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the parent asset's owner token (${ownerTokenName}) to create a SUB asset. ` +\n `The owner token proves you control the parent asset.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 7. Get burn information\n const burnInfo = this.burnManager.getIssueSubBurn();\n\n // 8. Estimate fee\n // Inputs: XNA UTXOs + owner token UTXO\n // Outputs: burn + change + owner token return + issue operation\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 9. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 10. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 11. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 4);\n\n // 12. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 13. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 14. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 15. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Third: Owner token return (CRITICAL - must return or lost forever!)\n const ownerTokenReturn = this.ownerTokenManager.createOwnerTokenReturnOutput(\n ownerTokenName,\n changeAddress // Return owner token to change address\n );\n outputs.push(ownerTokenReturn);\n\n // Last: Issue operation\n const issueOutput = OutputFormatter.formatIssueOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n units: units,\n reissuable: reissuable,\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash\n });\n\n outputs.push({ [toAddress]: issueOutput });\n\n // 16. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 17. Validate owner token is returned (safety check)\n this.ownerTokenManager.validateOwnerTokenReturn(inputs, orderedOutputs);\n\n // 18. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 19. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n parentAssetName,\n ownerTokenName: assetName + '!',\n parentOwnerTokenUsed: ownerTokenName,\n operationType: 'ISSUE_SUB',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_SUB',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, units),\n units,\n reissuable,\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n parentOwnerAddress: changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueSubBuilder;\n","/**\n * Issue DePIN Builder\n * Builds transactions for creating DEPIN assets.\n *\n * DEPIN assets:\n * - Soulbound assets\n * - Format: &NAME or &NAME/SUB\n * - Cost: 10 XNA (same burn as UNIQUE assets)\n * - Units: Always 0\n * - Owner token is auto-created by the node\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter } = require('../utils');\nconst { AssetExistsError } = require('../errors');\nconst { IpfsValidator } = require('../validators');\n\nclass IssueDepinBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue DEPIN parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n this.validateAssetName(params.assetName, 'DEPIN');\n this.validateAmount(params.quantity, 0);\n\n if (params.units !== undefined && params.units !== 0) {\n throw new Error('DEPIN assets must use units=0');\n }\n\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n if (params.reissuable !== undefined && typeof params.reissuable !== 'boolean') {\n throw new Error('reissuable must be a boolean');\n }\n\n return true;\n }\n\n /**\n * Build DEPIN asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n reissuable = true,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n const exists = await this.assetExists(assetName);\n if (exists) {\n throw new AssetExistsError(\n `Asset ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n const burnInfo = this.burnManager.getIssueDepinBurn();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n const estimatedFee = await this.estimateFee(1, 3);\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n const actualFee = await this.estimateFee(baseCurrencyUTXOs.length, 3);\n const totalRequired = burnInfo.amount + actualFee;\n\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n const inputs = baseCurrencyUTXOs.map(utxo => ({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n }));\n\n const outputs = [];\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n const issueOutput = OutputFormatter.formatIssueOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, 0),\n units: 0,\n reissuable,\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash\n });\n\n outputs.push({ [toAddress]: issueOutput });\n\n const orderedOutputs = this.outputOrderer.order(outputs);\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n return this.formatResult(\n rawTx,\n baseCurrencyUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenName: `${assetName}!`,\n operationType: 'ISSUE_DEPIN',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_DEPIN',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, 0),\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n ownerTokenAddress: changeAddress,\n reissuable\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueDepinBuilder;\n","/**\n * Reissue Builder\n * Builds transactions for reissuing (minting more supply) assets\n *\n * Reissue:\n * - Mints additional supply of an existing asset\n * - Cost: 200 XNA (burned)\n * - Requires asset's owner token (ASSET!)\n * - Can lock asset (make it non-reissuable)\n * - Can update IPFS metadata\n * - Owner token must be returned\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst {\n AssetNotFoundError,\n AssetNotReissuableError,\n OwnerTokenNotFoundError,\n MaxSupplyExceededError\n} = require('../errors');\nconst { IpfsValidator } = require('../validators');\nconst { ASSET_LIMITS } = require('../constants');\n\nclass ReissueBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate reissue parameters\n * @param {object} params - Reissue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required (amount to mint)');\n }\n\n if (params.quantity <= 0) {\n throw new Error('quantity must be greater than 0');\n }\n\n // Validate new IPFS hash if provided\n if (params.newIpfs) {\n IpfsValidator.validate(params.newIpfs);\n }\n\n return true;\n }\n\n /**\n * Build reissue transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n reissuable,\n newIpfs\n } = this.params;\n\n // 2. Get asset data to verify it exists and is reissuable\n const assetData = await this.getAssetData(assetName);\n if (!assetData) {\n throw new AssetNotFoundError(\n `Asset ${assetName} does not exist on the blockchain`,\n assetName\n );\n }\n\n // 3. Check if asset is reissuable\n if (!assetData.reissuable) {\n throw new AssetNotReissuableError(\n `Asset ${assetName} is not reissuable. The supply has been locked.`,\n assetName\n );\n }\n\n // 4. Check if reissuing would exceed max supply\n const currentSupply = assetData.amount || 0;\n const additionalAmount = quantity;\n const newTotalSupply = currentSupply + additionalAmount;\n\n if (newTotalSupply > ASSET_LIMITS.MAX_QUANTITY) {\n throw new MaxSupplyExceededError(\n `Reissuing ${additionalAmount} would exceed maximum supply. ` +\n `Current: ${currentSupply}, Additional: ${additionalAmount}, ` +\n `Max: ${ASSET_LIMITS.MAX_QUANTITY}`,\n assetName,\n currentSupply,\n additionalAmount,\n ASSET_LIMITS.MAX_QUANTITY\n );\n }\n\n // 5. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n const isDepinAsset = AssetNameParser.isDepin(assetName);\n\n // 6. Find owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the asset's owner token (${ownerTokenName}) to reissue it. ` +\n `The owner token proves you have the right to mint more supply.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 7. Get burn information\n const burnInfo = this.burnManager.getReissueBurn();\n\n // 8. Estimate fee\n // Inputs: XNA UTXOs + owner token UTXO\n // Outputs: burn + change + reissue operation\n // (node auto-generates owner token return from the reissue entry, total = 4 physical outputs)\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 9. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 10. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 11. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 4);\n\n // 12. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 13. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 14. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 15. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Reissue operation\n // Note: the node auto-generates the owner token return as part of processing\n // the reissue entry — no explicit transfer output needed here.\n const units = assetData.units || 0;\n const reissueOutput = OutputFormatter.formatReissueOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n reissuable: reissuable !== undefined ? reissuable : undefined,\n new_ipfs: newIpfs || undefined,\n owner_change_address: isDepinAsset ? toAddress : changeAddress\n });\n\n outputs.push({ [toAddress]: reissueOutput });\n\n // 16. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 17. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 18. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenUsed: ownerTokenName,\n quantityMinted: quantity,\n newTotalSupply,\n previousSupply: currentSupply,\n reissuableLocked: reissuable === false,\n operationType: 'REISSUE',\n localRawBuild: this.buildLocalRawBuild(\n 'REISSUE',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, units),\n units,\n reissuable: reissuable !== undefined ? reissuable : undefined,\n ipfsHash: newIpfs || undefined,\n ownerChangeAddress: isDepinAsset ? toAddress : changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = ReissueBuilder;\n","/**\n * Issue Unique Builder\n * Builds transactions for creating UNIQUE assets (NFTs)\n *\n * UNIQUE assets:\n * - Non-fungible tokens (NFTs)\n * - Format: ROOT#TAG (e.g., MYNFT#001)\n * - Cost: 10 XNA per NFT (burned)\n * - Requires parent's owner token (ROOT!)\n * - Properties: quantity=1, units=0, reissuable=false (always)\n * - Can create multiple NFTs in single transaction\n * - Each NFT can have unique IPFS metadata\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst {\n ParentAssetNotFoundError,\n OwnerTokenNotFoundError,\n AssetExistsError\n} = require('../errors');\nconst { IpfsValidator } = require('../validators');\n\nclass IssueUniqueBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue UNIQUE parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.rootName) {\n throw new Error('rootName is required (parent asset name)');\n }\n\n if (!params.assetTags || !Array.isArray(params.assetTags) || params.assetTags.length === 0) {\n throw new Error('assetTags is required and must be a non-empty array');\n }\n\n // Validate root name\n this.validateAssetName(params.rootName, 'ROOT');\n\n // Validate each tag\n params.assetTags.forEach((tag, index) => {\n if (!tag || typeof tag !== 'string') {\n throw new Error(`assetTags[${index}] must be a non-empty string`);\n }\n\n // Validate full unique asset name\n const fullName = `${params.rootName}#${tag}`;\n this.validateAssetName(fullName, 'UNIQUE');\n });\n\n // Validate IPFS hashes if provided\n if (params.ipfsHashes) {\n if (!Array.isArray(params.ipfsHashes)) {\n throw new Error('ipfsHashes must be an array');\n }\n\n if (params.ipfsHashes.length !== params.assetTags.length) {\n throw new Error(\n `ipfsHashes array length (${params.ipfsHashes.length}) must match ` +\n `assetTags array length (${params.assetTags.length})`\n );\n }\n\n params.ipfsHashes.forEach((hash, index) => {\n if (hash) {\n IpfsValidator.validate(hash);\n }\n });\n }\n\n return true;\n }\n\n /**\n * Build UNIQUE asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n rootName,\n assetTags,\n ipfsHashes = []\n } = this.params;\n\n // 2. Check if parent asset exists\n const parentExists = await this.assetExists(rootName);\n if (!parentExists) {\n throw new ParentAssetNotFoundError(\n `Parent asset ${rootName} does not exist. You must create the ROOT asset first.`,\n rootName\n );\n }\n\n // 3. Check if any of the unique assets already exist\n for (const tag of assetTags) {\n const fullName = `${rootName}#${tag}`;\n const exists = await this.assetExists(fullName);\n if (exists) {\n throw new AssetExistsError(\n `Unique asset ${fullName} already exists on the blockchain`,\n fullName\n );\n }\n }\n\n // 4. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 5. Find parent's owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(rootName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the parent asset's owner token (${ownerTokenName}) to create UNIQUE assets. ` +\n `The owner token proves you control the parent asset.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 6. Get burn information (cost = 10 XNA per NFT)\n const nftCount = assetTags.length;\n const burnInfo = this.burnManager.getIssueUniqueBurn(nftCount);\n\n // 7. Estimate fee\n // Inputs: XNA UTXOs + owner token UTXO\n // Outputs: burn + change + owner token return + issue_unique operation\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 8. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 9. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 10. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 4);\n\n // 11. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 12. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 13. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 14. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Issue unique operation\n // NOTE: owner token return is handled automatically by the node when processing\n // issue_unique — adding it manually would cause TOKEN! to appear twice in outputs\n const issueUniqueOutput = OutputFormatter.formatIssueUniqueOutput({\n root_name: rootName,\n asset_tags: assetTags,\n ipfs_hashes: ipfsHashes.length > 0 ? ipfsHashes : undefined\n });\n\n outputs.push({ [toAddress]: issueUniqueOutput });\n\n // 15. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 16. Create raw transaction\n // NOTE: validateOwnerTokenReturn removed — the node returns TOKEN! automatically\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 17. Build list of created NFT names\n const createdNFTs = assetTags.map(tag => `${rootName}#${tag}`);\n\n // 18. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n rootName,\n assetTags,\n createdNFTs,\n nftCount,\n ownerTokenUsed: ownerTokenName,\n operationType: 'ISSUE_UNIQUE',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_UNIQUE',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n rootName,\n assetTags,\n ipfsHashes: ipfsHashes.length > 0 ? ipfsHashes : undefined,\n ownerTokenAddress: changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueUniqueBuilder;\n","/**\n * Issue Qualifier Builder\n * Builds transactions for creating QUALIFIER assets\n *\n * QUALIFIER assets:\n * - KYC/compliance tags (e.g., #KYC_VERIFIED, #ACCREDITED)\n * - Format: #NAME or #ROOT/SUB\n * - Cost: 2000 XNA (root) or 200 XNA (sub-qualifier)\n * - Quantity: 1-10 units only\n * - Units: Always 0 (non-divisible)\n * - Used to tag addresses for restricted asset compliance\n * - Root qualifiers do not create owner tokens\n * - Sub-qualifiers consume and return the parent qualifier asset itself\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst { AssetExistsError, ParentAssetNotFoundError, OwnerTokenNotFoundError } = require('../errors');\nconst { IpfsValidator, AmountValidator } = require('../validators');\n\nclass IssueQualifierBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue QUALIFIER parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n // Validate asset name (QUALIFIER format: #NAME)\n this.validateAssetName(params.assetName, 'QUALIFIER');\n\n // Validate quantity (1-10 only for qualifiers)\n AmountValidator.validateQualifierQuantity(params.quantity);\n\n // Validate IPFS hash if provided\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n return true;\n }\n\n /**\n * Determine if this is a sub-qualifier\n * @param {string} assetName - Qualifier name\n * @returns {boolean} True if sub-qualifier\n */\n isSubQualifier(assetName) {\n return assetName.includes('/');\n }\n\n /**\n * Build QUALIFIER asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n // 2. Determine if root or sub-qualifier\n const isSub = this.isSubQualifier(assetName);\n const parsed = AssetNameParser.parse(assetName);\n\n // 3. If sub-qualifier, check parent exists and get parent qualifier input\n let parentQualifierUTXOs = [];\n let parentQualifierQuantity = null;\n let parentQualifierName = null;\n const addresses = await this._getAddresses();\n\n if (isSub) {\n parentQualifierName = parsed.parent;\n\n // Check parent qualifier exists\n const parentExists = await this.assetExists(parentQualifierName);\n if (!parentExists) {\n throw new ParentAssetNotFoundError(\n `Parent qualifier ${parentQualifierName} does not exist. You must create the parent qualifier first.`,\n parentQualifierName\n );\n }\n\n // Find parent qualifier balance to spend and return as change\n try {\n const selection = await this.utxoSelector.selectAssetUTXOs(addresses, parentQualifierName, 1);\n parentQualifierUTXOs = selection.utxos;\n parentQualifierQuantity = selection.totalAmount;\n } catch (error) {\n if (error.name === 'InsufficientFundsError') {\n throw new OwnerTokenNotFoundError(\n `You must own the parent qualifier asset (${parentQualifierName}) to create a sub-qualifier.`,\n parentQualifierName\n );\n }\n throw error;\n }\n }\n\n // 4. Check if qualifier already exists\n const exists = await this.assetExists(assetName);\n if (exists) {\n throw new AssetExistsError(\n `Qualifier ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n // 5. Get burn information (2000 XNA for root, 200 XNA for sub)\n const burnInfo = isSub\n ? this.burnManager.getIssueSubQualifierBurn()\n : this.burnManager.getIssueQualifierBurn();\n\n // 6. Get addresses\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 7. Estimate fee\n const outputCount = 3;\n const estimatedFee = await this.estimateFee(2, outputCount);\n\n // 8. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 9. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 10. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + parentQualifierUTXOs.length;\n const actualFee = await this.estimateFee(actualInputCount, outputCount);\n\n // 11. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 12. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 13. Build inputs\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add parent qualifier inputs if sub-qualifier\n parentQualifierUTXOs.forEach(parentUTXO => {\n inputs.push({\n txid: parentUTXO.txid,\n vout: parentUTXO.outputIndex,\n address: parentUTXO.address,\n assetName: parentUTXO.assetName,\n satoshis: parentUTXO.satoshis\n });\n });\n\n // 14. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Issue qualifier operation\n const issueQualifierOutput = OutputFormatter.formatIssueQualifierOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, 0),\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash,\n root_change_address: isSub ? changeAddress : undefined,\n change_quantity: isSub && parentQualifierQuantity !== null\n ? this.toSatoshis(parentQualifierQuantity, 0)\n : undefined\n });\n\n outputs.push({ [toAddress]: issueQualifierOutput });\n\n // 15. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 16. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 17. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ...parentQualifierUTXOs];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n qualifierType: isSub ? 'SUB_QUALIFIER' : 'QUALIFIER',\n parentQualifier: isSub ? parsed.parent : null,\n parentQualifierUsed: parentQualifierName,\n operationType: isSub ? 'ISSUE_SUB_QUALIFIER' : 'ISSUE_QUALIFIER',\n localRawBuild: this.buildLocalRawBuild(\n isSub ? 'ISSUE_SUB_QUALIFIER' : 'ISSUE_QUALIFIER',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, 0),\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n rootChangeAddress: isSub ? changeAddress : undefined,\n changeQuantityRaw: isSub && parentQualifierQuantity !== null\n ? this.toSatoshis(parentQualifierQuantity, 0)\n : undefined\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueQualifierBuilder;\n","/**\n * Issue Restricted Builder\n * Builds transactions for creating RESTRICTED assets (security tokens)\n *\n * RESTRICTED assets:\n * - Security tokens with KYC/compliance controls\n * - Format: $NAME (e.g., $SECURITY, $STOCK)\n * - Cost: 3000 XNA (burned)\n * - Requires verifier string (boolean logic with qualifiers)\n * - Only addresses meeting verifier requirements can receive/hold\n * - Can freeze individual addresses or entire asset\n * - Creates owner token (ASSET!)\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst { AssetExistsError, OwnerTokenNotFoundError } = require('../errors');\nconst { IpfsValidator, VerifierValidator } = require('../validators');\n\nclass IssueRestrictedBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate issue RESTRICTED parameters\n * @param {object} params - Issue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required');\n }\n\n if (!params.verifierString) {\n throw new Error('verifierString is required for restricted assets');\n }\n\n // Validate asset name (RESTRICTED format: $NAME)\n this.validateAssetName(params.assetName, 'RESTRICTED');\n\n // Validate quantity and units\n const units = params.units !== undefined ? params.units : 0;\n this.validateAmount(params.quantity, units);\n\n // Validate verifier string (critical for compliance)\n VerifierValidator.validate(params.verifierString);\n\n // Validate IPFS hash if provided\n if (params.hasIpfs && params.ipfsHash) {\n IpfsValidator.validate(params.ipfsHash);\n }\n\n // Validate reissuable is boolean if provided\n if (params.reissuable !== undefined && typeof params.reissuable !== 'boolean') {\n throw new Error('reissuable must be a boolean');\n }\n\n return true;\n }\n\n /**\n * Build RESTRICTED asset issuance transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n units = 0,\n verifierString,\n reissuable = true,\n hasIpfs = false,\n ipfsHash = ''\n } = this.params;\n\n // 2. Check if asset already exists\n const exists = await this.assetExists(assetName);\n if (exists) {\n throw new AssetExistsError(\n `Asset ${assetName} already exists on the blockchain`,\n assetName\n );\n }\n\n // 3. Extract qualifiers from verifier string for info\n const requiredQualifiers = VerifierValidator.extractQualifiers(verifierString);\n\n // 4. Get burn information (3000 XNA for restricted assets)\n const burnInfo = this.burnManager.getIssueRestrictedBurn();\n\n // 5. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 6. Find owner token UTXO (CRITICAL: node requires it as input)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the owner token (${ownerTokenName}) to issue the restricted asset ${assetName}.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 7. Estimate fee (+1 for owner token input)\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 8. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 9. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 10. Recalculate fee with actual input count (+1 for owner token)\n const actualFee = await this.estimateFee(baseCurrencyUTXOs.length + 1, 4);\n\n // 11. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 12. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 13. Build inputs (XNA + owner token)\n const inputs = [];\n\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input (node requires it to issue restricted asset)\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 14. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Issue restricted operation\n const issueRestrictedOutput = OutputFormatter.formatIssueRestrictedOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n verifier_string: verifierString,\n units: units,\n reissuable: reissuable,\n has_ipfs: hasIpfs,\n ipfs_hash: ipfsHash,\n owner_change_address: changeAddress\n });\n\n outputs.push({ [toAddress]: issueRestrictedOutput });\n\n // 15. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 16. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 17. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenName,\n verifierString,\n requiredQualifiers,\n operationType: 'ISSUE_RESTRICTED',\n localRawBuild: this.buildLocalRawBuild(\n 'ISSUE_RESTRICTED',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, units),\n verifierString,\n units,\n reissuable,\n ipfsHash: hasIpfs ? ipfsHash : undefined,\n ownerChangeAddress: changeAddress\n }\n )\n }\n );\n }\n}\n\nmodule.exports = IssueRestrictedBuilder;\n","/**\n * Reissue Restricted Builder\n * Builds transactions for reissuing RESTRICTED assets\n *\n * Reissue Restricted:\n * - Mints additional supply of restricted asset\n * - Cost: 200 XNA (burned)\n * - Requires asset's owner token (ASSET!)\n * - Can update verifier string\n * - Can lock asset (make it non-reissuable)\n * - Can update IPFS metadata\n * - Owner token must be returned\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst {\n AssetNotFoundError,\n AssetNotReissuableError,\n OwnerTokenNotFoundError,\n MaxSupplyExceededError\n} = require('../errors');\nconst { IpfsValidator, VerifierValidator } = require('../validators');\nconst { ASSET_LIMITS } = require('../constants');\n\nclass ReissueRestrictedBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate reissue restricted parameters\n * @param {object} params - Reissue parameters\n * @throws {Error} If validation fails\n */\n validateParams(params) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n // Validate asset name is restricted\n this.validateAssetName(params.assetName, 'RESTRICTED');\n\n if (params.quantity === undefined || params.quantity === null) {\n throw new Error('quantity is required (amount to mint)');\n }\n\n if (params.quantity <= 0) {\n throw new Error('quantity must be greater than 0');\n }\n\n // Validate verifier string if changing\n if (params.changeVerifier && params.newVerifier) {\n VerifierValidator.validate(params.newVerifier);\n }\n\n // Validate new IPFS hash if provided\n if (params.newIpfs) {\n IpfsValidator.validate(params.newIpfs);\n }\n\n return true;\n }\n\n /**\n * Build reissue restricted transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n // 1. Validate parameters\n await this.validateParams(this.params);\n\n const {\n assetName,\n quantity,\n changeVerifier = false,\n newVerifier,\n reissuable,\n newIpfs\n } = this.params;\n\n // 2. Get asset data to verify it exists and is reissuable\n const assetData = await this.getAssetData(assetName);\n if (!assetData) {\n throw new AssetNotFoundError(\n `Asset ${assetName} does not exist on the blockchain`,\n assetName\n );\n }\n\n // 3. Check if asset is reissuable\n if (!assetData.reissuable) {\n throw new AssetNotReissuableError(\n `Asset ${assetName} is not reissuable. The supply has been locked.`,\n assetName\n );\n }\n\n // 4. Check if reissuing would exceed max supply\n const currentSupply = assetData.amount || 0;\n const additionalAmount = quantity;\n const newTotalSupply = currentSupply + additionalAmount;\n\n if (newTotalSupply > ASSET_LIMITS.MAX_QUANTITY) {\n throw new MaxSupplyExceededError(\n `Reissuing ${additionalAmount} would exceed maximum supply. ` +\n `Current: ${currentSupply}, Additional: ${additionalAmount}, ` +\n `Max: ${ASSET_LIMITS.MAX_QUANTITY}`,\n assetName,\n currentSupply,\n additionalAmount,\n ASSET_LIMITS.MAX_QUANTITY\n );\n }\n\n // 5. Get addresses\n const addresses = await this._getAddresses();\n const toAddress = await this.getToAddress();\n const changeAddress = await this.getChangeAddress();\n\n // 6. Find owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the asset's owner token (${ownerTokenName}) to reissue it. ` +\n `The owner token proves you have the right to mint more supply and manage the asset.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 7. Get burn information\n const burnInfo = this.burnManager.getReissueBurn();\n\n // 8. Estimate fee\n const estimatedFee = await this.estimateFee(2, 4);\n\n // 9. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 10. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 11. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 4);\n\n // 12. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 13. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 14. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 15. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Reissue restricted operation\n const units = assetData.units || 0;\n const reissueRestrictedOutput = OutputFormatter.formatReissueRestrictedOutput({\n asset_name: assetName,\n asset_quantity: this.toSatoshis(quantity, units),\n change_verifier: changeVerifier,\n new_verifier: changeVerifier ? newVerifier : undefined,\n reissuable: reissuable !== undefined ? reissuable : undefined,\n new_ipfs: newIpfs || undefined,\n owner_change_address: this.params.ownerChangeAddress || changeAddress\n });\n\n outputs.push({ [toAddress]: reissueRestrictedOutput });\n\n // 16. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 17. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 18. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n // Extract qualifiers from new verifier if changed\n const requiredQualifiers = changeVerifier && newVerifier\n ? VerifierValidator.extractQualifiers(newVerifier)\n : null;\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n assetName,\n ownerTokenUsed: ownerTokenName,\n quantityMinted: quantity,\n newTotalSupply,\n previousSupply: currentSupply,\n verifierChanged: changeVerifier,\n newVerifier: changeVerifier ? newVerifier : undefined,\n requiredQualifiers,\n reissuableLocked: reissuable === false,\n operationType: 'REISSUE_RESTRICTED',\n localRawBuild: this.buildLocalRawBuild(\n 'REISSUE_RESTRICTED',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n toAddress,\n assetName,\n quantityRaw: this.toSatoshis(quantity, assetData.units || 0),\n units: assetData.units || 0,\n reissuable: reissuable !== undefined ? reissuable : undefined,\n ipfsHash: newIpfs || undefined,\n ownerChangeAddress: this.params.ownerChangeAddress || changeAddress,\n verifierString: changeVerifier ? newVerifier : undefined\n }\n )\n }\n );\n }\n}\n\nmodule.exports = ReissueRestrictedBuilder;\n","/**\n * Tag Address Builder\n * Builds transactions for tagging/untagging addresses with qualifiers\n *\n * Tag operations:\n * - Assign qualifier tags to addresses (for restricted asset compliance)\n * - Remove qualifier tags from addresses\n * - Cost: 0.1 XNA per address (burned)\n * - Requires spending the qualifier asset itself (#QUALIFIER)\n * - Used to mark addresses as KYC'd, accredited, etc.\n * - Owner token must be returned\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter } = require('../utils');\nconst { AssetNotFoundError, OwnerTokenNotFoundError, InvalidAddressError } = require('../errors');\n\nclass TagAddressBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate tag/untag parameters\n * @param {object} params - Tag parameters\n * @param {boolean} isUntag - True if untag operation\n * @throws {Error} If validation fails\n */\n validateParams(params, isUntag = false) {\n // Validate required parameters\n if (!params.qualifierName) {\n throw new Error('qualifierName is required');\n }\n\n if (!params.addresses || !Array.isArray(params.addresses) || params.addresses.length === 0) {\n throw new Error('addresses is required and must be a non-empty array');\n }\n\n if (params.addresses.length > 10) {\n throw new Error('addresses array cannot exceed 10 entries per transaction (node limit)');\n }\n\n // Validate qualifier name\n this.validateAssetName(params.qualifierName, 'QUALIFIER');\n\n // Validate addresses\n params.addresses.forEach((address, index) => {\n if (!address || typeof address !== 'string') {\n throw new InvalidAddressError(\n `addresses[${index}] must be a non-empty string`,\n address\n );\n }\n\n // Address prefix validation is left to the node (varies by network)\n });\n\n return true;\n }\n\n /**\n * Build tag addresses transaction\n * @param {boolean} isUntag - True for untag operation, false for tag\n * @returns {Promise<object>} Transaction result\n */\n async buildTagOperation(isUntag = false) {\n // 1. Validate parameters\n await this.validateParams(this.params, isUntag);\n\n const {\n qualifierName,\n addresses: targetAddresses,\n } = this.params;\n\n // 2. Check if qualifier exists\n const qualifierExists = await this.assetExists(qualifierName);\n if (!qualifierExists) {\n throw new AssetNotFoundError(\n `Qualifier ${qualifierName} does not exist. You must create the qualifier first.`,\n qualifierName\n );\n }\n\n // 3. Get wallet addresses\n const addresses = await this._getAddresses();\n const changeAddress = await this.getChangeAddress();\n\n // 4. Find qualifier asset balance (CRITICAL: must have this)\n let qualifierUTXOs;\n let qualifierQuantity;\n try {\n const selection = await this.utxoSelector.selectAssetUTXOs(addresses, qualifierName, 1);\n qualifierUTXOs = selection.utxos;\n qualifierQuantity = selection.totalAmount;\n } catch (error) {\n if (error.name === 'InsufficientFundsError') {\n throw new OwnerTokenNotFoundError(\n `You must own the qualifier asset (${qualifierName}) to tag/untag addresses.`,\n qualifierName\n );\n }\n throw error;\n }\n\n // 5. Get burn information (0.1 XNA per address)\n const addressCount = targetAddresses.length;\n const burnInfo = isUntag\n ? this.burnManager.getUntagAddressBurn(addressCount)\n : this.burnManager.getTagAddressBurn(addressCount);\n\n // 6. Estimate fee\n const estimatedFee = await this.estimateFee(2, 3);\n\n // 7. Calculate total XNA needed\n const totalXNANeeded = burnInfo.amount + estimatedFee;\n\n // 8. Select XNA UTXOs\n const utxoSelection = await this.selectUTXOs(totalXNANeeded, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 9. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + qualifierUTXOs.length;\n const actualFee = await this.estimateFee(actualInputCount, 3);\n\n // 10. Verify we have enough XNA\n const totalRequired = burnInfo.amount + actualFee;\n if (totalXNAInput < totalRequired) {\n const additionalNeeded = totalRequired - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 11. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - burnInfo.amount - actualFee;\n\n // 12. Build inputs (XNA + qualifier asset)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n qualifierUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n assetName: utxo.assetName,\n satoshis: utxo.satoshis\n });\n });\n\n // 13. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: Burn output\n outputs.push({ [burnInfo.address]: burnInfo.amount });\n\n // Second: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Tag/Untag operation. The node creates the qualifier change output\n // from the operation object itself, so this must be sent to the change address.\n const operationOutput = isUntag\n ? OutputFormatter.formatUntagAddressesOutput({\n qualifier: qualifierName,\n addresses: targetAddresses,\n change_quantity: this.toSatoshis(qualifierQuantity, 0)\n })\n : OutputFormatter.formatTagAddressesOutput({\n qualifier: qualifierName,\n addresses: targetAddresses,\n change_quantity: this.toSatoshis(qualifierQuantity, 0)\n });\n\n outputs.push({ [changeAddress]: operationOutput });\n\n // 14. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 15. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 16. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ...qualifierUTXOs];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnInfo.amount,\n {\n qualifierName,\n qualifierAssetUsed: qualifierName,\n targetAddresses,\n addressCount,\n operationType: isUntag ? 'UNTAG_ADDRESSES' : 'TAG_ADDRESSES',\n localRawBuild: this.buildLocalRawBuild(\n isUntag ? 'UNTAG_ADDRESSES' : 'TAG_ADDRESSES',\n inputs,\n burnInfo,\n changeAddress,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n {\n qualifierName,\n targetAddresses,\n qualifierChangeAddress: changeAddress,\n qualifierChangeAmountRaw: this.toSatoshis(qualifierQuantity, 0)\n }\n )\n }\n );\n }\n\n /**\n * Build tag addresses transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n return this.buildTagOperation(false);\n }\n\n /**\n * Build untag addresses transaction\n * @returns {Promise<object>} Transaction result\n */\n async buildUntag() {\n return this.buildTagOperation(true);\n }\n}\n\nmodule.exports = TagAddressBuilder;\n","/**\n * Freeze Address Builder\n * Builds transactions for freezing/unfreezing addresses and assets\n *\n * Freeze operations (restricted assets only):\n * - Freeze specific addresses (prevent trading)\n * - Unfreeze specific addresses (allow trading again)\n * - Global asset freeze (freeze entire asset)\n * - Global asset unfreeze (unfreeze entire asset)\n * - Cost: No burn (but requires fee)\n * - Requires restricted asset's owner token ($ASSET!)\n * - Owner token must be returned\n */\n\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\nconst { OutputFormatter, AssetNameParser } = require('../utils');\nconst { AssetNotFoundError, OwnerTokenNotFoundError, InvalidAddressError } = require('../errors');\n\nclass FreezeAddressBuilder extends BaseAssetTransactionBuilder {\n /**\n * Validate freeze/unfreeze parameters\n * @param {object} params - Freeze parameters\n * @param {string} operationType - Operation type\n * @throws {Error} If validation fails\n */\n validateParams(params, operationType) {\n // Validate required parameters\n if (!params.assetName) {\n throw new Error('assetName is required');\n }\n\n // Validate asset name is restricted\n this.validateAssetName(params.assetName, 'RESTRICTED');\n\n // For address-specific operations, validate addresses\n if (operationType === 'FREEZE_ADDRESSES' || operationType === 'UNFREEZE_ADDRESSES') {\n if (!params.addresses || !Array.isArray(params.addresses) || params.addresses.length === 0) {\n throw new Error('addresses is required and must be a non-empty array');\n }\n\n // Validate each address\n params.addresses.forEach((address, index) => {\n if (!address || typeof address !== 'string') {\n throw new InvalidAddressError(\n `addresses[${index}] must be a non-empty string`,\n address\n );\n }\n\n // Address prefix validation is left to the node (varies by network)\n });\n }\n\n return true;\n }\n\n /**\n * Build freeze operation transaction\n * @param {string} operationType - Operation type\n * @returns {Promise<object>} Transaction result\n */\n async buildFreezeOperation(operationType) {\n // 1. Validate parameters\n await this.validateParams(this.params, operationType);\n\n const { assetName } = this.params;\n\n // 2. Check if asset exists and is restricted\n const assetData = await this.getAssetData(assetName);\n if (!assetData) {\n throw new AssetNotFoundError(\n `Asset ${assetName} does not exist on the blockchain`,\n assetName\n );\n }\n\n // 3. Get wallet addresses\n const addresses = await this._getAddresses();\n const changeAddress = await this.getChangeAddress();\n\n // 4. Find owner token (CRITICAL: must have this)\n const ownerTokenName = AssetNameParser.getOwnerTokenName(assetName);\n let ownerTokenUTXO;\n try {\n ownerTokenUTXO = await this.ownerTokenManager.findOwnerTokenUTXO(\n ownerTokenName,\n addresses\n );\n } catch (error) {\n if (error instanceof OwnerTokenNotFoundError) {\n throw new OwnerTokenNotFoundError(\n `You must own the restricted asset's owner token (${ownerTokenName}) to freeze/unfreeze addresses or the asset.`,\n ownerTokenName\n );\n }\n throw error;\n }\n\n // 5. No burn for freeze operations (only fee)\n const burnAmount = 0;\n\n // 6. Estimate fee\n const estimatedFee = await this.estimateFee(2, 3);\n\n // 7. Select XNA UTXOs (only for fee, no burn)\n const utxoSelection = await this.selectUTXOs(estimatedFee, null, 0);\n const baseCurrencyUTXOs = utxoSelection.xnaUTXOs;\n const totalXNAInput = utxoSelection.totalXNA;\n\n // 8. Recalculate fee with actual input count\n const actualInputCount = baseCurrencyUTXOs.length + 1; // +1 for owner token\n const actualFee = await this.estimateFee(actualInputCount, 3);\n\n // 9. Verify we have enough XNA for fee\n if (totalXNAInput < actualFee) {\n const additionalNeeded = actualFee - totalXNAInput + 0.001;\n const additionalSelection = await this.selectUTXOs(additionalNeeded, null, 0);\n baseCurrencyUTXOs.push(...additionalSelection.xnaUTXOs);\n }\n\n // 10. Calculate XNA change\n const finalTotalInput = baseCurrencyUTXOs.reduce(\n (sum, utxo) => sum + utxo.satoshis / 100000000,\n 0\n );\n const xnaChange = finalTotalInput - actualFee;\n\n // 11. Build inputs (XNA + owner token)\n const inputs = [];\n\n // Add XNA inputs\n baseCurrencyUTXOs.forEach(utxo => {\n inputs.push({\n txid: utxo.txid,\n vout: utxo.outputIndex,\n address: utxo.address,\n satoshis: utxo.satoshis\n });\n });\n\n // Add owner token input\n inputs.push({\n txid: ownerTokenUTXO.txid,\n vout: ownerTokenUTXO.outputIndex,\n address: ownerTokenUTXO.address,\n assetName: ownerTokenUTXO.assetName,\n satoshis: ownerTokenUTXO.satoshis\n });\n\n // 12. Build outputs (ORDER CRITICAL!)\n const outputs = [];\n\n // First: XNA change (if any)\n if (xnaChange > 0.00000001) {\n outputs.push({ [changeAddress]: parseFloat(xnaChange.toFixed(8)) });\n }\n\n // Last: Freeze/Unfreeze operation\n let operationOutput;\n let targetAddresses = [];\n\n switch (operationType) {\n case 'FREEZE_ADDRESSES':\n targetAddresses = this.params.addresses;\n operationOutput = OutputFormatter.formatFreezeAddressesOutput({\n asset_name: assetName,\n addresses: targetAddresses\n });\n outputs.push({ [changeAddress]: operationOutput });\n break;\n\n case 'UNFREEZE_ADDRESSES':\n targetAddresses = this.params.addresses;\n operationOutput = OutputFormatter.formatUnfreezeAddressesOutput({\n asset_name: assetName,\n addresses: targetAddresses\n });\n outputs.push({ [changeAddress]: operationOutput });\n break;\n\n case 'FREEZE_ASSET':\n operationOutput = OutputFormatter.formatFreezeAssetOutput(assetName);\n outputs.push({ [changeAddress]: operationOutput });\n break;\n\n case 'UNFREEZE_ASSET':\n operationOutput = OutputFormatter.formatUnfreezeAssetOutput(assetName);\n outputs.push({ [changeAddress]: operationOutput });\n break;\n\n default:\n throw new Error(`Unknown freeze operation type: ${operationType}`);\n }\n\n // 13. Order outputs (protocol requirement)\n const orderedOutputs = this.outputOrderer.order(outputs);\n\n // 14. Create raw transaction\n const rawTx = await this.buildRawTransaction(inputs, orderedOutputs);\n\n // 15. Format and return result\n const allUTXOs = [...baseCurrencyUTXOs, ownerTokenUTXO];\n\n return this.formatResult(\n rawTx,\n allUTXOs,\n inputs,\n orderedOutputs,\n actualFee,\n burnAmount,\n {\n assetName,\n ownerTokenUsed: ownerTokenName,\n targetAddresses: targetAddresses.length > 0 ? targetAddresses : null,\n addressCount: targetAddresses.length,\n operationType,\n localRawBuild: this.buildLocalRawBuild(\n operationType,\n inputs,\n null,\n xnaChange > 0.00000001 ? changeAddress : null,\n xnaChange > 0.00000001 ? parseFloat(xnaChange.toFixed(8)) : null,\n operationType === 'FREEZE_ADDRESSES' || operationType === 'UNFREEZE_ADDRESSES'\n ? {\n assetName,\n targetAddresses,\n ownerChangeAddress: changeAddress\n }\n : {\n assetName,\n ownerChangeAddress: changeAddress\n }\n )\n }\n );\n }\n\n /**\n * Build freeze addresses transaction\n * @returns {Promise<object>} Transaction result\n */\n async build() {\n return this.buildFreezeOperation('FREEZE_ADDRESSES');\n }\n\n /**\n * Build unfreeze addresses transaction\n * @returns {Promise<object>} Transaction result\n */\n async buildUnfreeze() {\n return this.buildFreezeOperation('UNFREEZE_ADDRESSES');\n }\n\n /**\n * Build global freeze asset transaction\n * @returns {Promise<object>} Transaction result\n */\n async buildGlobalFreeze() {\n return this.buildFreezeOperation('FREEZE_ASSET');\n }\n\n /**\n * Build global unfreeze asset transaction\n * @returns {Promise<object>} Transaction result\n */\n async buildGlobalUnfreeze() {\n return this.buildFreezeOperation('UNFREEZE_ASSET');\n }\n}\n\nmodule.exports = FreezeAddressBuilder;\n","/**\n * Builders Module\n * Exports all transaction builder classes\n */\n\n// Base\nconst BaseAssetTransactionBuilder = require('./BaseAssetTransactionBuilder');\n\n// Basic Builders\nconst IssueRootBuilder = require('./IssueRootBuilder');\nconst IssueSubBuilder = require('./IssueSubBuilder');\nconst IssueDepinBuilder = require('./IssueDepinBuilder');\nconst ReissueBuilder = require('./ReissueBuilder');\n\n// Advanced Builders\nconst IssueUniqueBuilder = require('./IssueUniqueBuilder');\nconst IssueQualifierBuilder = require('./IssueQualifierBuilder');\nconst IssueRestrictedBuilder = require('./IssueRestrictedBuilder');\nconst ReissueRestrictedBuilder = require('./ReissueRestrictedBuilder');\nconst TagAddressBuilder = require('./TagAddressBuilder');\nconst FreezeAddressBuilder = require('./FreezeAddressBuilder');\n\nmodule.exports = {\n // Base\n BaseAssetTransactionBuilder,\n\n // Basic Builders\n IssueRootBuilder,\n IssueSubBuilder,\n IssueDepinBuilder,\n ReissueBuilder,\n\n // Advanced Builders\n IssueUniqueBuilder,\n IssueQualifierBuilder,\n IssueRestrictedBuilder,\n ReissueRestrictedBuilder,\n TagAddressBuilder,\n FreezeAddressBuilder\n};\n","/**\n * NeuraiAssets - Main API Class\n * Unified interface for all Neurai asset operations\n *\n * Usage:\n * const assets = new NeuraiAssets(rpc, {\n * network: 'xna',\n * addresses: ['N...'],\n * changeAddress: 'N...',\n * toAddress: 'N...'\n * });\n *\n * // Create asset\n * const result = await assets.createRootAsset({\n * assetName: 'MYTOKEN',\n * quantity: 1000000,\n * units: 2\n * });\n *\n * // Query asset\n * const assetData = await assets.getAssetData('MYTOKEN');\n */\n\nconst { AssetQueries } = require('./queries');\nconst {\n IssueRootBuilder,\n IssueSubBuilder,\n IssueDepinBuilder,\n IssueUniqueBuilder,\n IssueQualifierBuilder,\n IssueRestrictedBuilder,\n ReissueBuilder,\n ReissueRestrictedBuilder,\n TagAddressBuilder,\n FreezeAddressBuilder\n} = require('./builders');\n\nclass NeuraiAssets {\n /**\n * @param {Function} rpc - RPC function to call Neurai node\n * @param {object} config - Configuration options\n * @param {string} config.network - Network identifier ('xna' or 'xna-test')\n * @param {Array<string>} config.addresses - Wallet addresses\n * @param {string} config.changeAddress - Default change address\n * @param {string} config.toAddress - Default receiving address\n */\n constructor(rpc, config = {}) {\n if (!rpc || typeof rpc !== 'function') {\n throw new Error('RPC function is required');\n }\n\n this.rpc = rpc;\n this.config = {\n network: config.network || 'xna',\n addresses: config.addresses || [],\n changeAddress: config.changeAddress || null,\n toAddress: config.toAddress || null\n };\n\n // Initialize query interface\n this.queries = new AssetQueries(rpc);\n }\n\n /**\n * Update configuration\n * @param {object} config - New configuration\n */\n updateConfig(config) {\n Object.assign(this.config, config);\n }\n\n /**\n * Build transaction parameters object\n * @param {object} params - Operation-specific parameters\n * @returns {object} Complete parameters with config\n */\n _buildParams(params) {\n return {\n ...params,\n network: this.config.network,\n walletAddresses: this.config.addresses,\n changeAddress: params.changeAddress || this.config.changeAddress,\n toAddress: params.toAddress || this.config.toAddress\n };\n }\n\n // ========================================\n // ROOT ASSET OPERATIONS\n // ========================================\n\n /**\n * Create a ROOT asset\n * @param {object} params - Asset creation parameters\n * @param {string} params.assetName - Asset name (3-30 chars, A-Z 0-9 _ .)\n * @param {number} params.quantity - Total supply\n * @param {number} [params.units=0] - Decimal places (0-8)\n * @param {boolean} [params.reissuable=true] - Can mint more later\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash (if hasIpfs=true)\n * @returns {Promise<object>} Transaction data\n */\n async createRootAsset(params) {\n const builder = new IssueRootBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Create a SUB asset\n * @param {object} params - Sub-asset creation parameters\n * @param {string} params.assetName - Asset name (ROOT/SUB format)\n * @param {number} params.quantity - Total supply\n * @param {number} [params.units=0] - Decimal places (0-8)\n * @param {boolean} [params.reissuable=true] - Can mint more later\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash (if hasIpfs=true)\n * @returns {Promise<object>} Transaction data\n */\n async createSubAsset(params) {\n const builder = new IssueSubBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Create a DEPIN asset\n * @param {object} params - DEPIN creation parameters\n * @param {string} params.assetName - Asset name (&NAME or &NAME/SUB)\n * @param {number} params.quantity - Total supply\n * @param {boolean} [params.reissuable=true] - Can mint more later\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash\n * @returns {Promise<object>} Transaction data\n */\n async createDepinAsset(params) {\n const builder = new IssueDepinBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Reissue (mint more) of a ROOT or SUB asset\n * @param {object} params - Reissue parameters\n * @param {string} params.assetName - Asset name\n * @param {number} params.quantity - Amount to mint\n * @param {boolean} [params.reissuable] - Lock supply if false\n * @param {string} [params.newIpfs] - Update IPFS hash\n * @returns {Promise<object>} Transaction data\n */\n async reissueAsset(params) {\n const builder = new ReissueBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n // ========================================\n // UNIQUE ASSET (NFT) OPERATIONS\n // ========================================\n\n /**\n * Create UNIQUE assets (NFTs)\n * @param {object} params - NFT creation parameters\n * @param {string} params.rootAssetName - Root asset name\n * @param {Array<object>} params.assetTags - NFT tags and metadata\n * @param {string} params.assetTags[].tag - Unique identifier for this NFT\n * @param {boolean} [params.assetTags[].hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.assetTags[].ipfsHash] - IPFS hash for this NFT\n * @returns {Promise<object>} Transaction data\n */\n async createUniqueAssets(params) {\n const builder = new IssueUniqueBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n // ========================================\n // QUALIFIER OPERATIONS (KYC Tags)\n // ========================================\n\n /**\n * Create a QUALIFIER (root or sub)\n * @param {object} params - Qualifier creation parameters\n * @param {string} params.qualifierName - Qualifier name (#NAME or #ROOT/#SUB)\n * @param {number} [params.quantity=1] - Quantity (1-10)\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash\n * @param {string} [params.changeAddress] - Override change address\n * @returns {Promise<object>} Transaction data\n */\n async createQualifier(params) {\n const normalized = { ...params, assetName: params.assetName || params.qualifierName };\n const builder = new IssueQualifierBuilder(this.rpc, this._buildParams(normalized));\n return await builder.build();\n }\n\n /**\n * Assign qualifier tag(s) to address(es)\n * @param {object} params - Tag assignment parameters\n * @param {string} params.qualifierName - Qualifier name (#NAME)\n * @param {Array<string>} params.addresses - Addresses to tag\n * @param {string} [params.assetData=''] - Optional data\n * @returns {Promise<object>} Transaction data\n */\n async tagAddresses(params) {\n const builder = new TagAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Remove qualifier tag(s) from address(es)\n * @param {object} params - Tag removal parameters\n * @param {string} params.qualifierName - Qualifier name (#NAME)\n * @param {Array<string>} params.addresses - Addresses to untag\n * @returns {Promise<object>} Transaction data\n */\n async untagAddresses(params) {\n const builder = new TagAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.buildUntag();\n }\n\n // ========================================\n // RESTRICTED ASSET OPERATIONS (Security Tokens)\n // ========================================\n\n /**\n * Create a RESTRICTED asset (security token)\n * @param {object} params - Restricted asset creation parameters\n * @param {string} params.assetName - Asset name ($NAME format)\n * @param {number} params.quantity - Total supply\n * @param {string} params.verifierString - Boolean logic for compliance (e.g., \"#KYC & #ACCREDITED\")\n * @param {number} [params.units=0] - Decimal places (0-8)\n * @param {boolean} [params.reissuable=true] - Can mint more later\n * @param {boolean} [params.hasIpfs=false] - Has IPFS metadata\n * @param {string} [params.ipfsHash] - IPFS hash\n * @returns {Promise<object>} Transaction data\n */\n async createRestrictedAsset(params) {\n const builder = new IssueRestrictedBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Reissue (mint more) of a RESTRICTED asset\n * @param {object} params - Reissue parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @param {number} params.quantity - Amount to mint\n * @param {boolean} [params.changeVerifier=false] - Update verifier string\n * @param {string} [params.newVerifier] - New verifier string (if changeVerifier=true)\n * @param {boolean} [params.reissuable] - Lock supply if false\n * @param {string} [params.newIpfs] - Update IPFS hash\n * @returns {Promise<object>} Transaction data\n */\n async reissueRestrictedAsset(params) {\n const builder = new ReissueRestrictedBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Freeze specific addresses for a restricted asset\n * @param {object} params - Freeze parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @param {Array<string>} params.addresses - Addresses to freeze\n * @returns {Promise<object>} Transaction data\n */\n async freezeAddresses(params) {\n const builder = new FreezeAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.build();\n }\n\n /**\n * Unfreeze specific addresses for a restricted asset\n * @param {object} params - Unfreeze parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @param {Array<string>} params.addresses - Addresses to unfreeze\n * @returns {Promise<object>} Transaction data\n */\n async unfreezeAddresses(params) {\n const builder = new FreezeAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.buildUnfreeze();\n }\n\n /**\n * Freeze entire restricted asset globally\n * @param {object} params - Global freeze parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @returns {Promise<object>} Transaction data\n */\n async freezeAssetGlobally(params) {\n const builder = new FreezeAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.buildGlobalFreeze();\n }\n\n /**\n * Unfreeze entire restricted asset globally\n * @param {object} params - Global unfreeze parameters\n * @param {string} params.assetName - Restricted asset name ($NAME)\n * @returns {Promise<object>} Transaction data\n */\n async unfreezeAssetGlobally(params) {\n const builder = new FreezeAddressBuilder(this.rpc, this._buildParams(params));\n return await builder.buildGlobalUnfreeze();\n }\n\n // ========================================\n // QUERY OPERATIONS\n // Delegates to AssetQueries instance\n // ========================================\n // Note: Asset transfers are handled by neurai-jswallet\n\n /**\n * Get asset metadata\n * @param {string} assetName - Asset name\n * @returns {Promise<object>} Asset data\n */\n async getAssetData(assetName) {\n return await this.queries.getAssetData(assetName);\n }\n\n /**\n * List all assets on blockchain\n * @param {string} [filter='*'] - Filter pattern (e.g., 'MY*')\n * @param {boolean} [verbose=false] - Include detailed information\n * @param {number} [count=100] - Maximum number to return\n * @param {number} [start=0] - Starting index for pagination\n * @returns {Promise<Array|object>} Array of asset names or detailed objects\n */\n async listAssets(filter = '*', verbose = false, count = 100, start = 0) {\n return await this.queries.listAssets(filter, verbose, count, start);\n }\n\n /**\n * List assets owned by wallet\n * @param {string} [assetName='*'] - Filter by asset name\n * @param {boolean} [verbose=false] - Include detailed information\n * @param {number} [count=100] - Maximum number to return\n * @param {number} [start=0] - Starting index\n * @param {number} [confs=1] - Minimum confirmations\n * @returns {Promise<object>} Object with asset names as keys and amounts as values\n */\n async listMyAssets(assetName = '*', verbose = false, count = 100, start = 0, confs = 1) {\n return await this.queries.listMyAssets(assetName, verbose, count, start, confs);\n }\n\n /**\n * List all addresses holding a specific asset\n * @param {string} assetName - Asset name\n * @param {boolean} [onlyCount=false] - Return only count instead of full list\n * @param {number} [count=100] - Maximum number to return\n * @param {number} [start=0] - Starting index\n * @returns {Promise<Array|number>} Array of {address, amount} or count\n */\n async listAddressesByAsset(assetName, onlyCount = false, count = 100, start = 0) {\n return await this.queries.listAddressesByAsset(assetName, onlyCount, count, start);\n }\n\n /**\n * List asset balances for a specific address\n * @param {string} address - Address to query\n * @param {boolean} [onlyTotal=false] - Return only count instead of full list\n * @param {number} [count=100] - Maximum number to return\n * @param {number} [start=0] - Starting index\n * @returns {Promise<Array|number>} Array of {asset, amount} or count\n */\n async listAssetBalancesByAddress(address, onlyTotal = false, count = 100, start = 0) {\n return await this.queries.listAssetBalancesByAddress(address, onlyTotal, count, start);\n }\n\n /**\n * Check if an address has a specific qualifier tag\n * @param {string} address - Address to check\n * @param {string} qualifierName - Qualifier name (e.g., '#KYC_VERIFIED')\n * @returns {Promise<boolean>} True if address has the tag\n */\n async checkAddressTag(address, qualifierName) {\n return await this.queries.checkAddressTag(address, qualifierName);\n }\n\n /**\n * List all qualifiers assigned to an address\n * @param {string} address - Address to query\n * @returns {Promise<Array>} Array of qualifier names\n */\n async listTagsForAddress(address) {\n return await this.queries.listTagsForAddress(address);\n }\n\n /**\n * List all addresses with a specific qualifier tag\n * @param {string} qualifierName - Qualifier name\n * @returns {Promise<Array>} Array of addresses\n */\n async listAddressesForTag(qualifierName) {\n return await this.queries.listAddressesForTag(qualifierName);\n }\n\n /**\n * Check if an address can hold a restricted asset\n * @param {string} address - Address to check\n * @param {string} restrictedAssetName - Restricted asset name (e.g., '$SECURITY')\n * @returns {Promise<boolean>} True if address meets verifier requirements\n */\n async checkAddressRestriction(address, restrictedAssetName) {\n return await this.queries.checkAddressRestriction(address, restrictedAssetName);\n }\n\n /**\n * Check if an address is frozen for a restricted asset\n * @param {string} address - Address to check\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<boolean>} True if address is frozen\n */\n async isAddressFrozen(address, restrictedAssetName) {\n return await this.queries.isAddressFrozen(address, restrictedAssetName);\n }\n\n /**\n * Check if an asset is globally frozen\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<boolean>} True if asset is globally frozen\n */\n async checkGlobalRestriction(restrictedAssetName) {\n return await this.queries.checkGlobalRestriction(restrictedAssetName);\n }\n\n /**\n * Get verifier string for a restricted asset\n * @param {string} restrictedAssetName - Restricted asset name\n * @returns {Promise<string>} Verifier string\n */\n async getVerifierString(restrictedAssetName) {\n return await this.queries.getVerifierString(restrictedAssetName);\n }\n\n /**\n * Validate verifier string syntax\n * @param {string} verifierString - Verifier string to validate\n * @returns {Promise<boolean>} True if valid\n */\n async isValidVerifierString(verifierString) {\n return await this.queries.isValidVerifierString(verifierString);\n }\n\n /**\n * Get snapshot of asset ownership at a specific block\n * @param {string} assetName - Asset name\n * @param {number} blockHeight - Block height for snapshot\n * @returns {Promise<object>} Snapshot request result\n */\n async getSnapshotRequest(assetName, blockHeight) {\n return await this.queries.getSnapshotRequest(assetName, blockHeight);\n }\n\n /**\n * Cancel a snapshot request\n * @param {string} assetName - Asset name\n * @param {number} blockHeight - Block height of snapshot to cancel\n * @returns {Promise<boolean>} True if cancelled successfully\n */\n async cancelSnapshotRequest(assetName, blockHeight) {\n return await this.queries.cancelSnapshotRequest(assetName, blockHeight);\n }\n\n /**\n * List DEPIN holders with validity status\n * @param {string} assetName - DEPIN asset name\n * @returns {Promise<Array>} Holder entries\n */\n async listDepinHolders(assetName) {\n return await this.queries.listDepinHolders(assetName);\n }\n\n /**\n * Check DEPIN validity for an address\n * @param {string} assetName - DEPIN asset name\n * @param {string} address - Address to query\n * @returns {Promise<object>} Validity details\n */\n async checkDepinValidity(assetName, address) {\n return await this.queries.checkDepinValidity(assetName, address);\n }\n\n /**\n * Check if asset exists\n * @param {string} assetName - Asset name\n * @returns {Promise<boolean>} True if asset exists\n */\n async assetExists(assetName) {\n return await this.queries.assetExists(assetName);\n }\n\n /**\n * Get asset type from name\n * @param {string} assetName - Asset name\n * @returns {string} Asset type ('ROOT', 'SUB', 'UNIQUE', 'QUALIFIER', 'RESTRICTED', 'DEPIN', 'OWNER')\n */\n getAssetType(assetName) {\n return this.queries.getAssetType(assetName);\n }\n\n /**\n * Get total count of assets on blockchain\n * @returns {Promise<number>} Total asset count\n */\n async getAssetCount() {\n return await this.queries.getAssetCount();\n }\n}\n\nmodule.exports = NeuraiAssets;\n","/**\n * @neuraiproject/neurai-assets\n * Non-custodial Neurai asset management library\n *\n * Comprehensive asset management library for Neurai blockchain\n * Supports creation, reissuance, transfers, and queries for all asset types:\n * - ROOT assets (standard tokens)\n * - SUB assets (sub-tokens)\n * - UNIQUE assets (NFTs)\n * - QUALIFIER assets (KYC/compliance tags)\n * - RESTRICTED assets (security tokens with compliance)\n * - DEPIN assets (soulbound assets)\n *\n * @example\n * const NeuraiAssets = require('@neuraiproject/neurai-assets');\n *\n * // Initialize with RPC function\n * const assets = new NeuraiAssets(rpc, {\n * network: 'xna',\n * addresses: walletAddresses,\n * changeAddress: myChangeAddress,\n * toAddress: myReceivingAddress\n * });\n *\n * // Create a ROOT asset\n * const result = await assets.createRootAsset({\n * assetName: 'MYTOKEN',\n * quantity: 1000000,\n * units: 2,\n * reissuable: true\n * });\n *\n * // Sign and broadcast\n * const signedTx = await wallet.signTransaction(result.rawTx);\n * const txid = await wallet.broadcastTransaction(signedTx);\n */\n\n// Main API class\nconst NeuraiAssets = require('./NeuraiAssets');\n\n// Builders\nconst builders = require('./builders');\n\n// Queries\nconst { AssetQueries } = require('./queries');\n\n// Constants\nconst constants = require('./constants');\n\n// Errors\nconst errors = require('./errors');\n\n// Validators\nconst validators = require('./validators');\n\n// Utils\nconst utils = require('./utils');\n\n// Export main class as default\nmodule.exports = NeuraiAssets;\n\n// Export everything as named exports\nmodule.exports.NeuraiAssets = NeuraiAssets;\nmodule.exports.AssetQueries = AssetQueries;\nmodule.exports.builders = builders;\nmodule.exports.constants = constants;\nmodule.exports.errors = errors;\nmodule.exports.validators = validators;\nmodule.exports.utils = utils;\n","import packageApi from '../index.js';\n\nconst NeuraiAssets = packageApi?.NeuraiAssets ?? packageApi;\nconst AssetQueries = packageApi?.AssetQueries;\nconst builders = packageApi?.builders ?? {};\nconst constants = packageApi?.constants ?? {};\nconst errors = packageApi?.errors ?? {};\nconst validators = packageApi?.validators ?? {};\nconst utils = packageApi?.utils ?? {};\n\nconst publicApi = Object.assign(NeuraiAssets, {\n NeuraiAssets,\n AssetQueries,\n builders,\n constants,\n errors,\n validators,\n utils\n});\n\nexport default publicApi;\nexport {\n AssetQueries,\n NeuraiAssets,\n builders,\n constants,\n errors,\n utils,\n validators\n};\n","import publicApi, {\n AssetQueries,\n NeuraiAssets,\n builders,\n constants,\n errors,\n utils,\n validators\n} from './api.mjs';\n\nconst globalScope =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : window;\n\nglobalScope.NeuraiAssets = publicApi;\n\nexport default publicApi;\nexport {\n AssetQueries,\n NeuraiAssets,\n builders,\n constants,\n errors,\n utils,\n validators\n};\n"],"names":["require$$0","require$$1","errors","require$$2","require$$3","constants","utils","validators","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","builders","srcModule"],"mappings":"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"}
|