{"mappings":"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","sources":["src/index.ts","package.json","src/wallet/Wallet.ts","src/network/RostrumProvider.ts","src/models/rostrum.entities.ts","src/utils/WalletUtils.ts","src/wallet/accounts/models/DappAccount.ts","src/wallet/accounts/interfaces/BaseAccountInterface.ts","src/wallet/accounts/models/DefaultAccount.ts","src/wallet/accounts/models/VaultAccount.ts","src/utils/CommonUtils.ts","src/wallet/transactions/WalletTransactionCreator.ts","src/utils/TXUtils.ts","src/utils/TokenUtils.ts","src/wallet/transactions/interfaces/TransactionCreator.ts","src/wallet/accounts/AccountStore.ts","src/utils/ValidationUtils.ts","src/wallet/WatchOnlyWallet.ts","src/wallet/transactions/WatchOnlyTransactionCreator.ts","src/utils/WatchOnlyTXUtils.ts"],"sourcesContent":["// @ts-ignore\nimport { version } from '../package.json';\nimport Wallet from \"./wallet/Wallet\";\n\n/**\n * Guards against multiple instances of the wallet SDK being loaded.\n * This prevents conflicts and ensures only one version is active at a time.\n * @param version - The version string to check\n * @throws {Error} When multiple instances are detected\n */\nfunction versionGuard(version: string): void {\n    if (version !== undefined) {\n        let message = 'More than one instance of Wallet SDK' +\n            'Please make sure to require Wallet SDK and check that submodules do' +\n            ' not also include their own Wallet SDK dependency.';\n        throw new Error(message);\n    }\n}\n\nversionGuard((global as any)._walletSdk_ver);\n(global as any)._walletSdk_ver = `v${version}`;\n\n/**\n * Wallet SDK - A TypeScript SDK for the Nexa blockchain\n *\n * This SDK provides comprehensive wallet functionality including:\n * - Creating and managing wallets from seed phrases or private keys\n * - Account management with different account types\n * - Transaction building and signing\n * - Token operations and management\n * - Message signing and verification\n *\n * @example\n * ```typescript\n * import { Wallet } from 'wallet-sdk-ts';\n *\n * // Create a new wallet\n * const wallet = Wallet.create();\n *\n * // Or restore from seed phrase\n * const wallet = Wallet.fromSeedPhrase('your seed phrase here');\n *\n * // Initialize and discover accounts\n * await wallet.initialize();\n * ```\n */\nconst walletSdk = {\n    versionGuard,\n    version: `v${version}`,\n    Wallet\n}\n\nexport default walletSdk\n\nexport { default as Wallet } from './wallet/Wallet'\nexport { default as WatchOnlyWallet } from './wallet/WatchOnlyWallet'\n\n// Export utility enums and types\nexport { AccountType, TxTokenType } from './utils/WalletUtils'\n\n// Export account interfaces and classes\nexport { BaseAccount } from './wallet/accounts/interfaces/BaseAccountInterface'\nexport { default as DefaultAccount } from './wallet/accounts/models/DefaultAccount'\nexport { default as DappAccount } from './wallet/accounts/models/DappAccount'\nexport { default as VaultAccount } from './wallet/accounts/models/VaultAccount'\nexport { default as AccountStore } from './wallet/accounts/AccountStore'\n\n// Export transaction creators\nexport { default as WalletTransactionCreator } from './wallet/transactions/WalletTransactionCreator'\nexport { default as WatchOnlyTransactionCreator } from './wallet/transactions/WatchOnlyTransactionCreator'\n\n// Export network provider\nexport { rostrumProvider } from './network/RostrumProvider'\n\n// Export entity types and interfaces\nexport type {\n    AccountKeys,\n    AccountIndexes,\n    AddressKey,\n    Balance,\n    WatchOnlyAddress,\n    TxStatus,\n    HodlStatus\n} from './models/wallet.entities'\n\nexport type {\n    TxEntityState,\n    TxTemplateData,\n    TxOptions,\n    TokenAction,\n    PermissionLabel,\n    TransactionEntity\n} from './models/transaction.entities'\n","{\n  \"name\": \"@nexa/wallet-sdk-ts\",\n  \"version\": \"0.1.0\",\n  \"main\": \"dist/index.js\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"dist/index.d.ts\",\n  \"source\": \"src/index.ts\",\n  \"scripts\": {\n    \"build\": \"parcel build\",\n    \"dev\": \"parcel watch\",\n    \"test\": \"vitest run\",\n    \"clean\": \"rm -rf dist .parcel-cache\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+ssh://git@gitlab.com/nexa/wallet-sdk-ts.git\"\n  },\n  \"keywords\": [\n    \"nexa\",\n    \"wallet\",\n    \"web3\",\n    \"crypto\",\n    \"dapp\",\n    \"walletcomms\",\n    \"walletsdk\"\n  ],\n  \"contributors\": [\n    {\n      \"name\": \"Dolaned\"\n    },\n    {\n      \"name\": \"Griffith\"\n    },\n    {\n      \"name\": \"Vgrunner\"\n    },\n    {\n      \"name\": \"myendy\"\n    }\n  ],\n  \"author\": \"Dolaned\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://gitlab.com/nexa/wallet-sdk-ts/issues\"\n  },\n  \"homepage\": \"https://gitlab.com/nexa/wallet-sdk-ts#readme\",\n  \"description\": \"Wallet SDK for the Nexa blockchain\",\n  \"devDependencies\": {\n    \"@parcel/packager-ts\": \"^2.15.4\",\n    \"@parcel/transformer-typescript-types\": \"^2.15.4\",\n    \"@types/lodash-es\": \"^4.17.12\",\n    \"@types/node\": \"^22.13.1\",\n    \"parcel\": \"^2.15.4\",\n    \"typescript\": \"^5.8.3\",\n    \"vitest\": \"^3.0.8\"\n  },\n  \"targets\": {\n    \"main\": {\n      \"context\": \"node\",\n      \"outputFormat\": \"commonjs\",\n      \"distDir\": \"dist\",\n      \"isLibrary\": true,\n      \"includeNodeModules\": [\n        \"lodash-es\"\n      ]\n    },\n    \"module\": {\n      \"context\": \"node\",\n      \"outputFormat\": \"esmodule\",\n      \"distDir\": \"dist\",\n      \"isLibrary\": true\n    },\n    \"browser\": {\n      \"context\": \"browser\",\n      \"outputFormat\": \"esmodule\",\n      \"distDir\": \"dist\",\n      \"isLibrary\": true\n    }\n  },\n  \"dependencies\": {\n    \"@vgrunner/electrum-cash\": \"^2.0.12\",\n    \"bip39\": \"^3.1.0\",\n    \"js-big-decimal\": \"^2.2.0\",\n    \"libnexa-ts\": \"^1.0.5\",\n    \"lodash-es\": \"^4.17.21\"\n  },\n  \"directories\": {\n    \"test\": \"tests\"\n  }\n}\n","import {HDPrivateKey, Message, Networkish, Networks, TransactionBuilder,} from \"libnexa-ts\";\nimport * as Bip39 from 'bip39'\nimport {rostrumProvider} from \"../network/RostrumProvider\";\nimport {AccountType, discoverWallet,} from \"../utils/WalletUtils\";\nimport {isBuffer, isNil, isString} from \"lodash-es\";\nimport WalletTransactionCreator from \"./transactions/WalletTransactionCreator\";\nimport AccountStore from \"./accounts/AccountStore\";\nimport {BaseAccount} from \"./accounts/interfaces/BaseAccountInterface\";\nimport ValidationUtils from \"../utils/ValidationUtils\";\nimport {AddressKey} from \"../models/wallet.entities\";\n\n/**\n * Main Wallet class for managing Nexa blockchain wallet operations\n *\n * This class provides comprehensive wallet functionality including:\n * - Creating wallets from seed phrases or private keys\n * - Account discovery and management\n * - Transaction creation and signing\n * - Message signing and verification\n * - Multi-account support with different account types\n *\n * @example\n * ```typescript\n * // Create a new wallet with random seed phrase\n * const wallet = Wallet.create();\n *\n * // Restore wallet from existing seed phrase\n * const wallet = Wallet.fromSeedPhrase('your twelve word seed phrase here');\n *\n * // Initialize wallet (discovers accounts and balances)\n * await wallet.initialize();\n *\n * // Create a new account\n * const account = await wallet.newAccount('DefaultAccount');\n *\n * // Create and send a transaction\n * const tx = wallet.newTransaction(account)\n *   .to('nexa:address', 1000000) // 1 NEXA in satoshis\n *   .sign();\n *\n * const txId = await wallet.sendTransaction(tx.toHex());\n * ```\n */\nexport default class Wallet {\n\n    /** The master HD private key derived from the seed phrase */\n    private readonly masterKey!: HDPrivateKey;\n\n    /** Store for managing wallet accounts */\n    private _accountStore: AccountStore;\n\n    /** The blockchain network this wallet operates on */\n    private readonly _network: Networkish\n\n    /** The BIP39 seed phrase used to generate this wallet (if created from phrase) */\n    private readonly phrase?: string;\n\n    /**\n     * Creates a new Wallet instance\n     *\n     * @param data - Optional wallet data:\n     *   - undefined: Generate new random seed phrase\n     *   - string: Use as BIP39 seed phrase\n     *   - HDPrivateKey: Use as master key directly\n     * @param network - Network name ('mainnet', 'testnet', 'regtest'). Defaults to 'mainnet'\n     *\n     * @example\n     * ```typescript\n     * // Create new wallet with random seed\n     * const wallet = new Wallet();\n     *\n     * // Create from seed phrase\n     * const wallet = new Wallet('abandon abandon abandon...');\n     *\n     * // Create from master key\n     * const masterKey = HDPrivateKey.fromString('xprv...');\n     * const wallet = new Wallet(masterKey);\n     *\n     * // Create on testnet\n     * const wallet = new Wallet(undefined, 'testnet');\n     * ```\n     */\n    constructor(data?: string | HDPrivateKey | undefined, network?: string) {\n        this._network = Networks.get(network) ?? Networks.mainnet\n        this._accountStore = new AccountStore()\n        if(isNil(data)) {\n            this.phrase = Bip39.generateMnemonic(128, undefined, Bip39.wordlists.english)\n            const seed = Bip39.mnemonicToSeedSync(this.phrase, '')\n\n            const masterKey = HDPrivateKey.fromSeed(seed, this._network ?? Networks.mainnet)\n            this.masterKey  = masterKey.deriveChild(44, true).deriveChild(29223, true)\n        } else if(data instanceof HDPrivateKey) {\n            this.masterKey = data\n        } else if (isString(data)) {\n            this.phrase = data\n            const seed = Bip39.mnemonicToSeedSync(this.phrase, '')\n\n            const masterKey = HDPrivateKey.fromSeed(seed, this._network ?? Networks.mainnet)\n            this.masterKey  = masterKey.deriveChild(44, true).deriveChild(29223, true)\n        }\n    }\n\n    /**\n     * Create a new wallet with a randomly generated seed phrase\n     *\n     * This is the recommended way to create a new wallet for first-time users.\n     * The generated seed phrase should be securely stored by the user.\n     *\n     * @returns A new Wallet instance with a random 12-word seed phrase\n     *\n     * @example\n     * ```typescript\n     * const wallet = Wallet.create();\n     * console.log(wallet.export().phrase); // Store this securely!\n     * ```\n     */\n    public static create(): Wallet {\n        return new Wallet()\n    }\n\n    /**\n     * Create a wallet from an existing BIP39 seed phrase\n     *\n     * Use this method to restore a wallet from a previously generated seed phrase.\n     * The seed phrase should be a valid BIP39 mnemonic.\n     *\n     * @param phrase - The BIP39 seed phrase (12 or 24 words)\n     * @param network - Optional network name ('mainnet', 'testnet', 'regtest')\n     * @returns A new Wallet instance restored from the seed phrase\n     * @throws {Error} If the seed phrase is invalid or not provided\n     *\n     * @example\n     * ```typescript\n     * const wallet = Wallet.fromSeedPhrase(\n     *   'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about',\n     *   'testnet'\n     * );\n     * ```\n     */\n    public static fromSeedPhrase(phrase: string, network?: string): Wallet {\n        ValidationUtils.validateArgument(isString(phrase), 'seedphrase must be provided')\n        return new Wallet(phrase, network)\n    }\n\n    /**\n     * Create a wallet from an extended private key (xpriv)\n     *\n     * Use this method to create a wallet from a master private key in extended format.\n     * This is useful for advanced users who want to use a specific key derivation.\n     *\n     * @param xpriv - The extended private key string (starts with 'xprv')\n     * @param network - Optional network name ('mainnet', 'testnet', 'regtest')\n     * @returns A new Wallet instance using the provided master key\n     * @throws {Error} If the private key is invalid or not provided\n     *\n     * @example\n     * ```typescript\n     * const wallet = Wallet.fromXpriv(\n     *   'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi'\n     * );\n     * ```\n     */\n    public static fromXpriv(xpriv: string, network?: string): Wallet {\n        ValidationUtils.validateArgument(isString(xpriv), 'private key must be provided')\n        const masterKey = HDPrivateKey.fromString(xpriv)\n        return new Wallet(masterKey, network)\n    }\n\n    /**\n     * Initialize the wallet by discovering accounts and loading balances\n     *\n     * This method performs account discovery using the BIP44 derivation path\n     * and scans for existing accounts with transaction history or balances.\n     * Must be called before using the wallet's accounts.\n     *\n     * @returns Promise that resolves when initialization is complete\n     *\n     * @example\n     * ```typescript\n     * const wallet = Wallet.fromSeedPhrase('your seed phrase');\n     * await wallet.initialize();\n     *\n     * // Now you can access discovered accounts\n     * const accounts = wallet.accountStore.listAccounts();\n     * ```\n     */\n    public async initialize(): Promise<void> {\n        const walletAccounts: BaseAccount[] = await discoverWallet(this.masterKey)\n        for(const account of walletAccounts){\n            this._accountStore.importAccount(account)\n        }\n    }\n\n    /**\n     * Create a new transaction builder for this wallet\n     *\n     * @param fromAccount - The account to send the transaction from\n     * @param x - Optional existing transaction data:\n     *   - TransactionBuilder: Use existing transaction builder\n     *   - string: Parse from hex string\n     *   - Buffer: Parse from binary buffer\n     *   - undefined: Create new empty transaction\n     * @returns A new WalletTransactionCreator instance\n     *\n     * @example\n     * ```typescript\n     * const account = wallet.accountStore.getAccount(0);\n     * const tx = wallet.newTransaction(account)\n     *   .to('nexa:address', 1000000) // 1 NEXA\n     *   .sign();\n     *\n     * // Or from existing transaction hex\n     * const tx = wallet.newTransaction(account, 'raw_tx_hex')\n     *   .sign();\n     * ```\n     */\n    public newTransaction(fromAccount: BaseAccount, x?: TransactionBuilder | string | Buffer): WalletTransactionCreator {\n        let tx: WalletTransactionCreator;\n\n        if (x instanceof TransactionBuilder) {\n            tx = new WalletTransactionCreator(fromAccount, x);\n        } else if (isString(x)) {\n            tx = new WalletTransactionCreator(fromAccount).parseTxHex(x);\n        } else if (isBuffer(x) && !isNil(x)) {\n            tx = new WalletTransactionCreator(fromAccount).parseTxBuffer(x);\n        } else {\n            tx = new WalletTransactionCreator(fromAccount);\n        }\n\n        return tx.onNetwork(this._network);\n    }\n\n    /**\n     * Create a new account for this wallet\n     *\n     * @param accountType - The type of account to create:\n     *   - 'DefaultAccount': Standard account for general use\n     *   - 'VaultAccount': Secured account with additional protection\n     *   - 'DappAccount': Account optimized for dApp interactions\n     * @returns Promise that resolves to the newly created account\n     *\n     * @example\n     * ```typescript\n     * const defaultAccount = await wallet.newAccount('DefaultAccount');\n     * const vaultAccount = await wallet.newAccount('VaultAccount');\n     * const dappAccount = await wallet.newAccount('DappAccount');\n     * ```\n     */\n    public async newAccount(accountType: AccountType): Promise<BaseAccount>{\n        return await this.accountStore.createAccount(accountType, this.masterKey)\n    }\n\n    /**\n     * Broadcast a signed transaction to the Nexa network\n     *\n     * @param transaction - The signed transaction in hex format\n     * @returns Promise that resolves to the transaction ID (txid)\n     * @throws {Error} If the transaction is invalid or broadcast fails\n     *\n     * @example\n     * ```typescript\n     * const tx = wallet.newTransaction(account)\n     *   .to('nexa:address', 1000000)\n     *   .sign();\n     *\n     * const txId = await wallet.sendTransaction(tx.toHex());\n     * console.log('Transaction sent:', txId);\n     * ```\n     */\n    public async sendTransaction(transaction: string): Promise<string> {\n        ValidationUtils.validateArgument(isString(transaction), 'transaction must be present and valid')\n        return rostrumProvider.broadcast(transaction)\n    }\n\n    /**\n     * Sign a message using a specific address from this wallet\n     *\n     * The message is signed using the private key associated with the given address.\n     * This can be used for authentication or to prove ownership of an address.\n     *\n     * @param message - The message to sign\n     * @param addressToUse - The address whose private key should sign the message\n     * @returns The signature as a base64-encoded string\n     * @throws {Error} If the address is not owned by this wallet\n     *\n     * @example\n     * ```typescript\n     * const account = wallet.accountStore.getAccount(0);\n     * const address = account.getReceiveAddress();\n     * const signature = wallet.signMessage('Hello World', address);\n     * ```\n     */\n    public signMessage(message: string, addressToUse: string): string {\n        let msg = new Message(message);\n        const addressKey = this.accountStore.findKeyForAddress(addressToUse)\n        ValidationUtils.validateArgument(isNil(addressKey), \"You dont own this private key\")\n        return msg.sign(addressKey?.key.privateKey!)\n    }\n\n    /**\n     * Verify a message signature against an address\n     *\n     * This method can verify signatures created by any address, not just addresses\n     * owned by this wallet. It's useful for verifying messages from other parties.\n     *\n     * @param message - The original message that was signed\n     * @param signature - The signature to verify (base64-encoded)\n     * @param address - The address that supposedly signed the message\n     * @returns true if the signature is valid, false otherwise\n     * @throws {Error} If any parameters are missing or invalid\n     *\n     * @example\n     * ```typescript\n     * const isValid = wallet.verifyMessage(\n     *   'Hello World',\n     *   'signature_string',\n     *   'nexa:address'\n     * );\n     * console.log('Signature valid:', isValid);\n     * ```\n     */\n    public verifyMessage(message: string, signature: string, address: string): boolean {\n        ValidationUtils.validateArgument(!isNil(message), 'message is required')\n        ValidationUtils.validateArgument(!isNil(signature), 'signature is required')\n        ValidationUtils.validateArgument(!isNil(address), 'address is required ')\n        let msg = new Message(message);\n        const addressKey = this.accountStore.findKeyForAddress(address)\n        ValidationUtils.validateArgument(isNil(addressKey), \"You dont own this private key\")\n        return msg.verify(address, signature)\n    }\n\n    /**\n     * Export the wallet data for backup or storage\n     *\n     * Returns an object containing the wallet's seed phrase, master key, and accounts.\n     * This data can be used to restore the wallet later. The seed phrase should be\n     * stored securely as it provides full access to the wallet.\n     *\n     * @returns Object containing wallet data\n     * @property {string} phrase - The BIP39 seed phrase (if available)\n     * @property {HDPrivateKey} masterKey - The master private key\n     * @property {BaseAccount[]} accounts - Array of discovered accounts\n     *\n     * @example\n     * ```typescript\n     * const walletData = wallet.export();\n     *\n     * // Store the seed phrase securely\n     * const seedPhrase = walletData.phrase;\n     *\n     * // Later, restore the wallet\n     * const restoredWallet = Wallet.fromSeedPhrase(seedPhrase);\n     * ```\n     */\n    public export(): any {\n        return {\n            phrase: this.phrase,\n            masterKey: this.masterKey,\n            accounts: this._accountStore.listAccounts(),\n            accountIndexes: this.accountStore.listAccounts().keys()\n        }\n    }\n\n    /**\n     * Get the account store for managing wallet accounts\n     *\n     * The account store provides methods to create, import, and manage accounts\n     * within this wallet. Each account has its own set of addresses and keys.\n     *\n     * @returns The wallet's account store\n     *\n     * @example\n     * ```typescript\n     * const accountStore = wallet.accountStore;\n     * const accounts = accountStore.listAccounts();\n     * const firstAccount = accountStore.getAccount(0);\n     * ```\n     */\n    get accountStore(): AccountStore {\n        return this._accountStore;\n    }\n\n    /**\n     * Get the network this wallet is operating on\n     *\n     * @returns The network object (mainnet, testnet, or regtest)\n     *\n     * @example\n     * ```typescript\n     * const network = wallet.network;\n     * console.log('Network:', network.name);\n     * ```\n     */\n    get network(): Networkish {\n        return this._network;\n    }\n}\n","import {ElectrumClient, SubscribeCallback} from \"@vgrunner/electrum-cash\";\nimport {\n    BlockTip,\n    IFirstUse,\n    IListUnspentRecord,\n    ITXHistory,\n    ITokensBalance,\n    ITokenListUnspent,\n    ITransaction,\n    IUtxo,\n    RostrumParams,\n    ITokenGenesis,\n    RostrumScheme, RostrumTransportScheme\n} from \"../models/rostrum.entities\";\nimport { Balance } from \"../models/wallet.entities\";\n\ntype RPCParameter = string | number | boolean | null;\n\nexport class RostrumProvider {\n\n    private client?: ElectrumClient;\n\n    public constructor() {}\n\n    public async getVersion() {\n        return await this.execute<string[]>('server.version');\n    }\n\n    public async getBlockTip() {\n        return await this.execute<BlockTip>('blockchain.headers.tip');\n    }\n\n    public async getBalance(address: string) {\n        return await this.execute<Balance>('blockchain.address.get_balance', address, 'exclude_tokens');\n    }\n\n    public async getTransactionsHistory(address: string) {\n        return await this.execute<ITXHistory[]>('blockchain.address.get_history', address);\n    }\n\n    public async getFirstUse(address: string) {\n        return await this.execute<IFirstUse>('blockchain.address.get_first_use', address);\n    }\n\n    public async getTransaction(id: string, verbose: boolean = true) {\n        return await this.execute<ITransaction>('blockchain.transaction.get', id, verbose);\n    }\n\n    public async getUtxo(outpoint: string) {\n        return await this.execute<IUtxo>('blockchain.utxo.get', outpoint);\n    }\n\n    public async getNexaUtxos(address: string) {\n        return await this.execute<IListUnspentRecord[]>('blockchain.address.listunspent', address, 'exclude_tokens');\n    }\n\n    public async getTokenUtxos(address: string, token: string) {\n        let listunspent = await this.execute<ITokenListUnspent>('token.address.listunspent', address, null, token);\n        return listunspent.unspent;\n    }\n\n    public async getTokensBalance(address: string, token?: string) {\n        if (token) {\n            return await this.execute<ITokensBalance>('token.address.get_balance', address, null, token);\n        }\n        return await this.execute<ITokensBalance>('token.address.get_balance', address);\n    }\n\n    public async getTokenGenesis(token: string) {\n        return await this.execute<ITokenGenesis>('token.genesis.info', token);\n    }\n\n    public async subscribeToAddresses(addresses:string[], callback: SubscribeCallback) {\n        for (const addr of addresses) {\n            await this.client?.subscribe(callback, 'blockchain.address.subscribe', addr)\n        }\n    }\n\n    public async broadcast(txHex: string) {\n        return await this.execute<string>('blockchain.transaction.broadcast', txHex);\n    }\n\n    public async getLatency() {\n        try {\n            let start = Date.now();\n            let res = await this.getBlockTip();\n            if (res) {\n                return Date.now() - start;\n            }\n            return 0;\n        } catch {\n            return 0;\n        }\n    }\n\n    public async connect(params?: RostrumParams) {\n        try {\n            if (!params) {\n                params = {\n                    host: 'aus.electrum.nexa.onethirtyseven.dev',\n                    port: 30004,\n                    scheme: (RostrumScheme.WSS as RostrumTransportScheme)\n                }\n                // params = await StorageProvider.getRostrumParams();\n            }\n\n            this.client = new ElectrumClient(\"com.otoplo.wallet\", \"1.4.3\", params.host, params.port, params.scheme, 30*1000, 10*1000, true);\n            await this.client.connect();\n        } catch (e) {\n            if (e instanceof Error) {\n                console.info(e.message);\n            } else {\n                console.error(e);\n            }\n            throw e;\n        }\n    }\n\n    public async disconnect(force?: boolean) {\n        try {\n            return await this.client!.disconnect(force);\n        } catch (e) {\n            console.log(e)\n            return false;\n        }\n    }\n\n    private async execute<T>(method: string, ...parameters: RPCParameter[]) {\n        var res = await this.client!.request(method, ...parameters);\n        if (res instanceof Error) {\n            throw res;\n        }\n        return res as T;\n    }\n}\n\nexport const rostrumProvider = new RostrumProvider();","export type RostrumTransportScheme = 'ws' | 'wss';\n\nexport const RostrumScheme = {\n    WS: 'ws',\n    WSS: 'wss'\n}\n\nexport interface RostrumParams {\n    scheme: RostrumTransportScheme;\n    host: string;\n    port: number;\n}\n\nexport interface BlockTip {\n    height: number;\n    hex: string;\n}\n\nexport interface IFirstUse {\n    block_hash: string;\n    block_height: number;\n    height: number;\n    tx_hash: string;\n}\n\nexport interface ITokenGenesis {\n    decimal_places?: number,\n    document_hash?: string;\n    document_url?: string;\n    group: string;\n    height: number;\n    name?: string;\n    op_return?: string;\n    ticker?: string;\n    token_id_hex: string;\n    txid: string;\n    txidem: string;\n    op_return_id: number;\n}\n\nexport interface ITokensBalance {\n    cursor?: any;\n    confirmed: Record<string, bigint | number>;\n    unconfirmed: Record<string, bigint | number>;\n}\n\nexport interface ITokenListUnspent {\n    cursor?: any;\n    unspent: ITokenUtxo[];\n}\n\nexport interface ITokenUtxo {\n    group: string;\n    height: number;\n    outpoint_hash: string;\n    token_amount: number | bigint;\n    token_id_hex: string;\n    tx_hash: string;\n    tx_pos: number;\n    value: number;\n}\n\nexport interface IListUnspentRecord {\n    has_token: boolean;\n    height: number;\n    outpoint_hash: string;\n    tx_hash: string;\n    tx_pos: number;\n    value: number;\n}\n\nexport interface IUtxo {\n    addresses: string[];\n    amount: number;\n    group: string;\n    group_authority: bigint | number;\n    group_quantity: bigint | number;\n    height: number;\n    scripthash: string;\n    scriptpubkey: string;\n    spent: ISpent;\n    status: string;\n    template_argumenthash: string;\n    template_scripthash: string;\n    token_id_hex: string;\n    tx_hash: string;\n    tx_idem: string;\n    tx_pos: number;\n}\n\nexport interface ISpent {\n    height: number;\n    tx_hash: string;\n    tx_pos: number;\n}\n\nexport interface ITransaction {\n    blockhash: string;\n    blocktime: number;\n    confirmations: number;\n    fee: number;\n    fee_satoshi: number;\n    hash: string;\n    height: number;\n    hex: string;\n    locktime: number;\n    size: number;\n    time: number;\n    txid: string;\n    txidem: string;\n    version: number;\n    vin: ITXInput[];\n    vout: ITXOutput[];\n}\n\nexport interface ITXInput {\n    outpoint: string;\n    scriptSig: IScriptSig;\n    sequence: number;\n    value: number;\n    value_satoshi: bigint | number;\n    addresses: string[];\n    group: string;\n    groupAuthority: bigint | number;\n    groupQuantity: bigint | number;\n}\n\nexport interface ITXOutput {\n    n: number;\n    outpoint_hash: string;\n    scriptPubKey: IScriptPubKey;\n    type: number;\n    value: number;\n    value_satoshi: bigint | number;\n}\n\nexport interface IScriptSig {\n    asm: string;\n    hex: string;\n}\n\nexport interface IScriptPubKey {\n    addresses: string[];\n    argHash: string;\n    asm: string;\n    group: string;\n    groupAuthority: bigint | number;\n    groupQuantity: bigint | number;\n    hex: string;\n    scriptHash: string;\n    token_id_hex?: string;\n    type: string;\n}\n\nexport interface ITXHistory {\n    fee?: number;\n    height: number;\n    tx_hash: string;\n}\n","import {rostrumProvider} from \"../network/RostrumProvider\";\nimport {AccountIndexes, AccountKeys, AddressKey, Balance} from \"../models/wallet.entities\";\nimport * as Bip39 from 'bip39';\nimport bigDecimal from \"js-big-decimal\";\nimport {ITXHistory, ITXInput, ITXOutput} from \"../models/rostrum.entities\";\nimport {Address, AddressType, HDPrivateKey, Networkish} from \"libnexa-ts\";\n\nimport {isNil} from \"lodash-es\";\nimport {BaseAccount} from \"../wallet/accounts/interfaces/BaseAccountInterface\";\nimport DAppAccount from \"../wallet/accounts/models/DappAccount\";\nimport DefaultAccount from \"../wallet/accounts/models/DefaultAccount\";\nimport VaultAccount from \"../wallet/accounts/models/VaultAccount\";\nimport {TransactionEntity, TxEntityState} from \"../models/transaction.entities\";\nimport {currentTimestamp, isNullOrEmpty} from \"./CommonUtils\";\n\nexport enum TxTokenType {\n    NO_GROUP,\n    CREATE,\n    MINT,\n    MELT,\n    RENEW,\n    TRANSFER\n}\n\nexport enum AccountType {\n    NEXA_ACCOUNT,\n    VAULT_ACCOUNT,\n    DAPP_ACCOUNT,\n}\n\nexport function isValidNexaAddress(address: string, network: Networkish, type = AddressType.PayToScriptTemplate) {\n    return Address.isValid(address, network, type);\n}\n\nexport function generateMasterKey(mnemonic: string, passphrase?: string | undefined) {\n    const seed = Bip39.mnemonicToSeedSync(mnemonic, passphrase);\n    const masterKey = HDPrivateKey.fromSeed(seed);\n    return masterKey.deriveChild(44, true).deriveChild(29223, true);\n}\n\nexport function generateAccountKey(masterKey: HDPrivateKey, account: number) {\n    return masterKey.deriveChild(account, true);\n}\n\nexport function generateKeysAndAddresses(accountKey: HDPrivateKey, fromRIndex: number, rIndex: number, fromCIndex: number, cIndex: number): AccountKeys {\n    if (fromRIndex < 0) {\n        throw new Error(`Can not generate keys with fromRIndex ${fromRIndex}. must be >= 0.`);\n    }\n    if (fromCIndex < 0) {\n        throw new Error(`Can not generate keys with fromCIndex ${fromCIndex}. must be >= 0.`);\n    }\n    let receive = accountKey.deriveChild(0, false);\n    let change = accountKey.deriveChild(1, false);\n    let rKeys: AddressKey[] = [], cKeys: AddressKey[] = [];\n    for (let index = fromRIndex; index < rIndex; index++) {\n        let k = receive.deriveChild(index, false);\n        let addr = k.privateKey.toAddress().toString();\n        rKeys.push({key: k, address: addr, balance: \"0\", tokensBalance: {}});\n    }\n    for (let index = fromCIndex; index < cIndex; index++) {\n        let k = change.deriveChild(index, false);\n        let addr = k.privateKey.toAddress().toString();\n        cKeys.push({key: k, address: addr, balance: \"0\", tokensBalance: {}});\n    }\n    return {receiveKeys: rKeys, changeKeys: cKeys};\n}\n\nexport function generateKeyAndAddress(accountKey: HDPrivateKey, rIndex: number): AddressKey {\n    let receive = accountKey.deriveChild(0, false);\n    let k = receive.deriveChild(rIndex, false);\n    let addr = k.privateKey.toAddress().toString();\n    return ({key: k, address: addr, balance: \"0\", tokensBalance: {}});\n}\n\nasync function discoverUsedAccountIndexes(deriveKey: HDPrivateKey) {\n    let lastUsed = -1, index = 0, toScan = 20;\n\n    while (toScan > 0) {\n        toScan--;\n        let rAddr = deriveKey.deriveChild(index, false).privateKey.toAddress().toString();\n        let isUsed = await isAddressUsed(rAddr);\n        if (isUsed) {\n            lastUsed = index;\n            toScan = 20;\n        }\n        index++;\n    }\n    // return the last used index, returns -1 if no indexes are used\n    return lastUsed;\n}\n\nexport async function discoverNexaAccount(accountKey: HDPrivateKey) {\n\n    let receiveKey = accountKey.deriveChild(0, false);\n    let changeKey = accountKey.deriveChild(1, false);\n\n    let rIndexPromise = discoverUsedAccountIndexes(receiveKey);\n    let cIndexPromise = discoverUsedAccountIndexes(changeKey);\n\n    let [rIndex, cIndex] = await Promise.all([rIndexPromise, cIndexPromise]);\n\n    // get the index that is the last used nexa addr\n    let indexes: AccountIndexes = { rIndex: rIndex, cIndex: cIndex };\n\n    return indexes;\n}\n\nexport async function discoverNexaAccounts(masterKey: HDPrivateKey) {\n    let accounts: DefaultAccount[] = [];\n\n    let index = 0;\n    while (true) {\n        const nexaAccountKey = generateAccountKey(masterKey, index);\n        const indexes = await discoverNexaAccount(nexaAccountKey);\n        if (indexes.rIndex < 0 && indexes.cIndex < 0)\n        {\n            break;\n        }\n        if (indexes.rIndex < 0) {\n            indexes.rIndex = 0;\n        }\n        if (indexes.cIndex < 0) {\n            indexes.cIndex = 0;\n        }\n        // make account after break check, otherwise we might push an empty account\n        const nexaAccount = new DefaultAccount(index, indexes, generateKeysAndAddresses(nexaAccountKey, indexes.rIndex + 1, indexes.rIndex + 20, indexes.cIndex + 1, indexes.cIndex + 20))\n        await nexaAccount.loadBalances()\n        accounts.push(nexaAccount);\n        if (index == 0) {\n            index = 100;\n        }\n        else {\n            index++;\n        }\n    }\n    if (accounts.length == 0) {\n        // default account was unused but we need to populate at least one account,\n        // make the default account here\n        let defaultNexaAccountKey = generateAccountKey(masterKey, 0);\n        // get the last used indexes, -1 means unused\n        let defaultIndexes: AccountIndexes = { rIndex: 0, cIndex: 0 };\n        const defaultAccount = new DefaultAccount(0, defaultIndexes, generateKeysAndAddresses(defaultNexaAccountKey, defaultIndexes.rIndex, defaultIndexes.rIndex + 20, defaultIndexes.cIndex, defaultIndexes.cIndex + 20))\n        await defaultAccount.loadBalances()\n        accounts.push(defaultAccount)\n    }\n    return accounts;\n}\n\nasync function findUsedVaultAccounts(masterKey: HDPrivateKey) {\n    // all vaults are in bip44 account 1\n    let vaultAccountKey = generateAccountKey(masterKey, 1);\n    // all vaults are in the external chain\n    let vaultChain = vaultAccountKey.deriveChild(0, false);\n    // get the index that is the last used vault\n    return await discoverUsedAccountIndexes(vaultChain);\n}\n\nexport async function discoverVaults(masterKey: HDPrivateKey) {\n    let accounts: VaultAccount[] = [];\n    // all vaults are in bip44 account 1\n    let vaultAccountKey = generateAccountKey(masterKey, 1);\n    // find the next unused vault\n    let lastUsedVaultIndex: number = await findUsedVaultAccounts(masterKey);\n    // if all vaults unused, generate at least the first vault account\n    if (lastUsedVaultIndex < 0) lastUsedVaultIndex = 0;\n    // for each vault found, make the DefaultAccount for that vault\n    for (let index = 0; index <= lastUsedVaultIndex; index++)\n    {\n        const vaultAccount = new VaultAccount(1, index, generateKeyAndAddress(vaultAccountKey, index))\n        await vaultAccount.loadBalances();\n        accounts.push(vaultAccount);\n    }\n    return accounts;\n}\n\nasync function findUsedDappAccounts(masterKey: HDPrivateKey) {\n    // all dApp accounts are in bip44 account 2\n    let dappAccountKey = generateAccountKey(masterKey, 2);\n    // all dApp accounts use the external chain\n    let dappChain = dappAccountKey.deriveChild(0, false);\n    // get the index that is the next unused dApp account\n    return await discoverUsedAccountIndexes(dappChain);\n}\n\nexport async function discoverDappAccounts(masterKey: HDPrivateKey) {\n    let accounts: DAppAccount[] = [];\n    // all dApp accounts are in bip44 account 2\n    let dappAccountKey = generateAccountKey(masterKey, 2);\n    // find the next unused dapp account\n    let lastUsedDappIndex: number = await findUsedDappAccounts(masterKey);\n    // if all dapp accounts unused, generate at least the first dapp account\n    if (lastUsedDappIndex < 0) lastUsedDappIndex = 0;\n    // for each dApp account found, make the DefaultAccount for that dApp account\n    // for each vault found, make the DefaultAccount for that vault\n    for (let index = 0; index <= lastUsedDappIndex; index++)\n    {\n        const dappAccount = new DAppAccount(2, index, generateKeyAndAddress(dappAccountKey, index))\n        await dappAccount.loadBalances();\n        accounts.push(dappAccount);\n    }\n    return accounts;\n}\n\nexport async function discoverWallet(masterKey: HDPrivateKey) {\n    let accounts: BaseAccount[] = [];\n    // accounts 0, 100+\n    const nexaAccounts = await discoverNexaAccounts(masterKey);\n    // vaults in bip44 account 1\n    const vaultAccounts = await discoverVaults(masterKey);\n    // dApp accounts in bip44 account 2\n    const dappAccounts = await discoverDappAccounts(masterKey);\n    // 3 - 99 are reserved and will go here when added\n    accounts = accounts.concat(nexaAccounts);\n    accounts = accounts.concat(vaultAccounts);\n    accounts = accounts.concat(dappAccounts);\n    return accounts;\n}\n\nasync function isAddressUsed(address: string) {\n    try {\n        let firstUse = await rostrumProvider.getFirstUse(address);\n        return firstUse.tx_hash && firstUse.tx_hash !== \"\";\n    } catch (e) {\n        if (e instanceof Error && e.message.includes(\"not found\")) {\n            return false;\n        }\n        throw e;\n    }\n}\n\nasync function getKeyTokenBalance(key: AddressKey) {\n    let tokensBalance = await rostrumProvider.getTokensBalance(key.address);\n    let balance: Record<string, Balance> = {};\n\n    for (const cToken in tokensBalance.confirmed) {\n        if (tokensBalance.confirmed[cToken] != 0) {\n            balance[cToken] = { confirmed: BigInt(tokensBalance.confirmed[cToken]).toString(), unconfirmed: \"0\" }\n        }\n    }\n\n    for (const uToken in tokensBalance.unconfirmed) {\n        if (tokensBalance.unconfirmed[uToken] != 0) {\n            if (balance[uToken]) {\n                balance[uToken].unconfirmed = BigInt(tokensBalance.unconfirmed[uToken]).toString();\n            } else {\n                balance[uToken] = { confirmed: \"0\", unconfirmed: BigInt(tokensBalance.unconfirmed[uToken]).toString() }\n            }\n        }\n    }\n\n    return balance;\n}\n\nasync function getAndUpdateAddressKeyBalance(key: AddressKey) {\n    let balance = await rostrumProvider.getBalance(key.address);\n    key.balance = (BigInt(balance.confirmed) + BigInt(balance.unconfirmed)).toString();\n    key.tokensBalance = await getKeyTokenBalance(key);\n\n    return balance;\n}\n\nexport async function fetchTotalBalance(keys: AddressKey[]) {\n    let promises: Promise<Balance>[] = [];\n    keys.forEach(key => {\n        let b = getAndUpdateAddressKeyBalance(key);\n        promises.push(b);\n    });\n\n    return await Promise.all(promises);\n}\n\nexport function sumBalance(balances: Balance[]): Balance {\n    let confirmed = new bigDecimal(0), unconfirmed = new bigDecimal(0);\n    balances.forEach(b => {\n        confirmed = confirmed.add(new bigDecimal(b.confirmed));\n        unconfirmed = unconfirmed.add(new bigDecimal(b.unconfirmed));\n    });\n    return {confirmed: confirmed.getValue(), unconfirmed: unconfirmed.getValue()};\n}\n\nexport function sumTokensBalance(balances: Record<string, Balance>[]) {\n    let tokensBalance: Record<string, Balance> = {};\n    balances.forEach(b => {\n        for (const key in b) {\n            if (tokensBalance[key]) {\n                tokensBalance[key].confirmed = (BigInt(tokensBalance[key].confirmed) + BigInt(b[key].confirmed)).toString();\n                tokensBalance[key].unconfirmed = (BigInt(tokensBalance[key].unconfirmed) + BigInt(b[key].unconfirmed)).toString();\n            } else {\n                tokensBalance[key] = { confirmed: b[key].confirmed, unconfirmed: b[key].unconfirmed };\n            }\n        }\n    });\n\n    return tokensBalance;\n}\n\nexport async function fetchTransactionsHistory(addresses: string[], fromHeight: number) {\n    let index = 0, i = 0, data = new Map<string, ITXHistory>(), maxHeight = fromHeight;\n\n    for (let address of addresses) {\n        i++;\n        let txHistory = await rostrumProvider.getTransactionsHistory(address);\n        if (txHistory && txHistory.length > 0) {\n            index = i;\n            for (let tx of txHistory) {\n                if (tx.height === 0 || tx.height > fromHeight) {\n                    maxHeight = Math.max(maxHeight, tx.height);\n                    data.set(tx.tx_hash, tx);\n                }\n            }\n        }\n    }\n\n    return {index: index, txs: data, lastHeight: maxHeight};\n}\n\nasync function rescanAddressesHistory(addresses: string[]) {\n    let index = 0, i = 0, minHeight = Number.MAX_SAFE_INTEGER;\n\n    for (let address of addresses) {\n        i++;\n        let txHistory = await rostrumProvider.getTransactionsHistory(address);\n        if (!isNil(txHistory)) {\n            index = i;\n            let heights = txHistory.filter(tx => tx.height > 0).map(h => h.height);\n            if (!isNil(heights)) {\n                minHeight = Math.min(minHeight, ...heights);\n            }\n        }\n    }\n\n    return {index: (index > 0 ? index + 1 : 0), height: (minHeight == Number.MAX_SAFE_INTEGER ? 0 : minHeight)};\n}\n\nexport async function getNextAccountIndex(accountType: AccountType, masterKey: HDPrivateKey) {\n    if (accountType == AccountType.NEXA_ACCOUNT) {\n        let defaultNexaAccountKey = generateAccountKey(masterKey, 0);\n        const defaultIndexes = await discoverNexaAccount(defaultNexaAccountKey);\n        if (defaultIndexes.rIndex < 0 && defaultIndexes.cIndex < 0){\n            return 0;\n        }\n        else {\n            // account 0 was not empty\n            for (let index = 100; ; index++) {\n                const nexaAccountKey = generateAccountKey(masterKey, index);\n                const indexes = await discoverNexaAccount(nexaAccountKey);\n                if (indexes.rIndex < 0 && indexes.cIndex < 0)\n                {\n                    return index;\n                }\n            }\n        }\n    }\n    else if (accountType == AccountType.VAULT_ACCOUNT) {\n        // find the next unused vault\n        const lastUsedVault: number = await findUsedVaultAccounts(masterKey);\n        return lastUsedVault + 1;\n    }\n    else if (accountType == AccountType.DAPP_ACCOUNT) {\n        // find the next unused dapp account\n        const lastUsedDappAccount: number = await findUsedDappAccounts(masterKey);\n        return lastUsedDappAccount + 1;\n    }\n    else {\n        throw new Error(\"Can not get next account index. Invalid accountType.\");\n    }\n}\n\nexport async function classifyTransaction(txHistory: ITXHistory, myAddresses: string[]) {\n    let t = await rostrumProvider.getTransaction(txHistory.tx_hash);\n\n    let outputs = t.vout.filter(utxo => !isNil(utxo.scriptPubKey.addresses));\n\n    let isOutgoing = t.vin.length > 0 && myAddresses.includes(t.vin[0].addresses[0]);\n    let isIncoming = !isOutgoing || outputs.every(utxo => myAddresses.includes(utxo.scriptPubKey.addresses[0]));\n    let isConfirmed = t.height > 0;\n\n    let txEntry = {} as TransactionEntity;\n    txEntry.txId = t.txid;\n    txEntry.txIdem = t.txidem;\n    txEntry.height = isConfirmed ? t.height : 0;\n    txEntry.time = isConfirmed ? t.time : currentTimestamp();\n    txEntry.fee = t.fee_satoshi;\n\n    if (isOutgoing && isIncoming) {\n        txEntry.state = 'both';\n        txEntry.value = \"0\";\n        txEntry.payTo = \"Payment to yourself\";\n    } else if (isIncoming) {\n        txEntry.state = 'incoming';\n        let utxos = outputs.filter(utxo => myAddresses.includes(utxo.scriptPubKey.addresses[0]));\n        let amount = new bigDecimal(0);\n        utxos.forEach(utxo => {\n            amount = amount.add(new bigDecimal(utxo.value_satoshi));\n        });\n        txEntry.value = amount.getValue();\n        txEntry.payTo = utxos[0].scriptPubKey.addresses[0];\n    } else if(isOutgoing) {\n        txEntry.state = 'outgoing';\n        let utxos = outputs.filter(utxo => !myAddresses.includes(utxo.scriptPubKey.addresses[0]));\n        let amount = new bigDecimal(0);\n        utxos.forEach(utxo => {\n            amount = amount.add(new bigDecimal(utxo.value_satoshi));\n        });\n        txEntry.value = amount.getValue();\n        txEntry.payTo = utxos[0].scriptPubKey.addresses[0];\n    }\n\n    let [txType, txGroup, tokenAmount, extraGroup] = classifyTokenTransaction(t.vin, outputs, txEntry.state, myAddresses);\n    txEntry.txGroupType = txType;\n    txEntry.token = txGroup;\n    txEntry.tokenAmount = tokenAmount;\n    txEntry.extraGroup = extraGroup;\n\n    return txEntry;\n}\n\nfunction classifyTokenTransaction(vin: ITXInput[], vout: ITXOutput[], txState: TxEntityState, myAddresses: string[]): [TxTokenType, string, string, string] {\n    let groupInputs = vin.filter(input => !isNullOrEmpty(input.group));\n    let groupOutputs = vout.filter(output => !isNullOrEmpty(output.scriptPubKey.group));\n\n    if (isNullOrEmpty(groupInputs) && isNullOrEmpty(groupOutputs)) {\n        return [TxTokenType.NO_GROUP, \"none\", \"0\", \"none\"];\n    }\n\n    let myGroupInputs = groupInputs.filter(input => myAddresses.includes(input.addresses[0]));\n    let myGroupOutputs = groupOutputs.filter(output => myAddresses.includes(output.scriptPubKey.addresses[0]));\n\n    if (isNullOrEmpty(myGroupInputs) && isNullOrEmpty(myGroupOutputs)) {\n        return [TxTokenType.NO_GROUP, \"none\", \"0\", \"none\"];\n    }\n\n    if (isNullOrEmpty(groupInputs)) {\n        let group = myGroupOutputs.find(output => BigInt(output.scriptPubKey.groupQuantity) < 0n)?.scriptPubKey.group ?? \"none\";\n        return [TxTokenType.CREATE, group, \"0\", \"none\"];\n    }\n\n    if (isNullOrEmpty(groupOutputs)) {\n        if (txState === 'incoming') {\n            return [TxTokenType.NO_GROUP, \"none\", \"0\", \"none\"];\n        }\n\n        let inputs = myGroupInputs.filter(input => BigInt(input.groupQuantity) > 0n);\n        if (!isNullOrEmpty(inputs)) {\n            let amount = new bigDecimal(0);\n            inputs.forEach(utxo => {\n                amount = amount.add(new bigDecimal(utxo.groupQuantity));\n            });\n            let group = inputs[0].group;\n            let extraGroup = myGroupInputs.find(input => BigInt(input.groupQuantity) < 0n && inputs[0].group != input.group)?.group ?? \"none\";\n            return [TxTokenType.MELT, group, amount.getValue(), extraGroup];\n        }\n\n        let group = myGroupInputs.find(input => BigInt(input.groupQuantity) < 0n)?.group ?? \"none\";\n        let extraGroup = myGroupInputs.find(input => BigInt(input.groupQuantity) < 0n && group != input.group)?.group ?? \"none\";\n        return [TxTokenType.MELT, group, \"0\", extraGroup];\n    }\n\n    let tokenInputs = groupInputs.filter(input => BigInt(input.groupQuantity) > 0n);\n    let tokenOutputs = groupOutputs.filter(output => BigInt(output.scriptPubKey.groupQuantity) > 0n);\n\n    if (isNullOrEmpty(tokenInputs) && isNullOrEmpty(tokenOutputs)) {\n        let group = groupInputs.find(input => BigInt(input.groupQuantity) < 0n)?.group ?? \"none\";\n        let extraGroup = groupOutputs.find(output => BigInt(output.scriptPubKey.groupQuantity) < 0n && group != output.scriptPubKey.group)?.scriptPubKey.group ?? \"none\";\n        return [TxTokenType.RENEW, extraGroup !== 'none' ? extraGroup : group, \"0\", extraGroup !== 'none' ? group : extraGroup];\n    }\n\n    if (isNullOrEmpty(tokenInputs)) {\n        let group = tokenOutputs[0].scriptPubKey.group;\n        let amount = new bigDecimal(0);\n        tokenOutputs.forEach(utxo => {\n            amount = amount.add(new bigDecimal(utxo.scriptPubKey.groupQuantity));\n        });\n        let extraGroup = groupInputs.find(input => BigInt(input.groupQuantity) < 0n && group != input.group)?.group ?? \"none\";\n        return [TxTokenType.MINT, group, amount.getValue(), extraGroup];\n    }\n\n    if (isNullOrEmpty(tokenOutputs)) {\n        let group = tokenInputs[0].group;\n        let amount = new bigDecimal(0);\n        tokenInputs.forEach(utxo => {\n            amount = amount.add(new bigDecimal(utxo.groupQuantity));\n        });\n        let extraGroup = groupInputs.find(input => BigInt(input.groupQuantity) < 0n && group != input.group)?.group ?? \"none\";\n        return [TxTokenType.MELT, group, amount.getValue(), extraGroup];\n    }\n\n    let outQuantitySum = tokenOutputs.map(output => BigInt(output.scriptPubKey.groupQuantity)).reduce((a, b) => a + b, 0n);\n    let inQuantitySum = tokenInputs.map(input => BigInt(input.groupQuantity)).reduce((a, b) => a + b, 0n);\n\n    if (outQuantitySum > inQuantitySum) {\n        let group = tokenOutputs[0].scriptPubKey.group;\n        let extraGroup = groupInputs.find(input => BigInt(input.groupQuantity) < 0n && group != input.group)?.group ?? \"none\";\n        return [TxTokenType.MINT, group, (outQuantitySum - inQuantitySum).toString(), extraGroup];\n    }\n\n    if (inQuantitySum > outQuantitySum) {\n        let group = tokenInputs[0].group;\n        let extraGroup = groupInputs.find(input => BigInt(input.groupQuantity) < 0n && group != input.group)?.group ?? \"none\";\n        return [TxTokenType.MELT, group, (inQuantitySum - outQuantitySum).toString(), extraGroup];\n    }\n\n    let group = tokenOutputs[0].scriptPubKey.group;\n    let amount = \"\";\n    if (txState === 'incoming') {\n        amount = tokenOutputs\n            .filter(output => myAddresses.includes(output.scriptPubKey.addresses[0]))\n            .map(output => BigInt(output.scriptPubKey.groupQuantity))\n            .reduce((a, b) => a + b, 0n)\n            .toString();\n    } else if (txState === 'outgoing') {\n        amount = tokenOutputs\n            .filter(output => !myAddresses.includes(output.scriptPubKey.addresses[0]))\n            .map(output => BigInt(output.scriptPubKey.groupQuantity))\n            .reduce((a, b) => a + b, 0n)\n            .toString();\n    } else {\n        amount = \"0\";\n    }\n\n    return [TxTokenType.TRANSFER, group, amount, \"none\"];\n}","import {AccountIndexes, AccountKeys, AddressKey} from \"../../../models/wallet.entities\";\nimport {BaseAccount} from \"../interfaces/BaseAccountInterface\";\nimport {\n    AccountType, classifyTransaction,\n    fetchTotalBalance,\n    fetchTransactionsHistory,\n    sumBalance,\n    sumTokensBalance\n} from \"../../../utils/WalletUtils\";\nimport {PrivateKey} from \"libnexa-ts\";\nimport {TransactionEntity} from \"../../../models/transaction.entities\";\n\nexport default class DAppAccount extends BaseAccount {\n\n    private readonly _accountIndex: number;\n    private readonly _accountKey: AddressKey;\n\n    constructor(bip44Account: number, accountIndex: number, addressKey: AddressKey) {\n        super(bip44Account)\n        this._accountIndex = accountIndex;\n        this._accountKey = addressKey\n    }\n\n    // this is used in AccountStore.ts to get the key to be used in the map for this account\n    public getAccountStoreKey(): string {\n        return String(this._bip44Account + '.' + this._accountIndex);\n    }\n\n    public getAccountType(): AccountType {\n        return AccountType.DAPP_ACCOUNT;\n    }\n\n    public getNewAddress() {\n        return this._accountKey.address;\n    }\n\n    public getNewChangeAddress(): string {\n        return this._accountKey.address;\n    }\n\n    get accountIndexes(): AccountIndexes {\n        return {\n            rIndex: this._accountIndex,\n            cIndex: 0\n        };\n    }\n\n    get accountKeys(): AccountKeys {\n        return {\n            receiveKeys: [this._accountKey],\n            changeKeys: [this._accountKey]\n        };\n    }\n\n    async loadBalances(): Promise<void> {\n        let balances = await fetchTotalBalance([this._accountKey]);\n        let tokenBalances = [this._accountKey].map(k => k.tokensBalance);\n        super.balance = sumBalance(balances)\n        super.tokenBalances = sumTokensBalance(tokenBalances)\n    }\n\n    getKeyFromAddress(address: string): AddressKey {\n        return this._accountKey;\n    }\n\n    async getTransactions(fromHeight?: number, address?: string): Promise<Map<string, TransactionEntity>> {\n        let txPromises:TransactionEntity[] = []\n\n        const transactions = await fetchTransactionsHistory([address ?? this._accountKey.address], fromHeight ?? 0)\n        for (let tx of transactions.txs.values()) {\n            let t = await classifyTransaction(tx, [address ?? this._accountKey.address])\n            txPromises.push(t)\n        }\n        await Promise.all(txPromises)\n        for (let txEntity of txPromises){\n            this.transactions.set(txEntity.txId, txEntity)\n        }\n        return this.transactions\n    }\n}\n","import {AccountIndexes, AccountKeys, AddressKey, Balance} from \"../../../models/wallet.entities\";\nimport DefaultAccount from \"../models/DefaultAccount\";\nimport bigDecimal from \"js-big-decimal\";\nimport {AccountType} from \"../../../utils/WalletUtils\";\nimport {PrivateKey} from \"libnexa-ts\";\nimport {TransactionEntity} from \"../../../models/transaction.entities\";\n\nexport abstract class BaseAccount {\n    get transactions(): Map<string, TransactionEntity> {\n        return this._transactions;\n    }\n\n    set transactions(value: Map<string, TransactionEntity>) {\n        this._transactions = value;\n    }\n\n    protected readonly _bip44Account: number;\n    private _balance?: Balance;\n    private _tokenBalances?: Record<string, Balance> = {};\n    private _transactions : Map<string, TransactionEntity> = new Map<string, TransactionEntity>()\n\n    protected constructor(_bip44Account: number) {\n        this._bip44Account = _bip44Account;\n        this._balance = {\n            confirmed: 0,\n            unconfirmed: 0\n        }\n        this._tokenBalances = {};\n    }\n\n    abstract get accountIndexes(): AccountIndexes;\n    abstract get accountKeys(): AccountKeys;\n    abstract getNewChangeAddress(): string;\n    abstract getNewAddress(): string;\n    abstract getAccountStoreKey(): string;\n    abstract getAccountType(): AccountType;\n    abstract loadBalances(): Promise<void>;\n    abstract getKeyFromAddress(address:string): AddressKey;\n    abstract getTransactions(fromHeight?: number, address?:string): Promise<Map<string, TransactionEntity>>;\n\n    get balance(): Balance {\n        return this._balance!;\n    }\n\n    set balance(value: Balance) {\n        this._balance = value;\n    }\n\n    get tokenBalances(): Record<string, Balance> {\n        return this._tokenBalances!;\n    }\n\n    set tokenBalances(value: Record<string, Balance>) {\n        this._tokenBalances = value;\n    }\n}\n","import {AccountIndexes, AccountKeys, AddressKey} from \"../../../models/wallet.entities\";\nimport {BaseAccount} from \"../interfaces/BaseAccountInterface\";\nimport {\n    AccountType, classifyTransaction,\n    fetchTotalBalance,\n    fetchTransactionsHistory,\n    sumBalance,\n    sumTokensBalance\n} from \"../../../utils/WalletUtils\";\nimport {PrivateKey} from \"libnexa-ts\";\nimport {TransactionEntity} from \"../../../models/transaction.entities\";\n\nexport default class DefaultAccount extends BaseAccount {\n\n    private readonly _accountIndexes: AccountIndexes; // either a list of indexes or a single bip44 account index\n    private _accountKeys: AccountKeys; // either a list of keys or a single key\n\n    constructor(bip44Account: number, accountIndexes: AccountIndexes, accountKeys: AccountKeys) {\n        super(bip44Account)\n        if (accountIndexes.rIndex < 0) {\n            throw new Error(`Can not create nexa account with an rindex of ${accountIndexes.rIndex}. must be >= 0.`);\n        }\n        if (accountIndexes.cIndex < 0) {\n            throw new Error(`Can not create nexa account with an cindex of ${accountIndexes.cIndex}. must be >= 0.`);\n        }\n        this._accountIndexes = accountIndexes;\n        this._accountKeys = accountKeys;\n    }\n\n    // this is used in AccountStore.ts to get the key to be used in the map for this account\n    public getAccountStoreKey() {\n        return String(this._bip44Account);\n    }\n\n    public getAccountType(): AccountType {\n        return AccountType.NEXA_ACCOUNT\n    }\n\n    public getNewAddress() {\n        return this._accountKeys.receiveKeys[this._accountKeys.receiveKeys.length - 1]?.address ?? '';\n    }\n\n    public getNewChangeAddress(): string {\n        return this._accountKeys.changeKeys[this._accountKeys.changeKeys.length - 1]?.address ?? ''\n    }\n\n    get accountIndexes(): AccountIndexes {\n        return this._accountIndexes;\n    }\n\n    get accountKeys(): AccountKeys {\n        return this._accountKeys;\n    }\n\n    async loadBalances(): Promise<void> {\n        let balances = await fetchTotalBalance(this._accountKeys.receiveKeys.concat(this._accountKeys.changeKeys));\n        let tokenBalances = this._accountKeys.receiveKeys.concat(this._accountKeys.changeKeys).map(k => k.tokensBalance);\n        super.balance = sumBalance(balances)\n        super.tokenBalances = sumTokensBalance(tokenBalances)\n    }\n\n    getKeyFromAddress(address: string): AddressKey {\n        const allKeys = this._accountKeys.receiveKeys.concat(this._accountKeys.changeKeys)\n        const keyFound = allKeys.find(key => key.address === address)\n        return keyFound!\n    }\n\n    async getTransactions(fromHeight?: number, address?: string): Promise<Map<string, TransactionEntity>> {\n\n        let receiveAddresses = this.accountKeys.receiveKeys.map(ak => ak.address);\n        let changeAddresses = this.accountKeys.changeKeys.map(ak => ak.address);\n        let allAddresses = receiveAddresses.concat(changeAddresses);\n\n        let rTxs = fetchTransactionsHistory(address != null ? [address]: receiveAddresses, fromHeight ?? 0);\n        let cTxs = fetchTransactionsHistory(address != null ? [address] : receiveAddresses, fromHeight ?? 0);\n\n        let [rData, cData] = await Promise.all([rTxs, cTxs]);\n\n        let txHistory = rData.txs;\n        for (let tx of cData.txs.values()) {\n            txHistory.set(tx.tx_hash, tx);\n        }\n\n        let txPromises: TransactionEntity[] = [];\n        for (let tx of txHistory.values()) {\n            let t = await classifyTransaction(tx, allAddresses);\n            txPromises.push(t);\n        }\n        await Promise.all(txPromises)\n\n        for (let txEntity of txPromises){\n            this.transactions.set(txEntity.txId, txEntity)\n        }\n        return this.transactions\n    }\n}\n","import {AccountIndexes, AccountKeys, AddressKey} from \"../../../models/wallet.entities\";\nimport {BaseAccount} from \"../interfaces/BaseAccountInterface\";\nimport {\n    AccountType, classifyTransaction,\n    fetchTotalBalance,\n    fetchTransactionsHistory,\n    sumBalance,\n    sumTokensBalance\n} from \"../../../utils/WalletUtils\";\nimport {PrivateKey} from \"libnexa-ts\";\nimport {TransactionEntity} from \"../../../models/transaction.entities\";\nimport {rostrumProvider} from \"../../../network/RostrumProvider\";\n\nexport default class VaultAccount extends BaseAccount {\n\n    private readonly _accountIndex: number;\n    private readonly _accountKey: AddressKey;\n\n    constructor(bip44Account: number, accountIndex: number, addressKey: AddressKey) {\n        super(bip44Account)\n        this._accountIndex = accountIndex;\n        this._accountKey = addressKey;\n    }\n\n    // this is used in AccountStore.ts to get the key to be used in the map for this account\n    public getAccountStoreKey(): string {\n        return String(this._bip44Account + '.' + this._accountIndex);\n    }\n\n    public getAccountType(): AccountType {\n        return AccountType.VAULT_ACCOUNT\n    }\n\n    public getNewAddress() {\n        return this._accountKey.address\n    }\n\n    public getNewChangeAddress(): string {\n        return this._accountKey.address\n    }\n\n    get accountIndexes(): AccountIndexes {\n        return {\n            rIndex: this._accountIndex,\n            cIndex: 0\n        };\n    }\n\n    get accountKeys(): AccountKeys {\n        return {\n            receiveKeys: [this._accountKey],\n            changeKeys: [this._accountKey]\n        };\n    }\n\n    async loadBalances(): Promise<void> {\n        let balances = await fetchTotalBalance([this._accountKey]);\n        let tokenBalances = [this._accountKey].map(k => k.tokensBalance);\n        super.balance = sumBalance(balances)\n        super.tokenBalances = sumTokensBalance(tokenBalances)\n    }\n\n    getKeyFromAddress(address: string): AddressKey {\n        return this._accountKey;\n    }\n\n    async getTransactions(fromHeight?: number, address?: string): Promise<Map<string, TransactionEntity>> {\n        let txPromises:TransactionEntity[] = []\n\n        const transactions = await fetchTransactionsHistory([address ?? this._accountKey.address], fromHeight ?? 0)\n        for (let tx of transactions.txs.values()) {\n            let t = await classifyTransaction(tx, [address ?? this._accountKey.address])\n            txPromises.push(t)\n        }\n        await Promise.all(txPromises)\n        for (let txEntity of txPromises){\n            this.transactions.set(txEntity.txId, txEntity)\n        }\n        return this.transactions\n    }\n}\n","import bigDecimal from 'js-big-decimal';\nimport { Address, CommonUtils } from 'libnexa-ts';\n\n/** Maximum value for a 64-bit signed integer */\nexport const MAX_INT64: bigint = 9223372036854775807n;\n\n/**\n * Get the current Unix timestamp in seconds\n * \n * @returns Current timestamp as number of seconds since Unix epoch\n * \n * @example\n * ```typescript\n * const now = currentTimestamp();\n * console.log('Current time:', now);\n * ```\n */\nexport function currentTimestamp() {\n    return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Check if a value is null, undefined, or empty\n * \n * @param arg - The value to check\n * @returns true if the value is null, undefined, empty string, or empty array\n * \n * @example\n * ```typescript\n * isNullOrEmpty(''); // true\n * isNullOrEmpty([]); // true\n * isNullOrEmpty(null); // true\n * isNullOrEmpty('hello'); // false\n * ```\n */\nexport function isNullOrEmpty(arg?: string | any[] | null): arg is undefined | [] | null | '' {\n    return !arg || arg.length === 0;\n}\n\n/**\n * Parse an amount with decimal places and format it for display\n * \n * Converts a raw amount to a human-readable format by dividing by 10^decimals\n * and removing trailing zeros.\n * \n * @param amount - The raw amount to parse\n * @param decimals - Number of decimal places\n * @returns Formatted amount string\n * \n * @example\n * ```typescript\n * parseAmountWithDecimals(1000000, 6); // '1'\n * parseAmountWithDecimals(1500000, 6); // '1.5'\n * parseAmountWithDecimals(1000000n, 6); // '1'\n * ```\n */\nexport function parseAmountWithDecimals(amount: string | number | bigint, decimals: number) {\n    let val = new bigDecimal(amount).divide(new bigDecimal(Math.pow(10, decimals)), decimals).getPrettyValue();\n    if (val.match(/\\./)) {\n        val = val.replace(/\\.?0+$/, '');\n    }\n    return val;\n}\n\n/**\n * Convert a decimal amount to raw integer format\n * \n * Multiplies the amount by 10^decimals to get the raw integer representation\n * used in transactions.\n * \n * @param amount - The decimal amount to convert\n * @param decimals - Number of decimal places\n * @returns Raw amount as string\n * \n * @example\n * ```typescript\n * getRawAmount('1.5', 6); // '1500000'\n * getRawAmount(1.5, 6); // '1500000'\n * ```\n */\nexport function getRawAmount(amount: string | number | bigint, decimals: number) {\n    return new bigDecimal(amount).multiply(new bigDecimal(Math.pow(10, decimals))).getValue();\n}\n\n/**\n * Get the buffer representation of an address\n * \n * @param address - The address string (hex or Nexa address format)\n * @returns Buffer containing the address data\n * \n * @example\n * ```typescript\n * const buffer = getAddressBuffer('nexatest:nqtsq5g5jsdmqqywaqd82lhnnk3a8wqunjz6gtxdtavnnekc');\n * const hexBuffer = getAddressBuffer('a1b2c3d4e5f6');\n * ```\n */\nexport function getAddressBuffer(address: string) {\n    if (CommonUtils.isHexa(address)) {\n        return Buffer.from(address, 'hex') ;\n    }\n    return Address.fromString(address).data;\n}\n\n/**\n * Convert a token ID to hex format\n * \n * @param token - The token ID (hex string or Nexa address format)\n * @returns Token ID in hex format\n * \n * @example\n * ```typescript\n * const hexId = tokenIdToHex('nexatest:tq8r37lcjlqazz7vuvug84q2ev50573hesrnxkv9y6hvhhl5k5qqqnmyf79mx');\n * const hexId2 = tokenIdToHex('a1b2c3d4e5f6'); // already hex, returns as-is\n * ```\n */\nexport function tokenIdToHex(token: string) {\n    if (CommonUtils.isHexa(token)) {\n        return token;\n    }\n    return getAddressBuffer(token).toString('hex');\n}\n\n\n","import {PrivateKey, TransactionBuilder} from \"libnexa-ts\";\nimport {rostrumProvider} from \"../../network/RostrumProvider\";\nimport {\n    buildCreateGroupTransaction,\n    populateAndDuplicateTokenAuths,\n    populateNexaInputsAndChange,\n    populateTokenAuth,\n    populateTokenInputsAndChange,\n    prepareDeleteTransaction\n} from \"../../utils/TXUtils\";\nimport {BaseAccount} from \"../accounts/interfaces/BaseAccountInterface\";\nimport {AddressKey} from \"../../models/wallet.entities\";\nimport {TransactionCreator} from \"./interfaces/TransactionCreator\";\nimport {keys} from \"lodash-es\";\nimport {PermissionLabel} from \"../../models/transaction.entities\";\n\nexport default class WalletTransactionCreator extends TransactionCreator {\n\n    private  _keysToSign: PrivateKey[] = [];\n    private _account!: BaseAccount;\n\n    constructor(fromAccount: BaseAccount, tx?: TransactionBuilder | string | Buffer) {\n        super(tx)\n        this._account = fromAccount\n        this.validateAccount()\n    }\n\n    public fromAccount(fromAccount: BaseAccount): this {\n        this._account = fromAccount\n        return this\n    }\n\n    public parseTxHex(tx: string) {\n        this.builder.push(async () => {\n            const txBuilder = new TransactionBuilder(tx)\n            const newTxBuilder = new TransactionBuilder()\n            const oldInputs = txBuilder.transaction.inputs\n            for (const input of oldInputs) {\n                const utxo = await rostrumProvider.getUtxo(input.outpoint.toString('hex'))\n                newTxBuilder.from({\n                    outpoint: utxo.tx_hash,\n                    amount: utxo.amount,\n                    scriptPubKey: utxo.scriptpubkey\n                })\n                const foundKey = this.findPrivateKeyFromAddress(utxo.addresses[0])\n                if(foundKey) {\n                    this._keysToSign.push(foundKey.key.privateKey)\n                }\n\n            }\n            newTxBuilder.transaction.outputs = txBuilder.transaction.outputs\n\n        })\n\n        return this\n    }\n\n    public parseTxBuffer(tx: Buffer) {\n        this.builder.push(async () => {\n            this.transactionBuilder = new TransactionBuilder(tx);\n        })\n\n        return this\n    }\n\n    public mint(token: string, amount: string): this {\n        this.builder.push(async() => {\n            let toAddr = this._account.accountKeys.receiveKeys.at(-1)!.address;\n            this.tokenAction(toAddr, amount, token, 'mint')\n        })\n\n        return this\n    }\n\n    public melt(token: string, amount: string): this {\n        this.builder.push(async() => {\n            let toAddr = this._account.accountKeys.receiveKeys.at(-1)!.address;\n            this.tokenAction(toAddr, amount, token, 'melt')\n        })\n\n        return this\n    }\n\n    public populate(): this {\n        this.validateAccount();\n        this.builder.push(async () => {\n            let tK: PrivateKey[] = []\n            let nK: PrivateKey[] = []\n            if(this.tokens.size > 0) {\n                for (const tokenAction of this.tokens) {\n                    if(tokenAction.action == 'mint' || tokenAction.action == 'melt') {\n                        tK = tK.concat(await populateTokenAuth(this.transactionBuilder, this._account.accountKeys, tokenAction.token!, tokenAction.action))\n                    } else if (tokenAction.action == 'group') {\n                        tK = tK.concat(await buildCreateGroupTransaction(this.transactionBuilder, this._account.accountKeys, tokenAction.extraData?.opReturnData!, this.network))\n                    } else if (tokenAction.action == 'subgroup') {\n                       tK = tK.concat(await populateTokenAuth(this.transactionBuilder, this._account.accountKeys, tokenAction.parentToken!, 'subgroup', tokenAction.token, this._account.accountKeys.receiveKeys.at(-1)!.address));\n                    } else if(tokenAction.action == 'renew') {\n                        tK = tK.concat(await populateAndDuplicateTokenAuths(this.transactionBuilder, this._account.accountKeys, tokenAction.token!, tokenAction.extraData!.perms!, tokenAction.extraData!.address!))\n                    } else if(tokenAction.action == 'delete') {\n                        tK = tK.concat(await prepareDeleteTransaction(this.transactionBuilder, this._account.accountKeys, tokenAction.extraData!.outpoint!))\n                    } else {\n                        tK = tK.concat(await populateTokenInputsAndChange(this.transactionBuilder, this._account.accountKeys, tokenAction.token!, tokenAction.amount))\n                    }\n\n                    this._keysToSign!.concat(tK)\n                }\n            }\n\n            nK = nK.concat(await populateNexaInputsAndChange(this.transactionBuilder, this._account.accountKeys, this.totalValue, this.txOptions))\n            this._keysToSign! = tK.concat(nK)\n        })\n\n        return this\n    }\n\n    public sign(): this {\n        this.builder.push(async () => {\n            const blockHeight = await rostrumProvider.getBlockTip()\n            this.transactionBuilder.lockUntilBlockHeight(blockHeight.height).sign(this._keysToSign!)\n        })\n\n        return this\n    }\n\n    /**\n     * Validates that the account has the necessary keys before performing operations\n     * @throws Error if account or keys are not properly initialized\n     */\n    private validateAccount(): void {\n        if (!this._account) {\n            throw new Error('Account must be set before performing transactions');\n        }\n        if (!this._account.accountKeys) {\n            throw new Error('Account keys are not initialized');\n        }\n        if (!this._account.accountKeys.receiveKeys || this._account.accountKeys.receiveKeys.length === 0) {\n            throw new Error('No receive keys available in account');\n        }\n    }\n\n    private findPrivateKeyFromAddress(addr: string): AddressKey | undefined {\n        const keys: AddressKey[] = this._account.accountKeys.receiveKeys.concat(this._account.accountKeys.changeKeys)\n        return keys.find(key => key.address === addr)\n    }\n}\n","import {rostrumProvider} from '../network/RostrumProvider';\nimport {AccountKeys} from '../models/wallet.entities';\nimport {isNullOrEmpty, MAX_INT64, tokenIdToHex} from './CommonUtils';\nimport {\n    Address,\n    AddressType,\n    GroupToken,\n    Networkish,\n    PrivateKey,\n    Transaction,\n    TransactionBuilder,\n    UnitUtils,\n    UTXO\n} from \"libnexa-ts\";\nimport {PermissionLabel, TxOptions} from \"../models/transaction.entities\";\nimport {dupAuthority, isAuthFit} from \"./TokenUtils\";\n\n/** Maximum number of inputs/outputs allowed in a single transaction */\nconst MAX_INPUTS_OUTPUTS = 250;\n\n/**\n * Populate a transaction with Nexa UTXO inputs and set change output if needed\n *\n * This function automatically selects and adds UTXOs from the provided account keys\n * to satisfy the transaction's Nexa amount requirements. It handles change calculation\n * and can consolidate UTXOs when requested.\n *\n * @param txBuilder - The transaction builder to populate\n * @param keys - Account keys containing receive and change addresses with balances\n * @param totalTxValue - Total amount of Nexa required for the transaction (in satoshis)\n * @param options - Transaction options including consolidation settings and change address\n * @returns Promise resolving to array of private keys needed for signing\n * @throws {Error} If insufficient balance or too many inputs required\n *\n * @example\n * ```typescript\n * const txBuilder = new TransactionBuilder();\n * const keys = await account.getKeys();\n * const privateKeys = await populateNexaInputsAndChange(\n *   txBuilder,\n *   keys,\n *   1000000n, // 1 NEXA\n *   { isConsolidate: false, feeFromAmount: false }\n * );\n * ```\n */\nexport async function populateNexaInputsAndChange(txBuilder: TransactionBuilder, keys: AccountKeys, totalTxValue: bigint, options: TxOptions): Promise<PrivateKey[]> {\n    let rKeys = keys.receiveKeys.filter(k => BigInt(k.balance) > 0n);\n    let cKeys = keys.changeKeys.filter(k => BigInt(k.balance) > 0n);\n    let allKeys = rKeys.concat(cKeys);\n    if (isNullOrEmpty(allKeys)) {\n        throw new Error(\"Not enough Nexa balance.\");\n    }\n\n    let usedKeys = new Map<string, PrivateKey>();\n    let origAmount = options.isConsolidate ? 0 : Number(totalTxValue);\n\n    for (let key of allKeys) {\n        let utxos = await rostrumProvider.getNexaUtxos(key.address);\n        for (let utxo of utxos) {\n            let input: UTXO = {\n                outpoint: utxo.outpoint_hash,\n                address: key.address,\n                satoshis: utxo.value,\n                templateData: options.templateData\n            }\n            txBuilder.from(input);\n\n            if (!usedKeys.has(key.address)) {\n                usedKeys.set(key.address, key.key.privateKey);\n            }\n\n            if (options.isConsolidate) {\n                txBuilder.change(options.toChange ?? keys.receiveKeys[keys.receiveKeys.length - 1].address);\n                if (txBuilder.transaction.inputs.length > MAX_INPUTS_OUTPUTS) {\n                    return Array.from(usedKeys.values());\n                }\n            } else {\n                let tx = txBuilder.transaction;\n                if (tx.inputs.length > MAX_INPUTS_OUTPUTS) {\n                    throw new Error(\"Too many inputs. Consider consolidate transactions or reduce the send amount.\");\n                }\n\n                let unspent = tx.getUnspentValue();\n                if (unspent < 0n) {\n                    continue;\n                }\n\n                if (unspent == 0n && options.feeFromAmount) {\n                    let txFee = tx.estimateRequiredFee();\n                    tx.updateOutputAmount(0, origAmount - txFee);\n                    return Array.from(usedKeys.values());\n                }\n\n                txBuilder.change(options.toChange ?? keys.changeKeys[keys.changeKeys.length - 1].address);\n                if (options.feeFromAmount) {\n                    let hasChange = tx.getChangeOutput();\n                    let txFee = tx.estimateRequiredFee();\n                    tx.updateOutputAmount(0, origAmount - txFee);\n\n                    // edge case where change added after update\n                    if (!hasChange && tx.getChangeOutput()) {\n                        txFee = tx.estimateRequiredFee();\n                        tx.updateOutputAmount(0, origAmount - txFee);\n                    }\n                }\n\n                // check again after change output manipulation\n                if (tx.getUnspentValue() < tx.estimateRequiredFee()) {\n                    // try to add more utxos to satisfy the minimum fee\n                    continue;\n                }\n                return Array.from(usedKeys.values());\n            }\n        }\n    }\n\n    if (options.isConsolidate) {\n        if (usedKeys.size > 0) {\n            return Array.from(usedKeys.values());\n        }\n        throw new Error(\"Not enough Nexa balance.\");\n    }\n\n    let err = {\n        errorMsg: \"Not enough Nexa balance.\",\n        amount: UnitUtils.formatNEXA(txBuilder.transaction.outputs[0].value),\n        fee: UnitUtils.formatNEXA(txBuilder.transaction.estimateRequiredFee())\n    }\n\n    throw new Error(JSON.stringify(err));\n}\n\n/**\n * Populate a transaction with token UTXO inputs and set token change output if needed\n *\n * This function selects and adds token UTXOs from the provided account keys\n * to satisfy the transaction's token amount requirements. It automatically\n * handles token change calculation.\n *\n * @param txBuilder - The transaction builder to populate\n * @param keys - Account keys containing addresses with token balances\n * @param token - The token ID to spend\n * @param outTokenAmount - Amount of tokens required for the transaction\n * @returns Promise resolving to array of private keys needed for signing\n * @throws {Error} If insufficient token balance or too many inputs required\n *\n * @example\n * ```typescript\n * const txBuilder = new TransactionBuilder();\n * const keys = await account.getKeys();\n * const privateKeys = await populateTokenInputsAndChange(\n *   txBuilder,\n *   keys,\n *   'token_id_hex',\n *   1000n // Amount of tokens\n * );\n * ```\n */\nexport async function populateTokenInputsAndChange(txBuilder: TransactionBuilder, keys: AccountKeys, token: string, outTokenAmount: bigint): Promise<PrivateKey[]> {\n    let tokenHex = tokenIdToHex(token);\n    let rKeys = keys.receiveKeys.filter(k => Object.keys(k.tokensBalance).includes(tokenHex));\n    let cKeys = keys.changeKeys.filter(k => Object.keys(k.tokensBalance).includes(tokenHex));\n    let allKeys = rKeys.concat(cKeys);\n\n    if (isNullOrEmpty(allKeys)) {\n        throw new Error(\"Not enough token balance.\");\n    }\n\n    let usedKeys = new Map<string, PrivateKey>();\n    let inTokenAmount = 0n;\n\n    for (let key of allKeys) {\n        let utxos = await rostrumProvider.getTokenUtxos(key.address, token);\n        for (let utxo of utxos) {\n            if (utxo.token_amount < 0) {\n                continue;\n            }\n            txBuilder.from({\n                outpoint: utxo.outpoint_hash,\n                address: key.address,\n                satoshis: utxo.value,\n                groupId: utxo.group,\n                groupAmount: BigInt(utxo.token_amount),\n            });\n\n            inTokenAmount = inTokenAmount + BigInt(utxo.token_amount);\n            if (!usedKeys.has(key.address)) {\n                usedKeys.set(key.address, key.key.privateKey);\n            }\n\n            if (inTokenAmount > MAX_INT64) {\n                throw new Error(\"Token inputs exceeded max amount. Consider sending in small chunks\");\n            }\n            if (txBuilder.transaction.inputs.length > MAX_INPUTS_OUTPUTS) {\n                throw new Error(\"Too many inputs. Consider consolidating transactions or reduce the send amount.\");\n            }\n\n            if (inTokenAmount == outTokenAmount) {\n                return Array.from(usedKeys.values());\n            }\n            if (inTokenAmount > outTokenAmount) {\n                // change\n                txBuilder.to(keys.changeKeys[keys.changeKeys.length - 1].address, Transaction.DUST_AMOUNT, token, inTokenAmount - outTokenAmount);\n                return Array.from(usedKeys.values());\n            }\n        }\n    }\n\n    throw new Error(\"Not enough token balance\");\n}\n\n/**\n * Build a transaction to create a new token group\n *\n * This function creates a group token by using the first UTXO's outpoint\n * to generate a unique group ID. The group token represents the authority\n * to create fungible tokens within this group.\n *\n * @param txBuilder - The transaction builder to populate\n * @param keys - Account keys to use for funding the transaction\n * @param opReturnData - Optional data to include in the group creation\n * @param network - Network to create the group on\n * @returns Promise resolving to array of private keys needed for signing\n * @throws {Error} If insufficient balance for group creation\n *\n * @example\n * ```typescript\n * const txBuilder = new TransactionBuilder();\n * const keys = await account.getKeys();\n * const privateKeys = await buildCreateGroupTransaction(\n *   txBuilder,\n *   keys,\n *   'my_token_data',\n *   Networks.mainnet\n * );\n * ```\n */\nexport async function buildCreateGroupTransaction(\n    txBuilder: TransactionBuilder,\n    keys: AccountKeys,\n    opReturnData: string,\n    network: Networkish\n): Promise<PrivateKey[]> {\n    // TODO validate opreturn data\n    const allKeys = keys.receiveKeys.concat(keys.changeKeys)\n    let outpoint = '';\n    let usedKeys: PrivateKey[] = [];\n    let signKey: PrivateKey | undefined = undefined;\n    for (let key of allKeys) {\n        let utxos = await rostrumProvider.getNexaUtxos(key.address);\n        for (let utxo of utxos) {\n            txBuilder.from({\n                outpoint: utxo.outpoint_hash,\n                address: key.address,\n                satoshis: utxo.value\n            });\n\n            if (isNullOrEmpty(outpoint)) {\n                outpoint = utxo.outpoint_hash;\n                let id = GroupToken.findGroupId(Buffer.from(outpoint, 'hex'), Buffer.from(opReturnData, 'hex'), GroupToken.authFlags.ACTIVE_FLAG_BITS);\n                const groupId = new Address(id.hashBuffer, network, AddressType.GroupIdAddress).toString()\n                txBuilder.to(keys.receiveKeys.at(-1)!.address, Transaction.DUST_AMOUNT, groupId, GroupToken.authFlags.ACTIVE_FLAG_BITS | id.nonce)\n                signKey = key.key.privateKey\n                usedKeys.push(signKey);\n                return usedKeys\n            }\n        }\n    }\n\n    throw new Error(\"Not enough Nexa balance.\");\n}\n\n/**\n * Prepare a transaction to delete/spend a specific UTXO\n *\n * This function adds a specific UTXO as input to the transaction.\n * It's commonly used for spending token authority UTXOs or consolidating specific outputs.\n *\n * @param txBuilder - The transaction builder to populate\n * @param keys - Account keys to find the private key for the UTXO\n * @param outpoint - The outpoint (txid:vout) of the UTXO to spend\n * @returns Promise resolving to array containing the private key for the UTXO\n * @throws {Error} If the UTXO is not found or the associated key is not in the wallet\n *\n * @example\n * ```typescript\n * const txBuilder = new TransactionBuilder();\n * const keys = await account.getKeys();\n * const privateKeys = await prepareDeleteTransaction(\n *   txBuilder,\n *   keys,\n *   'txid:0'\n * );\n * ```\n */\nexport async function prepareDeleteTransaction(txBuilder: TransactionBuilder, keys: AccountKeys, outpoint: string): Promise<PrivateKey[]> {\n    let utxo = await rostrumProvider.getUtxo(outpoint);\n    let address = utxo.addresses[0];\n\n    txBuilder.from({\n        outpoint: outpoint,\n        address: address,\n        satoshis: utxo.amount\n    });\n\n    let allKeys = keys.receiveKeys.concat(keys.changeKeys);\n    let addrKey = allKeys.find(k => k.address === address);\n\n    if (!addrKey) {\n        throw new Error('UTXO associated key not found in the wallet');\n    }\n    return [addrKey.key.privateKey];\n}\n\n/**\n * Populate a transaction with token authority inputs for specific permissions\n *\n * This function finds and adds token authority UTXOs that have the required\n * permissions for token operations like minting, melting, or creating subgroups.\n * It automatically handles authority renewal if the authority allows it.\n *\n * @param txBuilder - The transaction builder to populate\n * @param keys - Account keys containing addresses with token authorities\n * @param token - The token ID to find authorities for\n * @param perm - The permission type required ('mint', 'melt', 'subgroup', etc.)\n * @param subgroup - Optional subgroup token ID for subgroup operations\n * @param subgroupAddr - Optional address to receive subgroup authority\n * @returns Promise resolving to array of private keys needed for signing\n * @throws {Error} If the required authority is not found\n *\n * @example\n * ```typescript\n * const txBuilder = new TransactionBuilder();\n * const keys = await account.getKeys();\n * const privateKeys = await populateTokenAuth(\n *   txBuilder,\n *   keys,\n *   'token_id_hex',\n *   'mint'\n * );\n * ```\n */\nexport async function populateTokenAuth(txBuilder: TransactionBuilder, keys: AccountKeys, token: string, perm: PermissionLabel, subgroup = '', subgroupAddr = ''): Promise<PrivateKey[]> {\n    let allKeys = keys.receiveKeys.concat(keys.changeKeys);\n    for (let key of allKeys) {\n        let utxos = await rostrumProvider.getTokenUtxos(key.address, token);\n        for (let utxo of utxos) {\n            if (!isAuthFit(utxo.token_amount, perm)) {\n                continue;\n            }\n\n            txBuilder.from({\n                outpoint: utxo.outpoint_hash,\n                address: key.address,\n                satoshis: utxo.value\n            });\n\n            if (perm === 'subgroup') {\n                txBuilder.to(subgroupAddr, Transaction.DUST_AMOUNT, subgroup, dupAuthority(utxo.token_amount, false));\n            }\n\n            // if renew flag included, we don't want to burn it\n            if (GroupToken.allowsRenew(BigInt.asUintN(64, BigInt(utxo.token_amount)))) {\n                txBuilder.to(keys.receiveKeys.at(-1)!.address, Transaction.DUST_AMOUNT, token, dupAuthority(utxo.token_amount));\n            }\n\n            return [key.key.privateKey];\n        }\n    }\n\n    throw new Error(\"The requested authority not found\");\n}\n\n/**\n * Populate a transaction with multiple token authorities and create duplicates\n *\n * This function finds token authority UTXOs for multiple permissions and\n * creates duplicate outputs for each authority. This is useful for complex\n * token operations that require multiple permissions while preserving the authorities.\n *\n * @param txBuilder - The transaction builder to populate\n * @param keys - Account keys containing addresses with token authorities\n * @param token - The token ID to find authorities for\n * @param perms - Array of permission types required\n * @param toAddr\n * @returns Promise resolving to array of private keys needed for signing\n * @throws {Error} If any required authority is not found\n *\n * @example\n * ```typescript\n * const txBuilder = new TransactionBuilder();\n * const keys = await account.getKeys();\n * const privateKeys = await populateAndDuplicateTokenAuths(\n *   txBuilder,\n *   keys,\n *   'token_id_hex',\n *   ['mint', 'melt']\n * );\n * ```\n */\nexport async function populateAndDuplicateTokenAuths(txBuilder: TransactionBuilder, keys: AccountKeys, token: string, perms: PermissionLabel[], toAddr?: string): Promise<PrivateKey[]> {\n    let allKeys = keys.receiveKeys.concat(keys.changeKeys);\n    let usedKeys: PrivateKey[] = [];\n\n    let reqiredPerms = new Set(perms);\n    reqiredPerms.add('authorise');\n\n    for (let key of allKeys) {\n        let utxos = await rostrumProvider.getTokenUtxos(key.address, token);\n        for (let utxo of utxos) {\n            if (utxo.token_amount > 0) {\n                continue;\n            }\n\n            let found = false;\n            for (let perm of reqiredPerms) {\n                if (isAuthFit(utxo.token_amount, perm)) {\n                    reqiredPerms.delete(perm);\n                    found = true;\n                }\n            }\n\n            if (!found) {\n                continue;\n            }\n\n            txBuilder.from({\n                outpoint: utxo.outpoint_hash,\n                address: key.address,\n                satoshis: utxo.value\n            });\n            usedKeys.push(key.key.privateKey);\n\n            // duplicate\n            txBuilder.to(toAddr != null ? toAddr : keys.receiveKeys.at(-1)!.address, Transaction.DUST_AMOUNT, token, dupAuthority(utxo.token_amount));\n\n            if (reqiredPerms.size === 0) {\n                return usedKeys;\n            }\n        }\n    }\n\n    throw new Error(\"The required authorities not found\");\n}\n","import {PermissionLabel} from \"../models/transaction.entities\";\nimport {GroupToken} from \"libnexa-ts\";\n\nexport function isAuthFit(authFlags: bigint | number, permission: PermissionLabel): boolean {\n    if (authFlags > 0) {\n        return false;\n    }\n\n    let flags = BigInt.asUintN(64, BigInt(authFlags));\n    switch (permission) {\n        case 'authorise':\n            return GroupToken.allowsRenew(flags);\n        case 'mint':\n            return GroupToken.allowsMint(flags);\n        case 'melt':\n            return GroupToken.allowsMelt(flags);\n        case 'rescript':\n            return GroupToken.allowsRescript(flags);\n        case 'subgroup':\n            return GroupToken.allowsSubgroup(flags);\n        default:\n            return false;\n    }\n}\n\nexport function dupAuthority(authFlags: bigint | number, withSubgroup = true): bigint {\n    if (authFlags > 0) {\n        return 0n;\n    }\n\n    let flags = BigInt.asUintN(64, BigInt(authFlags));\n    let newFlags = GroupToken.authFlags.AUTHORITY;\n\n    if (GroupToken.allowsRenew(flags)) {\n        newFlags |= GroupToken.authFlags.BATON;\n    }\n    if (GroupToken.allowsMint(flags)) {\n        newFlags |= GroupToken.authFlags.MINT;\n    }\n    if (GroupToken.allowsMelt(flags)) {\n        newFlags |= GroupToken.authFlags.MELT;\n    }\n    if (GroupToken.allowsRescript(flags)) {\n        newFlags |= GroupToken.authFlags.RESCRIPT;\n    }\n    if (GroupToken.allowsSubgroup(flags) && withSubgroup) {\n        newFlags |= GroupToken.authFlags.SUBGROUP;\n    }\n\n    return newFlags;\n}\n\nexport function buildAuthority(perms: PermissionLabel[]): bigint {\n    let newFlags = GroupToken.authFlags.AUTHORITY;\n    for (let perm of perms) {\n        switch (perm) {\n            case 'authorise':\n                newFlags |= GroupToken.authFlags.BATON;\n                break;\n            case 'mint':\n                newFlags |= GroupToken.authFlags.MINT;\n                break;\n            case 'melt':\n                newFlags |= GroupToken.authFlags.MELT;\n                break;\n            case 'rescript':\n                newFlags |= GroupToken.authFlags.RESCRIPT;\n                break;\n            case 'subgroup':\n                newFlags |= GroupToken.authFlags.SUBGROUP;\n                break;\n        }\n    }\n    return newFlags;\n}\n","import {\n    Address,\n    AddressType,\n    GroupToken,\n    Networkish,\n    Networks, Output, Script,\n    ScriptFactory,\n    Transaction,\n    TransactionBuilder\n} from \"libnexa-ts\";\nimport {PermissionLabel, TokenAction, TxOptions} from \"../../../models/transaction.entities\";\nimport {isValidNexaAddress} from \"../../../utils/WalletUtils\";\nimport {parseInt} from \"lodash-es\";\nimport {MAX_INT64} from \"../../../utils/CommonUtils\";\nimport {rostrumProvider} from \"../../../network/RostrumProvider\";\n\n/**\n * Abstract base class for creating and managing transactions in the NEXA blockchain.\n * Provides common functionality for transaction building including token operations,\n * address validation, and output creation.\n */\nexport abstract class TransactionCreator {\n\n    /** The underlying transaction builder instance */\n    private _transactionBuilder!: TransactionBuilder;\n    /** Set of token actions to be performed in this transaction */\n    private _tokens!: Set<TokenAction>;\n    /** Array of async functions to execute when building the transaction */\n    private _builder: (() => Promise<any>)[] = [];\n    /** Total value of NEXA being sent in this transaction */\n    private _totalValue: bigint = BigInt(0);\n    /** Network this transaction will be broadcast on */\n    private _network: Networkish = Networks.mainnet\n    /** Transaction options for customizing behavior */\n    private _txOptions: TxOptions = {}\n\n    /**\n     * Creates a new TransactionCreator instance\n     * @param tx Optional existing TransactionBuilder, hex string, or buffer\n     */\n    protected constructor(tx?: TransactionBuilder | string | Buffer) {\n        if (tx instanceof TransactionBuilder) {\n            this.transactionBuilder = tx;\n        }\n        this.tokens = new Set<TokenAction>()\n        this.transactionBuilder = new TransactionBuilder();\n    }\n\n    /** Parse transaction from hex string - must be implemented by subclasses */\n    public abstract parseTxHex(tx:string): this\n    /** Parse transaction from buffer - must be implemented by subclasses */\n    public abstract parseTxBuffer(tx: Buffer): this\n\n    /**\n     * Sets the network for this transaction\n     * @param network Network name or Networkish object\n     * @returns This instance for chaining\n     */\n    public onNetwork(network: string | Networkish) {\n        this.network = Networks.get(network)!\n        return this\n    }\n\n    /** Gets transaction options */\n    get txOptions(): TxOptions {\n        return this._txOptions;\n    }\n\n    /** Sets transaction options */\n    set txOptions(value: TxOptions) {\n        this._txOptions = value;\n    }\n\n    /** Gets the network for this transaction */\n    get network(): Networkish {\n        return this._network;\n    }\n\n    /** Sets the network for this transaction */\n    set network(value: Networkish) {\n        this._network = value;\n    }\n\n    /** Gets the builder function array */\n    get builder(): (() => Promise<any>)[] {\n        return this._builder;\n    }\n\n    /** Sets the builder function array */\n    set builder(value: (() => Promise<any>)[]) {\n        this._builder = value;\n    }\n\n    /** Gets the underlying transaction builder */\n    get transactionBuilder(): TransactionBuilder {\n        return this._transactionBuilder;\n    }\n\n    /** Sets the underlying transaction builder */\n    set transactionBuilder(value: TransactionBuilder) {\n        this._transactionBuilder = value;\n    }\n\n    /** Gets the set of token actions */\n    get tokens(): Set<TokenAction> {\n        return this._tokens;\n    }\n\n    /** Sets the set of token actions */\n    set tokens(value: Set<TokenAction>) {\n        this._tokens = value;\n    }\n\n    /** Gets the total NEXA value being sent */\n    get totalValue(): bigint {\n        return this._totalValue;\n    }\n\n    /** Sets the total NEXA value being sent */\n    set totalValue(value: bigint) {\n        this._totalValue = value;\n    }\n\n    /**\n     * Validates and creates a token action\n     * @param toAddr Destination address\n     * @param amount Amount to send\n     * @param token Token ID\n     * @param action Action type (mint, melt, send, etc.)\n     * @throws Error if validation fails\n     */\n    protected tokenAction(toAddr: string, amount: string, token: string, action: string){\n        // Validate destination address\n        if (!isValidNexaAddress(toAddr, this.network) && !isValidNexaAddress(toAddr, this.network, AddressType.PayToPublicKeyHash)) {\n            throw new Error('Invalid Address.');\n        }\n\n        // Validate amount ranges\n        if ((token && BigInt(amount) < 1n) || (!token && parseInt(amount) < Transaction.DUST_AMOUNT)) {\n            throw new Error(\"The amount is too low.\");\n        }\n        if ((token && BigInt(amount) > MAX_INT64) || (!token && parseInt(amount) > Transaction.MAX_MONEY)) {\n            throw new Error(\"The amount is too high.\");\n        }\n\n        // Validate token ID\n        if (!isValidNexaAddress(token, this.network, AddressType.GroupIdAddress)) {\n            throw new Error('Invalid Token ID');\n        }\n\n        // Ensure tokens are sent to script template addresses\n        if (Address.getOutputType(toAddr) === 0) {\n            throw new Error('Token must be sent to script template address');\n        }\n\n        // Add output to transaction\n        this.transactionBuilder.to(toAddr, Transaction.DUST_AMOUNT, token, BigInt(amount))\n\n        // Record the token action\n        this.tokens.add({\n            token: token,\n            amount: BigInt(amount),\n            action: action\n        })\n    }\n\n    /**\n     * Configures transaction to consolidate UTXOs to a single address\n     * @param toAddr Address to consolidate funds to\n     * @returns This instance for chaining\n     */\n    public consolidate(toAddr: string): this {\n        this.builder.push(async () => {\n            if (!isValidNexaAddress(toAddr, this.network) && !isValidNexaAddress(toAddr, this.network, AddressType.PayToPublicKeyHash)) {\n                throw new Error('Invalid Address.');\n            }\n            this._txOptions.isConsolidate = true\n            this._txOptions.toChange = toAddr\n        })\n        return this\n    }\n\n    /**\n     * Configures transaction to deduct fee from the send amount\n     * @returns This instance for chaining\n     */\n    public feeFromAmount(): this{\n        this.builder.push(async () => {\n            this._txOptions.feeFromAmount = true\n        })\n        return this\n    }\n\n    /**\n     * Adds a token send operation to the transaction\n     * @param toAddr Destination address\n     * @param amount Amount of tokens to send\n     * @param token Token ID\n     * @returns This instance for chaining\n     */\n    public sendToToken(toAddr: string, amount: string, token: string): this {\n        this.builder.push(async () => {\n            this.tokenAction(toAddr, amount, token, 'send')\n        })\n\n        return this;\n    }\n\n    /**\n     * Adds a NEXA send operation to the transaction\n     * @param toAddr Destination address\n     * @param amount Amount of NEXA to send\n     * @returns This instance for chaining\n     */\n    public sendTo(toAddr: string, amount: string){\n        this.builder.push(async () => {\n            if (!isValidNexaAddress(toAddr, this.network) && !isValidNexaAddress(toAddr, this.network, AddressType.PayToPublicKeyHash)) {\n                throw new Error('Invalid Address.');\n            }\n            this.transactionBuilder.to(toAddr, amount);\n            this.totalValue = BigInt(this.totalValue + amount)\n        })\n        return this;\n    }\n\n    /**\n     * Adds a token authority renewal operation\n     * @param token Token ID to renew authority for\n     * @param perms Permissions to renew\n     * @param toAddr\n     * @returns This instance for chaining\n     */\n    public renewAuthority(token: string, perms: PermissionLabel[], toAddr?: string): this {\n        this.builder.push(async() => {\n            if(toAddr != null) {\n                if (!isValidNexaAddress(toAddr, this.network) && !isValidNexaAddress(toAddr, this.network, AddressType.PayToPublicKeyHash)) {\n                    throw new Error('Invalid Address.');\n                }\n            }\n\n            this.tokens.add({\n                token: token,\n                action: 'renew',\n                amount: BigInt(Transaction.DUST_AMOUNT),\n                parentToken: undefined,\n                extraData: {\n                    perms: perms,\n                    address: toAddr\n                }\n            })\n        })\n        return this\n    }\n\n    /**\n     * Adds a token authority deletion operation\n     * @param token Token ID to delete authority for\n     * @param outpoint Outpoint of the authority to delete\n     * @returns This instance for chaining\n     */\n    public deleteAuthority(token:string, outpoint: string): this {\n        this.builder.push(async () => {\n            this.tokens.add({\n                token: token,\n                action: 'delete',\n                amount: BigInt(Transaction.DUST_AMOUNT),\n                parentToken: undefined,\n                extraData: {\n                    outpoint: outpoint\n                }\n            })\n        })\n        return this\n    }\n\n    /**\n     * Creates a legacy token (not implemented)\n     * @returns This instance for chaining\n     */\n    public legacyToken(name: string, ticker: string, decimals: number, docUrl: string, docHash: string): this {\n        this.builder.push(async () => {\n            const opReturn = ScriptFactory.buildTokenDescriptionLegacy(\n                ticker,\n                name,\n                docUrl,\n                docHash,\n                decimals\n            )\n            this.transactionBuilder.addData(opReturn, true)\n            this.tokens.add({\n                action: 'group',\n                amount: BigInt(Transaction.DUST_AMOUNT),\n                extraData: {\n                    opReturnData: opReturn.toHex()\n                }\n            })\n        })\n        return this\n    }\n\n    /**\n     * Creates a legacy group (not implemented)\n     * @returns This instance for chaining\n     */\n    public legacyGroup(name: string, ticker: string, docUrl: string, docHash: string): this {\n        this.builder.push(async () => {\n            const opReturn = ScriptFactory.buildTokenDescriptionLegacy(\n                ticker,\n                name,\n                docUrl,\n                docHash,\n            )\n            this.transactionBuilder.addData(opReturn, true)\n            this.tokens.add({\n                action: 'group',\n                amount: BigInt(Transaction.DUST_AMOUNT),\n                extraData: {\n                    opReturnData: opReturn.toHex()\n                }\n            })\n        })\n        return this\n    }\n\n    /**\n     * Creates a token with metadata\n     * @param name Token name\n     * @param ticker Token ticker symbol\n     * @param decimals Number of decimal places\n     * @param docUrl URL to token documentation\n     * @param docHash Hash of token documentation\n     * @returns This instance for chaining\n     */\n    public token(name: string, ticker: string, decimals: number, docUrl: string, docHash: string): this {\n        this.builder.push(async () => {\n            const opReturn = ScriptFactory.buildTokenDescription(\n                ticker,\n                name,\n                docUrl,\n                docHash,\n                decimals\n            )\n            this.transactionBuilder.addData(opReturn, true)\n            this.tokens.add({\n                action: 'group',\n                amount: BigInt(Transaction.DUST_AMOUNT),\n                extraData: {\n                    opReturnData: opReturn.toHex()\n                }\n            })\n        })\n        return this\n    }\n\n    /**\n     * Creates an NFT collection with metadata\n     * @param name Collection name\n     * @param ticker Collection ticker symbol\n     * @param docUrl URL to collection documentation\n     * @param docHash Hash of collection documentation\n     * @returns This instance for chaining\n     */\n    public collection(name: string, ticker: string, docUrl: string, docHash: string): this {\n        this.builder.push(async () => {\n            const opReturn = ScriptFactory.buildNFTCollectionDescription(\n                ticker,\n                name,\n                docUrl,\n                docHash\n            )\n            this.transactionBuilder.addData(opReturn, true)\n            this.tokens.add({\n                action: 'group',\n                amount: BigInt(Transaction.DUST_AMOUNT),\n                extraData: {\n                    opReturnData: opReturn.toHex()\n                }\n            })\n        })\n\n        return this\n    }\n\n    /**\n     * Creates an NFT within a collection\n     * @param parent Parent collection token ID\n     * @param zipUrl URL to NFT content ZIP file\n     * @param zipHash Hash of NFT content ZIP file\n     * @returns This instance for chaining\n     */\n    public nft(parent: string, zipUrl: string, zipHash: string) {\n        this.builder.push(async () => {\n            // add op_return for the nft\n            let opReturn = ScriptFactory.buildNFTDescription(zipUrl, zipHash);\n            this.transactionBuilder.addData(opReturn, true);\n            // generate subgroup ID\n            const subGroup = GroupToken.generateSubgroupId(parent, opReturn.toBuffer()).toString('hex')\n            this.tokens.add({\n                token: subGroup,\n                parentToken: parent,\n                amount: BigInt(Transaction.DUST_AMOUNT),\n                action: 'subgroup'\n            })\n        })\n        return this\n    }\n\n    /**\n     * Adds an OP_RETURN output to the transaction\n     * @param data Data to include in the OP_RETURN\n     * @param isFullScript Whether the data is already a complete script\n     * @returns This instance for chaining\n     */\n    public addOpReturn(data: Buffer | string | Script, isFullScript = false) {\n        this.builder.push(async () => {\n            let script = isFullScript ? new Script(data) : ScriptFactory.buildDataOut(data);\n            let output = new Output(0, script);\n            this.transactionBuilder.transaction.addOutput(output);\n        })\n\n        return this;\n    }\n\n    /** Populates the transaction with inputs and outputs - must be implemented by subclasses */\n    abstract populate(): this\n\n    /**\n     * Builds the transaction by executing all queued operations\n     * @returns Promise resolving to the serialized transaction hex\n     */\n    public async build(): Promise<string>{\n        for (const task of this.builder) {\n            await task();\n        }\n        return this.transactionBuilder.transaction.serialize(({disableAll: true}));\n    }\n\n}\n","import bigDecimal from \"js-big-decimal\";\nimport {BaseAccount} from \"./interfaces/BaseAccountInterface\";\nimport {\n    AccountType,\n    discoverNexaAccount,\n    generateAccountKey,\n    generateKeyAndAddress, generateKeysAndAddresses,\n    getNextAccountIndex\n} from \"../../utils/WalletUtils\";\nimport {HDPrivateKey} from \"libnexa-ts\";\nimport DAppAccount from \"./models/DappAccount\";\nimport VaultAccount from \"./models/VaultAccount\";\nimport DefaultAccount from \"./models/DefaultAccount\";\nimport {AccountIndexes, AddressKey} from \"../../models/wallet.entities\";\n\n/**\n * AccountStore manages a collection of wallet accounts of different types.\n * It provides functionality to create, import, export, and manage accounts\n * including DApp accounts, Vault accounts, and Default NEXA accounts.\n */\nexport default class AccountStore {\n\n    /** Map storing all accounts indexed by their unique store key */\n    private readonly _accounts: Map<string, BaseAccount>\n\n    /**\n     * Creates a new AccountStore instance\n     * Initializes an empty map to store accounts\n     */\n    public constructor() {\n        this._accounts = new Map<string, BaseAccount>()\n    }\n\n    /**\n     * Generates a unique store key for an account based on its type and index\n     * @param accountType The type of account (DAPP, VAULT, or DEFAULT)\n     * @param index The account index\n     * @returns Unique string key for storing the account\n     */\n    private getAccountStoreKey(accountType: AccountType, index: number): String {\n        switch (accountType){\n            case AccountType.DAPP_ACCOUNT:\n                // DApp accounts use format: \"2.index\"\n                return String(accountType + '.' + index);\n            case AccountType.VAULT_ACCOUNT:\n                // Vault accounts use format: \"1.index\"\n                return String(accountType + '.' + index);\n            default:\n                // Default accounts use just the index\n                return String(index)\n        }\n    }\n\n    /**\n     * Creates a new account of the specified type\n     * @param accountType Type of account to create (DAPP, VAULT, or DEFAULT)\n     * @param masterKey Master HD private key for deriving account keys\n     * @returns Promise resolving to the created account\n     */\n    async createAccount(accountType: AccountType, masterKey: HDPrivateKey): Promise<BaseAccount> {\n        // Get the next available index for this account type\n        const nextIndex = await getNextAccountIndex(accountType, masterKey);\n        const accountStoreKey = this.getAccountStoreKey(accountType, nextIndex)\n        \n        // Check if account already exists\n        const indexExists = this._accounts.get(String(accountStoreKey))\n        if(indexExists) {\n            return indexExists\n        }\n        \n        switch (accountType){\n            case AccountType.DAPP_ACCOUNT:\n                // Create DApp account (purpose 2)\n                let dappAccountKey = generateAccountKey(masterKey, 2);\n                const dAppAccount = new DAppAccount(2, nextIndex, generateKeyAndAddress(dappAccountKey, nextIndex))\n                await dAppAccount.loadBalances();\n                this._accounts.set(dAppAccount.getAccountStoreKey(), dAppAccount)\n                return dAppAccount\n            case AccountType.VAULT_ACCOUNT:\n                // Create Vault account (purpose 1)\n                let vaultAccountKey = generateAccountKey(masterKey, 1);\n                const vaultAccount = new VaultAccount(1, nextIndex, generateKeyAndAddress(vaultAccountKey, nextIndex))\n                await vaultAccount.loadBalances();\n                this._accounts.set(vaultAccount.getAccountStoreKey(), vaultAccount)\n                return vaultAccount\n            default:\n                // Create default NEXA account with receive and change addresses\n                let nexaAccountKey = generateAccountKey(masterKey, nextIndex);\n                const nexaAccountIndexes: AccountIndexes = { rIndex: 0, cIndex: 0 };\n                const nexaAccount = new DefaultAccount(nextIndex, nexaAccountIndexes, generateKeysAndAddresses(nexaAccountKey, nexaAccountIndexes.rIndex + 1, nexaAccountIndexes.rIndex + 20, nexaAccountIndexes.cIndex + 1, nexaAccountIndexes.cIndex + 20))\n                await nexaAccount.loadBalances()\n                this._accounts.set(nexaAccount.getAccountStoreKey(), nexaAccount)\n                return nexaAccount;\n        }\n    }\n\n    /**\n     * Finds the private key associated with a given address across all accounts\n     * @param address The address to search for\n     * @returns The AddressKey containing the private key, or null if not found\n     */\n    findKeyForAddress(address: string): AddressKey | null {\n        // Search through all accounts\n        for (const [_, account] of this._accounts.entries()) {\n            // Combine receive and change keys for this account\n            const allKeys = account.accountKeys.receiveKeys.concat(account.accountKeys.changeKeys)\n            \n            // Check each key for a matching address\n            for(const key of allKeys){\n                if(key.address == address) {\n                    return key\n                }\n            }\n        }\n        return null\n    }\n\n    /**\n     * Imports an existing account into the store\n     * @param accountData The account data to import\n     * @throws Error if an account with the same key already exists\n     */\n    importAccount(accountData: BaseAccount): void {\n        let index: string = accountData.getAccountStoreKey()\n        if(this._accounts.get(index)) {\n            throw Error('Account already exists!')\n        }\n        this._accounts.set(String(index), accountData)\n    }\n\n    /**\n     * Exports account data by index\n     * @param accountIndex The account index to export\n     * @returns The account data\n     * @throws Error if the account doesn't exist\n     */\n    exportAccount(accountIndex: string): BaseAccount {\n        if(!this._accounts.get(accountIndex)) {\n            throw Error('Cannot find account!')\n        }\n\n        return this._accounts.get(accountIndex)!\n    }\n\n    /**\n     * Removes an account from the store\n     * @param accountIndex The account index to remove\n     * @throws Error if the account doesn't exist\n     */\n    removeAccount(accountIndex: string): void {\n        if(!this._accounts.get(accountIndex)) {\n            throw Error('Cannot find account!')\n        }\n        this._accounts.delete(accountIndex)\n    }\n\n    /**\n     * Returns all accounts in the store\n     * @returns Map of account store keys to BaseAccount objects\n     */\n    listAccounts(): Map<string, BaseAccount> {\n        return this._accounts\n    }\n\n    /**\n     * Retrieves a specific account by its index\n     * @param index The account index to retrieve\n     * @returns The account if found, undefined otherwise\n     */\n    getAccount(index:string): BaseAccount | undefined {\n        return this._accounts.get(index)\n    }\n}\n","import { isString } from 'lodash-es';\n\n/** Type definition for constructor functions */\ntype Class<T> = new (...args: any[]) => T; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n/**\n * Utility class for validating arguments and state conditions\n * \n * Provides methods to validate function arguments and application state\n * with consistent error handling and messaging.\n */\nexport default class ValidationUtils {\n\n    /**\n     * Validate that a state condition is true\n     * \n     * @param condition - The condition to validate\n     * @param message - Error message to throw if condition is false\n     * @throws {Error} If condition is false\n     * \n     * @example\n     * ```typescript\n     * ValidationUtils.validateState(wallet.isInitialized, 'Wallet must be initialized');\n     * ```\n     */\n    public static validateState(condition: boolean, message: string): void {\n        if (!condition) {\n            throw new Error(`Invalid State: ${message}`);\n        }\n    }\n\n    /**\n     * Validate that an argument condition is true\n     * \n     * @param condition - The condition to validate\n     * @param argumentName - Name of the argument being validated\n     * @param message - Optional additional error message\n     * @throws {Error} If condition is false\n     * \n     * @example\n     * ```typescript\n     * ValidationUtils.validateArgument(\n     *   typeof amount === 'number',\n     *   'amount',\n     *   'must be a number'\n     * );\n     * ```\n     */\n    public static validateArgument(condition: boolean, argumentName: string, message = \"\"): void {\n        if (!condition) {\n            throw new Error(`Invalid Argument: ${argumentName}. ${message}`);\n        }\n    }\n\n    /**\n     * Validate that an argument is of the expected type\n     * \n     * @param argument - The argument to validate\n     * @param type - Expected type (string name or constructor function)\n     * @param argumentName - Name of the argument being validated\n     * @throws {TypeError} If argument is not of expected type\n     * \n     * @example\n     * ```typescript\n     * ValidationUtils.validateArgumentType(buffer, 'Buffer', 'data');\n     * ValidationUtils.validateArgumentType(wallet, Wallet, 'wallet');\n     * ValidationUtils.validateArgumentType(amount, 'number', 'amount');\n     * ```\n     */\n    public static validateArgumentType<T>(argument: unknown, type: string | Class<T>, argumentName?: string): void {\n        argumentName = argumentName || '(unknown name)';\n        if (isString(type)) {\n            if (type === 'Buffer') {\n                if (!Buffer.isBuffer(argument)) {\n                    throw new TypeError(`Invalid Argument for ${argumentName}, expected ${type} but got ${typeof argument}`);\n                }\n            } else if (typeof argument !== type) {\n                throw new TypeError(`Invalid Argument for ${argumentName}, expected ${type} but got ${typeof argument}`);\n            }\n        } else {\n            if (!(argument instanceof type)) {\n                throw new TypeError(`Invalid Argument for ${argumentName}, expected ${type} but got ${typeof argument}`);\n            }\n        }\n    }\n}\n","import {Networkish, Networks, TransactionBuilder} from \"libnexa-ts\";\nimport WatchOnlyTransactionCreator from \"./transactions/WatchOnlyTransactionCreator\";\nimport {rostrumProvider} from \"../network/RostrumProvider\";\nimport {WatchOnlyAddress} from \"../models/wallet.entities\";\nimport {isArray, isBuffer, isNil, isObject, isString} from \"lodash-es\";\nimport ValidationUtils from \"../utils/ValidationUtils\";\nimport {isValidNexaAddress} from \"../utils/WalletUtils\";\nimport {SubscribeCallback} from \"@vgrunner/electrum-cash\";\nimport {isNullOrEmpty} from \"../utils/CommonUtils\";\n\n/**\n * WatchOnlyWallet provides functionality for monitoring and creating transactions\n * for addresses without storing private keys. This allows users to track balances\n * and create unsigned transactions that can be signed elsewhere.\n */\nexport default class WatchOnlyWallet {\n    /** The blockchain network this wallet operates on */\n    private readonly _network: Networkish\n    /** Array of addresses to monitor without their private keys */\n    private readonly _addressesToWatch: WatchOnlyAddress[];\n\n    /**\n     * Creates a new WatchOnlyWallet instance\n     * @param addressesToWatch Array of addresses to monitor\n     * @param network Optional network name (defaults to mainnet)\n     * @throws Error if validation fails\n     */\n    constructor(addressesToWatch: WatchOnlyAddress[], network?: string) {\n        // Validate network parameter\n        if (network !== undefined && !isString(network)) {\n            throw new Error('Network must be a string');\n        }\n\n        if (network !== undefined && isString(network)) {\n            const n = Networks.get(network)\n            if (n === undefined) {\n                throw new Error(`Invalid network: ${network}`);\n            }\n        }\n\n        this._network = Networks.get(network) ?? Networks.mainnet;\n        // Validate addressesToWatch parameter\n        this._addressesToWatch = this.validateAddressesToWatch(addressesToWatch);\n    }\n\n    /**\n     * Validates the addresses to watch array\n     * @param addressesToWatch Array of addresses to validate\n     * @returns Validated array of WatchOnlyAddress objects\n     * @throws Error if validation fails\n     */\n    private validateAddressesToWatch(addressesToWatch: WatchOnlyAddress[]): WatchOnlyAddress[] {\n        if (addressesToWatch === null || addressesToWatch === undefined) {\n            throw new Error('addresesToWatch is required');\n        }\n        \n        if (!isArray(addressesToWatch)) {\n            throw new Error('addressesToWatch must be an array');\n        }\n\n        // Check if array is not empty\n        if (addressesToWatch.length === 0) {\n            throw new Error('addressesToWatch cannot be empty');\n        }\n\n        // Validate each address object\n        const validatedAddresses: WatchOnlyAddress[] = [];\n\n        for (let i = 0; i < addressesToWatch.length; i++) {\n            const addr = addressesToWatch[i];\n\n            // Check if address is an object\n            if (!isObject(addr) || isArray(addr)) {\n                throw new Error(`addressesToWatch[${i}] must be an object`);\n            }\n\n            // Check if address property exists and is a string\n            if (!addr.hasOwnProperty('address') || !isString(addr.address)) {\n                throw new Error(`addressesToWatch[${i}].address must be a string`);\n            }\n\n            // Check if address is not empty\n            if (addr.address.trim() === '') {\n                throw new Error(`addressesToWatch[${i}].address cannot be empty`);\n            }\n\n            // Validate address format\n            if (!isValidNexaAddress(addr.address, this._network)) {\n                throw new Error(`addressesToWatch[${i}].address is not a valid NEXA address: ${addr.address}`);\n            }\n\n            // Validate optional xPub property\n            if (addr.xPub !== undefined && !isObject(addr.xPub)) {\n                throw new Error(`addressesToWatch[${i}].xPub must be a PublicKey object`);\n            }\n\n            // Validate optional derivationPath property\n            if (addr.derivationPath !== undefined && !isString(addr.derivationPath)) {\n                throw new Error(`addressesToWatch[${i}].derivationPath must be a string`);\n            }\n\n            // Check for duplicate addresses\n            const isDuplicate = validatedAddresses.some(existingAddr =>\n                existingAddr.address === addr.address\n            );\n            if (isDuplicate) {\n                throw new Error(`Duplicate address found: ${addr.address}`);\n            }\n\n            validatedAddresses.push({\n                address: addr.address.trim(),\n                xPub: addr.xPub,\n                derivationPath: addr.derivationPath\n            });\n        }\n\n        return validatedAddresses;\n    }\n\n    /**\n     * Creates a new transaction creator for this watch-only wallet\n     * @param x Optional transaction data - can be a TransactionBuilder, hex string, or Buffer\n     * @returns WatchOnlyTransactionCreator configured with wallet's addresses and network\n     */\n    public newTransaction(x?: TransactionBuilder | string | Buffer): WatchOnlyTransactionCreator {\n        let tx: WatchOnlyTransactionCreator;\n\n        // Handle different input types for creating transactions\n        if (x instanceof TransactionBuilder) {\n            // Use existing TransactionBuilder instance\n            tx = new WatchOnlyTransactionCreator(x);\n        } else if (isString(x)) {\n            // Parse transaction from hex string\n            tx = new WatchOnlyTransactionCreator().parseTxHex(x);\n        } else if (isBuffer(x) && !isNil(x)) {\n            // Parse transaction from buffer\n            tx = new WatchOnlyTransactionCreator().parseTxBuffer(x);\n        } else {\n            // Create new empty transaction\n            tx = new WatchOnlyTransactionCreator();\n        }\n\n        // Configure transaction with wallet's addresses and network\n        return tx.from(this._addressesToWatch).onNetwork(this._network);\n    }\n\n    /**\n     * Broadcasts a signed transaction to the network\n     * @param transaction Hex-encoded signed transaction\n     * @returns Promise resolving to transaction ID\n     * @throws Error if transaction is invalid or broadcast fails\n     */\n    public async sendTransaction(transaction: string): Promise<string> {\n        ValidationUtils.validateArgument(isString(transaction), 'transaction must be present and valid')\n        return rostrumProvider.broadcast(transaction)\n    }\n\n    public async subscribeToAddressNotifications(callback: SubscribeCallback): Promise<void>{\n        await rostrumProvider.subscribeToAddresses(this._addressesToWatch.map(addr => addr.address), callback)\n    }\n\n    /**\n     * Gets the list of addresses being watched\n     * @returns Array of watched addresses (copy to prevent mutation)\n     */\n    public getWatchedAddresses(): WatchOnlyAddress[] {\n        return [...this._addressesToWatch];\n    }\n}\n","import {\n    AddressType,\n    TransactionBuilder,\n} from \"libnexa-ts\";\nimport {WatchOnlyAddress} from \"../../models/wallet.entities\";\nimport {TransactionCreator} from \"./interfaces/TransactionCreator\";\nimport {\n    watchOnlyBuildCreateGroupTransaction, watchOnlyPopulateAndDuplicateTokenAuths,\n    watchOnlyPopulateNexaInputsAndChange,\n    watchOnlyPopulateTokenAuth, watchOnlyPopulateTokenInputsAndChange, watchOnlyPrepareDeleteTransaction\n} from \"../../utils/WatchOnlyTXUtils\";\nimport {isString} from \"lodash-es\";\nimport {rostrumProvider} from \"../../network/RostrumProvider\";\nimport {PermissionLabel} from \"../../models/transaction.entities\";\nimport {isValidNexaAddress} from \"../../utils/WalletUtils\";\n\n/**\n * WatchOnlyTransactionCreator extends TransactionCreator to handle transaction creation\n * for watch-only wallets. It manages addresses without private keys and delegates\n * UTXO selection and input population to specialized utility functions.\n */\nexport default class WatchOnlyTransactionCreator extends TransactionCreator {\n\n\n    /** Addresses that need to be signed with (populated during transaction building) */\n    private _addressesToSignWith: string[] = [];\n    /** Available addresses for input selection and change */\n    private _availableAddresses: WatchOnlyAddress[] = []\n\n    /**\n     * Creates a new WatchOnlyTransactionCreator\n     * @param tx Optional existing transaction builder or transaction data\n     */\n    constructor(tx?: TransactionBuilder | string | Buffer) {\n        super(tx)\n    }\n\n    /**\n     * Sets the source addresses for transaction inputs\n     * @param address Single address string, array of addresses, or WatchOnlyAddress objects\n     * @returns This instance for chaining\n     */\n    public from(address: string | string[] | WatchOnlyAddress[] | WatchOnlyAddress): this {\n        if (isString(address)) {\n\n            if (!isValidNexaAddress(address, this.network) && !isValidNexaAddress(address, this.network, AddressType.PayToPublicKeyHash)) {\n                throw new Error('Invalid Address.');\n            }\n            // Single address string\n            this._availableAddresses.push({address: address});\n        } else if(Array.isArray(address)) {\n            // Array of addresses or WatchOnlyAddress objects\n            address.forEach((addr) => {\n                if (isString(addr)) {\n                    if (!isValidNexaAddress(addr, this.network) && !isValidNexaAddress(addr, this.network, AddressType.PayToPublicKeyHash)) {\n                        throw new Error('Invalid Address.');\n                    }\n                    // String address\n                    this._availableAddresses.push({address: addr});\n                } else if (addr && typeof addr === 'object' && 'address' in addr) {\n                    // WatchOnlyAddress object\n                    this._availableAddresses.push(<WatchOnlyAddress>addr);\n                }\n            })\n        } else if(address.address != null) {\n            // Single WatchOnlyAddress object\n            this._availableAddresses.push(<WatchOnlyAddress>address)\n        }\n        return this\n    }\n\n    /**\n     * Adds a token minting operation to the transaction\n     * @param token Token ID to mint\n     * @param amount Amount to mint\n     * @param toAddr Destination address for minted tokens\n     * @returns This instance for chaining\n     */\n    public mint(token: string, amount: string, toAddr:string): this {\n        this.builder.push(async() => {\n            this.tokenAction(toAddr, amount, token, 'mint')\n        })\n\n        return this\n    }\n\n    /**\n     * Adds a token melting operation to the transaction\n     * @param token Token ID to melt\n     * @param amount Amount to melt\n     * @param toAddr Destination address for melted tokens\n     * @returns This instance for chaining\n     */\n    public melt(token: string, amount: string, toAddr:string): this {\n        this.builder.push(async() => {\n            this.tokenAction(toAddr, amount, token, 'melt')\n        })\n\n        return this\n    }\n\n    /**\n     * Populates the transaction with inputs and outputs based on the configured actions.\n     * Handles different token operations (mint, melt, group creation, etc.) and\n     * populates NEXA inputs for transaction fees.\n     * @returns This instance for chaining\n     */\n    public populate(): this {\n        this.builder.push(async () => {\n            let tokenAddresses: string[] = []\n            let nexaAddresses: string[] = []\n\n            // Process token operations if any are configured\n            if(this.tokens.size > 0) {\n                for (const tokenAction of this.tokens) {\n                    if(tokenAction.action == 'mint' || tokenAction.action == 'melt') {\n                        // Handle token minting/melting - requires authority\n                        tokenAddresses = tokenAddresses.concat(await watchOnlyPopulateTokenAuth(this.transactionBuilder, this._availableAddresses, tokenAction.token!, tokenAction.action))\n                    } else if (tokenAction.action == 'group') {\n                        // Handle group token creation\n                        tokenAddresses = tokenAddresses.concat(await watchOnlyBuildCreateGroupTransaction(this.transactionBuilder, this._availableAddresses, tokenAction.token!, this.network))\n                    } else if (tokenAction.action == 'subgroup') {\n                        // Handle subgroup token creation\n                        tokenAddresses = tokenAddresses.concat(await watchOnlyPopulateTokenAuth(this.transactionBuilder, this._availableAddresses, tokenAction.parentToken!, tokenAction.action, tokenAction.token));\n                    } else if(tokenAction.action == 'renew') {\n                        // Handle authority renewal\n                        tokenAddresses = tokenAddresses.concat(await watchOnlyPopulateAndDuplicateTokenAuths(this.transactionBuilder, this._availableAddresses, tokenAction.token!, tokenAction.extraData!.perms!, tokenAction.extraData?.address!))\n                    } else if(tokenAction.action == 'delete') {\n                        // Handle authority deletion\n                        tokenAddresses = tokenAddresses.concat(await watchOnlyPrepareDeleteTransaction(this.transactionBuilder, this._availableAddresses, tokenAction.extraData!.outpoint!))\n                    } else {\n                        // Handle regular token transfers\n                        tokenAddresses = tokenAddresses.concat(await watchOnlyPopulateTokenInputsAndChange(this.transactionBuilder, this._availableAddresses, tokenAction.token!, tokenAction.amount))\n                    }\n\n                    // Accumulate addresses that need signing\n                    this._addressesToSignWith!.concat(tokenAddresses)\n                }\n            }\n\n            // Populate NEXA inputs for transaction fees and change\n            nexaAddresses = nexaAddresses.concat(await watchOnlyPopulateNexaInputsAndChange(this.transactionBuilder, this._availableAddresses, this.totalValue, this.txOptions))\n\n            // Combine all addresses that need signing\n            this._addressesToSignWith! = tokenAddresses.concat(nexaAddresses)\n        })\n\n        return this\n    }\n\n    /**\n     * Parse transaction from buffer (not implemented for watch-only)\n     * @param tx Transaction buffer\n     * @returns This instance for chaining\n     * @throws Error indicating method not implemented\n     */\n    public parseTxBuffer(tx: Buffer): this {\n        this.builder.push(async () => {\n            this.transactionBuilder = new TransactionBuilder(tx);\n        })\n        return this\n    }\n\n    /**\n     * Parse transaction from hex string (not implemented for watch-only)\n     * @param tx Transaction hex string\n     * @returns This instance for chaining\n     * @throws Error indicating method not implemented\n     */\n    public parseTxHex(tx: string) {\n        this.builder.push(async () => {\n            const txBuilder = new TransactionBuilder(tx)\n            const newTxBuilder = new TransactionBuilder()\n            const oldInputs = txBuilder.transaction.inputs\n            for (const input of oldInputs) {\n                const utxo = await rostrumProvider.getUtxo(input.outpoint.toString('hex'))\n                newTxBuilder.from({\n                    outpoint: utxo.tx_hash,\n                    amount: utxo.amount,\n                    scriptPubKey: utxo.scriptpubkey\n                })\n            }\n            newTxBuilder.transaction.outputs = txBuilder.transaction.outputs\n            this.transactionBuilder = newTxBuilder;\n        })\n\n        return this\n    }\n}\n","import { rostrumProvider } from '../network/RostrumProvider';\nimport { WatchOnlyAddress } from '../models/wallet.entities';\nimport { MAX_INT64, isNullOrEmpty } from './CommonUtils';\nimport {\n    Address,\n    AddressType,\n    GroupToken,\n    Networkish,\n    Transaction,\n    TransactionBuilder,\n    UnitUtils,\n    UTXO\n} from \"libnexa-ts\";\nimport { PermissionLabel, TxOptions } from \"../models/transaction.entities\";\nimport {dupAuthority, isAuthFit} from \"./TokenUtils\";\n\nconst MAX_INPUTS_OUTPUTS = 250;\n\nexport async function watchOnlyPopulateNexaInputsAndChange(txBuilder: TransactionBuilder, addresses: WatchOnlyAddress[], totalTxValue: bigint, options: TxOptions): Promise<string[]> {\n    if (isNullOrEmpty(addresses)) {\n        throw new Error(\"Not enough Nexa balance.\");\n    }\n\n    let usedAddresses = new Set<string>();\n    let origAmount = options.isConsolidate ? 0 : Number(totalTxValue);\n\n    for (let item of addresses) {\n        let utxos = await rostrumProvider.getNexaUtxos(item.address);\n        for (let utxo of utxos) {\n            let input: UTXO = {\n                outpoint: utxo.outpoint_hash,\n                address: item.address,\n                satoshis: utxo.value,\n                templateData: options.templateData\n            }\n            txBuilder.from(input);\n\n            if (!usedAddresses.has(item.address)) {\n                usedAddresses.add(item.address);\n            }\n\n            if (options.isConsolidate) {\n                // need to handle change\n                txBuilder.change(options.toChange ?? item.address);\n\n                if (txBuilder.transaction.inputs.length > MAX_INPUTS_OUTPUTS) {\n                    return Array.from(usedAddresses.values());\n                }\n            } else {\n                let tx = txBuilder.transaction;\n                if (tx.inputs.length > MAX_INPUTS_OUTPUTS) {\n                    throw new Error(\"Too many inputs. Consider consolidate transactions or reduce the send amount.\");\n                }\n\n                let unspent = tx.getUnspentValue();\n                if (unspent < 0n) {\n                    continue;\n                }\n\n                if (unspent == 0n && options.feeFromAmount) {\n                    let txFee = tx.estimateRequiredFee();\n                    tx.updateOutputAmount(0, origAmount - txFee);\n                    return Array.from(usedAddresses.values());\n                }\n\n                txBuilder.change(options.toChange ?? item.address);\n                if (options.feeFromAmount) {\n                    let hasChange = tx.getChangeOutput();\n                    let txFee = tx.estimateRequiredFee();\n                    tx.updateOutputAmount(0, origAmount - txFee);\n\n                    // edge case where change added after update\n                    if (!hasChange && tx.getChangeOutput()) {\n                        txFee = tx.estimateRequiredFee();\n                        tx.updateOutputAmount(0, origAmount - txFee);\n                    }\n                }\n\n                // check again after change output manipulation\n                if (tx.getUnspentValue() < tx.estimateRequiredFee()) {\n                    // try to add more utxos to satisfy the minimum fee\n                    continue;\n                }\n                return Array.from(usedAddresses.values());\n            }\n        }\n    }\n\n    if (options.isConsolidate) {\n        if (usedAddresses.size > 0) {\n            return Array.from(usedAddresses.values());\n        }\n        throw new Error(\"Not enough Nexa balance.\");\n    }\n\n    let err = {\n        errorMsg: \"Not enough Nexa balance.\",\n        amount: UnitUtils.formatNEXA(Number(totalTxValue)),\n        fee: UnitUtils.formatNEXA(txBuilder.transaction.estimateRequiredFee())\n    }\n\n    throw new Error(JSON.stringify(err));\n}\n\nexport async function watchOnlyPopulateTokenInputsAndChange(txBuilder: TransactionBuilder, addresses: WatchOnlyAddress[], token: string, outTokenAmount: bigint): Promise<string[]> {\n    if (isNullOrEmpty(addresses)) {\n        throw new Error(\"Not enough token balance.\");\n    }\n\n    let usedKeys = new Set<string>();\n    let inTokenAmount = 0n;\n\n    for (let item of addresses) {\n        let utxos = await rostrumProvider.getTokenUtxos(item.address, token);\n        for (let utxo of utxos) {\n            if (utxo.token_amount < 0) {\n                continue;\n            }\n            txBuilder.from({\n                outpoint: utxo.outpoint_hash,\n                address: item.address,\n                satoshis: utxo.value,\n                groupId: utxo.group,\n                groupAmount: BigInt(utxo.token_amount),\n            });\n\n            inTokenAmount = inTokenAmount + BigInt(utxo.token_amount);\n            if (!usedKeys.has(item.address)) {\n                usedKeys.add(item.address);\n            }\n\n            if (inTokenAmount > MAX_INT64) {\n                throw new Error(\"Token inputs exceeded max amount. Consider sending in small chunks\");\n            }\n            if (txBuilder.transaction.inputs.length > MAX_INPUTS_OUTPUTS) {\n                throw new Error(\"Too many inputs. Consider consolidating transactions or reduce the send amount.\");\n            }\n\n            if (inTokenAmount == outTokenAmount) {\n                return Array.from(usedKeys.values());\n            }\n            if (inTokenAmount > outTokenAmount) {\n                // change\n                txBuilder.to(item.address, Transaction.DUST_AMOUNT, token, inTokenAmount - outTokenAmount);\n                return Array.from(usedKeys.values());\n            }\n        }\n    }\n\n    throw new Error(\"Not enough token balance\");\n}\n\nexport async function watchOnlyBuildCreateGroupTransaction(\n    txBuilder: TransactionBuilder,\n    addresses: WatchOnlyAddress[],\n    opReturnData: string,\n    network: Networkish\n): Promise<string[]> {\n    let outpoint = '', idHex = '';\n    let usedKeys: string[] = [];\n    for (let item of addresses) {\n        let utxos = await rostrumProvider.getNexaUtxos(item.address);\n        for (let utxo of utxos) {\n            txBuilder.from({\n                outpoint: utxo.outpoint_hash,\n                address: item.address,\n                satoshis: utxo.value\n            });\n\n            if (isNullOrEmpty(outpoint)) {\n                outpoint = utxo.outpoint_hash;\n                let id = GroupToken.findGroupId(Buffer.from(outpoint, 'hex'), Buffer.from(opReturnData, 'hex'), GroupToken.authFlags.ACTIVE_FLAG_BITS);\n                const groupId = new Address(id.hashBuffer, network, AddressType.GroupIdAddress).toString()\n                txBuilder.to(item.address, Transaction.DUST_AMOUNT, groupId, GroupToken.authFlags.ACTIVE_FLAG_BITS | id.nonce)\n                idHex = id.hashBuffer.toString('hex');\n                usedKeys.push(item.address);\n                return usedKeys\n            }\n        }\n    }\n\n    throw new Error(\"Not enough Nexa balance.\");\n}\n\nexport async function watchOnlyPrepareDeleteTransaction(txBuilder: TransactionBuilder, addresses: WatchOnlyAddress[], outpoint: string): Promise<string[]> {\n    let utxo = await rostrumProvider.getUtxo(outpoint);\n    let address = utxo.addresses[0];\n\n    txBuilder.from({\n        outpoint: outpoint,\n        address: address,\n        satoshis: utxo.amount\n    });\n\n    let addrKey = addresses.find(k => k.address === address);\n\n    if (!addrKey) {\n        throw new Error('UTXO associated key not found in the wallet');\n    }\n    return [addrKey.address];\n}\n\nexport async function watchOnlyPopulateTokenAuth(txBuilder: TransactionBuilder, addresses: WatchOnlyAddress[], token: string, perm: PermissionLabel, subgroup = ''): Promise<string[]> {\n    for (let item of addresses) {\n        let utxos = await rostrumProvider.getTokenUtxos(item.address, token);\n        for (let utxo of utxos) {\n            if (!isAuthFit(utxo.token_amount, perm)) {\n                continue;\n            }\n\n            txBuilder.from({\n                outpoint: utxo.outpoint_hash,\n                address: item.address,\n                satoshis: utxo.value\n            });\n\n            if (perm === 'subgroup') {\n                txBuilder.to(item.address, Transaction.DUST_AMOUNT, subgroup, dupAuthority(utxo.token_amount, false));\n            }\n\n            // if renew flag included, we don't want to burn it\n            if (GroupToken.allowsRenew(BigInt.asUintN(64, BigInt(utxo.token_amount)))) {\n                txBuilder.to(item.address, Transaction.DUST_AMOUNT, token, dupAuthority(utxo.token_amount));\n            }\n\n            return [item.address];\n        }\n    }\n\n    throw new Error(\"The requested authority not found\");\n}\n\nexport async function watchOnlyPopulateAndDuplicateTokenAuths(txBuilder: TransactionBuilder, addresses: WatchOnlyAddress[], token: string, perms: PermissionLabel[], toAddr?: string): Promise<string[]> {\n    let usedAddresses: string[] = [];\n\n    let reqiredPerms = new Set(perms);\n    reqiredPerms.add('authorise');\n\n    for (let item of addresses) {\n        let utxos = await rostrumProvider.getTokenUtxos(item.address, token);\n        for (let utxo of utxos) {\n            if (utxo.token_amount > 0) {\n                continue;\n            }\n\n            let found = false;\n            for (let perm of reqiredPerms) {\n                if (isAuthFit(utxo.token_amount, perm)) {\n                    reqiredPerms.delete(perm);\n                    found = true;\n                }\n            }\n\n            if (!found) {\n                continue;\n            }\n\n            txBuilder.from({\n                outpoint: utxo.outpoint_hash,\n                address: item.address,\n                satoshis: utxo.value\n            });\n            usedAddresses.push(item.address);\n\n            // duplicate\n            txBuilder.to(toAddr != null ? toAddr : item.address, Transaction.DUST_AMOUNT, token, dupAuthority(utxo.token_amount));\n\n            if (reqiredPerms.size === 0) {\n                return usedAddresses;\n            }\n        }\n    }\n\n    throw new Error(\"The required authorities not found\");\n}\n"],"names":[],"version":3,"file":"index.mjs.map","sourceRoot":"../"}